summaryrefslogtreecommitdiffstats
path: root/app/dialogs/dialogs.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--app/dialogs/dialogs.c749
1 files changed, 749 insertions, 0 deletions
diff --git a/app/dialogs/dialogs.c b/app/dialogs/dialogs.c
new file mode 100644
index 0000000..064f2c4
--- /dev/null
+++ b/app/dialogs/dialogs.c
@@ -0,0 +1,749 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
+ * dialogs.c
+ * Copyright (C) 2010 Martin Nordholts <martinn@src.gnome.org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpbase/gimpbase.h"
+#include "libgimpconfig/gimpconfig.h"
+#include "libgimpwidgets/gimpwidgets.h"
+
+#include "dialogs-types.h"
+
+#include "config/gimpguiconfig.h"
+
+#include "display/gimpdisplay.h"
+#include "display/gimpdisplayshell.h"
+
+#include "core/gimp.h"
+#include "core/gimpcontext.h"
+#include "core/gimplist.h"
+
+#include "widgets/gimpdialogfactory.h"
+#include "widgets/gimpdockwindow.h"
+#include "widgets/gimphelp-ids.h"
+#include "widgets/gimpmenufactory.h"
+#include "widgets/gimpsessioninfo.h"
+#include "widgets/gimpsessioninfo-aux.h"
+#include "widgets/gimpsessionmanaged.h"
+#include "widgets/gimptoolbox.h"
+
+#include "dialogs.h"
+#include "dialogs-constructors.h"
+
+#include "gimp-log.h"
+
+#include "gimp-intl.h"
+
+
+GimpContainer *global_recent_docks = NULL;
+
+
+#define FOREIGN(id, singleton, remember_size) \
+ { id /* identifier */, \
+ NULL /* name */, \
+ NULL /* blurb */, \
+ NULL /* icon_name */, \
+ NULL /* help_id */, \
+ NULL /* new_func */, \
+ dialogs_restore_dialog /* restore_func */, \
+ 0 /* view_size */, \
+ singleton /* singleton */, \
+ TRUE /* session_managed */, \
+ remember_size /* remember_size */, \
+ FALSE /* remember_if_open */, \
+ TRUE /* hideable */, \
+ FALSE /* image_window */, \
+ FALSE /* dockable */}
+
+#define IMAGE_WINDOW(id, singleton, remember_size) \
+ { id /* identifier */, \
+ NULL /* name */, \
+ NULL /* blurb */, \
+ NULL /* icon_name */, \
+ NULL /* help_id */, \
+ NULL /* new_func */, \
+ dialogs_restore_window /* restore_func */, \
+ 0 /* view_size */, \
+ singleton /* singleton */, \
+ TRUE /* session_managed */, \
+ remember_size /* remember_size */, \
+ TRUE /* remember_if_open */, \
+ FALSE /* hideable */, \
+ TRUE /* image_window */, \
+ FALSE /* dockable */}
+
+#define TOPLEVEL(id, new_func, singleton, session_managed, remember_size) \
+ { id /* identifier */, \
+ NULL /* name */, \
+ NULL /* blurb */, \
+ NULL /* icon_name */, \
+ NULL /* help_id */, \
+ new_func /* new_func */, \
+ dialogs_restore_dialog /* restore_func */, \
+ 0 /* view_size */, \
+ singleton /* singleton */, \
+ session_managed /* session_managed */, \
+ remember_size /* remember_size */, \
+ FALSE /* remember_if_open */, \
+ TRUE /* hideable */, \
+ FALSE /* image_window */, \
+ FALSE /* dockable */}
+
+#define DOCKABLE(id, name, blurb, icon_name, help_id, new_func, view_size, singleton) \
+ { id /* identifier */, \
+ name /* name */, \
+ blurb /* blurb */, \
+ icon_name /* icon_name */, \
+ help_id /* help_id */, \
+ new_func /* new_func */, \
+ NULL /* restore_func */, \
+ view_size /* view_size */, \
+ singleton /* singleton */, \
+ FALSE /* session_managed */, \
+ FALSE /* remember_size */, \
+ TRUE /* remember_if_open */, \
+ TRUE /* hideable */, \
+ FALSE /* image_window */, \
+ TRUE /* dockable */}
+
+#define DOCK(id, new_func) \
+ { id /* identifier */, \
+ NULL /* name */, \
+ NULL /* blurb */, \
+ NULL /* icon_name */, \
+ NULL /* help_id */, \
+ new_func /* new_func */, \
+ dialogs_restore_dialog /* restore_func */, \
+ 0 /* view_size */, \
+ FALSE /* singleton */, \
+ FALSE /* session_managed */, \
+ FALSE /* remember_size */, \
+ FALSE /* remember_if_open */, \
+ TRUE /* hideable */, \
+ FALSE /* image_window */, \
+ FALSE /* dockable */}
+
+#define DOCK_WINDOW(id, new_func) \
+ { id /* identifier */, \
+ NULL /* name */, \
+ NULL /* blurb */, \
+ NULL /* icon_name */, \
+ NULL /* help_id */, \
+ new_func /* new_func */, \
+ dialogs_restore_dialog /* restore_func */, \
+ 0 /* view_size */, \
+ FALSE /* singleton */, \
+ TRUE /* session_managed */, \
+ TRUE /* remember_size */, \
+ TRUE /* remember_if_open */, \
+ TRUE /* hideable */, \
+ FALSE /* image_window */, \
+ FALSE /* dockable */}
+
+#define LISTGRID(id, new_func, name, blurb, icon_name, help_id, view_size) \
+ { "gimp-"#id"-list" /* identifier */, \
+ name /* name */, \
+ blurb /* blurb */, \
+ icon_name /* icon_name */, \
+ help_id /* help_id */, \
+ dialogs_##new_func##_list_view_new /* new_func */, \
+ NULL /* restore_func */, \
+ view_size /* view_size */, \
+ FALSE /* singleton */, \
+ FALSE /* session_managed */, \
+ FALSE /* remember_size */, \
+ TRUE /* remember_if_open */, \
+ TRUE /* hideable */, \
+ FALSE /* image_window */, \
+ TRUE /* dockable */}, \
+ { "gimp-"#id"-grid" /* identifier */, \
+ name /* name */, \
+ blurb /* blurb */, \
+ icon_name /* icon_name */, \
+ help_id /* help_id */, \
+ dialogs_##new_func##_grid_view_new /* new_func */, \
+ NULL /* restore_func */, \
+ view_size /* view_size */, \
+ FALSE /* singleton */, \
+ FALSE /* session_managed */, \
+ FALSE /* remember_size */, \
+ TRUE /* remember_if_open */, \
+ TRUE /* hideable */, \
+ FALSE /* image_window */, \
+ TRUE /* dockable */}
+
+#define LIST(id, new_func, name, blurb, icon_name, help_id, view_size) \
+ { "gimp-"#id"-list" /* identifier */, \
+ name /* name */, \
+ blurb /* blurb */, \
+ icon_name /* icon_name */, \
+ help_id /* help_id */, \
+ dialogs_##new_func##_list_view_new /* new_func */, \
+ NULL /* restore_func */, \
+ view_size /* view_size */, \
+ FALSE /* singleton */, \
+ FALSE /* session_managed */, \
+ FALSE /* remember_size */, \
+ TRUE /* remember_if_open */, \
+ TRUE /* hideable */, \
+ FALSE /* image_window */, \
+ TRUE /* dockable */}
+
+
+static GtkWidget * dialogs_restore_dialog (GimpDialogFactory *factory,
+ GdkScreen *screen,
+ gint monitor,
+ GimpSessionInfo *info);
+static GtkWidget * dialogs_restore_window (GimpDialogFactory *factory,
+ GdkScreen *screen,
+ gint monitor,
+ GimpSessionInfo *info);
+
+
+static const GimpDialogFactoryEntry entries[] =
+{
+ /* foreign toplevels without constructor */
+ FOREIGN ("gimp-brightness-contrast-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-color-balance-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-color-picker-tool-dialog", TRUE, TRUE),
+ FOREIGN ("gimp-colorize-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-crop-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-curves-tool-dialog", TRUE, TRUE),
+ FOREIGN ("gimp-desaturate-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-foreground-select-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-gegl-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-gradient-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-hue-saturation-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-levels-tool-dialog", TRUE, TRUE),
+ FOREIGN ("gimp-measure-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-offset-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-operation-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-posterize-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-rotate-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-scale-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-shear-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-text-tool-dialog", TRUE, TRUE),
+ FOREIGN ("gimp-threshold-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-transform-3d-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-perspective-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-unified-transform-tool-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-handle-transform-tool-dialog", TRUE, FALSE),
+
+ FOREIGN ("gimp-toolbox-color-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-gradient-editor-color-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-palette-editor-color-dialog", TRUE, FALSE),
+ FOREIGN ("gimp-colormap-editor-color-dialog", TRUE, FALSE),
+
+ FOREIGN ("gimp-controller-editor-dialog", FALSE, TRUE),
+ FOREIGN ("gimp-controller-action-dialog", FALSE, TRUE),
+
+ /* ordinary toplevels */
+ TOPLEVEL ("gimp-image-new-dialog",
+ dialogs_image_new_new, FALSE, TRUE, FALSE),
+ TOPLEVEL ("gimp-file-open-dialog",
+ dialogs_file_open_new, TRUE, TRUE, TRUE),
+ TOPLEVEL ("gimp-file-open-location-dialog",
+ dialogs_file_open_location_new, FALSE, TRUE, FALSE),
+ TOPLEVEL ("gimp-file-save-dialog",
+ dialogs_file_save_new, FALSE, TRUE, TRUE),
+ TOPLEVEL ("gimp-file-export-dialog",
+ dialogs_file_export_new, FALSE, TRUE, TRUE),
+
+ /* singleton toplevels */
+ TOPLEVEL ("gimp-preferences-dialog",
+ dialogs_preferences_get, TRUE, TRUE, TRUE),
+ TOPLEVEL ("gimp-input-devices-dialog",
+ dialogs_input_devices_get, TRUE, TRUE, FALSE),
+ TOPLEVEL ("gimp-keyboard-shortcuts-dialog",
+ dialogs_keyboard_shortcuts_get, TRUE, TRUE, TRUE),
+ TOPLEVEL ("gimp-module-dialog",
+ dialogs_module_get, TRUE, TRUE, TRUE),
+ TOPLEVEL ("gimp-palette-import-dialog",
+ dialogs_palette_import_get, TRUE, TRUE, TRUE),
+ TOPLEVEL ("gimp-tips-dialog",
+ dialogs_tips_get, TRUE, FALSE, FALSE),
+ TOPLEVEL ("gimp-about-dialog",
+ dialogs_about_get, TRUE, FALSE, FALSE),
+ TOPLEVEL ("gimp-action-search-dialog",
+ dialogs_action_search_get, TRUE, TRUE, TRUE),
+ TOPLEVEL ("gimp-error-dialog",
+ dialogs_error_get, TRUE, FALSE, FALSE),
+ TOPLEVEL ("gimp-critical-dialog",
+ dialogs_critical_get, TRUE, FALSE, FALSE),
+ TOPLEVEL ("gimp-close-all-dialog",
+ dialogs_close_all_get, TRUE, FALSE, FALSE),
+ TOPLEVEL ("gimp-quit-dialog",
+ dialogs_quit_get, TRUE, FALSE, FALSE),
+
+ /* docks */
+ DOCK ("gimp-dock",
+ dialogs_dock_new),
+ DOCK ("gimp-toolbox",
+ dialogs_toolbox_new),
+
+ /* dock windows */
+ DOCK_WINDOW ("gimp-dock-window",
+ dialogs_dock_window_new),
+ DOCK_WINDOW ("gimp-toolbox-window",
+ dialogs_toolbox_dock_window_new),
+
+ /* singleton dockables */
+ DOCKABLE ("gimp-tool-options",
+ N_("Tool Options"), NULL, GIMP_ICON_DIALOG_TOOL_OPTIONS,
+ GIMP_HELP_TOOL_OPTIONS_DIALOG,
+ dialogs_tool_options_new, 0, TRUE),
+ DOCKABLE ("gimp-device-status",
+ N_("Devices"), N_("Device Status"), GIMP_ICON_DIALOG_DEVICE_STATUS,
+ GIMP_HELP_DEVICE_STATUS_DIALOG,
+ dialogs_device_status_new, 0, TRUE),
+ DOCKABLE ("gimp-error-console",
+ N_("Errors"), N_("Error Console"), GIMP_ICON_DIALOG_WARNING,
+ GIMP_HELP_ERRORS_DIALOG,
+ dialogs_error_console_new, 0, TRUE),
+ DOCKABLE ("gimp-cursor-view",
+ N_("Pointer"), N_("Pointer Information"), GIMP_ICON_CURSOR,
+ GIMP_HELP_POINTER_INFO_DIALOG,
+ dialogs_cursor_view_new, 0, TRUE),
+ DOCKABLE ("gimp-dashboard",
+ N_("Dashboard"), N_("Dashboard"), GIMP_ICON_DIALOG_DASHBOARD,
+ GIMP_HELP_DASHBOARD_DIALOG,
+ dialogs_dashboard_new, 0, TRUE),
+
+ /* list & grid views */
+ LISTGRID (image, image,
+ N_("Images"), NULL, GIMP_ICON_DIALOG_IMAGES,
+ GIMP_HELP_IMAGE_DIALOG, GIMP_VIEW_SIZE_MEDIUM),
+ LISTGRID (brush, brush,
+ N_("Brushes"), NULL, GIMP_ICON_BRUSH,
+ GIMP_HELP_BRUSH_DIALOG, GIMP_VIEW_SIZE_MEDIUM),
+ LISTGRID (dynamics, dynamics,
+ N_("Paint Dynamics"), NULL, GIMP_ICON_DYNAMICS,
+ GIMP_HELP_DYNAMICS_DIALOG, GIMP_VIEW_SIZE_MEDIUM),
+ LISTGRID (mypaint-brush, mypaint_brush,
+ N_("MyPaint Brushes"), NULL, GIMP_ICON_MYPAINT_BRUSH,
+ GIMP_HELP_MYPAINT_BRUSH_DIALOG, GIMP_VIEW_SIZE_LARGE),
+ LISTGRID (pattern, pattern,
+ N_("Patterns"), NULL, GIMP_ICON_PATTERN,
+ GIMP_HELP_PATTERN_DIALOG, GIMP_VIEW_SIZE_MEDIUM),
+ LISTGRID (gradient, gradient,
+ N_("Gradients"), NULL, GIMP_ICON_GRADIENT,
+ GIMP_HELP_GRADIENT_DIALOG, GIMP_VIEW_SIZE_MEDIUM),
+ LISTGRID (palette, palette,
+ N_("Palettes"), NULL, GIMP_ICON_PALETTE,
+ GIMP_HELP_PALETTE_DIALOG, GIMP_VIEW_SIZE_MEDIUM),
+ LISTGRID (font, font,
+ N_("Fonts"), NULL, GIMP_ICON_FONT,
+ GIMP_HELP_FONT_DIALOG, GIMP_VIEW_SIZE_MEDIUM),
+ LISTGRID (buffer, buffer,
+ N_("Buffers"), NULL, GIMP_ICON_BUFFER,
+ GIMP_HELP_BUFFER_DIALOG, GIMP_VIEW_SIZE_MEDIUM),
+ LISTGRID (tool-preset, tool_preset,
+ N_("Tool Presets"), NULL, GIMP_ICON_TOOL_PRESET,
+ GIMP_HELP_TOOL_PRESET_DIALOG, GIMP_VIEW_SIZE_MEDIUM),
+ LISTGRID (document, document,
+ N_("History"), N_("Document History"), GIMP_ICON_DOCUMENT_OPEN_RECENT,
+ GIMP_HELP_DOCUMENT_DIALOG, GIMP_VIEW_SIZE_LARGE),
+ LISTGRID (template, template,
+ N_("Templates"), N_("Image Templates"), GIMP_ICON_TEMPLATE,
+ GIMP_HELP_TEMPLATE_DIALOG, GIMP_VIEW_SIZE_SMALL),
+
+ /* image related */
+ DOCKABLE ("gimp-layer-list",
+ N_("Layers"), NULL, GIMP_ICON_DIALOG_LAYERS,
+ GIMP_HELP_LAYER_DIALOG,
+ dialogs_layer_list_view_new, 0, FALSE),
+ DOCKABLE ("gimp-channel-list",
+ N_("Channels"), NULL, GIMP_ICON_DIALOG_CHANNELS,
+ GIMP_HELP_CHANNEL_DIALOG,
+ dialogs_channel_list_view_new, 0, FALSE),
+ DOCKABLE ("gimp-vectors-list",
+ N_("Paths"), NULL, GIMP_ICON_DIALOG_PATHS,
+ GIMP_HELP_PATH_DIALOG,
+ dialogs_vectors_list_view_new, 0, FALSE),
+ DOCKABLE ("gimp-indexed-palette",
+ N_("Colormap"), NULL, GIMP_ICON_COLORMAP,
+ GIMP_HELP_INDEXED_PALETTE_DIALOG,
+ dialogs_colormap_editor_new, 0, FALSE),
+ DOCKABLE ("gimp-histogram-editor",
+ N_("Histogram"), NULL, GIMP_ICON_HISTOGRAM,
+ GIMP_HELP_HISTOGRAM_DIALOG,
+ dialogs_histogram_editor_new, 0, FALSE),
+ DOCKABLE ("gimp-selection-editor",
+ N_("Selection"), N_("Selection Editor"), GIMP_ICON_SELECTION,
+ GIMP_HELP_SELECTION_DIALOG,
+ dialogs_selection_editor_new, 0, FALSE),
+ DOCKABLE ("gimp-symmetry-editor",
+ N_("Symmetry Painting"), NULL, GIMP_ICON_SYMMETRY,
+ GIMP_HELP_SYMMETRY_DIALOG,
+ dialogs_symmetry_editor_new, 0, FALSE),
+ DOCKABLE ("gimp-undo-history",
+ N_("Undo"), N_("Undo History"), GIMP_ICON_DIALOG_UNDO_HISTORY,
+ GIMP_HELP_UNDO_DIALOG,
+ dialogs_undo_editor_new, 0, FALSE),
+ DOCKABLE ("gimp-sample-point-editor",
+ N_("Sample Points"), N_("Sample Points"), GIMP_ICON_SAMPLE_POINT,
+ GIMP_HELP_SAMPLE_POINT_DIALOG,
+ dialogs_sample_point_editor_new, 0, FALSE),
+
+ /* display related */
+ DOCKABLE ("gimp-navigation-view",
+ N_("Navigation"), N_("Display Navigation"), GIMP_ICON_DIALOG_NAVIGATION,
+ GIMP_HELP_NAVIGATION_DIALOG,
+ dialogs_navigation_editor_new, 0, FALSE),
+
+ /* editors */
+ DOCKABLE ("gimp-color-editor",
+ N_("FG/BG"), N_("FG/BG Color"), GIMP_ICON_COLORS_DEFAULT,
+ GIMP_HELP_COLOR_DIALOG,
+ dialogs_color_editor_new, 0, FALSE),
+
+ /* singleton editors */
+ DOCKABLE ("gimp-brush-editor",
+ N_("Brush Editor"), NULL, GIMP_ICON_BRUSH,
+ GIMP_HELP_BRUSH_EDITOR_DIALOG,
+ dialogs_brush_editor_get, 0, TRUE),
+ DOCKABLE ("gimp-dynamics-editor",
+ N_("Paint Dynamics Editor"), NULL, GIMP_ICON_DYNAMICS,
+ GIMP_HELP_DYNAMICS_EDITOR_DIALOG,
+ dialogs_dynamics_editor_get, 0, TRUE),
+ DOCKABLE ("gimp-gradient-editor",
+ N_("Gradient Editor"), NULL, GIMP_ICON_GRADIENT,
+ GIMP_HELP_GRADIENT_EDITOR_DIALOG,
+ dialogs_gradient_editor_get, 0, TRUE),
+ DOCKABLE ("gimp-palette-editor",
+ N_("Palette Editor"), NULL, GIMP_ICON_PALETTE,
+ GIMP_HELP_PALETTE_EDITOR_DIALOG,
+ dialogs_palette_editor_get, 0, TRUE),
+ DOCKABLE ("gimp-tool-preset-editor",
+ N_("Tool Preset Editor"), NULL, GIMP_ICON_TOOL_PRESET,
+ GIMP_HELP_TOOL_PRESET_EDITOR_DIALOG,
+ dialogs_tool_preset_editor_get, 0, TRUE),
+
+ /* image windows */
+ IMAGE_WINDOW ("gimp-empty-image-window",
+ TRUE, TRUE),
+ IMAGE_WINDOW ("gimp-single-image-window",
+ TRUE, TRUE)
+};
+
+/**
+ * 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;
+}
+
+/**
+ * dialogs_restore_window:
+ * @factory:
+ * @screen:
+ * @monitor:
+ * @info:
+ *
+ * "restores" the image window. We don't really restore anything since
+ * the image window is created earlier, so we just look for and return
+ * the already-created image window.
+ *
+ * Returns:
+ **/
+static GtkWidget *
+dialogs_restore_window (GimpDialogFactory *factory,
+ GdkScreen *screen,
+ gint monitor,
+ GimpSessionInfo *info)
+{
+ Gimp *gimp = gimp_dialog_factory_get_context (factory)->gimp;
+ GimpDisplay *display = GIMP_DISPLAY (gimp_get_empty_display (gimp));
+ GimpDisplayShell *shell = gimp_display_get_shell (display);
+ GtkWidget *dialog;
+
+ dialog = GTK_WIDGET (gimp_display_shell_get_window (shell));
+
+ return dialog;
+}
+
+
+/* public functions */
+
+void
+dialogs_init (Gimp *gimp,
+ GimpMenuFactory *menu_factory)
+{
+ GimpDialogFactory *factory = NULL;
+ gint i = 0;
+
+ g_return_if_fail (GIMP_IS_GIMP (gimp));
+ g_return_if_fail (GIMP_IS_MENU_FACTORY (menu_factory));
+
+ factory = gimp_dialog_factory_new ("toplevel",
+ gimp_get_user_context (gimp),
+ menu_factory);
+ gimp_dialog_factory_set_singleton (factory);
+
+ for (i = 0; i < G_N_ELEMENTS (entries); i++)
+ gimp_dialog_factory_register_entry (factory,
+ entries[i].identifier,
+ gettext (entries[i].name),
+ gettext (entries[i].blurb),
+ entries[i].icon_name,
+ entries[i].help_id,
+ entries[i].new_func,
+ entries[i].restore_func,
+ entries[i].view_size,
+ entries[i].singleton,
+ entries[i].session_managed,
+ entries[i].remember_size,
+ entries[i].remember_if_open,
+ entries[i].hideable,
+ entries[i].image_window,
+ entries[i].dockable);
+
+ global_recent_docks = gimp_list_new (GIMP_TYPE_SESSION_INFO, FALSE);
+}
+
+void
+dialogs_exit (Gimp *gimp)
+{
+ g_return_if_fail (GIMP_IS_GIMP (gimp));
+
+ if (gimp_dialog_factory_get_singleton ())
+ {
+ /* run dispose manually so the factory destroys its dialogs, which
+ * might in turn directly or indirectly ref the factory
+ */
+ g_object_run_dispose (G_OBJECT (gimp_dialog_factory_get_singleton ()));
+
+ g_object_unref (gimp_dialog_factory_get_singleton ());
+ gimp_dialog_factory_set_singleton (NULL);
+ }
+
+ g_clear_object (&global_recent_docks);
+}
+
+static void
+dialogs_ensure_factory_entry_on_recent_dock (GimpSessionInfo *info)
+{
+ if (! gimp_session_info_get_factory_entry (info))
+ {
+ GimpDialogFactoryEntry *entry = NULL;
+
+ /* The recent docks container only contains session infos for
+ * dock windows
+ */
+ entry = gimp_dialog_factory_find_entry (gimp_dialog_factory_get_singleton (),
+ "gimp-dock-window");
+
+ gimp_session_info_set_factory_entry (info, entry);
+ }
+}
+
+static GFile *
+dialogs_get_dockrc_file (void)
+{
+ const gchar *basename;
+
+ basename = g_getenv ("GIMP_TESTING_DOCKRC_NAME");
+ if (! basename)
+ basename = "dockrc";
+
+ return gimp_directory_file (basename, NULL);
+}
+
+void
+dialogs_load_recent_docks (Gimp *gimp)
+{
+ GFile *file;
+ GError *error = NULL;
+
+ g_return_if_fail (GIMP_IS_GIMP (gimp));
+
+ file = dialogs_get_dockrc_file ();
+
+ if (gimp->be_verbose)
+ g_print ("Parsing '%s'\n", gimp_file_get_utf8_name (file));
+
+ if (! gimp_config_deserialize_gfile (GIMP_CONFIG (global_recent_docks),
+ file,
+ NULL, &error))
+ {
+ if (error->code != GIMP_CONFIG_ERROR_OPEN_ENOENT)
+ gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR, error->message);
+
+ g_clear_error (&error);
+ }
+
+ g_object_unref (file);
+
+ /* In GIMP 2.6 dockrc did not contain the factory entries for the
+ * session infos, so set that up manually if needed
+ */
+ gimp_container_foreach (global_recent_docks,
+ (GFunc) dialogs_ensure_factory_entry_on_recent_dock,
+ NULL);
+
+ gimp_list_reverse (GIMP_LIST (global_recent_docks));
+}
+
+void
+dialogs_save_recent_docks (Gimp *gimp)
+{
+ GFile *file;
+ GError *error = NULL;
+
+ g_return_if_fail (GIMP_IS_GIMP (gimp));
+
+ file = dialogs_get_dockrc_file ();
+
+ if (gimp->be_verbose)
+ g_print ("Writing '%s'\n", gimp_file_get_utf8_name (file));
+
+ if (! gimp_config_serialize_to_gfile (GIMP_CONFIG (global_recent_docks),
+ file,
+ "recently closed docks",
+ "end of recently closed docks",
+ NULL, &error))
+ {
+ gimp_message_literal (gimp, NULL, GIMP_MESSAGE_ERROR, error->message);
+ g_clear_error (&error);
+ }
+
+ g_object_unref (file);
+}
+
+GtkWidget *
+dialogs_get_toolbox (void)
+{
+ GList *list;
+
+ g_return_val_if_fail (GIMP_IS_DIALOG_FACTORY (gimp_dialog_factory_get_singleton ()), NULL);
+
+ for (list = gimp_dialog_factory_get_open_dialogs (gimp_dialog_factory_get_singleton ());
+ list;
+ list = g_list_next (list))
+ {
+ if (GIMP_IS_DOCK_WINDOW (list->data) &&
+ gimp_dock_window_has_toolbox (list->data))
+ return list->data;
+ }
+
+ return NULL;
+}
+
+GtkWidget *
+dialogs_get_dialog (GObject *attach_object,
+ const gchar *attach_key)
+{
+ g_return_val_if_fail (G_IS_OBJECT (attach_object), NULL);
+ g_return_val_if_fail (attach_key != NULL, NULL);
+
+ return g_object_get_data (attach_object, attach_key);
+}
+
+void
+dialogs_attach_dialog (GObject *attach_object,
+ const gchar *attach_key,
+ GtkWidget *dialog)
+{
+ g_return_if_fail (G_IS_OBJECT (attach_object));
+ g_return_if_fail (attach_key != NULL);
+ g_return_if_fail (GTK_IS_WIDGET (dialog));
+
+ g_object_set_data (attach_object, attach_key, dialog);
+ g_object_set_data (G_OBJECT (dialog), "gimp-dialogs-attach-key",
+ (gpointer) attach_key);
+
+ g_signal_connect_object (dialog, "destroy",
+ G_CALLBACK (dialogs_detach_dialog),
+ attach_object,
+ G_CONNECT_SWAPPED);
+}
+
+void
+dialogs_detach_dialog (GObject *attach_object,
+ GtkWidget *dialog)
+{
+ const gchar *attach_key;
+
+ g_return_if_fail (G_IS_OBJECT (attach_object));
+ g_return_if_fail (GTK_IS_WIDGET (dialog));
+
+ attach_key = g_object_get_data (G_OBJECT (dialog),
+ "gimp-dialogs-attach-key");
+
+ g_return_if_fail (attach_key != NULL);
+
+ g_object_set_data (attach_object, attach_key, NULL);
+
+ g_signal_handlers_disconnect_by_func (dialog,
+ dialogs_detach_dialog,
+ attach_object);
+}
+
+void
+dialogs_destroy_dialog (GObject *attach_object,
+ const gchar *attach_key)
+{
+ GtkWidget *dialog;
+
+ g_return_if_fail (G_IS_OBJECT (attach_object));
+ g_return_if_fail (attach_key != NULL);
+
+ dialog = g_object_get_data (attach_object, attach_key);
+
+ if (dialog)
+ gtk_widget_destroy (dialog);
+}