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 <tec...@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

_______________________________________________
Geany-devel mailing list
Geany-devel@uvena.de
http://lists.uvena.de/cgi-bin/mailman/listinfo/geany-devel

Reply via email to