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