/** * gnome_desktop_prepend_terminal_to_vector: * @argc: a pointer to the vector size * @argv: a pointer to the vector * * Description: Prepends a terminal (either the one configured as default in * the user's GNOME setup, or one of the common xterm emulators) to the passed * in vector, modifying it in the process. The vector should be allocated with * #g_malloc, as this will #g_free the original vector. Also all elements must * have been allocated separately. That is the standard glib/GNOME way of * doing vectors however. If the integer that @argc points to is negative, the * size will first be computed. Also note that passing in pointers to a vector * that is empty, will just create a new vector for you. **/ void gnome_desktop_prepend_terminal_to_vector (int *argc, char ***argv) { #ifndef G_OS_WIN32 char **real_argv; int real_argc; int i, j; char **term_argv = NULL; int term_argc = 0; GSettings *settings; gchar *terminal = NULL; char **the_argv; g_return_if_fail (argc != NULL); g_return_if_fail (argv != NULL); _gnome_desktop_init_i18n (); /* sanity */ if(*argv == NULL) *argc = 0; the_argv = *argv; /* compute size if not given */ if (*argc < 0) { for (i = 0; the_argv[i] != NULL; i++) ; *argc = i; } settings = g_settings_new ("org.cinnamon.desktop.default-applications.terminal"); terminal = g_settings_get_string (settings, "exec"); if (terminal) { gchar *command_line; gchar *exec_flag; exec_flag = g_settings_get_string (settings, "exec-arg"); if (exec_flag == NULL) command_line = g_strdup (terminal); else command_line = g_strdup_printf ("%s %s", terminal, exec_flag); g_shell_parse_argv (command_line, &term_argc, &term_argv, NULL /* error */); g_free (command_line); g_free (exec_flag); g_free (terminal); } g_object_unref (settings); if (term_argv == NULL) { char *check; term_argc = 2; term_argv = g_new0 (char *, 3); check = g_find_program_in_path ("gnome-terminal"); if (check != NULL) { term_argv[0] = check; /* Note that gnome-terminal takes -x and * as -e in gnome-terminal is broken we use that. */ term_argv[1] = g_strdup ("-x"); } else { if (check == NULL) check = g_find_program_in_path ("nxterm"); if (check == NULL) check = g_find_program_in_path ("color-xterm"); if (check == NULL) check = g_find_program_in_path ("rxvt"); if (check == NULL) check = g_find_program_in_path ("xterm"); if (check == NULL) check = g_find_program_in_path ("dtterm"); if (check == NULL) { g_warning (_("Cannot find a terminal, using " "xterm, even if it may not work")); check = g_strdup ("xterm"); } term_argv[0] = check; term_argv[1] = g_strdup ("-e"); } }
/* Returns NULL if screen could not be created. For instance, if * the driver does not support Xrandr 1.2. */ GnomeRRScreen * gnome_rr_screen_new (GdkScreen *gdk_screen, GnomeRRScreenChanged callback, gpointer data, GError **error) { #ifdef HAVE_RANDR Display *dpy = GDK_SCREEN_XDISPLAY (gdk_screen); int event_base; int ignore; #endif g_return_val_if_fail (error == NULL || *error == NULL, NULL); _gnome_desktop_init_i18n (); #ifdef HAVE_RANDR if (XRRQueryExtension (dpy, &event_base, &ignore)) { GnomeRRScreen *screen = g_new0 (GnomeRRScreen, 1); screen->gdk_screen = gdk_screen; screen->gdk_root = gdk_screen_get_root_window (gdk_screen); screen->xroot = gdk_x11_drawable_get_xid (screen->gdk_root); screen->xdisplay = dpy; screen->xscreen = gdk_x11_screen_get_xscreen (screen->gdk_screen); screen->connector_type_atom = XInternAtom (dpy, "ConnectorType", FALSE); screen->callback = callback; screen->data = data; screen->randr_event_base = event_base; XRRQueryVersion (dpy, &screen->rr_major_version, &screen->rr_minor_version); if (screen->rr_major_version > 1 || (screen->rr_major_version == 1 && screen->rr_minor_version < 2)) { g_set_error (error, GNOME_RR_ERROR, GNOME_RR_ERROR_NO_RANDR_EXTENSION, "RANDR extension is too old (must be at least 1.2)"); g_free (screen); return NULL; } screen->info = screen_info_new (screen, TRUE, error); if (!screen->info) { g_free (screen); return NULL; } if (screen->callback) { XRRSelectInput (screen->xdisplay, screen->xroot, RRScreenChangeNotifyMask); gdk_x11_register_standard_event_type (gdk_screen_get_display (gdk_screen), event_base, RRNotify + 1); gdk_window_add_filter (screen->gdk_root, screen_on_event, screen); } return screen; } else { #endif /* HAVE_RANDR */ g_set_error (error, GNOME_RR_ERROR, GNOME_RR_ERROR_NO_RANDR_EXTENSION, _("RANDR extension is not present")); return NULL; #ifdef HAVE_RANDR } #endif }