diff --git a/ChangeLog b/ChangeLog index 31c4829c3e..a43ccf1477 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,40 @@ +2008-03-24 Sven Neumann + + Do not any longer keep the document history in two places. We only + use GtkRecentManager now: + + * app/core/Makefile.am + * app/core/gimp-documents.[ch]: removed these files. + + * app/core/gimpdocumentlist.c: removed code to load and save the + "documents" file. + (gimp_document_list_add_uri): call gimp_recent_list_add_uri() here. + + * app/core/gimpimagefile.[ch]: added function to set the mime-type. + + * app/core/gimp.c (gimp_restore): removed code to load the + document history. + (gimp_real_exit): removed code to save it. + + * app/core/gimp-gui.[ch]: extended the vtable with a method to + populate the document list. + + * app/gui/gui-vtable.c: added code to populate the document history + from the list of recently used files kept by GtkRecentManager. + + * app/gui/gui.c (gui_restore_callback): load the recent files here. + + * app/file/file-open.c + * app/file/file-save.c: no need to call gimp_recent_list_add_uri() + any longer as gimp_document_list_add_uri() does that for us now. + + * app/actions/documents-commands.c (documents_clear_cmd_callback): + purge the items from GtkRecentManager. Also changed the dialog to + emphasize that this operation now affects the document history in + all applications. + + * docs/gimp.1.in: removed reference to "documents" file. + 2008-03-23 Mukund Sivaraman * HACKING: Updated section on getting dependencies, as we don't diff --git a/app/actions/documents-commands.c b/app/actions/documents-commands.c index 7323737129..1e8a2924fa 100644 --- a/app/actions/documents-commands.c +++ b/app/actions/documents-commands.c @@ -30,7 +30,6 @@ #include "config/gimpcoreconfig.h" #include "core/gimp.h" -#include "core/gimp-documents.h" #include "core/gimpcontainer.h" #include "core/gimpcontext.h" #include "core/gimpimagefile.h" @@ -170,8 +169,17 @@ documents_remove_cmd_callback (GtkAction *action, gpointer data) { GimpContainerEditor *editor = GIMP_CONTAINER_EDITOR (data); + GimpContext *context; + GimpImagefile *imagefile; + + context = gimp_container_view_get_context (editor->view); + imagefile = gimp_context_get_imagefile (context); gimp_container_view_remove_active (editor->view); + + gtk_recent_manager_remove_item (gtk_recent_manager_get_default (), + gimp_object_get_name (GIMP_OBJECT (imagefile)), + NULL); } void @@ -207,12 +215,12 @@ documents_clear_cmd_callback (GtkAction *action, dialog, G_CONNECT_SWAPPED); gimp_message_box_set_primary_text (GIMP_MESSAGE_DIALOG (dialog)->box, - _("Remove all entries from the " - "document history?")); + _("Clear the Recent Documents list?")); gimp_message_box_set_text (GIMP_MESSAGE_DIALOG (dialog)->box, _("Clearing the document history will permanently " - "remove all currently listed entries.")); + "remove all items from the recent documents " + "list in all applications.")); if (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK) { @@ -221,7 +229,8 @@ documents_clear_cmd_callback (GtkAction *action, gimp_container_clear (gimp->documents); - if (! gimp_documents_save (gimp, &error)) + if (! gtk_recent_manager_purge_items (gtk_recent_manager_get_default (), + &error)) { gimp_message (gimp, G_OBJECT (dialog), GIMP_MESSAGE_ERROR, "%s", error->message); diff --git a/app/core/Makefile.am b/app/core/Makefile.am index 9c2bbf91f3..0360f88998 100644 --- a/app/core/Makefile.am +++ b/app/core/Makefile.am @@ -24,8 +24,6 @@ libappcore_a_sources = \ gimp.h \ gimp-contexts.c \ gimp-contexts.h \ - gimp-documents.c \ - gimp-documents.h \ gimp-edit.c \ gimp-edit.h \ gimp-gradients.c \ diff --git a/app/core/gimp-documents.c b/app/core/gimp-documents.c deleted file mode 100644 index ee5b59f5b7..0000000000 --- a/app/core/gimp-documents.c +++ /dev/null @@ -1,108 +0,0 @@ -/* GIMP - The GNU Image Manipulation Program - * Copyright (C) 1995-1997 Spencer Kimball and Peter Mattis - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "config.h" - -#include - -#include "libgimpbase/gimpbase.h" -#include "libgimpconfig/gimpconfig.h" - -#include "core-types.h" - -#include "config/gimpcoreconfig.h" - -#include "gimp.h" -#include "gimp-documents.h" -#include "gimpdocumentlist.h" - - -/* functions to load and save the gimp documents files */ - -gboolean -gimp_documents_load (Gimp *gimp, - GError **error) -{ - gchar *filename; - GError *my_error = NULL; - gboolean success; - - g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE); - g_return_val_if_fail (GIMP_IS_DOCUMENT_LIST (gimp->documents), FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - filename = gimp_personal_rc_file ("documents"); - - if (gimp->be_verbose) - g_print ("Parsing '%s'\n", gimp_filename_to_utf8 (filename)); - - success = gimp_config_deserialize_file (GIMP_CONFIG (gimp->documents), - filename, - GINT_TO_POINTER (gimp->config->thumbnail_size), - &my_error); - - if (! success) - { - if (my_error->code == GIMP_CONFIG_ERROR_OPEN_ENOENT) - { - g_clear_error (&my_error); - success = TRUE; - } - else - { - g_propagate_error (error, my_error); - } - } - - g_free (filename); - - return success; -} - -gboolean -gimp_documents_save (Gimp *gimp, - GError **error) -{ - const gchar *header = - "GIMP documents\n" - "\n" - "This file will be entirely rewritten each time you exit."; - const gchar *footer = - "end of documents"; - - gchar *filename; - gboolean success; - - g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE); - g_return_val_if_fail (GIMP_IS_DOCUMENT_LIST (gimp->documents), FALSE); - g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - - filename = gimp_personal_rc_file ("documents"); - - if (gimp->be_verbose) - g_print ("Writing '%s'\n", gimp_filename_to_utf8 (filename)); - - success = gimp_config_serialize_to_file (GIMP_CONFIG (gimp->documents), - filename, - header, footer, NULL, - error); - - g_free (filename); - - return success; -} diff --git a/app/core/gimp-documents.h b/app/core/gimp-documents.h deleted file mode 100644 index b2a095f0f2..0000000000 --- a/app/core/gimp-documents.h +++ /dev/null @@ -1,29 +0,0 @@ -/* GIMP - The GNU Image Manipulation Program - * Copyright (C) 1995-1997 Spencer Kimball and Peter Mattis - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __GIMP_DOCUMENTS_H__ -#define __GIMP_DOCUMENTS_H__ - - -gboolean gimp_documents_load (Gimp *gimp, - GError **error); -gboolean gimp_documents_save (Gimp *gimp, - GError **error); - - -#endif /* __GIMP_DOCUMENTS_H__ */ diff --git a/app/core/gimp-gui.c b/app/core/gimp-gui.c index 8bb0f2eefa..4e4d208b8e 100644 --- a/app/core/gimp-gui.c +++ b/app/core/gimp-gui.c @@ -62,6 +62,7 @@ gimp_gui_init (Gimp *gimp) gimp->gui.pdb_dialog_set = NULL; gimp->gui.pdb_dialog_close = NULL; gimp->gui.recent_list_add_uri = NULL; + gimp->gui.recent_list_load = NULL; } void @@ -430,3 +431,12 @@ gimp_recent_list_add_uri (Gimp *gimp, return FALSE; } + +void +gimp_recent_list_load (Gimp *gimp) +{ + g_return_if_fail (GIMP_IS_GIMP (gimp)); + + if (gimp->gui.recent_list_load) + gimp->gui.recent_list_load (gimp); +} diff --git a/app/core/gimp-gui.h b/app/core/gimp-gui.h index 8f63644af9..16af1416a6 100644 --- a/app/core/gimp-gui.h +++ b/app/core/gimp-gui.h @@ -84,6 +84,7 @@ struct _GimpGui gboolean (* recent_list_add_uri) (Gimp *gimp, const gchar *uri, const gchar *mime_type); + void (* recent_list_load) (Gimp *gimp); }; @@ -154,5 +155,7 @@ gboolean gimp_pdb_dialog_close (Gimp *gimp, gboolean gimp_recent_list_add_uri (Gimp *gimp, const gchar *uri, const gchar *mime_type); +void gimp_recent_list_load (Gimp *gimp); + #endif /* __GIMP_GUI_H__ */ diff --git a/app/core/gimp.c b/app/core/gimp.c index ecda4f89f0..b36192b055 100644 --- a/app/core/gimp.c +++ b/app/core/gimp.c @@ -44,7 +44,6 @@ #include "gimp.h" #include "gimp-contexts.h" -#include "gimp-documents.h" #include "gimp-gradients.h" #include "gimp-modules.h" #include "gimp-parasites.h" @@ -624,8 +623,6 @@ static gboolean gimp_real_exit (Gimp *gimp, gboolean force) { - GError *error = NULL; - if (gimp->be_verbose) g_print ("EXIT: %s\n", G_STRFUNC); @@ -639,13 +636,6 @@ gimp_real_exit (Gimp *gimp, gimp_fonts_reset (gimp); - if (gimp->config->save_document_history) - if (! gimp_documents_save (gimp, &error)) - { - gimp_message (gimp, NULL, GIMP_MESSAGE_ERROR, "%s", error->message); - g_clear_error (&error); - } - gimp_templates_save (gimp); gimp_parasiterc_save (gimp); gimp_unitrc_save (gimp); @@ -816,8 +806,6 @@ void gimp_restore (Gimp *gimp, GimpInitStatusFunc status_callback) { - GError *error = NULL; - g_return_if_fail (GIMP_IS_GIMP (gimp)); g_return_if_fail (status_callback != NULL); @@ -849,20 +837,12 @@ gimp_restore (Gimp *gimp, if (! gimp->no_fonts) gimp_fonts_load (gimp); - /* initialize the document history */ - status_callback (NULL, _("Documents"), 0.6); - if (! gimp_documents_load (gimp, &error)) - { - gimp_message (gimp, NULL, GIMP_MESSAGE_ERROR, "%s", error->message); - g_clear_error (&error); - } - /* initialize the template list */ - status_callback (NULL, _("Templates"), 0.7); + status_callback (NULL, _("Templates"), 0.6); gimp_templates_load (gimp); /* initialize the module list */ - status_callback (NULL, _("Modules"), 0.8); + status_callback (NULL, _("Modules"), 0.7); gimp_modules_load (gimp); g_signal_emit (gimp, gimp_signals[RESTORE], 0, status_callback); diff --git a/app/core/gimpdocumentlist.c b/app/core/gimpdocumentlist.c index d48bf00b2b..97985a4b80 100644 --- a/app/core/gimpdocumentlist.c +++ b/app/core/gimpdocumentlist.c @@ -24,26 +24,14 @@ #include "core-types.h" +#include "config/gimpcoreconfig.h" + #include "gimp.h" #include "gimpdocumentlist.h" #include "gimpimagefile.h" -static void gimp_document_list_config_iface_init (GimpConfigInterface *iface); -static gboolean gimp_document_list_serialize (GimpConfig *config, - GimpConfigWriter *writer, - gpointer data); -static gboolean gimp_document_list_deserialize (GimpConfig *config, - GScanner *scanner, - gint nest_level, - gpointer data); - - -G_DEFINE_TYPE_WITH_CODE (GimpDocumentList, gimp_document_list, GIMP_TYPE_LIST, - G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG, - gimp_document_list_config_iface_init)) - -static const gchar document_symbol[] = "document"; +G_DEFINE_TYPE (GimpDocumentList, gimp_document_list, GIMP_TYPE_LIST) static void @@ -56,99 +44,6 @@ gimp_document_list_init (GimpDocumentList *list) { } -static void -gimp_document_list_config_iface_init (GimpConfigInterface *iface) -{ - iface->serialize = gimp_document_list_serialize; - iface->deserialize = gimp_document_list_deserialize; -} - -static gboolean -gimp_document_list_serialize (GimpConfig *config, - GimpConfigWriter *writer, - gpointer data) -{ - GList *list; - - for (list = GIMP_LIST (config)->list; list; list = list->next) - { - gimp_config_writer_open (writer, document_symbol); - gimp_config_writer_string (writer, GIMP_OBJECT (list->data)->name); - gimp_config_writer_close (writer); - } - - return TRUE; -} - -static gboolean -gimp_document_list_deserialize (GimpConfig *config, - GScanner *scanner, - gint nest_level, - gpointer data) -{ - GimpDocumentList *document_list = GIMP_DOCUMENT_LIST (config); - GTokenType token; - gint size; - - size = GPOINTER_TO_INT (data); - - g_scanner_scope_add_symbol (scanner, 0, - document_symbol, (gpointer) document_symbol); - - token = G_TOKEN_LEFT_PAREN; - - while (g_scanner_peek_next_token (scanner) == token) - { - token = g_scanner_get_next_token (scanner); - - switch (token) - { - case G_TOKEN_LEFT_PAREN: - token = G_TOKEN_SYMBOL; - break; - - case G_TOKEN_SYMBOL: - token = G_TOKEN_RIGHT_PAREN; - if (scanner->value.v_symbol == document_symbol) - { - gchar *uri = NULL; - - if (! gimp_scanner_parse_string (scanner, &uri)) - { - token = G_TOKEN_STRING; - break; - } - - if (uri) - { - GimpImagefile *imagefile; - - imagefile = gimp_imagefile_new (document_list->gimp, uri); - - g_free (uri); - - gimp_container_add (GIMP_CONTAINER (document_list), - GIMP_OBJECT (imagefile)); - - g_object_unref (imagefile); - } - } - break; - - case G_TOKEN_RIGHT_PAREN: - token = G_TOKEN_LEFT_PAREN; - break; - - default: /* do nothing */ - break; - } - } - - gimp_list_reverse (GIMP_LIST (document_list)); - - return gimp_config_deserialize_return (scanner, token, nest_level); -} - GimpContainer * gimp_document_list_new (Gimp *gimp) { @@ -172,12 +67,15 @@ gimp_document_list_add_uri (GimpDocumentList *document_list, const gchar *uri, const gchar *mime_type) { + Gimp *gimp; GimpImagefile *imagefile; GimpContainer *container; g_return_val_if_fail (GIMP_IS_DOCUMENT_LIST (document_list), NULL); g_return_val_if_fail (uri != NULL, NULL); + gimp = document_list->gimp; + container = GIMP_CONTAINER (document_list); imagefile = (GimpImagefile *) gimp_container_get_child_by_name (container, @@ -189,14 +87,15 @@ gimp_document_list_add_uri (GimpDocumentList *document_list, } else { - imagefile = gimp_imagefile_new (document_list->gimp, uri); + imagefile = gimp_imagefile_new (gimp, uri); gimp_container_add (container, GIMP_OBJECT (imagefile)); g_object_unref (imagefile); } - g_object_set (imagefile->thumbnail, - "image-mimetype", mime_type, - NULL); + gimp_imagefile_set_mime_type (imagefile, mime_type); + + if (gimp->config->save_document_history) + gimp_recent_list_add_uri (gimp, uri, mime_type); return imagefile; } diff --git a/app/core/gimpimagefile.c b/app/core/gimpimagefile.c index 58a8c20daa..011598951a 100644 --- a/app/core/gimpimagefile.c +++ b/app/core/gimpimagefile.c @@ -183,6 +183,17 @@ gimp_imagefile_new (Gimp *gimp, return imagefile; } +void +gimp_imagefile_set_mime_type (GimpImagefile *imagefile, + const gchar *mime_type) +{ + g_return_if_fail (GIMP_IS_IMAGEFILE (imagefile)); + + g_object_set (imagefile->thumbnail, + "image-mimetype", mime_type, + NULL); +} + void gimp_imagefile_update (GimpImagefile *imagefile) { diff --git a/app/core/gimpimagefile.h b/app/core/gimpimagefile.h index dac1ace953..a5178e2177 100644 --- a/app/core/gimpimagefile.h +++ b/app/core/gimpimagefile.h @@ -47,7 +47,6 @@ struct _GimpImagefile Gimp *gimp; GimpThumbnail *thumbnail; - gchar *mime_type; gchar *description; gboolean static_desc; }; @@ -64,6 +63,8 @@ GType gimp_imagefile_get_type (void) G_GNUC_CONST; GimpImagefile * gimp_imagefile_new (Gimp *gimp, const gchar *uri); +void gimp_imagefile_set_mime_type (GimpImagefile *imagefile, + const gchar *mime_type); void gimp_imagefile_update (GimpImagefile *imagefile); void gimp_imagefile_create_thumbnail (GimpImagefile *imagefile, GimpContext *context, diff --git a/app/file/file-open.c b/app/file/file-open.c index 1e70392f35..6ae08086dc 100644 --- a/app/file/file-open.c +++ b/app/file/file-open.c @@ -362,9 +362,6 @@ file_open_with_proc_and_display (Gimp *gimp, gimp_imagefile_save_thumbnail (imagefile, mime_type, image); } } - - if (gimp->config->save_document_history) - gimp_recent_list_add_uri (gimp, uri, mime_type); } /* the display owns the image now */ @@ -448,9 +445,6 @@ file_open_layers (Gimp *gimp, gimp_document_list_add_uri (GIMP_DOCUMENT_LIST (gimp->documents), uri, mime_type); - - if (gimp->config->save_document_history) - gimp_recent_list_add_uri (gimp, uri, mime_type); } else { diff --git a/app/file/file-save.c b/app/file/file-save.c index 4b1985e98a..48f1c56fdc 100644 --- a/app/file/file-save.c +++ b/app/file/file-save.c @@ -183,9 +183,6 @@ file_save (GimpImage *image, /* only save a thumbnail if we are saving as XCF, see bug #25272 */ if (GIMP_PROCEDURE (file_proc)->proc_type == GIMP_INTERNAL) gimp_imagefile_save_thumbnail (imagefile, file_proc->mime_type, image); - - if (image->gimp->config->save_document_history) - gimp_recent_list_add_uri (image->gimp, uri, file_proc->mime_type); } else if (status != GIMP_PDB_CANCEL) { diff --git a/app/gui/gui-vtable.c b/app/gui/gui-vtable.c index 1879b94b3e..9861889d41 100644 --- a/app/gui/gui-vtable.c +++ b/app/gui/gui-vtable.c @@ -35,6 +35,8 @@ #include "core/gimpcontext.h" #include "core/gimpgradient.h" #include "core/gimpimage.h" +#include "core/gimpimagefile.h" +#include "core/gimplist.h" #include "core/gimppalette.h" #include "core/gimppattern.h" #include "core/gimpprogress.h" @@ -123,6 +125,8 @@ static gboolean gui_pdb_dialog_close (Gimp *gimp, static gboolean gui_recent_list_add_uri (Gimp *gimp, const gchar *uri, const gchar *mime_type); +static void gui_recent_list_load (Gimp *gimp); + /* public functions */ @@ -153,6 +157,7 @@ gui_vtable_init (Gimp *gimp) gimp->gui.pdb_dialog_set = gui_pdb_dialog_set; gimp->gui.pdb_dialog_close = gui_pdb_dialog_close; gimp->gui.recent_list_add_uri = gui_recent_list_add_uri; + gimp->gui.recent_list_load = gui_recent_list_load; } @@ -593,17 +598,12 @@ gui_recent_list_add_uri (Gimp *gimp, const gchar *uri, const gchar *mime_type) { - GtkRecentManager *manager; - GtkRecentData recent; - const gchar *groups[2] = { "Graphics", NULL }; + GtkRecentData recent; + const gchar *groups[2] = { "Graphics", NULL }; g_return_val_if_fail (GIMP_IS_GIMP (gimp), FALSE); g_return_val_if_fail (uri != NULL, FALSE); - manager = gtk_recent_manager_get_default (); - - g_return_val_if_fail (manager != NULL, FALSE); - /* use last part of the URI */ recent.display_name = NULL; @@ -616,5 +616,47 @@ gui_recent_list_add_uri (Gimp *gimp, recent.groups = (gchar **) groups; recent.is_private = FALSE; - return gtk_recent_manager_add_full (manager, uri, &recent); + return gtk_recent_manager_add_full (gtk_recent_manager_get_default (), + uri, &recent); +} + +static void +gui_recent_list_load (Gimp *gimp) +{ + GList *items; + GList *list; + + g_return_if_fail (GIMP_IS_GIMP (gimp)); + + gimp_container_freeze (gimp->documents); + gimp_container_clear (gimp->documents); + + items = gtk_recent_manager_get_items (gtk_recent_manager_get_default ()); + + for (list = items; list; list = list->next) + { + GtkRecentInfo *info = list->data; + + if (gtk_recent_info_has_application (info, + "GNU Image Manipulation Program")) + { + GimpImagefile *imagefile; + + imagefile = gimp_imagefile_new (gimp, + gtk_recent_info_get_uri (info)); + + gimp_imagefile_set_mime_type (imagefile, + gtk_recent_info_get_mime_type (info)); + + gimp_container_add (gimp->documents, GIMP_OBJECT (imagefile)); + g_object_unref (imagefile); + } + + gtk_recent_info_unref (info); + } + + g_list_free (items); + + gimp_list_reverse (GIMP_LIST (gimp->documents)); + gimp_container_thaw (gimp->documents); } diff --git a/app/gui/gui.c b/app/gui/gui.c index 30bb8dca68..eebda7c62e 100644 --- a/app/gui/gui.c +++ b/app/gui/gui.c @@ -436,7 +436,11 @@ gui_restore_callback (Gimp *gimp, g_type_class_unref (g_type_class_ref (GIMP_TYPE_COLOR_SELECTOR_PALETTE)); - (* status_callback) (NULL, _("Tool Options"), 1.0); + /* initialize the document history */ + status_callback (NULL, _("Documents"), 0.9); + gimp_recent_list_load (gimp); + + status_callback (NULL, _("Tool Options"), 1.0); gimp_tools_restore (gimp); } diff --git a/docs/gimp.1.in b/docs/gimp.1.in index 0b2b90c3b7..48804f5999 100644 --- a/docs/gimp.1.in +++ b/docs/gimp.1.in @@ -1,4 +1,4 @@ -.TH GIMP 1 "February 23 2008" "Version @GIMP_VERSION@" "GIMP Manual Pages" +.TH GIMP 1 "March 23 2008" "Version @GIMP_VERSION@" "GIMP Manual Pages" .SH NAME gimp - an image manipulation and paint program. @@ -193,9 +193,6 @@ placed in users' home directories the first time GIMP is run. together with the tool, colors, brush, pattern and gradient associated to that device. -\fB$HOME\fP/@gimpdir@/documents - lists all images that have been -opened or saved using GIMP. - \fB$HOME\fP/@gimpdir@/gtkrc - users set of GIMP-specific GTK config settings. Options such as widget color and fonts sizes can be set here.