gint main (gint argc, gchar *argv[]) { GdkDisplay *extra_display; gtk_init (&argc, &argv); test_error_trapping (gdk_display_get_default ()); extra_display = gdk_display_open (NULL); test_error_trapping (extra_display); gdk_display_close (extra_display); test_error_trapping (gdk_display_get_default ()); /* open a display with a trap pushed and see if we * get confused */ gdk_error_trap_push (); gdk_error_trap_push (); extra_display = gdk_display_open (NULL); test_error_trapping (extra_display); gdk_display_close (extra_display); gdk_error_trap_pop_ignored (); gdk_error_trap_pop_ignored (); test_error_trapping (gdk_display_get_default ()); /* reassure us that the tests ran. */ g_print("All errors properly trapped.\n"); return 0; }
/* Called when the user clicks on the "Close" button in the * "Display" frame. Closes the selected display. */ static void close_display_cb (GtkWidget *button, ChangeDisplayInfo *info) { if (info->current_display) gdk_display_close (info->current_display); }
char *sendpraat (void *display, const char *programName, long timeOut, const char *text) { char nativeProgramName [100]; #if gtk char *home, pidFileName [256], messageFileName [256]; FILE *pidFile; long pid, wid = 0; #elif win char homeDirectory [256], messageFileName [256], windowName [256]; HWND window; (void) display; (void) timeOut; #elif mac AEDesc programDescriptor; AppleEvent event, reply; OSStatus err; UInt32 signature; (void) display; #endif /* * Clean up from an earlier call. */ errorMessage [0] = '\0'; /* * Handle case differences. */ strcpy (nativeProgramName, programName); #if gtk nativeProgramName [0] = tolower (nativeProgramName [0]); #else nativeProgramName [0] = toupper (nativeProgramName [0]); #endif /* * If the text is going to be sent in a file, create its name. * The file is going to be written into the preferences directory of the receiving program. * On Unix, the name will be something like /home/jane/.praat-dir/message. * On Windows, the name will be something like C:\Users\Jane\Praat\Message.txt, * or C:\Windows\Praat\Message.txt on older systems. * On Macintosh, the text is NOT going to be sent in a file. */ #if gtk if ((home = getenv ("HOME")) == NULL) { sprintf (errorMessage, "HOME environment variable not set."); return errorMessage; } sprintf (messageFileName, "%s/.%s-dir/message", home, programName); #elif win if (GetEnvironmentVariableA ("USERPROFILE", homeDirectory, 255)) { ; /* Ready. */ } else if (GetEnvironmentVariableA ("HOMEDRIVE", homeDirectory, 255)) { GetEnvironmentVariableA ("HOMEPATH", homeDirectory + strlen (homeDirectory), 255); } else { GetWindowsDirectoryA (homeDirectory, 255); } sprintf (messageFileName, "%s\\%s\\Message.txt", homeDirectory, programName); #endif /* * Save the message file (Unix and Windows only). */ #if gtk || win { FILE *messageFile; if ((messageFile = fopen (messageFileName, "w")) == NULL) { sprintf (errorMessage, "Cannot create message file \"%s\" " "(no privilege to write to directory, or disk full, or program is not called %s).\n", messageFileName, programName); return errorMessage; } #if gtk if (timeOut) fprintf (messageFile, "#%ld\n", (long) getpid ()); /* Write own process ID for callback. */ #endif fprintf (messageFile, "%s", text); fclose (messageFile); } #endif /* * Where shall we send the message? */ #if gtk /* * Get the process ID and the window ID of a running Praat-shell program. */ sprintf (pidFileName, "%s/.%s-dir/pid", home, programName); if ((pidFile = fopen (pidFileName, "r")) == NULL) { sprintf (errorMessage, "Program %s not running.", programName); return errorMessage; } if (fscanf (pidFile, "%ld%ld", & pid, & wid) < 1) { fclose (pidFile); sprintf (errorMessage, "Program %s not running, or disk has been full.", programName); return errorMessage; } fclose (pidFile); #elif win /* * Get the window handle of the "Objects" window of a running Praat-shell program. */ sprintf (windowName, "PraatShell1 %s", programName); window = FindWindowA (windowName, NULL); if (! window) { sprintf (errorMessage, "Program %s not running (or an old version).", programName); return errorMessage; } #elif mac /* * Convert the program name to a Macintosh signature. * I know of no system routine for this, so I'll just translate the two most common names: */ if (! strcmp (programName, "praat") || ! strcmp (programName, "Praat") || ! strcmp (programName, "PRAAT")) signature = 'PpgB'; else if (! strcmp (programName, "als") || ! strcmp (programName, "Als") || ! strcmp (programName, "ALS")) signature = 'CclA'; else signature = 0; AECreateDesc (typeApplSignature, & signature, 4, & programDescriptor); #endif /* * Send the message. */ #if gtk /* * Be ready to receive notification of completion. */ if (timeOut) signal (SIGUSR2, handleCompletion); /* * Notify running program. */ if (wid != 0) { /* Praat shell version October 21, 1998 or later? Send event to window. */ /* * Notify main window. */ GdkEventClient gevent; g_type_init (); int displaySupplied = display != NULL; if (! displaySupplied) { display = gdk_display_open (getenv ("DISPLAY")); /* GdkDisplay* */ if (display == NULL) { sprintf (errorMessage, "Cannot open display %s", getenv ("DISPLAY")); return errorMessage; } } gevent. type = GDK_CLIENT_EVENT; gevent. window = 0; gevent. send_event = 1; gevent. message_type = gdk_atom_intern_static_string ("SENDPRAAT"); gevent. data_format = 8; if (! gdk_event_send_client_message_for_display (display, (GdkEvent *) & gevent, wid)) { if (! displaySupplied) gdk_display_close (display); sprintf (errorMessage, "Cannot send message to %s (window %ld). " "The program %s may have been started by a different user, " "or may have crashed.", programName, wid, programName); return errorMessage; } if (! displaySupplied) gdk_display_close (display); } /* * Wait for the running program to notify us of completion, * but do not wait for more than 'timeOut' seconds. */ if (timeOut) { signal (SIGALRM, handleTimeOut); alarm (timeOut); theTimeOut = timeOut; /* Hand an argument to handleTimeOut () in a static variable. */ errorMessage [0] = '\0'; pause (); if (errorMessage [0] != '\0') return errorMessage; } #elif win /* * Notify the running program by sending a WM_USER message to its main window. */ if (SendMessage (window, WM_USER, 0, 0)) { sprintf (errorMessage, "Program %s returns error.", programName); /* BUG? */ return errorMessage; } #elif mac /* * Notify the running program by sending it an Apple event of the magic class 758934755. */ AECreateAppleEvent (758934755, 0, & programDescriptor, kAutoGenerateReturnID, 1, & event); AEPutParamPtr (& event, 1, typeChar, text, strlen (text) + 1); #ifdef __MACH__ err = AESendMessage (& event, & reply, ( timeOut == 0 ? kAENoReply : kAEWaitReply ) | kAECanInteract | kAECanSwitchLayer, timeOut == 0 ? kNoTimeOut : 60 * timeOut); #else err = AESend (& event, & reply, ( timeOut == 0 ? kAENoReply : kAEWaitReply ) | kAECanInteract | kAECanSwitchLayer, kAENormalPriority, timeOut == 0 ? kNoTimeOut : 60 * timeOut, NULL, NULL); #endif if (err != noErr) { if (err == procNotFound || err == connectionInvalid) sprintf (errorMessage, "Could not send message to program \"%s\".\n" "The program is probably not running (or an old version).", programName); else if (err == errAETimeout) sprintf (errorMessage, "Message to program \"%s\" timed out " "after %ld seconds, before completion.", programName, timeOut); else sprintf (errorMessage, "Unexpected sendpraat error %d.\nNotify the author.", err); } AEDisposeDesc (& programDescriptor); AEDisposeDesc (& event); AEDisposeDesc (& reply); #endif /* * Notify the caller of success (NULL pointer) or failure (string with an error message). */ return errorMessage [0] == '\0' ? NULL : errorMessage; }
static VALUE rg_close(VALUE self) { gdk_display_close(_SELF(self)); return self; }
/*# @method close GdkDisplay @brief Closes the connection to the windowing system for the given display, and cleans up associated resources. */ FALCON_FUNC Display::close( VMARG ) { NO_ARGS gdk_display_close( GET_DISPLAY( vm->self() ) ); }