/** * dialogs_restore_dialog: * @factory: * @screen: * @monitor: * @info: * * Creates a top level widget based on the given session info object * in which other widgets later can be be put, typically also restored * from the same session info object. * * Returns: **/ static GtkWidget * dialogs_restore_dialog (GimpDialogFactory *factory, GdkScreen *screen, gint monitor, GimpSessionInfo *info) { GtkWidget *dialog; GimpCoreConfig *config = gimp_dialog_factory_get_context (factory)->gimp->config; GIMP_LOG (DIALOG_FACTORY, "restoring toplevel \"%s\" (info %p)", gimp_session_info_get_factory_entry (info)->identifier, info); dialog = gimp_dialog_factory_dialog_new (factory, screen, monitor, NULL /*ui_manager*/, gimp_session_info_get_factory_entry (info)->identifier, gimp_session_info_get_factory_entry (info)->view_size, ! GIMP_GUI_CONFIG (config)->hide_docks); g_object_set_data (G_OBJECT (dialog), GIMP_DIALOG_VISIBILITY_KEY, GINT_TO_POINTER (GIMP_GUI_CONFIG (config)->hide_docks ? GIMP_DIALOG_VISIBILITY_HIDDEN : GIMP_DIALOG_VISIBILITY_VISIBLE)); return dialog; }
static void gimp_display_shell_resolution_changed_handler (GimpImage *image, GimpDisplayShell *shell) { gimp_display_shell_scale_update (shell); if (shell->dot_for_dot) { if (shell->unit != GIMP_UNIT_PIXEL) { gimp_display_shell_rulers_update (shell); } gimp_display_shell_scaled (shell); } else { /* A resolution change has the same effect as a size change from * a display shell point of view. Force a redraw of the display * so that we don't get any display garbage. */ GimpDisplayConfig *config = shell->display->config; gboolean resize_window; /* Resize windows only in multi-window mode */ resize_window = (config->resize_windows_on_resize && ! GIMP_GUI_CONFIG (config)->single_window_mode); gimp_display_shell_scale_resize (shell, resize_window, FALSE); } }
void gimp_help_show (Gimp *gimp, const gchar *help_domain, const gchar *help_id) { GimpGuiConfig *config; g_return_if_fail (GIMP_IS_GIMP (gimp)); config = GIMP_GUI_CONFIG (gimp->config); if (config->use_help) { GimpIdleHelp *idle_help = g_slice_new0 (GimpIdleHelp); idle_help->gimp = gimp; if (help_domain && strlen (help_domain)) idle_help->help_domain = g_strdup (help_domain); idle_help->help_locales = gimp_help_get_locales (config); if (help_id && strlen (help_id)) idle_help->help_id = g_strdup (help_id); g_idle_add ((GSourceFunc) gimp_idle_help, idle_help); if (gimp->be_verbose) g_print ("HELP: request for help-id '%s' from help-domain '%s'\n", help_id ? help_id : "(null)", help_domain ? help_domain : "(null)"); } }
void file_menu_setup (GimpUIManager *manager, const gchar *ui_path) { GtkUIManager *ui_manager; gint n_entries; guint merge_id; gint i; g_return_if_fail (GIMP_IS_UI_MANAGER (manager)); g_return_if_fail (ui_path != NULL); ui_manager = GTK_UI_MANAGER (manager); n_entries = GIMP_GUI_CONFIG (manager->gimp->config)->last_opened_size; merge_id = gtk_ui_manager_new_merge_id (ui_manager); for (i = 0; i < n_entries; i++) { gchar *action_name; gchar *action_path; action_name = g_strdup_printf ("file-open-recent-%02d", i + 1); action_path = g_strdup_printf ("%s/File/Open Recent/Files", ui_path); gtk_ui_manager_add_ui (ui_manager, merge_id, action_path, action_name, action_name, GTK_UI_MANAGER_MENUITEM, FALSE); g_free (action_name); g_free (action_path); } }
/** * gimp_display_shell_scale_set_dot_for_dot: * @shell: the #GimpDisplayShell * @dot_for_dot: whether "Dot for Dot" should be enabled * * If @dot_for_dot is set to %TRUE then the "Dot for Dot" mode (where image and * screen pixels are of the same size) is activated. Dually, the mode is * disabled if @dot_for_dot is %FALSE. **/ void gimp_display_shell_scale_set_dot_for_dot (GimpDisplayShell *shell, gboolean dot_for_dot) { g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); if (dot_for_dot != shell->dot_for_dot) { GimpDisplayConfig *config = shell->display->config; gboolean resize_window; /* Resize windows only in multi-window mode */ resize_window = (config->resize_windows_on_zoom && ! GIMP_GUI_CONFIG (config)->single_window_mode); /* freeze the active tool */ gimp_display_shell_pause (shell); shell->dot_for_dot = dot_for_dot; gimp_display_shell_scale_update (shell); gimp_display_shell_scale_resize (shell, resize_window, FALSE); /* re-enable the active tool */ gimp_display_shell_resume (shell); } }
static GimpObject * gui_get_window_strategy (Gimp *gimp) { if (GIMP_GUI_CONFIG (gimp->config)->single_window_mode) return gimp_single_window_strategy_get_singleton (); else return gimp_multi_window_strategy_get_singleton (); }
static void windows_actions_single_window_mode_notify (GimpDisplayConfig *config, GParamSpec *pspec, GimpActionGroup *group) { gimp_action_group_set_action_active (group, "windows-use-single-window-mode", GIMP_GUI_CONFIG (config)->single_window_mode); }
void session_restore (Gimp *gimp, GdkMonitor *monitor) { g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (GDK_IS_MONITOR (monitor)); gimp_dialog_factory_restore (gimp_dialog_factory_get_singleton (), monitor); /* make sure GimpImageWindow acts upon hide-docks at the right time, * see bug #678043. */ if (GIMP_GUI_CONFIG (gimp->config)->single_window_mode && GIMP_GUI_CONFIG (gimp->config)->hide_docks) { g_object_notify (G_OBJECT (gimp->config), "hide-docks"); } }
static gboolean gui_exit_callback (Gimp *gimp, gboolean force) { GimpGuiConfig *gui_config = GIMP_GUI_CONFIG (gimp->config); if (gimp->be_verbose) g_print ("EXIT: %s\n", G_STRFUNC); if (! force && gimp_displays_dirty (gimp)) { GdkScreen *screen; gint monitor; monitor = gimp_get_monitor_at_pointer (&screen); gimp_dialog_factory_dialog_raise (gimp_dialog_factory_get_singleton (), screen, monitor, "gimp-quit-dialog", -1); return TRUE; /* stop exit for now */ } gimp->message_handler = GIMP_CONSOLE; gui_unique_exit (); if (gui_config->save_session_info) session_save (gimp, FALSE); color_history_save (gimp); if (gui_config->save_accels) menus_save (gimp, FALSE); if (gui_config->save_device_status) gimp_devices_save (gimp, FALSE); if (TRUE /* gui_config->save_controllers */) gimp_controllers_save (gimp); g_signal_handlers_disconnect_by_func (gimp_get_user_context (gimp), gui_display_changed, gimp); gimp_displays_delete (gimp); gimp_tools_save (gimp, gui_config->save_tool_options, FALSE); gimp_tools_exit (gimp); gimp_language_store_parser_clean (); return FALSE; /* continue exiting */ }
void gimp_mybrush_register (Gimp *gimp, GimpPaintRegisterCallback callback) { if (GIMP_GUI_CONFIG (gimp->config)->playground_mybrush_tool) (* callback) (gimp, GIMP_TYPE_MYBRUSH, GIMP_TYPE_MYBRUSH_OPTIONS, "gimp-mybrush", _("Mybrush"), "gimp-tool-mybrush"); }
void session_save (Gimp *gimp, gboolean always_save) { GimpConfigWriter *writer; gchar *filename; GError *error = NULL; g_return_if_fail (GIMP_IS_GIMP (gimp)); if (sessionrc_deleted && ! always_save) return; filename = session_filename (gimp); if (gimp->be_verbose) g_print ("Writing '%s'\n", gimp_filename_to_utf8 (filename)); writer = gimp_config_writer_new_file (filename, TRUE, "GIMP sessionrc\n\n" "This file takes session-specific info " "(that is info, you want to keep between " "two GIMP sessions). You are not supposed " "to edit it manually, but of course you " "can do. The sessionrc will be entirely " "rewritten every time you quit GIMP. " "If this file isn't found, defaults are " "used.", NULL); g_free (filename); if (!writer) return; gimp_dialog_factories_session_save (writer); gimp_config_writer_linefeed (writer); /* save last tip shown */ gimp_config_writer_open (writer, "last-tip-shown"); gimp_config_writer_printf (writer, "%d", GIMP_GUI_CONFIG (gimp->config)->last_tip + 1); gimp_config_writer_close (writer); if (! gimp_config_writer_finish (writer, "end of sessionrc", &error)) { gimp_message (gimp, NULL, GIMP_MESSAGE_ERROR, "%s", error->message); g_clear_error (&error); } sessionrc_deleted = FALSE; }
static void gimp_gui_config_finalize (GObject *object) { GimpGuiConfig *gui_config = GIMP_GUI_CONFIG (object); g_free (gui_config->theme_path); g_free (gui_config->theme); g_free (gui_config->help_locales); g_free (gui_config->web_browser); g_free (gui_config->user_manual_online_uri); G_OBJECT_CLASS (parent_class)->finalize (object); }
void windows_actions_update (GimpActionGroup *group, gpointer data) { GimpGuiConfig *config = GIMP_GUI_CONFIG (group->gimp->config); #define SET_ACTIVE(action,condition) \ gimp_action_group_set_action_active (group, action, (condition) != 0) SET_ACTIVE ("windows-use-single-window-mode", config->single_window_mode); SET_ACTIVE ("windows-hide-docks", config->hide_docks); #undef SET_ACTIVE }
void windows_use_single_window_mode_cmd_callback (GtkAction *action, gpointer data) { gboolean active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); Gimp *gimp; return_if_no_gimp (gimp, data); if (GIMP_GUI_CONFIG (gimp->config)->single_window_mode == active) return; g_object_set (gimp->config, "single-window-mode", active, NULL); }
void windows_hide_docks_cmd_callback (GtkAction *action, gpointer data) { gboolean active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)); Gimp *gimp; return_if_no_gimp (gimp, data); if (GIMP_GUI_CONFIG (gimp->config)->hide_docks == active) return; g_object_set (gimp->config, "hide-docks", active, NULL); }
void gimp_action_history_exit (Gimp *gimp) { GimpGuiConfig *config; GimpActionHistoryItem *item; GList *actions; GFile *file; GimpConfigWriter *writer; gint min_count = 0; gint i; g_return_if_fail (GIMP_IS_GIMP (gimp)); config = GIMP_GUI_CONFIG (gimp->config); /* If we have more items than current history size, trim the history * and move down all count so that 1 is lower. */ item = g_list_nth_data (history.items, config->action_history_size); if (item) min_count = item->count - 1; file = gimp_directory_file (GIMP_ACTION_HISTORY_FILENAME, NULL); if (gimp->be_verbose) g_print ("Writing '%s'\n", gimp_file_get_utf8_name (file)); writer = gimp_config_writer_new_gfile (file, TRUE, "GIMP action-history", NULL); g_object_unref (file); for (actions = history.items, i = 0; actions && i < config->action_history_size; actions = g_list_next (actions), i++) { item = actions->data; gimp_config_writer_open (writer, "history-item"); gimp_config_writer_string (writer, item->action_name); gimp_config_writer_printf (writer, "%d", item->count - min_count); gimp_config_writer_close (writer); } gimp_config_writer_finish (writer, "end of action-history", NULL); gimp_action_history_clear (gimp); }
static gboolean gui_exit_after_callback (Gimp *gimp, gboolean force) { if (gimp->be_verbose) g_print ("EXIT: %s\n", G_STRFUNC); g_signal_handlers_disconnect_by_func (gimp->config, gui_show_help_button_notify, gimp); g_signal_handlers_disconnect_by_func (gimp->config, gui_user_manual_notify, gimp); g_signal_handlers_disconnect_by_func (gimp->config, gui_show_tooltips_notify, gimp); gimp_action_history_exit (GIMP_GUI_CONFIG (gimp->config)); g_object_unref (image_ui_manager); image_ui_manager = NULL; g_object_unref (ui_configurer); ui_configurer = NULL; session_exit (gimp); menus_exit (gimp); actions_exit (gimp); gimp_render_exit (gimp); gimp_controllers_exit (gimp); gimp_devices_exit (gimp); dialogs_exit (gimp); g_signal_handlers_disconnect_by_func (gimp, G_CALLBACK (gui_global_buffer_changed), NULL); gimp_clipboard_exit (gimp); themes_exit (gimp); g_type_class_unref (g_type_class_peek (GIMP_TYPE_COLOR_SELECT)); return FALSE; /* continue exiting */ }
void gimp_seamless_clone_tool_register (GimpToolRegisterCallback callback, gpointer data) { /* we should not know that "data" is a Gimp*, but what the heck this * is experimental playground stuff */ if (GIMP_GUI_CONFIG (GIMP (data)->config)->playground_seamless_clone_tool) (* callback) (GIMP_TYPE_SEAMLESS_CLONE_TOOL, GIMP_TYPE_SEAMLESS_CLONE_OPTIONS, gimp_seamless_clone_options_gui, 0, "gimp-seamless-clone-tool", _("Seamless Clone"), _("Seamless Clone: Seamlessly paste one image into another"), N_("_Seamless Clone"), NULL, NULL, GIMP_HELP_TOOL_SEAMLESS_CLONE, GIMP_ICON_TOOL_SEAMLESS_CLONE, data); }
void gimp_n_point_deformation_tool_register (GimpToolRegisterCallback callback, gpointer data) { /* we should not know that "data" is a Gimp*, but what the heck this * is experimental playground stuff */ if (GIMP_GUI_CONFIG (GIMP (data)->config)->playground_npd_tool) (* callback) (GIMP_TYPE_N_POINT_DEFORMATION_TOOL, GIMP_TYPE_N_POINT_DEFORMATION_OPTIONS, gimp_n_point_deformation_options_gui, 0, "gimp-n-point-deformation-tool", _("N-Point Deformation"), _("N-Point Deformation Tool: Rubber-like deformation of " "image using points"), N_("_N-Point Deformation"), "<shift>N", NULL, GIMP_HELP_TOOL_N_POINT_DEFORMATION, GIMP_STOCK_TOOL_N_POINT_DEFORMATION, data); }
static gboolean gimp_idle_help (GimpIdleHelp *idle_help) { GimpGuiConfig *config = GIMP_GUI_CONFIG (idle_help->gimp->config); const gchar *procedure_name = NULL; #ifdef GIMP_HELP_DEBUG g_printerr ("Help Domain: %s\n", idle_help->help_domain ? idle_help->help_domain : "NULL"); g_printerr ("Help ID: %s\n\n", idle_help->help_id ? idle_help->help_id : "NULL"); #endif if (config->help_browser == GIMP_HELP_BROWSER_GIMP) { if (gimp_help_browser (idle_help->gimp)) procedure_name = "extension-gimp-help-browser-temp"; } if (config->help_browser == GIMP_HELP_BROWSER_WEB_BROWSER) { /* FIXME: should check for procedure availability */ procedure_name = "plug-in-web-browser"; } if (procedure_name) gimp_help_call (idle_help->gimp, procedure_name, idle_help->help_domain, idle_help->help_locales, idle_help->help_id); g_free (idle_help->help_domain); g_free (idle_help->help_locales); g_free (idle_help->help_id); g_slice_free (GimpIdleHelp, idle_help); return FALSE; }
void themes_init (Gimp *gimp) { GimpGuiConfig *config; gchar *themerc; g_return_if_fail (GIMP_IS_GIMP (gimp)); config = GIMP_GUI_CONFIG (gimp->config); themes_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); if (config->theme_path) { gchar *path; path = gimp_config_path_expand (config->theme_path, TRUE, NULL); gimp_datafiles_read_directories (path, G_FILE_TEST_IS_DIR, themes_directories_foreach, gimp); g_free (path); } themes_apply_theme (gimp, config->theme); themerc = gimp_personal_rc_file ("themerc"); gtk_rc_parse (themerc); g_free (themerc); g_signal_connect (config, "notify::theme", G_CALLBACK (themes_theme_change_notify), gimp); }
static void gimp_image_map_tool_commit (GimpImageMapTool *im_tool) { GimpTool *tool = GIMP_TOOL (im_tool); if (im_tool->gui) gimp_tool_gui_hide (im_tool->gui); if (im_tool->image_map) { GimpImageMapOptions *options = GIMP_IMAGE_MAP_TOOL_GET_OPTIONS (tool); gimp_tool_control_push_preserve (tool->control, TRUE); if (! options->preview) gimp_image_map_apply (im_tool->image_map, NULL); gimp_image_map_commit (im_tool->image_map, GIMP_PROGRESS (tool), TRUE); g_object_unref (im_tool->image_map); im_tool->image_map = NULL; gimp_tool_control_pop_preserve (tool->control); gimp_image_map_tool_remove_guide (im_tool); gimp_image_flush (gimp_display_get_image (tool->display)); if (im_tool->config && im_tool->settings_box) { GimpGuiConfig *config = GIMP_GUI_CONFIG (tool->tool_info->gimp->config); gimp_settings_box_add_current (GIMP_SETTINGS_BOX (im_tool->settings_box), config->image_map_tool_max_recent); } } tool->display = NULL; tool->drawable = NULL; }
void themes_init (Gimp *gimp) { GimpGuiConfig *config; g_return_if_fail (GIMP_IS_GIMP (gimp)); config = GIMP_GUI_CONFIG (gimp->config); /* Check for theme extensions. */ themes_theme_paths_notify (gimp->extension_manager, NULL, gimp); g_signal_connect (gimp->extension_manager, "notify::theme-paths", G_CALLBACK (themes_theme_paths_notify), gimp); themes_style_provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ()); /* Use GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1 so theme files * override default styles provided by widgets themselves. */ gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), themes_style_provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1); g_object_unref (themes_style_provider); g_signal_connect (config, "notify::theme", G_CALLBACK (themes_theme_change_notify), gimp); g_signal_connect (config, "notify::prefer-dark-theme", G_CALLBACK (themes_theme_change_notify), gimp); g_signal_connect (config, "notify::prefer-symbolic-icons", G_CALLBACK (themes_theme_change_notify), gimp); themes_theme_change_notify (config, NULL, gimp); }
/* Search all history actions which match "keyword" with function * match_func(action, keyword). * * @return a list of GtkAction*, to free with: * g_list_free_full (result, (GDestroyNotify) g_object_unref); */ GList * gimp_action_history_search (Gimp *gimp, GimpActionMatchFunc match_func, const gchar *keyword) { GimpGuiConfig *config; GimpUIManager *manager; GList *actions; GList *result = NULL; gint i; g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL); g_return_val_if_fail (match_func != NULL, NULL); config = GIMP_GUI_CONFIG (gimp->config); manager = gimp_ui_managers_from_name ("<Image>")->data; for (actions = history.items, i = 0; actions && i < config->action_history_size; actions = g_list_next (actions), i++) { GimpActionHistoryItem *item = actions->data; GtkAction *action; action = gimp_ui_manager_find_action (manager, NULL, item->action_name); if (action == NULL) continue; if (! gtk_action_is_sensitive (action) && ! config->search_show_unavailable) continue; if (match_func (action, keyword, NULL, gimp)) result = g_list_prepend (result, g_object_ref (action)); } return g_list_reverse (result); }
void gimp_mybrush_tool_register (GimpToolRegisterCallback callback, gpointer data) { /* we should not know that "data" is a Gimp*, but what the heck this * is experimental playground stuff */ if (GIMP_GUI_CONFIG (GIMP (data)->config)->playground_mybrush_tool) (* callback) (GIMP_TYPE_MYBRUSH_TOOL, GIMP_TYPE_MYBRUSH_OPTIONS, gimp_mybrush_options_gui, GIMP_CONTEXT_FOREGROUND_MASK | GIMP_CONTEXT_BACKGROUND_MASK | GIMP_CONTEXT_OPACITY_MASK | GIMP_CONTEXT_PAINT_MODE_MASK, "gimp-mybrush-tool", _("MyPaint Brush"), _("MyPaint Brush Tool: Use MyPaint brushes in GIMP"), N_("M_yPaint Brush"), "Y", NULL, GIMP_HELP_TOOL_MYBRUSH, GIMP_STOCK_TOOL_MYBRUSH, data); }
static void image_scale_callback (GtkWidget *widget, GimpViewable *viewable, gint width, gint height, GimpUnit unit, GimpInterpolationType interpolation, gdouble xresolution, gdouble yresolution, GimpUnit resolution_unit, gpointer data) { ImageScaleDialog *dialog = data; GimpImage *image = GIMP_IMAGE (viewable); GimpImageScaleCheckType scale_check; gint64 max_memsize; gint64 new_memsize; dialog->width = width; dialog->height = height; dialog->unit = unit; dialog->interpolation = interpolation; dialog->xresolution = xresolution; dialog->yresolution = yresolution; dialog->resolution_unit = resolution_unit; gtk_widget_set_sensitive (widget, FALSE); max_memsize = GIMP_GUI_CONFIG (image->gimp->config)->max_new_image_size; scale_check = gimp_image_scale_check (image, width, height, max_memsize, &new_memsize); switch (scale_check) { case GIMP_IMAGE_SCALE_TOO_BIG: image_scale_confirm_large (dialog, new_memsize, max_memsize); break; case GIMP_IMAGE_SCALE_TOO_SMALL: image_scale_confirm_small (dialog); break; case GIMP_IMAGE_SCALE_OK: gtk_widget_hide (widget); dialog->callback (dialog->dialog, GIMP_VIEWABLE (dialog->image), dialog->width, dialog->height, dialog->unit, dialog->interpolation, dialog->xresolution, dialog->yresolution, dialog->resolution_unit, dialog->user_data); gtk_widget_destroy (widget); /* remember the last used unit */ g_object_set_data (G_OBJECT (image), "scale-dialog-unit", GINT_TO_POINTER (unit)); break; } }
void file_actions_setup (GimpActionGroup *group) { GimpEnumActionEntry *entries; gint n_entries; gint i; gimp_action_group_add_actions (group, "file-action", file_actions, G_N_ELEMENTS (file_actions)); gimp_action_group_add_enum_actions (group, "file-action", file_save_actions, G_N_ELEMENTS (file_save_actions), G_CALLBACK (file_save_cmd_callback)); n_entries = GIMP_GUI_CONFIG (group->gimp->config)->last_opened_size; entries = g_new0 (GimpEnumActionEntry, n_entries); for (i = 0; i < n_entries; i++) { entries[i].name = g_strdup_printf ("file-open-recent-%02d", i + 1); entries[i].icon_name = "document-open"; entries[i].label = entries[i].name; entries[i].tooltip = NULL; entries[i].value = i; entries[i].value_variable = FALSE; if (i < 9) entries[i].accelerator = g_strdup_printf ("<primary>%d", i + 1); else if (i == 9) entries[i].accelerator = g_strdup ("<primary>0"); else entries[i].accelerator = NULL; } gimp_action_group_add_enum_actions (group, NULL, entries, n_entries, G_CALLBACK (file_open_recent_cmd_callback)); for (i = 0; i < n_entries; i++) { GtkAction *action; gimp_action_group_set_action_visible (group, entries[i].name, FALSE); gimp_action_group_set_action_always_show_image (group, entries[i].name, TRUE); action = gtk_action_group_get_action (GTK_ACTION_GROUP (group), entries[i].name); g_object_set (action, "context", gimp_get_user_context (group->gimp), NULL); g_free ((gchar *) entries[i].name); if (entries[i].accelerator) g_free ((gchar *) entries[i].accelerator); } g_free (entries); g_signal_connect_object (group->gimp->documents, "add", G_CALLBACK (file_actions_last_opened_update), group, 0); g_signal_connect_object (group->gimp->documents, "remove", G_CALLBACK (file_actions_last_opened_update), group, 0); g_signal_connect_object (group->gimp->documents, "reorder", G_CALLBACK (file_actions_last_opened_reorder), group, 0); file_actions_last_opened_update (group->gimp->documents, NULL, group); /* also listen to image adding/removal so we catch the case where * the last image is closed but its display stays open. */ g_signal_connect_object (group->gimp->images, "add", G_CALLBACK (file_actions_close_all_update), group, 0); g_signal_connect_object (group->gimp->images, "remove", G_CALLBACK (file_actions_close_all_update), group, 0); file_actions_close_all_update (group->gimp->displays, NULL, group); }
void menus_init (Gimp *gimp, GimpActionFactory *action_factory) { g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (GIMP_IS_ACTION_FACTORY (action_factory)); g_return_if_fail (global_menu_factory == NULL); /* We need to make sure the property is installed before using it */ g_type_class_ref (GTK_TYPE_MENU); menus_can_change_accels (GIMP_GUI_CONFIG (gimp->config)); g_signal_connect (gimp->config, "notify::can-change-accels", G_CALLBACK (menus_can_change_accels), NULL); global_menu_factory = gimp_menu_factory_new (gimp, action_factory); gimp_menu_factory_manager_register (global_menu_factory, "<Image>", "file", "context", "debug", "help", "edit", "select", "view", "image", "drawable", "layers", "channels", "vectors", "tools", "dialogs", "windows", "plug-in", "filters", "quick-mask", NULL, "/image-menubar", "image-menu.xml", image_menu_setup, "/dummy-menubar", "image-menu.xml", image_menu_setup, "/quick-mask-popup", "quick-mask-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Toolbox>", "file", "context", "help", "edit", "select", "view", "image", "drawable", "layers", "channels", "vectors", "tools", "windows", "dialogs", "plug-in", "filters", "quick-mask", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Dock>", "file", "context", "edit", "select", "view", "image", "drawable", "layers", "channels", "vectors", "tools", "windows", "dialogs", "plug-in", "quick-mask", "dock", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Layers>", "layers", "plug-in", "filters", NULL, "/layers-popup", "layers-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Channels>", "channels", "plug-in", "filters", NULL, "/channels-popup", "channels-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Vectors>", "vectors", "plug-in", NULL, "/vectors-popup", "vectors-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Colormap>", "colormap", "plug-in", NULL, "/colormap-popup", "colormap-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Dockable>", "dockable", "dock", NULL, "/dockable-popup", "dockable-menu.xml", dockable_menu_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Brushes>", "brushes", "plug-in", NULL, "/brushes-popup", "brushes-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Dynamics>", "dynamics", "plug-in", NULL, "/dynamics-popup", "dynamics-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Patterns>", "patterns", "plug-in", NULL, "/patterns-popup", "patterns-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Gradients>", "gradients", "plug-in", NULL, "/gradients-popup", "gradients-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Palettes>", "palettes", "plug-in", NULL, "/palettes-popup", "palettes-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<ToolPresets>", "tool-presets", "plug-in", NULL, "/tool-presets-popup", "tool-presets-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Fonts>", "fonts", "plug-in", NULL, "/fonts-popup", "fonts-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Buffers>", "buffers", "plug-in", NULL, "/buffers-popup", "buffers-menu.xml", plug_in_menus_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Documents>", "documents", NULL, "/documents-popup", "documents-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Templates>", "templates", NULL, "/templates-popup", "templates-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Images>", "images", NULL, "/images-popup", "images-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<BrushEditor>", "brush-editor", NULL, "/brush-editor-popup", "brush-editor-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<DynamicsEditor>", "dynamics-editor", NULL, "/dynamics-editor-popup", "dynamics-editor-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<GradientEditor>", "gradient-editor", NULL, "/gradient-editor-popup", "gradient-editor-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<PaletteEditor>", "palette-editor", NULL, "/palette-editor-popup", "palette-editor-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<ToolPresetEditor>", "tool-preset-editor", NULL, "/tool-preset-editor-popup", "tool-preset-editor-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Selection>", "select", "vectors", NULL, "/selection-popup", "selection-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<NavigationEditor>", "view", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<Undo>", "edit", NULL, "/undo-popup", "undo-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<ErrorConsole>", "error-console", NULL, "/error-console-popup", "error-console-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<ToolOptions>", "tool-options", NULL, "/tool-options-popup", "tool-options-menu.xml", tool_options_menu_setup, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<TextEditor>", "text-editor", NULL, "/text-editor-toolbar", "text-editor-toolbar.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<TextTool>", "text-tool", NULL, "/text-tool-popup", "text-tool-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<CursorInfo>", "cursor-info", NULL, "/cursor-info-popup", "cursor-info-menu.xml", NULL, NULL); gimp_menu_factory_manager_register (global_menu_factory, "<SamplePoints>", "sample-points", NULL, "/sample-points-popup", "sample-points-menu.xml", NULL, NULL); }
static void gimp_move_tool_button_release (GimpTool *tool, const GimpCoords *coords, guint32 time, GdkModifierType state, GimpButtonReleaseType release_type, GimpDisplay *display) { GimpMoveTool *move = GIMP_MOVE_TOOL (tool); GimpGuiConfig *config = GIMP_GUI_CONFIG (display->gimp->config); GimpDisplayShell *shell = gimp_display_get_shell (display); GimpImage *image = gimp_display_get_image (display); if (gimp_tool_control_is_active (tool->control)) gimp_tool_control_halt (tool->control); if (move->moving_guide) { gboolean delete_guide = FALSE; gint x, y, width, height; gimp_tool_pop_status (tool, display); gimp_tool_control_set_scroll_lock (tool->control, FALSE); gimp_tool_control_set_precision (tool->control, GIMP_CURSOR_PRECISION_PIXEL_CENTER); gimp_draw_tool_stop (GIMP_DRAW_TOOL (tool)); if (release_type == GIMP_BUTTON_RELEASE_CANCEL) { move->moving_guide = FALSE; move->guide_position = GUIDE_POSITION_INVALID; move->guide_orientation = GIMP_ORIENTATION_UNKNOWN; gimp_display_shell_selection_resume (shell); return; } gimp_display_shell_untransform_viewport (shell, &x, &y, &width, &height); switch (move->guide_orientation) { case GIMP_ORIENTATION_HORIZONTAL: if ((move->guide_position < y) || (move->guide_position > (y + height))) delete_guide = TRUE; break; case GIMP_ORIENTATION_VERTICAL: if ((move->guide_position < x) || (move->guide_position > (x + width))) delete_guide = TRUE; break; default: break; } if (delete_guide) { if (move->guide) { gimp_image_remove_guide (image, move->guide, TRUE); move->guide = NULL; } } else { if (move->guide) { gimp_image_move_guide (image, move->guide, move->guide_position, TRUE); } else { switch (move->guide_orientation) { case GIMP_ORIENTATION_HORIZONTAL: move->guide = gimp_image_add_hguide (image, move->guide_position, TRUE); break; case GIMP_ORIENTATION_VERTICAL: move->guide = gimp_image_add_vguide (image, move->guide_position, TRUE); break; default: g_assert_not_reached (); } } } gimp_display_shell_selection_resume (shell); gimp_image_flush (image); move->moving_guide = FALSE; move->guide_position = GUIDE_POSITION_INVALID; move->guide_orientation = GIMP_ORIENTATION_UNKNOWN; if (move->guide) gimp_draw_tool_start (GIMP_DRAW_TOOL (tool), display); } else { gboolean flush = FALSE; if (! config->move_tool_changes_active || (release_type == GIMP_BUTTON_RELEASE_CANCEL)) { if (move->old_active_layer) { gimp_image_set_active_layer (image, move->old_active_layer); move->old_active_layer = NULL; flush = TRUE; } if (move->old_active_vectors) { gimp_image_set_active_vectors (image, move->old_active_vectors); move->old_active_vectors = NULL; flush = TRUE; } } if (release_type != GIMP_BUTTON_RELEASE_CANCEL) { if (move->floating_layer) { floating_sel_anchor (move->floating_layer); flush = TRUE; } } if (flush) gimp_image_flush (image); } }
static void gimp_display_shell_size_changed_detailed_handler (GimpImage *image, gint previous_origin_x, gint previous_origin_y, gint previous_width, gint previous_height, GimpDisplayShell *shell) { GimpDisplayConfig *config = shell->display->config; gboolean resize_window; /* Resize windows only in multi-window mode */ resize_window = (config->resize_windows_on_resize && ! GIMP_GUI_CONFIG (config)->single_window_mode); if (resize_window) { GimpImageWindow *window = gimp_display_shell_get_window (shell); if (window && gimp_image_window_get_active_shell (window) == shell) { /* If the window is resized just center the image in it when it * has change size */ gimp_image_window_shrink_wrap (window, FALSE); } } else { GimpImage *image = gimp_display_get_image (shell->display); gint new_width = gimp_image_get_width (image); gint new_height = gimp_image_get_height (image); gint scaled_previous_origin_x; gint scaled_previous_origin_y; gboolean horizontally; gboolean vertically; scaled_previous_origin_x = SCALEX (shell, previous_origin_x); scaled_previous_origin_y = SCALEY (shell, previous_origin_y); horizontally = (SCALEX (shell, previous_width) > shell->disp_width && SCALEX (shell, new_width) <= shell->disp_width); vertically = (SCALEY (shell, previous_height) > shell->disp_height && SCALEY (shell, new_height) <= shell->disp_height); gimp_display_shell_scroll_set_offset (shell, shell->offset_x + scaled_previous_origin_x, shell->offset_y + scaled_previous_origin_y); gimp_display_shell_scroll_center_image (shell, horizontally, vertically); /* The above calls might not lead to a call to * gimp_display_shell_scroll_clamp_and_update() and * gimp_display_shell_expose_full() in all cases because when * scaling the old and new scroll offset might be the same. * * We need them to be called in all cases, so simply call them * explicitly here at the end */ gimp_display_shell_scroll_clamp_and_update (shell); gimp_display_shell_expose_full (shell); } }