[Xfce4-commits] <mousepad:master> * mousepad/mousepad-window.c: Prevent multiple recent- and go-menu updates when multiple items are opened or the recent history is cleared.
Nick Schermer
noreply at xfce.org
Sat May 5 21:30:06 CEST 2012
Updating branch refs/heads/master
to 64c5d0349576fb0c55f7f9df7e985437c0fe8aea (commit)
from f0dc6b97b9512e8121ad3b253562d13f5baca205 (commit)
commit 64c5d0349576fb0c55f7f9df7e985437c0fe8aea
Author: Nick Schermer <nick at xfce.org>
Date: Wed Feb 28 19:16:13 2007 +0000
* mousepad/mousepad-window.c: Prevent multiple recent- and go-menu
updates when multiple items are opened or the recent history is
cleared.
(Old svn revision: 25044)
ChangeLog | 6 +++
mousepad/mousepad-window.c | 76 ++++++++++++++++++++++++++++++++++++-------
2 files changed, 69 insertions(+), 13 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index d9d84a6..4e3ee21 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2007-02-18 Nick Schermer <nick at xfce.org>
+ * mousepad/mousepad-window.c: Prevent multiple recent- and go-menu
+ updates when multiple items are opened or the recent history is
+ cleared.
+
+2007-02-18 Nick Schermer <nick at xfce.org>
+
* TODO, mousepad/mousepad-window.c: Add option to the recent menu
to clear the history.
* mousepad/mousepad-window.c: The recent items are now in the Mousepad
diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c
index 81d9a66..6a2e885 100644
--- a/mousepad/mousepad-window.c
+++ b/mousepad/mousepad-window.c
@@ -92,7 +92,7 @@ static void mousepad_window_error_dialog (GtkWindow
GError *error,
const gchar *message);
static void mousepad_window_update_actions (MousepadWindow *window);
-static void mousepad_window_rebuild_gomenu (MousepadWindow *window);
+static void mousepad_window_go_menu (MousepadWindow *window);
static void mousepad_window_selection_changed (MousepadScreen *screen,
gboolean selected,
MousepadWindow *window);
@@ -232,6 +232,7 @@ static const GtkToggleActionEntry toggle_action_entries[] =
static GObjectClass *mousepad_window_parent_class;
+static gboolean lock_menu_updates = FALSE;
@@ -703,6 +704,9 @@ mousepad_window_open_files (MousepadWindow *window,
_mousepad_return_if_fail (filenames != NULL);
_mousepad_return_if_fail (*filenames != NULL);
+ /* block menu updates */
+ lock_menu_updates = TRUE;
+
/* walk through all the filenames */
for (n = 0; filenames[n] != NULL; ++n)
{
@@ -725,6 +729,13 @@ mousepad_window_open_files (MousepadWindow *window,
g_free (filename);
filename = NULL;
}
+
+ /* allow menu updates again */
+ lock_menu_updates = FALSE;
+
+ /* update the menus */
+ mousepad_window_recent_menu (window);
+ mousepad_window_go_menu (window);
}
@@ -883,7 +894,7 @@ mousepad_window_add (MousepadWindow *window,
GTK_WIDGET_UNSET_FLAGS (window->notebook, GTK_CAN_FOCUS);
/* rebuild the go menu */
- mousepad_window_rebuild_gomenu (window);
+ mousepad_window_go_menu (window);
/* show the screen */
gtk_widget_show (GTK_WIDGET (screen));
@@ -1004,6 +1015,10 @@ mousepad_window_recent_menu (MousepadWindow *window)
GtkAction *action;
gint n;
+ /* leave when we're updating multiple files */
+ if (lock_menu_updates)
+ return;
+
/* unmerge the ui controls from the previous update */
if (merge_id != 0)
gtk_ui_manager_remove_ui (window->ui_manager, merge_id);
@@ -1091,6 +1106,9 @@ mousepad_window_recent_menu (MousepadWindow *window)
g_list_free (filtered);
g_list_foreach (items, (GFunc) gtk_recent_info_unref, NULL);
g_list_free (items);
+
+ /* make sure the ui is up2date to avoid flickering */
+ gtk_ui_manager_ensure_update (window->ui_manager);
}
@@ -1222,7 +1240,7 @@ mousepad_window_tab_removed (GtkNotebook *notebook,
GTK_WIDGET_UNSET_FLAGS (window->notebook, GTK_CAN_FOCUS);
/* rebuild the go menu */
- mousepad_window_rebuild_gomenu (window);
+ mousepad_window_go_menu (window);
/* update all screen sensitive actions */
mousepad_window_update_actions (window);
@@ -1237,15 +1255,8 @@ mousepad_window_page_reordered (GtkNotebook *notebook,
guint page_num,
MousepadWindow *window)
{
- GtkWidget *item;
-
/* update the go menu */
- mousepad_window_rebuild_gomenu (window);
-
- /* select the item in the menu */
- item = g_object_get_data (G_OBJECT (page), "go-menu-item");
- if (G_LIKELY (item != NULL))
- gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (item), TRUE);
+ mousepad_window_go_menu (window);
}
@@ -1364,7 +1375,7 @@ mousepad_window_action_goto (GtkRadioAction *action,
static void
-mousepad_window_rebuild_gomenu (MousepadWindow *window)
+mousepad_window_go_menu (MousepadWindow *window)
{
GtkWidget *screen;
gint npages;
@@ -1376,6 +1387,10 @@ mousepad_window_rebuild_gomenu (MousepadWindow *window)
GList *actions, *li;
static guint merge_id = 0;
+ /* leave when we're updating multiple files */
+ if (lock_menu_updates)
+ return;
+
/* remove the old merge */
if (merge_id != 0)
gtk_ui_manager_remove_ui (window->ui_manager, merge_id);
@@ -1391,6 +1406,7 @@ mousepad_window_rebuild_gomenu (MousepadWindow *window)
/* walk through the notebook pages */
npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook));
+
for (n = 0; n < npages; ++n)
{
screen = gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), n);
@@ -1419,6 +1435,10 @@ mousepad_window_rebuild_gomenu (MousepadWindow *window)
/* add a menu item without accelerator */
gtk_action_group_add_action (window->gomenu_actions, GTK_ACTION (action));
+ /* select this action */
+ if (gtk_notebook_get_current_page (GTK_NOTEBOOK (window->notebook)) == n)
+ gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
+
/* release the action */
g_object_unref (G_OBJECT (action));
@@ -1486,6 +1506,9 @@ mousepad_window_action_open_file (GtkAction *action,
/* open the new file */
filenames = gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER (chooser));
+ /* block menu updates */
+ lock_menu_updates = TRUE;
+
/* open the selected files */
for (li = filenames; li != NULL; li = li->next)
{
@@ -1503,6 +1526,13 @@ mousepad_window_action_open_file (GtkAction *action,
/* free the list */
g_slist_free(filenames);
+
+ /* allow menu updates again */
+ lock_menu_updates = FALSE;
+
+ /* update the menus */
+ mousepad_window_recent_menu (window);
+ mousepad_window_go_menu (window);
}
/* destroy dialog */
@@ -1578,6 +1608,9 @@ mousepad_window_action_clear_recent (GtkAction *action,
if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
{
+ /* avoid updating the menu */
+ lock_menu_updates = TRUE;
+
/* get all the items in the manager */
items = gtk_recent_manager_get_items (window->recent_manager);
@@ -1608,6 +1641,12 @@ mousepad_window_action_clear_recent (GtkAction *action,
/* cleanup */
g_list_foreach (items, (GFunc) gtk_recent_info_unref, NULL);
g_list_free (items);
+
+ /* allow menu updates again */
+ lock_menu_updates = FALSE;
+
+ /* update the recent menu */
+ mousepad_window_recent_menu (window);
}
/* destroy the dialog */
@@ -1734,6 +1773,9 @@ mousepad_window_action_close (GtkAction *action,
/* get the number of page in the notebook */
npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook)) - 1;
+ /* prevent menu updates */
+ lock_menu_updates = TRUE;
+
/* close all the tabs, one by one. the window will close
* when all the tabs are closed */
for (i = npages; i >= 0; --i)
@@ -1747,7 +1789,15 @@ mousepad_window_action_close (GtkAction *action,
/* ask user what to do, break when he/she hits the cancel button */
if (!mousepad_window_close_screen (window, MOUSEPAD_SCREEN (screen)))
- break;
+ {
+ /* allow updates again */
+ lock_menu_updates = FALSE;
+
+ /* update the go menu */
+ mousepad_window_go_menu (window);
+
+ break;
+ }
}
}
}
More information about the Xfce4-commits
mailing list