X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/71317c5b3086a27e6f3b041e8ec02a1c5ad2ab32..687d733769cc797102a52c7cad8edd32be5a2f89:/src/gtk/utilsgtk.cpp diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index 07ca4f5658..28d35e2adc 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -30,6 +30,11 @@ #include #include +#include "glib.h" +#include "gdk/gdk.h" +#include "gtk/gtk.h" +#include "gtk/gtkfeatures.h" +#include "gdk/gdkx.h" #ifdef __SVR4__ #include @@ -37,7 +42,11 @@ #ifdef __SOLARIS__ // somehow missing from sys/wait.h but in the system's docs -pid_t wait4(pid_t pid, int *statusp, int options, struct rusage *rusage); +extern "C" +{ + pid_t wait4(pid_t pid, int *statusp, int options, struct rusage + *rusage); +} #endif //------------------------------------------------------------------------ @@ -46,42 +55,46 @@ pid_t wait4(pid_t pid, int *statusp, int options, struct rusage *rusage); void wxBell(void) { - gdk_beep(); -}; + gdk_beep(); +} void wxSleep(int nSecs) { - sleep(nSecs); -}; + sleep(nSecs); +} int wxKill(long pid, int sig) { - return kill(pid, sig); -}; + return kill(pid, sig); +} void wxDisplaySize( int *width, int *height ) { - if (width) *width = gdk_screen_width(); - if (height) *height = gdk_screen_height(); + if (width) *width = gdk_screen_width(); + if (height) *height = gdk_screen_height(); } void wxGetMousePosition( int* x, int* y ) { - wxFAIL_MSG( "GetMousePosition not yet implemented" ); - if (x) *x = 0; - if (y) *y = 0; -}; + gdk_window_get_pointer( (GdkWindow*) NULL, x, y, (GdkModifierType*) NULL ); +} bool wxColourDisplay(void) { - wxFAIL_MSG( "wxColourDisplay always returns TRUE" ); - return 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; } //------------------------------------------------------------------------ @@ -90,34 +103,41 @@ int wxDisplayDepth(void) const char* wxGetHomeDir( wxString *home ) { - *home = wxGetUserHome( wxString() ); - if (home->IsNull()) *home = "/"; - return *home; -}; + *home = wxGetUserHome( wxString() ); + if (home->IsNull()) *home = "/"; + return *home; +} char *wxGetUserHome( const wxString &user ) { - struct passwd *who = (struct passwd *) NULL; + struct passwd *who = (struct passwd *) NULL; - if (user.IsNull() || (user== "")) - { + if (user.IsNull() || (user== "")) + { register char *ptr; if ((ptr = getenv("HOME")) != NULL) + { return ptr; - if ((ptr = getenv("USER")) != NULL - || (ptr = getenv("LOGNAME")) != NULL) { + } + if ((ptr = getenv("USER")) != NULL || (ptr = getenv("LOGNAME")) != NULL) + { 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()); - } - else - who = getpwnam (user); + } + } + else + { + who = getpwnam (user); + } - return who ? who->pw_dir : (char*)NULL; -}; + return who ? who->pw_dir : (char*)NULL; +} //------------------------------------------------------------------------ // id routines @@ -143,15 +163,15 @@ bool wxGetHostName(char *buf, int sz) // strncpy(buf, (h=gethostbyname(name))!=NULL ? h->h_name : name, sz-1); if((unsigned)sz > strlen(name)+strlen(domain)+1) { - strcpy(buf, name); - if(strcmp(domain,"(none)") == 0) // standalone machine - { - strcat(buf,"."); - strcat(buf,domain); - } + strcpy(buf, name); + if(strcmp(domain,"(none)") == 0) // standalone machine + { + strcat(buf,"."); + strcat(buf,domain); + } } else - return FALSE; + return FALSE; return TRUE; #endif } @@ -194,7 +214,7 @@ void wxDebugMsg( const char *format, ... ) vfprintf( stderr, format, ap ); fflush( stderr ); va_end(ap); -}; +} void wxError( const wxString &msg, const wxString &title ) { @@ -202,7 +222,7 @@ void wxError( const wxString &msg, const wxString &title ) if (!title.IsNull()) fprintf( stderr, "%s ", WXSTRINGCAST(title) ); if (!msg.IsNull()) fprintf( stderr, ": %s", WXSTRINGCAST(msg) ); fprintf( stderr, ".\n" ); -}; +} void wxFatalError( const wxString &msg, const wxString &title ) { @@ -211,7 +231,7 @@ void wxFatalError( const wxString &msg, const wxString &title ) if (!msg.IsNull()) fprintf( stderr, ": %s", WXSTRINGCAST(msg) ); fprintf( stderr, ".\n" ); exit(3); // the same exit code as for abort() -}; +} //------------------------------------------------------------------------ // directory routines @@ -219,11 +239,11 @@ void wxFatalError( const wxString &msg, const wxString &title ) bool wxDirExists( const wxString& dir ) { - char buf[500]; - strcpy( buf, WXSTRINGCAST(dir) ); - struct stat sbuf; - return ((stat(buf, &sbuf) != -1) && S_ISDIR(sbuf.st_mode) ? TRUE : FALSE); -}; + char buf[500]; + strcpy( buf, WXSTRINGCAST(dir) ); + struct stat sbuf; + return ((stat(buf, &sbuf) != -1) && S_ISDIR(sbuf.st_mode) ? TRUE : FALSE); +} //------------------------------------------------------------------------ // subprocess routines @@ -231,38 +251,38 @@ 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; + wxEndProcessData *proc_data = (wxEndProcessData *)data; + int pid; - pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->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 */ + /* 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 */ #if !defined(__sgi) - wait4(proc_data->pid, NULL, 0, NULL); + wait4(proc_data->pid, (int*) NULL, 0, (rusage *) NULL); #else - wait3((int *) NULL, 0, (rusage *) NULL); + wait3((int *) NULL, 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); - 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 ) { @@ -272,8 +292,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; } @@ -283,14 +304,23 @@ 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 + // to avoid any input/output which might block the process + // or irritate the user. If one wants proper IO for the sub- + // process, the "right thing to do" is to start an xterm executing + // it. + close(STDIN_FILENO); + close(STDOUT_FILENO); + close(STDERR_FILENO); #ifdef _AIX execvp ((const char *)*argv, (const char **)argv); @@ -298,20 +328,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); @@ -325,7 +358,7 @@ long wxExecute( char **argv, bool sync, wxProcess *process ) // failed! return pid; } -}; +} long wxExecute( const wxString& command, bool sync, wxProcess *process ) { @@ -347,4 +380,4 @@ long wxExecute( const wxString& command, bool sync, wxProcess *process ) delete [] tmp; return lRc; -}; +}