[gimp] app: Add and use factory entry related getters for GimpSessionInfo
- From: Martin Nordholts <martinn src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] app: Add and use factory entry related getters for GimpSessionInfo
- Date: Sun, 20 Sep 2009 09:40:35 +0000 (UTC)
commit 44d5728d7ba03ac68f491c858777496ad0ac1e02
Author: Martin Nordholts <martinn src gnome org>
Date: Sun Sep 20 11:43:41 2009 +0200
app: Add and use factory entry related getters for GimpSessionInfo
Add GimpSessionInfo getters for a bunch of dialog factory entry
fields. This moves much of the GimpDock special casing to a common
place and also reduces direct access to session info fields.
app/widgets/gimpdialogfactory.c | 14 ++++----
app/widgets/gimpsessioninfo.c | 72 ++++++++++++++++++++++++++++++++++++--
app/widgets/gimpsessioninfo.h | 24 ++++++------
3 files changed, 87 insertions(+), 23 deletions(-)
---
diff --git a/app/widgets/gimpdialogfactory.c b/app/widgets/gimpdialogfactory.c
index b7d193a..b9b6b98 100644
--- a/app/widgets/gimpdialogfactory.c
+++ b/app/widgets/gimpdialogfactory.c
@@ -828,7 +828,7 @@ gimp_dialog_factory_add_dialog (GimpDialogFactory *factory,
{
if (current_info->widget)
{
- if (entry->singleton)
+ if (gimp_session_info_is_singleton (current_info))
{
g_warning ("%s: singleton dialog \"%s\" created twice",
G_STRFUNC, entry->identifier);
@@ -851,7 +851,8 @@ gimp_dialog_factory_add_dialog (GimpDialogFactory *factory,
toplevel ? "toplevel" : "dockable",
entry->identifier);
- if (toplevel && entry->session_managed &&
+ if (toplevel &&
+ gimp_session_info_is_session_managed (current_info) &&
! GTK_WIDGET_VISIBLE (dialog))
{
gimp_session_info_set_geometry (current_info);
@@ -883,7 +884,7 @@ gimp_dialog_factory_add_dialog (GimpDialogFactory *factory,
* dialog needs GDK_HINT_USER_POS so it keeps its
* position when hidden/shown within this(!) session.
*/
- if (entry->session_managed)
+ if (gimp_session_info_is_session_managed (info))
g_signal_connect (dialog, "configure-event",
G_CALLBACK (gimp_dialog_factory_set_user_pos),
NULL);
@@ -958,7 +959,7 @@ gimp_dialog_factory_add_dialog (GimpDialogFactory *factory,
factory,
G_CONNECT_SWAPPED);
- if ((entry && entry->session_managed && toplevel) || GIMP_IS_DOCK (dialog))
+ if (gimp_session_info_is_session_managed (info))
g_signal_connect_object (dialog, "configure-event",
G_CALLBACK (gimp_dialog_factory_dialog_configure),
factory,
@@ -1060,7 +1061,7 @@ gimp_dialog_factory_remove_dialog (GimpDialogFactory *factory,
gimp_dialog_factory_remove_dialog,
factory);
- if (entry && entry->session_managed && GTK_WIDGET_TOPLEVEL (dialog))
+ if (gimp_session_info_is_session_managed (session_info))
g_signal_handlers_disconnect_by_func (dialog,
gimp_dialog_factory_dialog_configure,
factory);
@@ -1418,8 +1419,7 @@ gimp_dialog_factories_save_foreach (gconstpointer key,
* by the factory but don't save them if they don't want to be
* managed
*/
- if (info->dockable_entry ||
- (info->toplevel_entry && ! info->toplevel_entry->session_managed))
+ if (! gimp_session_info_is_session_managed (info))
continue;
if (info->widget)
diff --git a/app/widgets/gimpsessioninfo.c b/app/widgets/gimpsessioninfo.c
index 3c604bf..61212b6 100644
--- a/app/widgets/gimpsessioninfo.c
+++ b/app/widgets/gimpsessioninfo.c
@@ -62,6 +62,7 @@ static gboolean gimp_session_info_deserialize (GimpConfig *config,
GScanner *scanner,
gint nest_level,
gpointer data);
+static gboolean gimp_session_info_is_for_dock (GimpSessionInfo *info);
G_DEFINE_TYPE_WITH_CODE (GimpSessionInfo, gimp_session_info, GIMP_TYPE_OBJECT,
@@ -309,6 +310,27 @@ gimp_session_info_deserialize (GimpConfig *config,
return gimp_config_deserialize_return (scanner, token, nest_level);
}
+/**
+ * gimp_session_info_is_for_dock:
+ * @info:
+ *
+ * Helper function to determine if the session info is for a dock. It
+ * uses the dialog factory entry state and the associated widget state
+ * if any to determine that.
+ *
+ * Returns: %TRUE if session info is for a dock, %FALSE otherwise.
+ **/
+static gboolean
+gimp_session_info_is_for_dock (GimpSessionInfo *info)
+{
+ gboolean entry_state_for_dock = (! info->toplevel_entry &&
+ ! info->dockable_entry);
+ gboolean widget_state_for_dock = (info->widget == NULL ||
+ GIMP_IS_DOCK (info->widget));
+
+ return entry_state_for_dock && widget_state_for_dock;
+}
+
/* public functions */
@@ -417,8 +439,9 @@ gimp_session_info_set_geometry (GimpSessionInfo *info)
screen = gtk_widget_get_screen (info->widget);
- use_size = ((! info->toplevel_entry || info->toplevel_entry->remember_size) &&
- (info->width > 0 && info->height > 0));
+ use_size = (gimp_session_info_get_remember_size (info) &&
+ info->width > 0 &&
+ info->height > 0);
if (use_size)
{
@@ -491,7 +514,7 @@ gimp_session_info_get_geometry (GimpSessionInfo *info)
info->x = MAX (0, x);
info->y = MAX (0, y);
- if (! info->toplevel_entry || info->toplevel_entry->remember_size)
+ if (gimp_session_info_get_remember_size (info))
{
gdk_drawable_get_size (GDK_DRAWABLE (window),
&info->width, &info->height);
@@ -505,7 +528,7 @@ gimp_session_info_get_geometry (GimpSessionInfo *info)
info->open = FALSE;
- if (! info->toplevel_entry || info->toplevel_entry->remember_if_open)
+ if (gimp_session_info_get_remember_if_open (info))
{
GimpDialogVisibilityState visibility;
@@ -576,3 +599,44 @@ gimp_session_info_clear_info (GimpSessionInfo *info)
info->books = NULL;
}
}
+
+gboolean
+gimp_session_info_is_singleton (GimpSessionInfo *info)
+{
+ g_return_val_if_fail (GIMP_IS_SESSION_INFO (info), FALSE);
+
+ return (! gimp_session_info_is_for_dock (info) &&
+ info->toplevel_entry &&
+ info->toplevel_entry->singleton);
+}
+
+gboolean
+gimp_session_info_is_session_managed (GimpSessionInfo *info)
+{
+ g_return_val_if_fail (GIMP_IS_SESSION_INFO (info), FALSE);
+
+ return (gimp_session_info_is_for_dock (info) ||
+ (info->toplevel_entry &&
+ info->toplevel_entry->session_managed));
+}
+
+
+gboolean
+gimp_session_info_get_remember_size (GimpSessionInfo *info)
+{
+ g_return_val_if_fail (GIMP_IS_SESSION_INFO (info), FALSE);
+
+ return (gimp_session_info_is_for_dock (info) ||
+ (info->toplevel_entry &&
+ info->toplevel_entry->remember_size));
+}
+
+gboolean
+gimp_session_info_get_remember_if_open (GimpSessionInfo *info)
+{
+ g_return_val_if_fail (GIMP_IS_SESSION_INFO (info), FALSE);
+
+ return (gimp_session_info_is_for_dock (info) ||
+ (info->toplevel_entry &&
+ info->toplevel_entry->remember_if_open));
+}
diff --git a/app/widgets/gimpsessioninfo.h b/app/widgets/gimpsessioninfo.h
index 2fdc7d8..ef27f9d 100644
--- a/app/widgets/gimpsessioninfo.h
+++ b/app/widgets/gimpsessioninfo.h
@@ -73,18 +73,18 @@ struct _GimpSessionInfoClass
};
-GType gimp_session_info_get_type (void) G_GNUC_CONST;
-
-GimpSessionInfo * gimp_session_info_new (void);
-
-void gimp_session_info_restore (GimpSessionInfo *info,
- GimpDialogFactory *factory);
-
-void gimp_session_info_set_geometry (GimpSessionInfo *info);
-void gimp_session_info_get_geometry (GimpSessionInfo *info);
-
-void gimp_session_info_get_info (GimpSessionInfo *info);
-void gimp_session_info_clear_info (GimpSessionInfo *info);
+GType gimp_session_info_get_type (void) G_GNUC_CONST;
+GimpSessionInfo * gimp_session_info_new (void);
+void gimp_session_info_restore (GimpSessionInfo *info,
+ GimpDialogFactory *factory);
+void gimp_session_info_set_geometry (GimpSessionInfo *info);
+void gimp_session_info_get_geometry (GimpSessionInfo *info);
+void gimp_session_info_get_info (GimpSessionInfo *info);
+void gimp_session_info_clear_info (GimpSessionInfo *info);
+gboolean gimp_session_info_is_singleton (GimpSessionInfo *info);
+gboolean gimp_session_info_is_session_managed (GimpSessionInfo *info);
+gboolean gimp_session_info_get_remember_size (GimpSessionInfo *info);
+gboolean gimp_session_info_get_remember_if_open (GimpSessionInfo *info);
#endif /* __GIMP_SESSION_INFO_H__ */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]