mirror of https://github.com/GNOME/gimp.git
Made session info serialization independent from widgets so it can be used
2008-05-14 Michael Natterer <mitch@gimp.org> Made session info serialization independent from widgets so it can be used on stored dock layouts which are not open: * app/widgets/gimpsessioninfo-book.[ch] * app/widgets/gimpsessioninfo-dock.[ch] * app/widgets/gimpsessioninfo-dockable.[ch]: add from_widget() functions which return newly allocated session info structs. Changed serialize() functions to take these structs instead of widgets. Changed deserialize() functions to return the structs instead of appending them to lists in their parent structs. Don't free anything in restore(). * app/widgets/gimpsessioninfo-aux.[ch] (gimp_session_info_aux_serialize): take a GList of aux_info instead of a widget. * app/widgets/gimpsessioninfo.[ch]: add new functions get_info() which collects above session info details from dialogs and clear_info() which clears that info. Call clear_info() from finalize(). Don't free anything in restore(). * app/widgets/gimpdialogfactory.c (gimp_dialog_factories_save_foreach): collect the session info detials from the dialogs before serializing because serialize() doesn't know about the widget any longer. Clear the infos after serializing. (gimp_dialog_factories_restore_foreach): clear the session info details after creating the dialogs because restore() doesn't clear the info by itself any longer. svn path=/trunk/; revision=25657
This commit is contained in:
parent
24a7aa75bd
commit
5766498fff
33
ChangeLog
33
ChangeLog
|
@ -1,3 +1,36 @@
|
|||
2008-05-14 Michael Natterer <mitch@gimp.org>
|
||||
|
||||
Made session info serialization independent from widgets so it can
|
||||
be used on stored dock layouts which are not open:
|
||||
|
||||
* app/widgets/gimpsessioninfo-book.[ch]
|
||||
* app/widgets/gimpsessioninfo-dock.[ch]
|
||||
* app/widgets/gimpsessioninfo-dockable.[ch]: add from_widget()
|
||||
functions which return newly allocated session info structs.
|
||||
Changed serialize() functions to take these structs instead of
|
||||
widgets. Changed deserialize() functions to return the structs
|
||||
instead of appending them to lists in their parent structs. Don't
|
||||
free anything in restore().
|
||||
|
||||
* app/widgets/gimpsessioninfo-aux.[ch]
|
||||
(gimp_session_info_aux_serialize): take a GList of aux_info
|
||||
instead of a widget.
|
||||
|
||||
* app/widgets/gimpsessioninfo.[ch]: add new functions get_info()
|
||||
which collects above session info details from dialogs and
|
||||
clear_info() which clears that info. Call clear_info() from
|
||||
finalize(). Don't free anything in restore().
|
||||
|
||||
* app/widgets/gimpdialogfactory.c
|
||||
(gimp_dialog_factories_save_foreach): collect the session info
|
||||
detials from the dialogs before serializing because serialize()
|
||||
doesn't know about the widget any longer. Clear the infos after
|
||||
serializing.
|
||||
|
||||
(gimp_dialog_factories_restore_foreach): clear the session info
|
||||
details after creating the dialogs because restore() doesn't clear
|
||||
the info by itself any longer.
|
||||
|
||||
2008-05-13 Michael Natterer <mitch@gimp.org>
|
||||
|
||||
* app/widgets/gimpsessioninfo.c: turn "info != NULL" checks into
|
||||
|
|
|
@ -1336,7 +1336,13 @@ gimp_dialog_factories_save_foreach (gconstpointer key,
|
|||
(info->toplevel_entry && ! info->toplevel_entry->session_managed))
|
||||
continue;
|
||||
|
||||
if (info->widget)
|
||||
gimp_session_info_get_info (info);
|
||||
|
||||
gimp_session_info_serialize (writer, info, GIMP_OBJECT (factory)->name);
|
||||
|
||||
if (info->widget)
|
||||
gimp_session_info_clear_info (info);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1352,7 +1358,10 @@ gimp_dialog_factories_restore_foreach (gconstpointer key,
|
|||
GimpSessionInfo *info = infos->data;
|
||||
|
||||
if (info->open)
|
||||
gimp_session_info_restore (info, factory);
|
||||
{
|
||||
gimp_session_info_restore (info, factory);
|
||||
gimp_session_info_clear_info (info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -203,35 +203,25 @@ gimp_session_info_aux_set_props (GObject *object,
|
|||
|
||||
void
|
||||
gimp_session_info_aux_serialize (GimpConfigWriter *writer,
|
||||
GtkWidget *widget)
|
||||
GList *aux_info)
|
||||
{
|
||||
GList *aux_info;
|
||||
GList *list;
|
||||
|
||||
g_return_if_fail (writer != NULL);
|
||||
g_return_if_fail (GTK_IS_WIDGET (widget));
|
||||
g_return_if_fail (aux_info != NULL);
|
||||
|
||||
aux_info = gimp_session_info_aux_get_list (widget);
|
||||
gimp_config_writer_open (writer, "aux-info");
|
||||
|
||||
if (aux_info)
|
||||
for (list = aux_info; list; list = g_list_next (list))
|
||||
{
|
||||
GList *list;
|
||||
|
||||
gimp_config_writer_open (writer, "aux-info");
|
||||
|
||||
for (list = aux_info; list; list = g_list_next (list))
|
||||
{
|
||||
GimpSessionInfoAux *aux = list->data;
|
||||
|
||||
gimp_config_writer_open (writer, aux->name);
|
||||
gimp_config_writer_string (writer, aux->value);
|
||||
gimp_config_writer_close (writer);
|
||||
}
|
||||
GimpSessionInfoAux *aux = list->data;
|
||||
|
||||
gimp_config_writer_open (writer, aux->name);
|
||||
gimp_config_writer_string (writer, aux->value);
|
||||
gimp_config_writer_close (writer);
|
||||
|
||||
g_list_foreach (aux_info, (GFunc) gimp_session_info_aux_free, NULL);
|
||||
g_list_free (aux_info);
|
||||
}
|
||||
|
||||
gimp_config_writer_close (writer);
|
||||
}
|
||||
|
||||
GTokenType
|
||||
|
|
|
@ -42,7 +42,7 @@ void gimp_session_info_aux_set_props (GObject *object,
|
|||
...) G_GNUC_NULL_TERMINATED;
|
||||
|
||||
void gimp_session_info_aux_serialize (GimpConfigWriter *writer,
|
||||
GtkWidget *widget);
|
||||
GList *aux_info);
|
||||
GTokenType gimp_session_info_aux_deserialize (GScanner *scanner,
|
||||
GList **aux_list);
|
||||
|
||||
|
|
|
@ -30,7 +30,6 @@
|
|||
#include "gimpdialogfactory.h"
|
||||
#include "gimpdock.h"
|
||||
#include "gimpdockbook.h"
|
||||
#include "gimpsessioninfo.h"
|
||||
#include "gimpsessioninfo-book.h"
|
||||
#include "gimpsessioninfo-dockable.h"
|
||||
|
||||
|
@ -61,63 +60,50 @@ gimp_session_info_book_free (GimpSessionInfoBook *info)
|
|||
g_list_foreach (info->dockables, (GFunc) gimp_session_info_dockable_free,
|
||||
NULL);
|
||||
g_list_free (info->dockables);
|
||||
info->dockables = NULL;
|
||||
}
|
||||
|
||||
g_slice_free (GimpSessionInfoBook, info);
|
||||
}
|
||||
|
||||
void
|
||||
gimp_session_info_book_serialize (GimpConfigWriter *writer,
|
||||
GimpDockbook *dockbook)
|
||||
gimp_session_info_book_serialize (GimpConfigWriter *writer,
|
||||
GimpSessionInfoBook *info)
|
||||
{
|
||||
GList *children;
|
||||
GList *pages;
|
||||
gint current_page;
|
||||
|
||||
g_return_if_fail (writer != NULL);
|
||||
g_return_if_fail (GIMP_IS_DOCKBOOK (dockbook));
|
||||
g_return_if_fail (info != NULL);
|
||||
|
||||
gimp_config_writer_open (writer, "book");
|
||||
|
||||
if (GTK_IS_VPANED (GTK_WIDGET (dockbook)->parent))
|
||||
if (info->position != 0)
|
||||
{
|
||||
GtkPaned *paned = GTK_PANED (GTK_WIDGET (dockbook)->parent);
|
||||
|
||||
if (GTK_WIDGET (dockbook) == gtk_paned_get_child2 (paned))
|
||||
{
|
||||
gimp_config_writer_open (writer, "position");
|
||||
gimp_config_writer_printf (writer, "%d",
|
||||
gtk_paned_get_position (paned));
|
||||
gimp_config_writer_close (writer);
|
||||
}
|
||||
gimp_config_writer_open (writer, "position");
|
||||
gimp_config_writer_printf (writer, "%d", info->position);
|
||||
gimp_config_writer_close (writer);
|
||||
}
|
||||
|
||||
current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook));
|
||||
|
||||
gimp_config_writer_open (writer, "current-page");
|
||||
gimp_config_writer_printf (writer, "%d", current_page);
|
||||
gimp_config_writer_printf (writer, "%d", info->current_page);
|
||||
gimp_config_writer_close (writer);
|
||||
|
||||
children = gtk_container_get_children (GTK_CONTAINER (dockbook));
|
||||
|
||||
for (pages = children; pages; pages = g_list_next (pages))
|
||||
for (pages = info->dockables; pages; pages = g_list_next (pages))
|
||||
gimp_session_info_dockable_serialize (writer, pages->data);
|
||||
|
||||
g_list_free (children);
|
||||
|
||||
gimp_config_writer_close (writer);
|
||||
}
|
||||
|
||||
GTokenType
|
||||
gimp_session_info_book_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfo *info)
|
||||
gimp_session_info_book_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfoBook **book)
|
||||
{
|
||||
GimpSessionInfoBook *book;
|
||||
GimpSessionInfoBook *info;
|
||||
GTokenType token;
|
||||
|
||||
g_return_val_if_fail (scanner != NULL, G_TOKEN_LEFT_PAREN);
|
||||
g_return_val_if_fail (info != NULL, G_TOKEN_LEFT_PAREN);
|
||||
g_return_val_if_fail (book != NULL, G_TOKEN_LEFT_PAREN);
|
||||
|
||||
g_scanner_scope_add_symbol (scanner, scope, "position",
|
||||
GINT_TO_POINTER (SESSION_INFO_BOOK_POSITION));
|
||||
|
@ -126,7 +112,7 @@ gimp_session_info_book_deserialize (GScanner *scanner,
|
|||
g_scanner_scope_add_symbol (scanner, scope, "dockable",
|
||||
GINT_TO_POINTER (SESSION_INFO_BOOK_DOCKABLE));
|
||||
|
||||
book = gimp_session_info_book_new ();
|
||||
info = gimp_session_info_book_new ();
|
||||
|
||||
token = G_TOKEN_LEFT_PAREN;
|
||||
|
||||
|
@ -143,15 +129,17 @@ gimp_session_info_book_deserialize (GScanner *scanner,
|
|||
case G_TOKEN_SYMBOL:
|
||||
switch (GPOINTER_TO_INT (scanner->value.v_symbol))
|
||||
{
|
||||
GimpSessionInfoDockable *dockable;
|
||||
|
||||
case SESSION_INFO_BOOK_POSITION:
|
||||
token = G_TOKEN_INT;
|
||||
if (! gimp_scanner_parse_int (scanner, &book->position))
|
||||
if (! gimp_scanner_parse_int (scanner, &info->position))
|
||||
goto error;
|
||||
break;
|
||||
|
||||
case SESSION_INFO_BOOK_CURRENT_PAGE:
|
||||
token = G_TOKEN_INT;
|
||||
if (! gimp_scanner_parse_int (scanner, &book->current_page))
|
||||
if (! gimp_scanner_parse_int (scanner, &info->current_page))
|
||||
goto error;
|
||||
break;
|
||||
|
||||
|
@ -159,10 +147,13 @@ gimp_session_info_book_deserialize (GScanner *scanner,
|
|||
g_scanner_set_scope (scanner, scope + 1);
|
||||
token = gimp_session_info_dockable_deserialize (scanner,
|
||||
scope + 1,
|
||||
book);
|
||||
&dockable);
|
||||
|
||||
if (token == G_TOKEN_LEFT_PAREN)
|
||||
g_scanner_set_scope (scanner, scope);
|
||||
{
|
||||
info->dockables = g_list_append (info->dockables, dockable);
|
||||
g_scanner_set_scope (scanner, scope);
|
||||
}
|
||||
else
|
||||
goto error;
|
||||
|
||||
|
@ -183,7 +174,7 @@ gimp_session_info_book_deserialize (GScanner *scanner,
|
|||
}
|
||||
}
|
||||
|
||||
info->books = g_list_append (info->books, book);
|
||||
*book = info;
|
||||
|
||||
g_scanner_scope_remove_symbol (scanner, scope, "position");
|
||||
g_scanner_scope_remove_symbol (scanner, scope, "current-page");
|
||||
|
@ -192,11 +183,55 @@ gimp_session_info_book_deserialize (GScanner *scanner,
|
|||
return token;
|
||||
|
||||
error:
|
||||
gimp_session_info_book_free (book);
|
||||
*book = NULL;
|
||||
|
||||
gimp_session_info_book_free (info);
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
GimpSessionInfoBook *
|
||||
gimp_session_info_book_from_widget (GimpDockbook *dockbook)
|
||||
{
|
||||
GimpSessionInfoBook *info;
|
||||
GList *children;
|
||||
GList *list;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_DOCKBOOK (dockbook), NULL);
|
||||
|
||||
info = gimp_session_info_book_new ();
|
||||
|
||||
info->widget = GTK_WIDGET (dockbook);
|
||||
|
||||
if (GTK_IS_VPANED (info->widget->parent))
|
||||
{
|
||||
GtkPaned *paned = GTK_PANED (info->widget->parent);
|
||||
|
||||
if (info->widget == gtk_paned_get_child2 (paned))
|
||||
info->position = gtk_paned_get_position (paned);
|
||||
}
|
||||
|
||||
info->current_page =
|
||||
gtk_notebook_get_current_page (GTK_NOTEBOOK (dockbook));
|
||||
|
||||
children = gtk_container_get_children (GTK_CONTAINER (dockbook));
|
||||
|
||||
for (list = children; list; list = g_list_next (list))
|
||||
{
|
||||
GimpSessionInfoDockable *dockable;
|
||||
|
||||
dockable = gimp_session_info_dockable_from_widget (list->data);
|
||||
|
||||
info->dockables = g_list_prepend (info->dockables, dockable);
|
||||
}
|
||||
|
||||
info->dockables = g_list_reverse (info->dockables);
|
||||
|
||||
g_list_free (children);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
void
|
||||
gimp_session_info_book_restore (GimpSessionInfoBook *info,
|
||||
GimpDock *dock)
|
||||
|
|
|
@ -37,16 +37,19 @@ struct _GimpSessionInfoBook
|
|||
|
||||
GimpSessionInfoBook *
|
||||
gimp_session_info_book_new (void);
|
||||
void gimp_session_info_book_free (GimpSessionInfoBook *info);
|
||||
void gimp_session_info_book_free (GimpSessionInfoBook *info);
|
||||
|
||||
void gimp_session_info_book_serialize (GimpConfigWriter *writer,
|
||||
GimpDockbook *dockbook);
|
||||
GTokenType gimp_session_info_book_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfo *info);
|
||||
void gimp_session_info_book_serialize (GimpConfigWriter *writer,
|
||||
GimpSessionInfoBook *book);
|
||||
GTokenType gimp_session_info_book_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfoBook **book);
|
||||
|
||||
void gimp_session_info_book_restore (GimpSessionInfoBook *info,
|
||||
GimpDock *dock);
|
||||
GimpSessionInfoBook *
|
||||
gimp_session_info_book_from_widget (GimpDockbook *dockbook);
|
||||
|
||||
void gimp_session_info_book_restore (GimpSessionInfoBook *info,
|
||||
GimpDock *dock);
|
||||
|
||||
|
||||
#endif /* __GIMP_SESSION_INFO_BOOK_H__ */
|
||||
|
|
|
@ -45,17 +45,17 @@ enum
|
|||
|
||||
void
|
||||
gimp_session_info_dock_serialize (GimpConfigWriter *writer,
|
||||
GimpDock *dock)
|
||||
GList *books)
|
||||
{
|
||||
GList *books;
|
||||
GList *list;
|
||||
|
||||
g_return_if_fail (writer != NULL);
|
||||
g_return_if_fail (GIMP_IS_DOCK (dock));
|
||||
g_return_if_fail (books != NULL);
|
||||
|
||||
gimp_config_writer_open (writer, "dock");
|
||||
|
||||
for (books = dock->dockbooks; books; books = g_list_next (books))
|
||||
gimp_session_info_book_serialize (writer, books->data);
|
||||
for (list = books; list; list = g_list_next (list))
|
||||
gimp_session_info_book_serialize (writer, list->data);
|
||||
|
||||
gimp_config_writer_close (writer);
|
||||
}
|
||||
|
@ -88,13 +88,18 @@ gimp_session_info_dock_deserialize (GScanner *scanner,
|
|||
case G_TOKEN_SYMBOL:
|
||||
switch (GPOINTER_TO_INT (scanner->value.v_symbol))
|
||||
{
|
||||
GimpSessionInfoBook *book;
|
||||
|
||||
case SESSION_INFO_BOOK:
|
||||
g_scanner_set_scope (scanner, scope + 1);
|
||||
token = gimp_session_info_book_deserialize (scanner, scope + 1,
|
||||
info);
|
||||
&book);
|
||||
|
||||
if (token == G_TOKEN_LEFT_PAREN)
|
||||
g_scanner_set_scope (scanner, scope);
|
||||
{
|
||||
info->books = g_list_append (info->books, book);
|
||||
g_scanner_set_scope (scanner, scope);
|
||||
}
|
||||
else
|
||||
return token;
|
||||
|
||||
|
@ -120,6 +125,26 @@ gimp_session_info_dock_deserialize (GScanner *scanner,
|
|||
return token;
|
||||
}
|
||||
|
||||
GList *
|
||||
gimp_session_info_dock_from_widget (GimpDock *dock)
|
||||
{
|
||||
GList *list;
|
||||
GList *infos = NULL;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL);
|
||||
|
||||
for (list = dock->dockbooks; list; list = g_list_next (list))
|
||||
{
|
||||
GimpSessionInfoBook *book;
|
||||
|
||||
book = gimp_session_info_book_from_widget (list->data);
|
||||
|
||||
infos = g_list_prepend (infos, book);
|
||||
}
|
||||
|
||||
return g_list_reverse (infos);
|
||||
}
|
||||
|
||||
static void
|
||||
gimp_session_info_dock_paned_size_allocate (GtkWidget *paned,
|
||||
GtkAllocation *allocation,
|
||||
|
@ -181,9 +206,5 @@ gimp_session_info_dock_restore (GimpSessionInfo *info,
|
|||
}
|
||||
}
|
||||
|
||||
g_list_foreach (info->books, (GFunc) gimp_session_info_book_free, NULL);
|
||||
g_list_free (info->books);
|
||||
info->books = NULL;
|
||||
|
||||
gtk_widget_show (GTK_WIDGET (dock));
|
||||
}
|
||||
|
|
|
@ -24,11 +24,13 @@
|
|||
|
||||
|
||||
void gimp_session_info_dock_serialize (GimpConfigWriter *writer,
|
||||
GimpDock *dock);
|
||||
GList *books);
|
||||
GTokenType gimp_session_info_dock_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfo *info);
|
||||
|
||||
GList * gimp_session_info_dock_from_widget (GimpDock *dock);
|
||||
|
||||
void gimp_session_info_dock_restore (GimpSessionInfo *info,
|
||||
GimpDialogFactory *factory,
|
||||
GdkScreen *screen);
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
#include "gimpdock.h"
|
||||
#include "gimpdockable.h"
|
||||
#include "gimpsessioninfo-aux.h"
|
||||
#include "gimpsessioninfo-book.h"
|
||||
#include "gimpsessioninfo-dockable.h"
|
||||
|
||||
|
||||
|
@ -59,83 +58,73 @@ gimp_session_info_dockable_free (GimpSessionInfoDockable *info)
|
|||
g_return_if_fail (info != NULL);
|
||||
|
||||
if (info->identifier)
|
||||
g_free (info->identifier);
|
||||
{
|
||||
g_free (info->identifier);
|
||||
info->identifier = NULL;
|
||||
}
|
||||
|
||||
if (info->aux_info)
|
||||
{
|
||||
g_list_foreach (info->aux_info, (GFunc) gimp_session_info_aux_free, NULL);
|
||||
g_list_free (info->aux_info);
|
||||
info->aux_info = NULL;
|
||||
}
|
||||
|
||||
g_slice_free (GimpSessionInfoDockable, info);
|
||||
}
|
||||
|
||||
void
|
||||
gimp_session_info_dockable_serialize (GimpConfigWriter *writer,
|
||||
GimpDockable *dockable)
|
||||
gimp_session_info_dockable_serialize (GimpConfigWriter *writer,
|
||||
GimpSessionInfoDockable *info)
|
||||
{
|
||||
GimpDialogFactoryEntry *entry;
|
||||
GEnumClass *enum_class;
|
||||
GEnumValue *enum_value;
|
||||
const gchar *tab_style = "icon";
|
||||
|
||||
g_return_if_fail (writer != NULL);
|
||||
g_return_if_fail (GIMP_IS_DOCKABLE (dockable));
|
||||
g_return_if_fail (info != NULL);
|
||||
|
||||
gimp_dialog_factory_from_widget (GTK_WIDGET (dockable), &entry);
|
||||
enum_class = g_type_class_ref (GIMP_TYPE_TAB_STYLE);
|
||||
|
||||
if (entry)
|
||||
gimp_config_writer_open (writer, "dockable");
|
||||
gimp_config_writer_string (writer, info->identifier);
|
||||
|
||||
enum_value = g_enum_get_value (enum_class, info->tab_style);
|
||||
|
||||
if (enum_value)
|
||||
tab_style = enum_value->value_nick;
|
||||
|
||||
gimp_config_writer_open (writer, "tab-style");
|
||||
gimp_config_writer_print (writer, tab_style, -1);
|
||||
gimp_config_writer_close (writer);
|
||||
|
||||
if (info->view_size > 0)
|
||||
{
|
||||
GimpContainerView *view;
|
||||
GEnumClass *enum_class;
|
||||
GEnumValue *enum_value;
|
||||
const gchar *tab_style = "icon";
|
||||
gint view_size = -1;
|
||||
|
||||
enum_class = g_type_class_ref (GIMP_TYPE_TAB_STYLE);
|
||||
|
||||
gimp_config_writer_open (writer, "dockable");
|
||||
gimp_config_writer_string (writer, entry->identifier);
|
||||
|
||||
enum_value = g_enum_get_value (enum_class, dockable->tab_style);
|
||||
|
||||
if (enum_value)
|
||||
tab_style = enum_value->value_nick;
|
||||
|
||||
gimp_config_writer_open (writer, "tab-style");
|
||||
gimp_config_writer_print (writer, tab_style, -1);
|
||||
gimp_config_writer_open (writer, "preview-size");
|
||||
gimp_config_writer_printf (writer, "%d", info->view_size);
|
||||
gimp_config_writer_close (writer);
|
||||
|
||||
view = gimp_container_view_get_by_dockable (dockable);
|
||||
|
||||
if (view)
|
||||
view_size = gimp_container_view_get_view_size (view, NULL);
|
||||
|
||||
if (view_size > 0 &&
|
||||
view_size != entry->view_size)
|
||||
{
|
||||
gimp_config_writer_open (writer, "preview-size");
|
||||
gimp_config_writer_printf (writer, "%d", view_size);
|
||||
gimp_config_writer_close (writer);
|
||||
}
|
||||
|
||||
gimp_session_info_aux_serialize (writer, GTK_WIDGET (dockable));
|
||||
|
||||
gimp_config_writer_close (writer);
|
||||
|
||||
g_type_class_unref (enum_class);
|
||||
}
|
||||
|
||||
if (info->aux_info)
|
||||
gimp_session_info_aux_serialize (writer, info->aux_info);
|
||||
|
||||
gimp_config_writer_close (writer);
|
||||
|
||||
g_type_class_unref (enum_class);
|
||||
}
|
||||
|
||||
GTokenType
|
||||
gimp_session_info_dockable_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfoBook *book)
|
||||
gimp_session_info_dockable_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfoDockable **dockable)
|
||||
{
|
||||
GimpSessionInfoDockable *dockable;
|
||||
GimpSessionInfoDockable *info;
|
||||
GEnumClass *enum_class;
|
||||
GEnumValue *enum_value;
|
||||
GTokenType token;
|
||||
|
||||
g_return_val_if_fail (scanner != NULL, G_TOKEN_LEFT_PAREN);
|
||||
g_return_val_if_fail (book != NULL, G_TOKEN_LEFT_PAREN);
|
||||
g_return_val_if_fail (dockable != NULL, G_TOKEN_LEFT_PAREN);
|
||||
|
||||
g_scanner_scope_add_symbol (scanner, scope, "tab-style",
|
||||
GINT_TO_POINTER (SESSION_INFO_DOCKABLE_TAB_STYLE));
|
||||
|
@ -144,12 +133,12 @@ gimp_session_info_dockable_deserialize (GScanner *scanner,
|
|||
g_scanner_scope_add_symbol (scanner, scope, "aux-info",
|
||||
GINT_TO_POINTER (SESSION_INFO_DOCKABLE_AUX));
|
||||
|
||||
dockable = gimp_session_info_dockable_new ();
|
||||
info = gimp_session_info_dockable_new ();
|
||||
|
||||
enum_class = g_type_class_ref (GIMP_TYPE_TAB_STYLE);
|
||||
|
||||
token = G_TOKEN_STRING;
|
||||
if (! gimp_scanner_parse_string (scanner, &dockable->identifier))
|
||||
if (! gimp_scanner_parse_string (scanner, &info->identifier))
|
||||
goto error;
|
||||
|
||||
token = G_TOKEN_LEFT_PAREN;
|
||||
|
@ -182,18 +171,18 @@ gimp_session_info_dockable_deserialize (GScanner *scanner,
|
|||
scanner->value.v_identifier);
|
||||
|
||||
if (enum_value)
|
||||
dockable->tab_style = enum_value->value;
|
||||
info->tab_style = enum_value->value;
|
||||
break;
|
||||
|
||||
case SESSION_INFO_DOCKABLE_VIEW_SIZE:
|
||||
token = G_TOKEN_INT;
|
||||
if (! gimp_scanner_parse_int (scanner, &dockable->view_size))
|
||||
if (! gimp_scanner_parse_int (scanner, &info->view_size))
|
||||
goto error;
|
||||
break;
|
||||
|
||||
case SESSION_INFO_DOCKABLE_AUX:
|
||||
token = gimp_session_info_aux_deserialize (scanner,
|
||||
&dockable->aux_info);
|
||||
&info->aux_info);
|
||||
if (token != G_TOKEN_LEFT_PAREN)
|
||||
goto error;
|
||||
break;
|
||||
|
@ -213,7 +202,8 @@ gimp_session_info_dockable_deserialize (GScanner *scanner,
|
|||
}
|
||||
}
|
||||
|
||||
book->dockables = g_list_append (book->dockables, dockable);
|
||||
*dockable = info;
|
||||
|
||||
g_type_class_unref (enum_class);
|
||||
|
||||
g_scanner_scope_remove_symbol (scanner, scope, "tab-style");
|
||||
|
@ -223,12 +213,47 @@ gimp_session_info_dockable_deserialize (GScanner *scanner,
|
|||
return token;
|
||||
|
||||
error:
|
||||
gimp_session_info_dockable_free (dockable);
|
||||
*dockable = NULL;
|
||||
|
||||
gimp_session_info_dockable_free (info);
|
||||
g_type_class_unref (enum_class);
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
GimpSessionInfoDockable *
|
||||
gimp_session_info_dockable_from_widget (GimpDockable *dockable)
|
||||
{
|
||||
GimpSessionInfoDockable *info;
|
||||
GimpDialogFactoryEntry *entry;
|
||||
GimpContainerView *view;
|
||||
gint view_size = -1;
|
||||
|
||||
g_return_val_if_fail (GIMP_IS_DOCKABLE (dockable), NULL);
|
||||
|
||||
gimp_dialog_factory_from_widget (GTK_WIDGET (dockable), &entry);
|
||||
|
||||
g_return_val_if_fail (entry != NULL, NULL);
|
||||
|
||||
info = gimp_session_info_dockable_new ();
|
||||
|
||||
info->identifier = g_strdup (entry->identifier);
|
||||
info->tab_style = dockable->tab_style;
|
||||
info->view_size = -1;
|
||||
|
||||
view = gimp_container_view_get_by_dockable (dockable);
|
||||
|
||||
if (view)
|
||||
view_size = gimp_container_view_get_view_size (view, NULL);
|
||||
|
||||
if (view_size > 0 && view_size != entry->view_size)
|
||||
info->view_size = view_size;
|
||||
|
||||
info->aux_info = gimp_session_info_aux_get_list (GTK_WIDGET (dockable));
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
GimpDockable *
|
||||
gimp_session_info_dockable_restore (GimpSessionInfoDockable *info,
|
||||
GimpDock *dock)
|
||||
|
|
|
@ -36,16 +36,19 @@ struct _GimpSessionInfoDockable
|
|||
|
||||
GimpSessionInfoDockable *
|
||||
gimp_session_info_dockable_new (void);
|
||||
void gimp_session_info_dockable_free (GimpSessionInfoDockable *info);
|
||||
void gimp_session_info_dockable_free (GimpSessionInfoDockable *info);
|
||||
|
||||
void gimp_session_info_dockable_serialize (GimpConfigWriter *writer,
|
||||
GimpDockable *dockable);
|
||||
GTokenType gimp_session_info_dockable_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfoBook *book);
|
||||
void gimp_session_info_dockable_serialize (GimpConfigWriter *writer,
|
||||
GimpSessionInfoDockable *dockable);
|
||||
GTokenType gimp_session_info_dockable_deserialize (GScanner *scanner,
|
||||
gint scope,
|
||||
GimpSessionInfoDockable **dockable);
|
||||
|
||||
GimpDockable * gimp_session_info_dockable_restore (GimpSessionInfoDockable *info,
|
||||
GimpDock *dock);
|
||||
GimpSessionInfoDockable *
|
||||
gimp_session_info_dockable_from_widget (GimpDockable *dockable);
|
||||
|
||||
GimpDockable * gimp_session_info_dockable_restore (GimpSessionInfoDockable *info,
|
||||
GimpDock *dock);
|
||||
|
||||
|
||||
#endif /* __GIMP_SESSION_INFO_DOCKABLE_H__ */
|
||||
|
|
|
@ -81,19 +81,7 @@ gimp_session_info_finalize (GObject *object)
|
|||
{
|
||||
GimpSessionInfo *info = GIMP_SESSION_INFO (object);
|
||||
|
||||
if (info->aux_info)
|
||||
{
|
||||
g_list_foreach (info->aux_info,
|
||||
(GFunc) gimp_session_info_aux_free, NULL);
|
||||
g_list_free (info->aux_info);
|
||||
}
|
||||
|
||||
if (info->books)
|
||||
{
|
||||
g_list_foreach (info->books,
|
||||
(GFunc) gimp_session_info_book_free, NULL);
|
||||
g_list_free (info->books);
|
||||
}
|
||||
gimp_session_info_clear_info (info);
|
||||
|
||||
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||
}
|
||||
|
@ -131,9 +119,6 @@ gimp_session_info_serialize (GimpConfigWriter *writer,
|
|||
g_return_if_fail (factory_name != NULL);
|
||||
g_return_if_fail (writer != NULL);
|
||||
|
||||
if (info->widget)
|
||||
gimp_session_info_get_geometry (info);
|
||||
|
||||
if (info->toplevel_entry)
|
||||
dialog_name = info->toplevel_entry->identifier;
|
||||
else
|
||||
|
@ -166,10 +151,11 @@ gimp_session_info_serialize (GimpConfigWriter *writer,
|
|||
|
||||
if (info->widget)
|
||||
{
|
||||
gimp_session_info_aux_serialize (writer, info->widget);
|
||||
if (info->aux_info)
|
||||
gimp_session_info_aux_serialize (writer, info->aux_info);
|
||||
|
||||
if (! info->toplevel_entry)
|
||||
gimp_session_info_dock_serialize (writer, GIMP_DOCK (info->widget));
|
||||
if (info->books)
|
||||
gimp_session_info_dock_serialize (writer, info->books);
|
||||
}
|
||||
|
||||
gimp_config_writer_close (writer); /* session-info */
|
||||
|
@ -405,10 +391,6 @@ gimp_session_info_restore (GimpSessionInfo *info,
|
|||
{
|
||||
gimp_session_info_dock_restore (info, factory, screen);
|
||||
}
|
||||
|
||||
g_list_foreach (info->aux_info, (GFunc) gimp_session_info_aux_free, NULL);
|
||||
g_list_free (info->aux_info);
|
||||
info->aux_info = NULL;
|
||||
}
|
||||
|
||||
/* This function mostly lifted from
|
||||
|
@ -581,3 +563,39 @@ gimp_session_info_get_geometry (GimpSessionInfo *info)
|
|||
info->screen = gdk_screen_get_number (screen);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gimp_session_info_get_info (GimpSessionInfo *info)
|
||||
{
|
||||
g_return_if_fail (GIMP_IS_SESSION_INFO (info));
|
||||
g_return_if_fail (GTK_IS_WIDGET (info->widget));
|
||||
|
||||
gimp_session_info_get_geometry (info);
|
||||
|
||||
info->aux_info = gimp_session_info_aux_get_list (info->widget);
|
||||
|
||||
if (! info->toplevel_entry)
|
||||
info->books = gimp_session_info_dock_from_widget (GIMP_DOCK (info->widget));
|
||||
}
|
||||
|
||||
void
|
||||
gimp_session_info_clear_info (GimpSessionInfo *info)
|
||||
{
|
||||
g_return_if_fail (GIMP_IS_SESSION_INFO (info));
|
||||
|
||||
if (info->aux_info)
|
||||
{
|
||||
g_list_foreach (info->aux_info,
|
||||
(GFunc) gimp_session_info_aux_free, NULL);
|
||||
g_list_free (info->aux_info);
|
||||
info->aux_info = NULL;
|
||||
}
|
||||
|
||||
if (info->books)
|
||||
{
|
||||
g_list_foreach (info->books,
|
||||
(GFunc) gimp_session_info_book_free, NULL);
|
||||
g_list_free (info->books);
|
||||
info->books = NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -86,5 +86,8 @@ void gimp_session_info_restore (GimpSessionInfo *info,
|
|||
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);
|
||||
|
||||
|
||||
#endif /* __GIMP_SESSION_INFO_H__ */
|
||||
|
|
Loading…
Reference in New Issue