X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3069ac4e452f98644f9cdcae52a36ed9b9a93a31..debdd17e991830c4ced82f5e4672fe2b32a684c2:/src/gtk1/utilsgtk.cpp?ds=inline diff --git a/src/gtk1/utilsgtk.cpp b/src/gtk1/utilsgtk.cpp index 331b2e9cea..ba3988e154 100644 --- a/src/gtk1/utilsgtk.cpp +++ b/src/gtk1/utilsgtk.cpp @@ -18,6 +18,8 @@ #include "wx/intl.h" #include "wx/log.h" +#include "wx/process.h" + #include #include #include @@ -29,12 +31,13 @@ #include #include #include +#include // for O_WRONLY and friends -#include -#include -#include - -#include "gdk/gdkx.h" // GDK_DISPLAY +#include "glib.h" +#include "gdk/gdk.h" +#include "gtk/gtk.h" +#include "gtk/gtkfeatures.h" +#include "gdk/gdkx.h" #ifdef __SVR4__ #include @@ -76,24 +79,25 @@ void wxDisplaySize( int *width, int *height ) void wxGetMousePosition( int* x, int* y ) { - Window dumw; - int dumi; - unsigned int dumu; - - XQueryPointer( GDK_DISPLAY(),GDK_ROOT_WINDOW(), - &dumw,&dumw,x,y,&dumi,&dumi,&dumu ); + gdk_window_get_pointer( (GdkWindow*) NULL, x, y, (GdkModifierType*) NULL ); } bool wxColourDisplay(void) { - wxFAIL_MSG( "wxColourDisplay always returns TRUE" ); return TRUE; } int wxDisplayDepth(void) { - wxFAIL_MSG( "wxDisplayDepth always returns 8" ); - return 8; + return gdk_window_get_visual( (GdkWindow*) &gdk_root_parent )->depth; +} + +int wxGetOsVersion(int *majorVsn, int *minorVsn) +{ + if (majorVsn) *majorVsn = GTK_MAJOR_VERSION; + if (minorVsn) *minorVsn = GTK_MINOR_VERSION; + + return wxGTK; } //------------------------------------------------------------------------ @@ -123,7 +127,8 @@ char *wxGetUserHome( const wxString &user ) { who = getpwnam(ptr); } - // We now make sure the the user exists! + + /* We now make sure the the user exists! */ if (who == NULL) { who = getpwuid(getuid()); @@ -249,37 +254,41 @@ bool wxDirExists( const wxString& dir ) struct wxEndProcessData { - gint pid, tag; - wxProcess *process; + gint pid, tag; + wxProcess *process; }; static void GTK_EndProcessDetector(gpointer data, gint source, GdkInputCondition WXUNUSED(condition) ) { - wxEndProcessData *proc_data = (wxEndProcessData *)data; - int pid; - - pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid); - - /* wait4 is not part of any standard, use at own risk - * not sure what wait4 does, but wait3 seems to be closest, whats a digit ;-) - * --- offer@sgi.com */ + wxEndProcessData *proc_data = (wxEndProcessData *)data; + int pid; + + pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid); + + /* wait4 is not part of any standard, use at own risk + * not sure what wait4 does, but wait3 seems to be closest, whats a digit ;-) + * --- offer@sgi.com */ + // VZ: wait4() will be woken up by a signal, not wait3 - so it's quite + // different (also, wait3() waits for any child, wait4() only for this + // one) + int status = -1; #if !defined(__sgi) - wait4(proc_data->pid, NULL, 0, NULL); + wait4(proc_data->pid, &status, 0, (rusage *) NULL); #else - wait3((int *) NULL, 0, (rusage *) NULL); + wait3(&status, 0, (rusage *) NULL); #endif - close(source); - gdk_input_remove(proc_data->tag); + close(source); + gdk_input_remove(proc_data->tag); - if (proc_data->process) - proc_data->process->OnTerminate(proc_data->pid); + if (proc_data->process) + proc_data->process->OnTerminate(proc_data->pid, status); - if (proc_data->pid > 0) - delete proc_data; - else - proc_data->pid = 0; + if (proc_data->pid > 0) + delete proc_data; + else + proc_data->pid = 0; } long wxExecute( char **argv, bool sync, wxProcess *process ) @@ -290,8 +299,9 @@ long wxExecute( char **argv, bool sync, wxProcess *process ) wxCHECK_MSG( *argv, 0, "can't exec empty command" ); /* Create pipes */ - if (pipe(end_proc_detect) == -1) { - wxLogSysError(_("Pipe creation failed")); + if (pipe(end_proc_detect) == -1) + { + wxLogSysError( "Pipe creation failed" ); return 0; } @@ -301,12 +311,13 @@ long wxExecute( char **argv, bool sync, wxProcess *process ) #else pid_t pid = fork(); #endif - if (pid == -1) { - // error - wxLogSysError(_("Fork failed")); + if (pid == -1) + { + wxLogSysError( "Fork failed" ); return 0; } - else if (pid == 0) { + else if (pid == 0) + { // we're in child close(end_proc_detect[0]); // close reading side // These three lines close the open file descriptors to @@ -317,6 +328,12 @@ long wxExecute( char **argv, bool sync, wxProcess *process ) close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); + // some programs complain about sterr not being open, so + // redirect them: + open("/dev/null", O_RDONLY); // stdin + open("/dev/null", O_WRONLY); // stdout + open("/dev/null", O_WRONLY); // stderr + #ifdef _AIX execvp ((const char *)*argv, (const char **)argv); @@ -324,20 +341,23 @@ long wxExecute( char **argv, bool sync, wxProcess *process ) execvp (*argv, argv); #endif // there is no return after successful exec() - wxLogSysError(_("Can't execute '%s'"), *argv); + wxLogSysError( "Can't execute '%s'", *argv); _exit(-1); } - else { + else + { // we're in parent close(end_proc_detect[1]); // close writing side data->tag = gdk_input_add(end_proc_detect[0], GDK_INPUT_READ, GTK_EndProcessDetector, (gpointer)data); data->pid = pid; - if (!sync) { + if (!sync) + { data->process = process; } - else { + else + { data->process = (wxProcess *) NULL; data->pid = -(data->pid);