[Geany-devel] [PATCH 1/3] Fix tab history switching

Jiří Techet techet at xxxxx
Wed Jun 9 19:40:57 UTC 2010


There is a 600ms interval in which the panel displaying the current file
name isn't displayed. If you switch tabs with a keybinding and do it
too quickly (press it twice in the 600ms period), the wrong file is
put on top of the stack. This patch fixes the problem

Signed-off-by: Jiří Techet <techet at gmail.com>
---
 src/keybindings.c |   65 +++++++++++++++++++++++++++++++---------------------
 1 files changed, 39 insertions(+), 26 deletions(-)

diff --git a/src/keybindings.c b/src/keybindings.c
index 8347cc1..c297589 100644
--- a/src/keybindings.c
+++ b/src/keybindings.c
@@ -71,7 +71,7 @@ const gsize MAX_MRU_DOCS = 20;
 static GQueue *mru_docs = NULL;
 static guint mru_pos = 0;
 
-static gboolean switch_dialog_cancelled = TRUE;
+static gboolean switch_in_progress = FALSE;
 static GtkWidget *switch_dialog = NULL;
 static GtkWidget *switch_dialog_label = NULL;
 
@@ -576,7 +576,7 @@ static void on_notebook_switch_page(void)
 
 	/* when closing current doc, old is NULL.
 	 * Don't add to the mru list when switch dialog is visible. */
-	if (old && switch_dialog_cancelled)
+	if (old && !switch_in_progress)
 	{
 		g_queue_remove(mru_docs, old);
 		g_queue_push_head(mru_docs, old);
@@ -879,7 +879,7 @@ static GtkWidget *create_dialog(void)
 	gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
 
 	text_renderer = gtk_cell_renderer_text_new();
-    column = gtk_tree_view_column_new_with_attributes(NULL, text_renderer, "text", 1, NULL);
+	column = gtk_tree_view_column_new_with_attributes(NULL, text_renderer, "text", 1, NULL);
 	gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column);
 
 	fill_shortcut_labels_treeview(tree);
@@ -1751,12 +1751,15 @@ static void cb_func_switch_tabright(G_GNUC_UNUSED guint key_id)
 static gboolean on_key_release_event(GtkWidget *widget, GdkEventKey *ev, gpointer user_data)
 {
 	/* user may have rebound keybinding to a different modifier than Ctrl, so check all */
-	if (!switch_dialog_cancelled && is_modifier_key(ev->keyval))
+	if (switch_in_progress && is_modifier_key(ev->keyval))
 	{
-		switch_dialog_cancelled = TRUE;
+		switch_in_progress = FALSE;
 
-		if (switch_dialog && GTK_WIDGET_VISIBLE(switch_dialog))
-			gtk_widget_hide(switch_dialog);
+		if (switch_dialog)
+		{
+			gtk_widget_destroy(switch_dialog);
+			switch_dialog = NULL;
+		}
 
 		mru_pos = 0;
 	}
@@ -1809,23 +1812,27 @@ static GtkWidget *create_switch_dialog(void)
 }
 
 
-static gboolean on_switch_timeout(G_GNUC_UNUSED gpointer data)
+static void update_filename_label()
 {
-	if (switch_dialog_cancelled)
+	if (!switch_dialog)
 	{
-		return FALSE;
-	}
-	if (! switch_dialog || !GTK_WIDGET_VISIBLE(switch_dialog))
-		mru_pos = 2;	/* skip past the previous document */
-	else
-		mru_pos += 1;
-
-	if (! switch_dialog)
 		switch_dialog = create_switch_dialog();
+		gtk_widget_show_all(switch_dialog);
+	}
 
 	geany_wrap_label_set_text(GTK_LABEL(switch_dialog_label),
 		DOC_FILENAME(document_get_current()));
-	gtk_widget_show_all(switch_dialog);
+}
+
+
+static gboolean on_switch_timeout(G_GNUC_UNUSED gpointer data)
+{
+	if (!switch_in_progress || switch_dialog)
+	{
+		return FALSE;
+	}
+
+	update_filename_label();
 	return FALSE;
 }
 
@@ -1848,19 +1855,25 @@ static void cb_func_switch_tablastused(G_GNUC_UNUSED guint key_id)
 
 	/* if there's a modifier key, we can switch back in MRU order each time unless
 	 * the key is released */
-	if (! switch_dialog_cancelled)
+	if (!switch_in_progress)
 	{
-		on_switch_timeout(NULL);	/* update filename label */
-	}
-	else
-	if (keybindings_lookup_item(GEANY_KEY_GROUP_NOTEBOOK,
-		GEANY_KEYS_NOTEBOOK_SWITCHTABLASTUSED)->mods)
-	{
-		switch_dialog_cancelled = FALSE;
+		switch_in_progress = TRUE;
+
+		/* because switch_in_progress was not set when we called
+		 * gtk_notebook_set_current_page() above, this function inserted last_doc
+		 * into the queue => on mru_pos = 0 there is last_doc, on mru_pos = 1
+		 * there is the currently displayed doc, so we want to continue from 2
+		 * next time this function is called */
+		mru_pos = 2;
 
 		/* delay showing dialog to give user time to let go of any modifier keys */
 		g_timeout_add(600, on_switch_timeout, NULL);
 	}
+	else
+	{
+		update_filename_label();	/* update filename label */
+		mru_pos += 1;
+	}
 }
 
 
-- 
1.7.0.4




More information about the Devel mailing list