static gboolean gimp_dialog_factory_set_user_pos (GtkWidget *dialog, GdkEventConfigure *cevent, gpointer data) { GdkWindowHints geometry_mask; #ifdef DEBUG_FACTORY GimpDialogFactoryEntry *entry; gimp_dialog_factory_from_widget (dialog, &entry); if (entry) g_print ("%s: setting GDK_HINT_USER_POS for \"%s\"\n", G_STRFUNC, entry->identifier); #endif /* DEBUG_FACTORY */ g_signal_handlers_disconnect_by_func (dialog, gimp_dialog_factory_set_user_pos, data); geometry_mask = GDK_HINT_USER_POS; if (gimp_dialog_factory_get_has_min_size (GTK_WINDOW (dialog))) geometry_mask |= GDK_HINT_MIN_SIZE; gtk_window_set_geometry_hints (GTK_WINDOW (dialog), NULL, NULL, geometry_mask); return FALSE; }
static gboolean gimp_dialog_factory_dialog_configure (GtkWidget *dialog, GdkEventConfigure *cevent, GimpDialogFactory *factory) { GimpDialogFactory *dialog_factory; GimpDialogFactoryEntry *entry; GList *list; if (! g_list_find (factory->open_dialogs, dialog)) { g_warning ("%s: dialog not registered", G_STRFUNC); return FALSE; } dialog_factory = gimp_dialog_factory_from_widget (dialog, &entry); if (! dialog_factory || (! entry && ! GIMP_IS_DOCK (dialog))) { g_warning ("%s: dialog was not created by a GimpDialogFactory", G_STRFUNC); return FALSE; } if (dialog_factory != factory) { g_warning ("%s: dialog was created by a different GimpDialogFactory", G_STRFUNC); return FALSE; } for (list = factory->session_infos; list; list = g_list_next (list)) { GimpSessionInfo *session_info = list->data; if (session_info->widget == dialog) { gimp_session_info_get_geometry (session_info); GIMP_LOG (DIALOG_FACTORY, "updated session info for \"%s\" from window geometry " "(x=%d y=%d %dx%d)", entry ? entry->identifier : "dock", session_info->x, session_info->y, session_info->width, session_info->height); break; } } return FALSE; }
static gboolean windows_menu_is_toolbox_dock_window (GimpDockWindow *dock_window) { GimpDialogFactoryEntry *entry = NULL; gboolean is_for_toolbox = FALSE; gimp_dialog_factory_from_widget (GTK_WIDGET (dock_window), &entry); if (entry && strcmp ("gimp-toolbox-window", entry->identifier) == 0) is_for_toolbox = TRUE; return is_for_toolbox; }
static gboolean gimp_dialog_factory_dialog_configure (GtkWidget *dialog, GdkEventConfigure *cevent, GimpDialogFactory *factory) { GimpDialogFactory *dialog_factory; GimpDialogFactoryEntry *entry; GList *list; if (! g_list_find (factory->open_dialogs, dialog)) { g_warning ("%s: dialog not registered", G_STRFUNC); return FALSE; } dialog_factory = gimp_dialog_factory_from_widget (dialog, &entry); if (! dialog_factory || ! entry) { g_warning ("%s: dialog was not created by a GimpDialogFactory", G_STRFUNC); return FALSE; } if (dialog_factory != factory) { g_warning ("%s: dialog was created by a different GimpDialogFactory", G_STRFUNC); return FALSE; } for (list = factory->session_infos; list; list = g_list_next (list)) { GimpSessionInfo *session_info = list->data; if (session_info->widget == dialog) { D (g_print ("%s: updating session info for \"%s\" from window geometry\n", G_STRFUNC, entry->identifier)); gimp_session_info_get_geometry (session_info); break; } } return FALSE; }
void gimp_dialog_factory_add_foreign (GimpDialogFactory *factory, const gchar *identifier, GtkWidget *dialog) { GimpDialogFactory *dialog_factory; GimpDialogFactoryEntry *entry; g_return_if_fail (GIMP_IS_DIALOG_FACTORY (factory)); g_return_if_fail (identifier != NULL); g_return_if_fail (GTK_IS_WIDGET (dialog)); g_return_if_fail (GTK_WIDGET_TOPLEVEL (dialog)); dialog_factory = gimp_dialog_factory_from_widget (dialog, &entry); if (dialog_factory || entry) { g_warning ("%s: dialog was created by a GimpDialogFactory", G_STRFUNC); return; } entry = gimp_dialog_factory_find_entry (factory, identifier); if (! entry) { g_warning ("%s: no entry registered for \"%s\"", G_STRFUNC, identifier); return; } if (entry->new_func) { g_warning ("%s: entry for \"%s\" has a constructor (is not foreign)", G_STRFUNC, identifier); return; } gimp_dialog_factory_set_widget_data (dialog, factory, entry); gimp_dialog_factory_add_dialog (factory, dialog); }
void gimp_dialog_factory_remove_dialog (GimpDialogFactory *factory, GtkWidget *dialog) { GimpDialogFactory *dialog_factory; GimpDialogFactoryEntry *entry; GimpSessionInfo *session_info; GList *list; g_return_if_fail (GIMP_IS_DIALOG_FACTORY (factory)); g_return_if_fail (GTK_IS_WIDGET (dialog)); if (! g_list_find (factory->open_dialogs, dialog)) { g_warning ("%s: dialog not registered", G_STRFUNC); return; } factory->open_dialogs = g_list_remove (factory->open_dialogs, dialog); dialog_factory = gimp_dialog_factory_from_widget (dialog, &entry); if (! (dialog_factory && (entry || GIMP_IS_DOCK (dialog)))) { g_warning ("%s: dialog was not created by a GimpDialogFactory", G_STRFUNC); return; } if (dialog_factory != factory) { g_warning ("%s: dialog was created by a different GimpDialogFactory", G_STRFUNC); return; } D (g_print ("%s: removing \"%s\"\n", G_STRFUNC, entry ? entry->identifier : "dock")); for (list = factory->session_infos; list; list = g_list_next (list)) { session_info = (GimpSessionInfo *) list->data; if (session_info->widget == dialog) { D (g_print ("%s: clearing session info %p (widget %p) for \"%s\"\n", G_STRFUNC, session_info, session_info->widget, entry ? entry->identifier : "dock")); session_info->widget = NULL; /* don't save session info for empty docks */ if (GIMP_IS_DOCK (dialog)) { factory->session_infos = g_list_remove (factory->session_infos, session_info); gimp_session_info_free (session_info); } break; } } }
void gimp_dialog_factory_add_dialog (GimpDialogFactory *factory, GtkWidget *dialog) { GimpDialogFactory *dialog_factory; GimpDialogFactoryEntry *entry; GimpSessionInfo *info; GList *list; gboolean toplevel; g_return_if_fail (GIMP_IS_DIALOG_FACTORY (factory)); g_return_if_fail (GTK_IS_WIDGET (dialog)); if (g_list_find (factory->open_dialogs, dialog)) { g_warning ("%s: dialog already registered", G_STRFUNC); return; } dialog_factory = gimp_dialog_factory_from_widget (dialog, &entry); if (! (dialog_factory && (entry || GIMP_IS_DOCK (dialog)))) { g_warning ("%s: dialog was not created by a GimpDialogFactory", G_STRFUNC); return; } if (dialog_factory != factory) { g_warning ("%s: dialog was created by a different GimpDialogFactory", G_STRFUNC); return; } toplevel = GTK_WIDGET_TOPLEVEL (dialog); if (entry) /* dialog is a toplevel (but not a GimpDock) or a GimpDockable */ { D (g_print ("%s: adding %s \"%s\"\n", G_STRFUNC, toplevel ? "toplevel" : "dockable", entry->identifier)); for (list = factory->session_infos; list; list = g_list_next (list)) { info = list->data; if ((info->toplevel_entry == entry) || (info->dockable_entry == entry)) { if (info->widget) { if (entry->singleton) { g_warning ("%s: singleton dialog \"%s\" created twice", G_STRFUNC, entry->identifier); D (g_print ("%s: corrupt session info: %p (widget %p)\n", G_STRFUNC, info, info->widget)); return; } continue; } info->widget = dialog; D (g_print ("%s: updating session info %p (widget %p) for %s \"%s\"\n", G_STRFUNC, info, info->widget, toplevel ? "toplevel" : "dockable", entry->identifier)); if (toplevel && entry->session_managed) gimp_session_info_set_geometry (info); break; } } if (! list) /* didn't find a session info */ { info = gimp_session_info_new (); info->widget = dialog; D (g_print ("%s: creating session info %p (widget %p) for %s \"%s\"\n", G_STRFUNC, info, info->widget, toplevel ? "toplevel" : "dockable", entry->identifier)); if (toplevel) { info->toplevel_entry = entry; /* if we create a new session info, we never call * gimp_session_info_set_geometry(), but still the * dialog needs GDK_HINT_USER_POS so it keeps its * position when hidden/shown within this(!) session. */ if (entry->session_managed) g_signal_connect (dialog, "configure-event", G_CALLBACK (gimp_dialog_factory_set_user_pos), NULL); } else { info->dockable_entry = entry; } factory->session_infos = g_list_append (factory->session_infos, info); } } else /* dialog is a GimpDock */ { D (g_print ("%s: adding dock\n", G_STRFUNC)); for (list = factory->session_infos; list; list = g_list_next (list)) { info = list->data; /* take the first empty slot */ if (! info->toplevel_entry && ! info->dockable_entry && ! info->widget) { info->widget = dialog; D (g_print ("%s: updating session info %p (widget %p) for dock\n", G_STRFUNC, info, info->widget)); gimp_session_info_set_geometry (info); break; } } if (! list) /* didn't find a session info */ { info = gimp_session_info_new (); info->widget = dialog; D (g_print ("%s: creating session info %p (widget %p) for dock\n", G_STRFUNC, info, info->widget)); /* if we create a new session info, we never call * gimp_session_info_set_geometry(), but still the * dialog needs GDK_HINT_USER_POS so it keeps its * position when hidden/shown within this(!) session. */ g_signal_connect (dialog, "configure-event", G_CALLBACK (gimp_dialog_factory_set_user_pos), NULL); factory->session_infos = g_list_append (factory->session_infos, info); } } factory->open_dialogs = g_list_prepend (factory->open_dialogs, dialog); g_signal_connect_object (dialog, "destroy", G_CALLBACK (gimp_dialog_factory_remove_dialog), factory, G_CONNECT_SWAPPED); if (entry && entry->session_managed && toplevel) g_signal_connect_object (dialog, "configure-event", G_CALLBACK (gimp_dialog_factory_dialog_configure), factory, 0); }
void gimp_dialog_factory_remove_dialog (GimpDialogFactory *factory, GtkWidget *dialog) { GimpDialogFactory *dialog_factory; GimpDialogFactoryEntry *entry; GList *list; g_return_if_fail (GIMP_IS_DIALOG_FACTORY (factory)); g_return_if_fail (GTK_IS_WIDGET (dialog)); if (! g_list_find (factory->open_dialogs, dialog)) { g_warning ("%s: dialog not registered", G_STRFUNC); return; } factory->open_dialogs = g_list_remove (factory->open_dialogs, dialog); dialog_factory = gimp_dialog_factory_from_widget (dialog, &entry); if (! (dialog_factory && (entry || GIMP_IS_DOCK (dialog)))) { g_warning ("%s: dialog was not created by a GimpDialogFactory", G_STRFUNC); return; } if (dialog_factory != factory) { g_warning ("%s: dialog was created by a different GimpDialogFactory", G_STRFUNC); return; } GIMP_LOG (DIALOG_FACTORY, "removing \"%s\"", entry ? entry->identifier : "dock"); for (list = factory->session_infos; list; list = g_list_next (list)) { GimpSessionInfo *session_info = list->data; if (session_info->widget == dialog) { GIMP_LOG (DIALOG_FACTORY, "clearing session info %p (widget %p) for \"%s\"", session_info, session_info->widget, entry ? entry->identifier : "dock"); session_info->widget = NULL; gimp_dialog_factory_unset_widget_data (dialog); g_signal_handlers_disconnect_by_func (dialog, gimp_dialog_factory_set_user_pos, NULL); g_signal_handlers_disconnect_by_func (dialog, gimp_dialog_factory_remove_dialog, factory); if (entry && entry->session_managed && GTK_WIDGET_TOPLEVEL (dialog)) g_signal_handlers_disconnect_by_func (dialog, gimp_dialog_factory_dialog_configure, factory); if (GIMP_IS_DOCK (dialog)) { /* don't save session info for empty docks */ factory->session_infos = g_list_remove (factory->session_infos, session_info); g_object_unref (session_info); g_signal_emit (factory, factory_signals[DOCK_REMOVED], 0, dialog); } break; } } }
void dockable_actions_update (GimpActionGroup *group, gpointer data) { GimpDockable *dockable; GimpDockbook *dockbook; GimpDocked *docked; GimpDialogFactoryEntry *entry; GimpContainerView *view; GimpViewType view_type = -1; gboolean list_view_available = FALSE; gboolean grid_view_available = FALSE; GimpViewSize view_size = -1; GimpTabStyle tab_style = -1; gint n_pages = 0; gint n_books = 0; if (GIMP_IS_DOCKBOOK (data)) { gint page_num; dockbook = GIMP_DOCKBOOK (data); page_num = gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook)); dockable = (GimpDockable *) gtk_notebook_get_nth_page (GTK_NOTEBOOK (dockbook), page_num); } else if (GIMP_IS_DOCKABLE (data)) { dockable = GIMP_DOCKABLE (data); dockbook = dockable->dockbook; } else { return; } docked = GIMP_DOCKED (gtk_bin_get_child (GTK_BIN (dockable))); gimp_dialog_factory_from_widget (GTK_WIDGET (dockable), &entry); if (entry) { gchar *identifier; gchar *substring = NULL; identifier = g_strdup (entry->identifier); if ((substring = strstr (identifier, "grid"))) view_type = GIMP_VIEW_TYPE_GRID; else if ((substring = strstr (identifier, "list"))) view_type = GIMP_VIEW_TYPE_LIST; if (substring) { memcpy (substring, "list", 4); if (gimp_dialog_factory_find_entry (dockbook->dock->dialog_factory, identifier)) list_view_available = TRUE; memcpy (substring, "grid", 4); if (gimp_dialog_factory_find_entry (dockbook->dock->dialog_factory, identifier)) grid_view_available = TRUE; } g_free (identifier); } view = gimp_container_view_get_by_dockable (dockable); if (view) view_size = gimp_container_view_get_view_size (view, NULL); tab_style = dockable->tab_style; n_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (dockbook)); n_books = g_list_length (dockbook->dock->dockbooks); #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) #define SET_SENSITIVE(action,sensitive) \ gimp_action_group_set_action_sensitive (group, action, (sensitive) != 0) SET_SENSITIVE ("dockable-detach-tab", n_pages > 1 || n_books > 1); SET_VISIBLE ("dockable-preview-size-menu", view_size != -1); if (view_size != -1) { if (view_size >= GIMP_VIEW_SIZE_GIGANTIC) { SET_ACTIVE ("dockable-preview-size-gigantic", TRUE); } else if (view_size >= GIMP_VIEW_SIZE_ENORMOUS) { SET_ACTIVE ("dockable-preview-size-enormous", TRUE); } else if (view_size >= GIMP_VIEW_SIZE_HUGE) { SET_ACTIVE ("dockable-preview-size-huge", TRUE); } else if (view_size >= GIMP_VIEW_SIZE_EXTRA_LARGE) { SET_ACTIVE ("dockable-preview-size-extra-large", TRUE); } else if (view_size >= GIMP_VIEW_SIZE_LARGE) { SET_ACTIVE ("dockable-preview-size-large", TRUE); } else if (view_size >= GIMP_VIEW_SIZE_MEDIUM) { SET_ACTIVE ("dockable-preview-size-medium", TRUE); } else if (view_size >= GIMP_VIEW_SIZE_SMALL) { SET_ACTIVE ("dockable-preview-size-small", TRUE); } else if (view_size >= GIMP_VIEW_SIZE_EXTRA_SMALL) { SET_ACTIVE ("dockable-preview-size-extra-small", TRUE); } else if (view_size >= GIMP_VIEW_SIZE_TINY) { SET_ACTIVE ("dockable-preview-size-tiny", TRUE); } } SET_VISIBLE ("dockable-tab-style-menu", n_pages > 1); if (n_pages > 1) { GimpDockedInterface *docked_iface = GIMP_DOCKED_GET_INTERFACE (docked); if (tab_style == GIMP_TAB_STYLE_ICON) SET_ACTIVE ("dockable-tab-style-icon", TRUE); else if (tab_style == GIMP_TAB_STYLE_PREVIEW) SET_ACTIVE ("dockable-tab-style-preview", TRUE); else if (tab_style == GIMP_TAB_STYLE_NAME) SET_ACTIVE ("dockable-tab-style-name", TRUE); else if (tab_style == GIMP_TAB_STYLE_ICON_NAME) SET_ACTIVE ("dockable-tab-style-icon-name", TRUE); else if (tab_style == GIMP_TAB_STYLE_PREVIEW_NAME) SET_ACTIVE ("dockable-tab-style-preview-name", TRUE); SET_SENSITIVE ("dockable-tab-style-preview", docked_iface->get_preview); SET_SENSITIVE ("dockable-tab-style-preview-name", docked_iface->get_preview); } SET_VISIBLE ("dockable-view-type-grid", view_type != -1); SET_VISIBLE ("dockable-view-type-list", view_type != -1); if (view_type != -1) { if (view_type == GIMP_VIEW_TYPE_LIST) SET_ACTIVE ("dockable-view-type-list", TRUE); else SET_ACTIVE ("dockable-view-type-grid", TRUE); SET_SENSITIVE ("dockable-view-type-grid", grid_view_available); SET_SENSITIVE ("dockable-view-type-list", list_view_available); } SET_VISIBLE ("dockable-show-button-bar", gimp_docked_has_button_bar (docked)); SET_ACTIVE ("dockable-show-button-bar", gimp_docked_get_show_button_bar (docked)); #undef SET_ACTIVE #undef SET_VISIBLE #undef SET_SENSITIVE }
void gimp_dialog_factory_hide_dialog (GtkWidget *dialog) { g_return_if_fail (GTK_IS_WIDGET (dialog)); g_return_if_fail (GTK_WIDGET_TOPLEVEL (dialog)); if (! gimp_dialog_factory_from_widget (dialog, NULL)) { g_warning ("%s: dialog was not created by a GimpDialogFactory", G_STRFUNC); return; } gtk_widget_hide (dialog); if (! dialogs_shown) g_object_set_data (G_OBJECT (dialog), GIMP_DIALOG_VISIBILITY_KEY, GINT_TO_POINTER (GIMP_DIALOG_VISIBILITY_INVISIBLE)); }