Revision: 3438 http://geany.svn.sourceforge.net/geany/?rev=3438&view=rev Author: ntrel Date: 2009-01-03 12:54:13 +0000 (Sat, 03 Jan 2009)
Log Message: ----------- Fix not switching to 2nd last used document when the last used document has been closed (#1945162). - Code changes: Move geany_object extern to geany.h. Remove CallbacksData struct.
Modified Paths: -------------- trunk/ChangeLog trunk/geany.glade trunk/src/callbacks.c trunk/src/callbacks.h trunk/src/geany.h trunk/src/geanyobject.c trunk/src/geanyobject.h trunk/src/interface.c trunk/src/keybindings.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-01-02 14:01:24 UTC (rev 3437) +++ trunk/ChangeLog 2009-01-03 12:54:13 UTC (rev 3438) @@ -1,3 +1,15 @@ +2009-01-03 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/interface.c, src/keybindings.c, src/geanyobject.c, + src/geanyobject.h, src/geany.h, src/callbacks.c, src/callbacks.h, + geany.glade: + Fix not switching to 2nd last used document when the last used + document has been closed (#1945162). + - Code changes: + Move geany_object extern to geany.h. + Remove CallbacksData struct. + + 2009-01-02 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/keybindings.c, src/keybindings.h, src/main.c:
Modified: trunk/geany.glade =================================================================== --- trunk/geany.glade 2009-01-02 14:01:24 UTC (rev 3437) +++ trunk/geany.glade 2009-01-03 12:54:13 UTC (rev 3438) @@ -1770,7 +1770,6 @@ <property name="tab_pos">GTK_POS_TOP</property> <property name="scrollable">True</property> <property name="enable_popup">True</property> - <signal name="switch_page" handler="on_notebook1_switch_page" last_modification_time="Sat, 23 Apr 2005 15:17:51 GMT"/> <signal name="switch_page" handler="on_notebook1_switch_page_after" after="yes" last_modification_time="Fri, 26 May 2006 11:47:25 GMT"/> </widget> <packing>
Modified: trunk/src/callbacks.c =================================================================== --- trunk/src/callbacks.c 2009-01-02 14:01:24 UTC (rev 3437) +++ trunk/src/callbacks.c 2009-01-03 12:54:13 UTC (rev 3438) @@ -89,9 +89,7 @@ * the selection-changed signal from tv.tree_openfiles */ /*static gboolean switch_tv_notebook_page = FALSE; */
-CallbacksData callbacks_data = { NULL };
- static gboolean check_no_unsaved(void) { guint i; @@ -703,18 +701,9 @@ }
+/* Changes window-title after switching tabs and lots of other things. + * note: using 'after' makes Scintilla redraw before the UI, appearing more responsive */ void -on_notebook1_switch_page (GtkNotebook *notebook, - GtkNotebookPage *page, - guint page_num, - gpointer user_data) -{ - callbacks_data.last_doc = document_get_current(); -} - - -/* changes window-title on switching tabs and lots of other things */ -void on_notebook1_switch_page_after (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num,
Modified: trunk/src/callbacks.h =================================================================== --- trunk/src/callbacks.h 2009-01-02 14:01:24 UTC (rev 3437) +++ trunk/src/callbacks.h 2009-01-03 12:54:13 UTC (rev 3438) @@ -25,14 +25,6 @@ #include "geany.h" /* necessary for interface.c */
-typedef struct -{ - GeanyDocument *last_doc; -} CallbacksData; - -extern CallbacksData callbacks_data; - - gboolean on_exit_clicked (GtkWidget *widget, gpointer gdata);
@@ -73,12 +65,6 @@ gpointer user_data);
void -on_notebook1_switch_page (GtkNotebook *notebook, - GtkNotebookPage *page, - guint page_num, - gpointer user_data); - -void on_save_all1_activate (GtkMenuItem *menuitem, gpointer user_data);
Modified: trunk/src/geany.h =================================================================== --- trunk/src/geany.h 2009-01-02 14:01:24 UTC (rev 3437) +++ trunk/src/geany.h 2009-01-03 12:54:13 UTC (rev 3438) @@ -79,7 +79,9 @@
extern GeanyApp *app;
+extern GObject *geany_object;
+ extern gboolean ignore_callback;
Modified: trunk/src/geanyobject.c =================================================================== --- trunk/src/geanyobject.c 2009-01-02 14:01:24 UTC (rev 3437) +++ trunk/src/geanyobject.c 2009-01-03 12:54:13 UTC (rev 3438) @@ -34,6 +34,7 @@ #include "geany.h" #include "geanyobject.h"
+/* extern in geany.h */ GObject *geany_object;
static guint geany_object_signals[GCB_MAX] = { 0 };
Modified: trunk/src/geanyobject.h =================================================================== --- trunk/src/geanyobject.h 2009-01-02 14:01:24 UTC (rev 3437) +++ trunk/src/geanyobject.h 2009-01-03 12:54:13 UTC (rev 3438) @@ -30,8 +30,6 @@
G_BEGIN_DECLS
-extern GObject *geany_object; - typedef enum { GCB_DOCUMENT_NEW,
Modified: trunk/src/interface.c =================================================================== --- trunk/src/interface.c 2009-01-02 14:01:24 UTC (rev 3437) +++ trunk/src/interface.c 2009-01-03 12:54:13 UTC (rev 3438) @@ -1473,9 +1473,6 @@ g_signal_connect ((gpointer) notebook3, "key_press_event", G_CALLBACK (on_escape_key_press_event), NULL); - g_signal_connect ((gpointer) notebook1, "switch_page", - G_CALLBACK (on_notebook1_switch_page), - NULL); g_signal_connect_after ((gpointer) notebook1, "switch_page", G_CALLBACK (on_notebook1_switch_page_after), NULL);
Modified: trunk/src/keybindings.c =================================================================== --- trunk/src/keybindings.c 2009-01-02 14:01:24 UTC (rev 3437) +++ trunk/src/keybindings.c 2009-01-03 12:54:13 UTC (rev 3438) @@ -58,6 +58,9 @@ static GtkAccelGroup *kb_accel_group = NULL; static const gboolean swap_alt_tab_order = FALSE;
+const gsize MAX_MRU_DOCS = 20; +static GQueue *mru_docs = NULL; + static gboolean switch_dialog_cancelled = TRUE; static GtkWidget *switch_dialog = NULL; static GtkWidget *switch_dialog_label = NULL; @@ -483,8 +486,51 @@ }
+/* before the tab changes, add the current document to the MRU list */ +static void on_notebook_switch_page() +{ + GeanyDocument *old = document_get_current(); + + /* when closing current doc, old is NULL */ + if (old) + { + g_queue_push_head(mru_docs, old); + + if (g_queue_get_length(mru_docs) > MAX_MRU_DOCS) + g_queue_pop_tail(mru_docs); + } +} + + +/* really this should be just after a document was closed, not idle */ +static gboolean on_idle_close(gpointer data) +{ + GeanyDocument *current; + + current = document_get_current(); + + while (current && g_queue_peek_head(mru_docs) == current) + g_queue_pop_head(mru_docs); + + return FALSE; +} + + +static void on_document_close(GObject *obj, GeanyDocument *doc) +{ + g_queue_remove_all(mru_docs, doc); + g_idle_add(on_idle_close, NULL); +} + + void keybindings_init(void) { + mru_docs = g_queue_new(); + g_signal_connect(main_widgets.notebook, "switch-page", + G_CALLBACK(on_notebook_switch_page), NULL); + g_signal_connect(geany_object, "document-close", + G_CALLBACK(on_document_close), NULL); + keybinding_groups = g_ptr_array_sized_new(GEANY_KEY_GROUP_COUNT);
kb_accel_group = gtk_accel_group_new(); @@ -671,6 +717,7 @@ void keybindings_free(void) { g_ptr_array_free(keybinding_groups, TRUE); + g_queue_free(mru_docs); }
@@ -1428,7 +1475,7 @@ static void cb_func_switch_tablastused(G_GNUC_UNUSED guint key_id) { /* TODO: MRU switching order */ - GeanyDocument *last_doc = callbacks_data.last_doc; + GeanyDocument *last_doc = g_queue_peek_head(mru_docs);
if (!DOC_VALID(last_doc)) return;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.