From 03f0700c23324f28c176a920b8350b1a3e4778ca Mon Sep 17 00:00:00 2001 From: Nick Treleaven Date: Tue, 16 Sep 2008 15:47:26 +0000 Subject: [PATCH] Add plugin signal "document-close", sent just before a document is closed. (Merged from split-window-plugin branch). git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@2953 ea778897-0a13-0410-b9d1-a72fbfd435f5 --- ChangeLog | 5 +++ doc/plugins.dox | 11 ++++++ src/document.c | 95 +++++++++++++++++++++++++---------------------- src/geanyobject.c | 10 +++++ src/geanyobject.h | 2 + 5 files changed, 79 insertions(+), 44 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9cbc6d26..b2e13c16 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,11 @@ * doc/plugins.dox: Fix wrong parameter for "project-close" signal. (Merged from split-window-plugin branch). + * src/geanyobject.c, src/geanyobject.h, src/document.c, + doc/plugins.dox: + Add plugin signal "document-close", sent just before a document is + closed. + (Merged from split-window-plugin branch). 2008-09-15 Nick Treleaven diff --git a/doc/plugins.dox b/doc/plugins.dox index 27621de7..9e7414bb 100644 --- a/doc/plugins.dox +++ b/doc/plugins.dox @@ -121,6 +121,17 @@ PluginCallback plugin_callbacks[] = * @param user_data user data. * @endsignaldef * + * @signaldef document-close + * @signalproto + * void user_function(GObject *obj, GeanyDocument *doc, gpointer user_data); + * @endsignalproto + * @signaldesc + * Sent before closing a document. + * @param obj a GeanyObject instance, should be ignored. + * @param doc the document about to be closed. + * @param user_data user data. + * @endsignaldef + * * @signaldef project-open * @signalproto * void user_function(GObject *obj, GKeyFile *config, gpointer user_data); diff --git a/src/document.c b/src/document.c index 9639daea..7e2f4176 100644 --- a/src/document.c +++ b/src/document.c @@ -475,53 +475,60 @@ gboolean document_close(GeanyDocument *doc) gboolean document_remove_page(guint page_num) { GeanyDocument *doc = document_get_from_page(page_num); + Document *fdoc = DOCUMENT(doc); - if (doc != NULL) + if (doc == NULL) { - Document *fdoc = DOCUMENT(doc); - - if (doc->changed && ! dialogs_show_unsaved_file(doc)) - { - return FALSE; - } - /* Checking real_path makes it likely the file exists on disk */ - if (! main_status.closing_all && doc->real_path != NULL) - ui_add_recent_file(doc->file_name); - - notebook_remove_page(page_num); - treeviews_remove_document(doc); - navqueue_remove_file(doc->file_name); - msgwin_status_add(_("File %s closed."), DOC_FILENAME(doc)); - g_free(doc->encoding); - g_free(fdoc->saved_encoding.encoding); - g_free(doc->file_name); - g_free(doc->real_path); - tm_workspace_remove_object(doc->tm_file, TRUE, TRUE); - - editor_destroy(doc->editor); - doc->editor = NULL; - - doc->is_valid = FALSE; - doc->file_name = NULL; - doc->real_path = NULL; - doc->file_type = NULL; - doc->encoding = NULL; - doc->has_bom = FALSE; - doc->tm_file = NULL; - document_undo_clear(doc); - if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)) == 0) - { - treeviews_update_tag_list(NULL, FALSE); - /*on_notebook1_switch_page(GTK_NOTEBOOK(main_widgets.notebook), NULL, 0, NULL);*/ - ui_set_window_title(NULL); - ui_save_buttons_toggle(FALSE); - ui_document_buttons_update(); - build_menu_update(NULL); - } - return TRUE; + geany_debug("Error: page_num: %d", page_num); + return FALSE; } - geany_debug("Error: page_num: %d", page_num); - return FALSE; + + if (doc->changed && ! dialogs_show_unsaved_file(doc)) + { + return FALSE; + } + + /* tell any plugins that the document is about to be closed */ + if (geany_object) + { + g_signal_emit_by_name(geany_object, "document-close", doc); + } + + /* Checking real_path makes it likely the file exists on disk */ + if (! main_status.closing_all && doc->real_path != NULL) + ui_add_recent_file(doc->file_name); + + notebook_remove_page(page_num); + treeviews_remove_document(doc); + navqueue_remove_file(doc->file_name); + msgwin_status_add(_("File %s closed."), DOC_FILENAME(doc)); + g_free(doc->encoding); + g_free(fdoc->saved_encoding.encoding); + g_free(doc->file_name); + g_free(doc->real_path); + tm_workspace_remove_object(doc->tm_file, TRUE, TRUE); + + editor_destroy(doc->editor); + doc->editor = NULL; + + doc->is_valid = FALSE; + doc->file_name = NULL; + doc->real_path = NULL; + doc->file_type = NULL; + doc->encoding = NULL; + doc->has_bom = FALSE; + doc->tm_file = NULL; + document_undo_clear(doc); + if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)) == 0) + { + treeviews_update_tag_list(NULL, FALSE); + /*on_notebook1_switch_page(GTK_NOTEBOOK(main_widgets.notebook), NULL, 0, NULL);*/ + ui_set_window_title(NULL); + ui_save_buttons_toggle(FALSE); + ui_document_buttons_update(); + build_menu_update(NULL); + } + return TRUE; } diff --git a/src/geanyobject.c b/src/geanyobject.c index 5deb9fc8..351f67cc 100644 --- a/src/geanyobject.c +++ b/src/geanyobject.c @@ -116,6 +116,15 @@ static void create_signals(GObjectClass *g_object_class) gtk_marshal_NONE__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); + geany_object_signals[GCB_DOCUMENT_CLOSE] = g_signal_new ( + "document-close", + G_OBJECT_CLASS_TYPE (g_object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (GeanyObjectClass, document_close), + NULL, NULL, + gtk_marshal_NONE__POINTER, + G_TYPE_NONE, 1, + G_TYPE_POINTER); geany_object_signals[GCB_PROJECT_OPEN] = g_signal_new ( "project-open", @@ -143,6 +152,7 @@ static void create_signals(GObjectClass *g_object_class) NULL, NULL, gtk_marshal_NONE__NONE, G_TYPE_NONE, 0); + geany_object_signals[GCB_UPDATE_EDITOR_MENU] = g_signal_new ( "update-editor-menu", G_OBJECT_CLASS_TYPE (g_object_class), diff --git a/src/geanyobject.h b/src/geanyobject.h index 601fbeaa..412b1eac 100644 --- a/src/geanyobject.h +++ b/src/geanyobject.h @@ -38,6 +38,7 @@ typedef enum GCB_DOCUMENT_OPEN, GCB_DOCUMENT_SAVE, GCB_DOCUMENT_ACTIVATE, + GCB_DOCUMENT_CLOSE, GCB_PROJECT_OPEN, GCB_PROJECT_SAVE, GCB_PROJECT_CLOSE, @@ -75,6 +76,7 @@ struct _GeanyObjectClass void (*document_open)(GeanyDocument *doc); void (*document_save)(GeanyDocument *doc); void (*document_activate)(GeanyDocument *doc); + void (*document_close)(GeanyDocument *doc); void (*project_open)(GKeyFile *keyfile); void (*project_save)(GKeyFile *keyfile); void (*project_close)(void);