From 4162e3c933ba20d40da66fae65f7188044d5c867 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Tue, 4 Nov 2003 10:08:02 +0000 Subject: Yet another sensitivity update strategy. Set sensitivity on menu show and 2003-11-04 Marco Pesenti Gritti * src/ephy-window.c: (edit_menu_show_cb), (edit_menu_hide_cb), (init_menu_updaters), (setup_window): Yet another sensitivity update strategy. Set sensitivity on menu show and reset it on menu hide, so that accellerators ever work. --- src/ephy-window.c | 142 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 87 insertions(+), 55 deletions(-) (limited to 'src/ephy-window.c') diff --git a/src/ephy-window.c b/src/ephy-window.c index cbc45f074..4f3dfbeda 100644 --- a/src/ephy-window.c +++ b/src/ephy-window.c @@ -70,14 +70,12 @@ ephy_window_notebook_switch_page_cb (GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, EphyWindow *window); -static void -window_cmd_edit (GtkAction *action, EphyWindow *window); static GtkActionEntry ephy_menu_entries [] = { /* Toplevel */ { "File", NULL, N_("_File") }, - { "Edit", NULL, N_("_Edit"), NULL, NULL, G_CALLBACK (window_cmd_edit) }, + { "Edit", NULL, N_("_Edit") }, { "View", NULL, N_("_View") }, { "Bookmarks", NULL, N_("_Bookmarks") }, { "Go", NULL, N_("_Go") }, @@ -350,58 +348,6 @@ ephy_window_get_type (void) return ephy_window_type; } -void -window_cmd_edit (GtkAction *action, - EphyWindow *window) -{ - GtkWidget *widget = gtk_window_get_focus (GTK_WINDOW (window)); - GtkActionGroup *action_group; - gboolean can_copy, can_cut, can_undo, can_redo; - - if (GTK_IS_EDITABLE (widget)) - { - gboolean has_selection; - - has_selection = gtk_editable_get_selection_bounds - (GTK_EDITABLE (widget), NULL, NULL); - - can_copy = has_selection; - can_cut = has_selection; - can_undo = FALSE; - can_redo = FALSE; - } - else - { - EphyEmbed *embed; - - embed = ephy_window_get_active_embed (window); - g_return_if_fail (embed != NULL); - - ephy_command_manager_get_command_state - (EPHY_COMMAND_MANAGER (embed), "cmd_copy", &can_copy); - ephy_command_manager_get_command_state - (EPHY_COMMAND_MANAGER (embed), "cmd_cut", &can_cut); - ephy_command_manager_get_command_state - (EPHY_COMMAND_MANAGER (embed), "cmd_undo", &can_undo); - ephy_command_manager_get_command_state - (EPHY_COMMAND_MANAGER (embed), "cmd_redo", &can_redo); - } - - action_group = window->priv->action_group; - - action = gtk_action_group_get_action (action_group, "EditCopy"); - g_object_set (action, "sensitive", can_copy, NULL); - - action = gtk_action_group_get_action (action_group, "EditCut"); - g_object_set (action, "sensitive", can_cut, NULL); - - action = gtk_action_group_get_action (action_group, "EditUndo"); - g_object_set (action, "sensitive", can_undo, NULL); - - action = gtk_action_group_get_action (action_group, "EditRedo"); - g_object_set (action, "sensitive", can_redo, NULL); -} - static void remove_from_session (EphyWindow *window) { @@ -628,6 +574,90 @@ ephy_window_state_event_cb (GtkWidget *widget, GdkEventWindowState *event, EphyW return FALSE; } +static void +edit_menu_show_cb (GtkWidget *menu, + EphyWindow *window) +{ + GtkWidget *widget = gtk_window_get_focus (GTK_WINDOW (window)); + GtkActionGroup *action_group; + GtkAction *action; + gboolean can_copy, can_cut, can_undo, can_redo; + + if (GTK_IS_EDITABLE (widget)) + { + gboolean has_selection; + + has_selection = gtk_editable_get_selection_bounds + (GTK_EDITABLE (widget), NULL, NULL); + + can_copy = has_selection; + can_cut = has_selection; + can_undo = FALSE; + can_redo = FALSE; + } + else + { + EphyEmbed *embed; + + embed = ephy_window_get_active_embed (window); + g_return_if_fail (embed != NULL); + + ephy_command_manager_get_command_state + (EPHY_COMMAND_MANAGER (embed), "cmd_copy", &can_copy); + ephy_command_manager_get_command_state + (EPHY_COMMAND_MANAGER (embed), "cmd_cut", &can_cut); + ephy_command_manager_get_command_state + (EPHY_COMMAND_MANAGER (embed), "cmd_undo", &can_undo); + ephy_command_manager_get_command_state + (EPHY_COMMAND_MANAGER (embed), "cmd_redo", &can_redo); + } + + action_group = window->priv->action_group; + + action = gtk_action_group_get_action (action_group, "EditCopy"); + g_object_set (action, "sensitive", can_copy, NULL); + action = gtk_action_group_get_action (action_group, "EditCut"); + g_object_set (action, "sensitive", can_cut, NULL); + action = gtk_action_group_get_action (action_group, "EditUndo"); + g_object_set (action, "sensitive", can_undo, NULL); + action = gtk_action_group_get_action (action_group, "EditRedo"); + g_object_set (action, "sensitive", can_redo, NULL); +} + +static void +edit_menu_hide_cb (GtkWidget *menu, + EphyWindow *window) +{ + GtkActionGroup *action_group; + GtkAction *action; + + action_group = window->priv->action_group; + + action = gtk_action_group_get_action (action_group, "EditCopy"); + g_object_set (action, "sensitive", TRUE, NULL); + action = gtk_action_group_get_action (action_group, "EditCut"); + g_object_set (action, "sensitive", TRUE, NULL); + action = gtk_action_group_get_action (action_group, "EditUndo"); + g_object_set (action, "sensitive", TRUE, NULL); + action = gtk_action_group_get_action (action_group, "EditRedo"); + g_object_set (action, "sensitive", TRUE, NULL); +} + +static void +init_menu_updaters (EphyWindow *window) +{ + GtkWidget *edit_menu_item, *edit_menu; + + edit_menu_item = gtk_ui_manager_get_widget + (GTK_UI_MANAGER (window->ui_merge), "/menubar/EditMenu"); + edit_menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (edit_menu_item)); + + g_signal_connect (edit_menu, "show", + G_CALLBACK (edit_menu_show_cb), window); + g_signal_connect (edit_menu, "hide", + G_CALLBACK (edit_menu_hide_cb), window); +} + static void setup_window (EphyWindow *window) { @@ -704,6 +734,8 @@ setup_window (EphyWindow *window) gtk_ui_manager_ensure_update (GTK_UI_MANAGER (window->ui_merge)); + init_menu_updaters (window); + window->priv->toolbar = toolbar_new (window); gtk_widget_show (GTK_WIDGET (window->priv->toolbar)); gtk_box_pack_end (GTK_BOX (window->priv->menu_dock), -- cgit v1.2.3