void window_actions_setup (GimpActionGroup *group, const gchar *move_to_screen_help_id) { GdkDisplayManager *manager = gdk_display_manager_get (); GSList *displays; GSList *list; g_object_set_data_full (G_OBJECT (group), "move-to-screen-help-id", g_strdup (move_to_screen_help_id), (GDestroyNotify) g_free); displays = gdk_display_manager_list_displays (manager); /* present displays in the order in which they were opened */ displays = g_slist_reverse (displays); for (list = displays; list; list = g_slist_next (list)) { window_actions_display_opened (manager, list->data, group); } g_slist_free (displays); g_signal_connect_object (manager, "display-opened", G_CALLBACK (window_actions_display_opened), G_OBJECT (group), 0); }
/* Cleans up when the toplevel is destroyed; we remove the * connections we use to track currently open displays, then * free the ChangeDisplayInfo structure. */ static void destroy_info (ChangeDisplayInfo *info) { GdkDisplayManager *manager = gdk_display_manager_get (); GSList *displays = gdk_display_manager_list_displays (manager); GSList *tmp_list; g_signal_handlers_disconnect_by_func (manager, display_opened_cb, info); for (tmp_list = displays; tmp_list; tmp_list = tmp_list->next) g_signal_handlers_disconnect_by_func (tmp_list->data, display_closed_cb, info); g_slist_free (tmp_list); g_object_unref (info->size_group); g_object_unref (info->display_model); g_object_unref (info->screen_model); if (info->current_display) g_object_unref (info->current_display); if (info->current_screen) g_object_unref (info->current_screen); g_free (info); }
void window_menu_setup (GimpUIManager *manager, const gchar *group_name, const gchar *ui_path) { GdkDisplayManager *disp_manager = gdk_display_manager_get (); GSList *displays; GSList *list; g_return_if_fail (GIMP_IS_UI_MANAGER (manager)); g_return_if_fail (ui_path != NULL); g_object_set_data_full (G_OBJECT (manager), "move-to-screen-group-name", g_strdup (group_name), (GDestroyNotify) g_free); g_object_set_data_full (G_OBJECT (manager), "move-to-screen-ui-path", g_strdup (ui_path), (GDestroyNotify) g_free); displays = gdk_display_manager_list_displays (disp_manager); /* present displays in the order in which they were opened */ displays = g_slist_reverse (displays); for (list = displays; list; list = g_slist_next (list)) { window_menu_display_opened (disp_manager, list->data, manager); } g_slist_free (displays); g_signal_connect_object (disp_manager, "display-opened", G_CALLBACK (window_menu_display_opened), G_OBJECT (manager), 0); }
void window_actions_update (GimpActionGroup *group, GtkWidget *window) { const gchar *group_name; gint show_menu = FALSE; gchar *name; group_name = gtk_action_group_get_name (GTK_ACTION_GROUP (group)); #define SET_ACTIVE(action,active) \ gimp_action_group_set_action_active (group, action, (active) != 0) #define SET_VISIBLE(action,active) \ gimp_action_group_set_action_visible (group, action, (active) != 0) if (GTK_IS_WINDOW (window)) { GdkDisplay *display; GdkScreen *screen; gchar *screen_name; display = gtk_widget_get_display (window); show_menu = (gdk_display_get_n_screens (display) > 1); #ifdef GIMP_UNSTABLE show_menu = TRUE; #endif if (! show_menu) { GdkDisplayManager *manager = gdk_display_manager_get (); GSList *displays; displays = gdk_display_manager_list_displays (manager); show_menu = (displays->next != NULL); g_slist_free (displays); } screen = gtk_widget_get_screen (window); screen_name = gdk_screen_make_display_name (screen); name = g_strdup_printf ("%s-move-to-screen-%s", group_name, screen_name); g_free (screen_name); SET_ACTIVE (name, TRUE); g_free (name); } name = g_strdup_printf ("%s-move-to-screen-menu", group_name); SET_VISIBLE (name, show_menu); g_free (name); #undef SET_ACTIVE #undef SET_VISIBLE }
/* Adds all currently open displays to our list of displays, * and set up a signal connection so that we'll be notified * when displays are opened in the future as well. */ static void initialize_displays (ChangeDisplayInfo *info) { GdkDisplayManager *manager = gdk_display_manager_get (); GSList *displays = gdk_display_manager_list_displays (manager); GSList *tmp_list; for (tmp_list = displays; tmp_list; tmp_list = tmp_list->next) add_display (info, tmp_list->data); g_slist_free (tmp_list); g_signal_connect (manager, "display-opened", G_CALLBACK (display_opened_cb), info); }
/* X error handler. Keep the name the same because people are used to * breaking on it in the debugger. */ static int gdk_x_error (Display *xdisplay, XErrorEvent *error) { if (error->error_code) { GdkDisplay *error_display; GdkDisplayManager *manager; GSList *displays; /* Figure out which GdkDisplay if any got the error. */ error_display = NULL; manager = gdk_display_manager_get (); displays = gdk_display_manager_list_displays (manager); while (displays != NULL) { GdkX11Display *gdk_display = displays->data; if (xdisplay == gdk_display->xdisplay) { error_display = GDK_DISPLAY (gdk_display); g_slist_free (displays); displays = NULL; } else { displays = g_slist_delete_link (displays, displays); } } if (error_display == NULL) { /* Error on an X display not opened by GDK. Ignore. */ return 0; } else { _gdk_x11_display_error_event (error_display, error); } } return 0; }
static GdkDisplay * display_open_if_needed (const gchar *name) { GSList *displays; GSList *l; GdkDisplay *display = NULL; displays = gdk_display_manager_list_displays (gdk_display_manager_get ()); for (l = displays; l != NULL; l = l->next) { if (strcmp (gdk_display_get_name ((GdkDisplay *) l->data), name) == 0) { display = l->data; break; } } g_slist_free (displays); return display != NULL ? display : gdk_display_open (name); }
static void gtk_clipboard_store_all (void) { GtkClipboard *clipboard; GSList *displays, *list; displays = gdk_display_manager_list_displays (gdk_display_manager_get ()); list = displays; while (list) { GdkDisplay *display = static_cast<GdkDisplay *>(list->data); clipboard = gtk_clipboard_get_for_display (display, GDK_SELECTION_CLIPBOARD); if (clipboard) gtk_clipboard_store (clipboard); list = list->next; } g_slist_free (displays); }
int main (int argc, char const **argv) { gboolean opened_workbook = FALSE; gboolean with_gui; GOIOContext *ioc; WorkbookView *wbv; GSList *wbcgs_to_kill = NULL; GOCmdContext *cc; #ifdef G_OS_WIN32 gboolean has_console; #endif /* No code before here, we need to init threads */ argv = gnm_pre_parse_init (argc, argv); /* * Attempt to disable Ubuntu's funky, non-working scroll * bars. This needs to be done before gtk starts loading * modules. Note: the following call will not replace * an existing setting, so you can run with =1 if you like. */ g_setenv ("LIBOVERLAY_SCROLLBAR", "0", FALSE); #ifdef G_OS_WIN32 has_console = FALSE; { typedef BOOL (CALLBACK* LPFNATTACHCONSOLE)(DWORD); LPFNATTACHCONSOLE MyAttachConsole; HMODULE hmod; if ((hmod = GetModuleHandle("kernel32.dll"))) { MyAttachConsole = (LPFNATTACHCONSOLE) GetProcAddress(hmod, "AttachConsole"); if (MyAttachConsole && MyAttachConsole(ATTACH_PARENT_PROCESS)) { freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); dup2(fileno(stdout), 1); dup2(fileno(stderr), 2); has_console = TRUE; } } } #endif gnumeric_arg_parse (argc, (char **)argv); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); bind_textdomain_codeset (GETTEXT_PACKAGE "-functions", "UTF-8"); with_gui = !func_def_file && !func_state_file && !split_funcdocs; if (with_gui) { gnm_session_init (argv[0]); } gnm_init (); /* These are useful for the build process only. */ if (func_state_file) return gnm_dump_func_defs (func_state_file, 0); if (func_def_file) return gnm_dump_func_defs (func_def_file, 1); if (split_funcdocs) return gnm_dump_func_defs (NULL, 2); if (ext_refs_file) return gnm_dump_func_defs (ext_refs_file, 4); if (with_gui) { go_component_set_default_command_context (cc = cmd_context_stderr_new ()); g_object_unref (cc); cc = g_object_new (GNM_TYPE_IO_CONTEXT_GTK, "show-splash", !gnumeric_no_splash, "show-warnings", !gnumeric_no_warnings, NULL); ioc = GO_IO_CONTEXT (g_object_ref (cc)); handle_paint_events (); pathetic_qt_workaround (); } else { /* TODO: Make this inconsistency go away */ cc = cmd_context_stderr_new (); ioc = go_io_context_new (cc); go_component_set_default_command_context (cc); } /* Keep in sync with .desktop file */ g_set_application_name (_("Gnumeric Spreadsheet")); gnm_plugins_init (GO_CMD_CONTEXT (ioc)); if (startup_files) { int i; for (i = 0; startup_files [i]; i++) ; go_io_context_set_num_files (ioc, i); for (i = 0; startup_files [i] && !initial_workbook_open_complete; i++) { char *uri = go_shell_arg_to_uri (startup_files[i]); if (uri == NULL) { g_warning ("Ignoring invalid URI."); continue; } go_io_context_processing_file (ioc, uri); wbv = workbook_view_new_from_uri (uri, NULL, ioc, NULL); g_free (uri); if (go_io_error_occurred (ioc) || go_io_warning_occurred (ioc)) { go_io_error_display (ioc); go_io_error_clear (ioc); } if (wbv != NULL) { WBCGtk *wbcg; workbook_update_history (wb_view_get_workbook (wbv), GNM_FILE_SAVE_AS_STYLE_SAVE); wbcg = wbc_gtk_new (wbv, NULL, NULL, geometry); geometry = NULL; sheet_update (wb_view_cur_sheet (wbv)); opened_workbook = TRUE; gnm_io_context_gtk_set_transient_for (GNM_IO_CONTEXT_GTK (ioc), wbcg_toplevel (wbcg)); if (immediate_exit_flag) wbcgs_to_kill = g_slist_prepend (wbcgs_to_kill, wbcg); } /* cheesy attempt to keep the ui from freezing during load */ handle_paint_events (); if (gnm_io_context_gtk_get_interrupted (GNM_IO_CONTEXT_GTK (ioc))) break; /* Don't load any more workbooks */ } } g_object_unref (cc); cc = NULL; /* FIXME: Maybe we should quit here if we were asked to open files and failed to do so. */ /* If we were intentionally short circuited exit now */ if (!initial_workbook_open_complete) { initial_workbook_open_complete = TRUE; if (!opened_workbook) { gint n_of_sheets = gnm_conf_get_core_workbook_n_sheet (); wbc_gtk_new (NULL, workbook_new_with_sheets (n_of_sheets), NULL, geometry); } if (immediate_exit_flag) { GSList *l; for (l = wbcgs_to_kill; l; l = l->next) g_idle_add ((GSourceFunc)cb_kill_wbcg, l->data); } g_signal_connect (gnm_app_get_app (), "workbook_removed", G_CALLBACK (cb_workbook_removed), NULL); gnm_io_context_gtk_discharge_splash (GNM_IO_CONTEXT_GTK (ioc)); g_object_unref (ioc); g_idle_add ((GSourceFunc)pathetic_qt_workaround, NULL); gtk_main (); } else { g_object_unref (ioc); g_slist_foreach (wbcgs_to_kill, (GFunc)cb_kill_wbcg, NULL); } g_slist_free (wbcgs_to_kill); gnumeric_arg_shutdown (); store_plugin_state (); gnm_shutdown (); #if defined(G_OS_WIN32) if (has_console) { close(1); close(2); FreeConsole(); } #endif gnm_pre_parse_shutdown (); go_component_set_default_command_context (NULL); /* * This helps finding leaks. We might want it in developent * only. */ if (with_gui && gnm_debug_flag ("close-displays")) { GSList *displays; gdk_flush(); while (g_main_context_iteration (NULL, FALSE)) ;/* nothing */ displays = gdk_display_manager_list_displays (gdk_display_manager_get ()); g_slist_foreach (displays, (GFunc)gdk_display_close, NULL); g_slist_free (displays); } return 0; }
static VALUE rg_displays(VALUE self) { return GOBJGSLIST2RVAL_FREE(gdk_display_manager_list_displays(_SELF(self)), g_slist_free, NULL); }