From 43e6542702d6f02df74679f6586912b92f8d6f43 Mon Sep 17 00:00:00 2001 From: Christian Dywan Date: Fri, 24 Jul 2009 23:55:57 +0200 Subject: [PATCH] Implement MidoriBrowser::populate-tool-menu and adjust extensions Extensions used to look for the menu and append items manually. In order to show Tools in the Compact menu a proper signal is needed. Adblock, Shortcuts and Toolbar Editor are ported to the new API. --- extensions/adblock.c | 36 +++++++---- extensions/shortcuts.c | 36 +++++++---- extensions/toolbar-editor.c | 34 +++++----- midori/midori-browser.c | 124 ++++++++++++++++++++++++++++++------ midori/midori-panel.c | 74 +++++++++++---------- 5 files changed, 207 insertions(+), 97 deletions(-) diff --git a/extensions/adblock.c b/extensions/adblock.c index a9e438f0..6d8bfe76 100644 --- a/extensions/adblock.c +++ b/extensions/adblock.c @@ -52,6 +52,11 @@ adblock_fixup_regexp (gchar* src) return dst; } +static void +adblock_browser_populate_tool_menu_cb (MidoriBrowser* browser, + GtkWidget* menu, + MidoriExtension* extension); + static void adblock_app_add_browser_cb (MidoriApp* app, MidoriBrowser* browser, @@ -59,13 +64,14 @@ adblock_app_add_browser_cb (MidoriApp* app, static void adblock_deactivate_cb (MidoriExtension* extension, - GtkWidget* menuitem) + MidoriBrowser* browser) { MidoriApp* app = midori_extension_get_app (extension); - gtk_widget_destroy (menuitem); g_signal_handlers_disconnect_by_func ( - extension, adblock_deactivate_cb, menuitem); + browser, adblock_browser_populate_tool_menu_cb, extension); + g_signal_handlers_disconnect_by_func ( + extension, adblock_deactivate_cb, browser); g_signal_handlers_disconnect_by_func ( app, adblock_app_add_browser_cb, extension); /* FIXME: Disconnect session callbacks */ @@ -289,26 +295,28 @@ adblock_menu_configure_filters_activate_cb (GtkWidget* menuitem, } static void -adblock_app_add_browser_cb (MidoriApp* app, - MidoriBrowser* browser, - MidoriExtension* extension) +adblock_browser_populate_tool_menu_cb (MidoriBrowser* browser, + GtkWidget* menu, + MidoriExtension* extension) { - GtkWidget* panel; - GtkWidget* menu; GtkWidget* menuitem; - panel = katze_object_get_object (browser, "panel"); - menu = katze_object_get_object (panel, "menu"); menuitem = gtk_menu_item_new_with_mnemonic (_("Configure _Advertisement filters...")); g_signal_connect (menuitem, "activate", G_CALLBACK (adblock_menu_configure_filters_activate_cb), extension); gtk_widget_show (menuitem); - gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 3); - g_object_unref (menu); - g_object_unref (panel); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); +} +static void +adblock_app_add_browser_cb (MidoriApp* app, + MidoriBrowser* browser, + MidoriExtension* extension) +{ + g_signal_connect (browser, "populate-tool-menu", + G_CALLBACK (adblock_browser_populate_tool_menu_cb), extension); g_signal_connect (extension, "deactivate", - G_CALLBACK (adblock_deactivate_cb), menuitem); + G_CALLBACK (adblock_deactivate_cb), browser); } static gboolean diff --git a/extensions/shortcuts.c b/extensions/shortcuts.c index 7f098099..e555b97c 100644 --- a/extensions/shortcuts.c +++ b/extensions/shortcuts.c @@ -14,6 +14,11 @@ #include #include "config.h" +static void +shortcuts_browser_populate_tool_menu_cb (MidoriBrowser* browser, + GtkWidget* menu, + MidoriExtension* extension); + static void shortcuts_app_add_browser_cb (MidoriApp* app, MidoriBrowser* browser, @@ -21,13 +26,14 @@ shortcuts_app_add_browser_cb (MidoriApp* app, static void shortcuts_deactivate_cb (MidoriExtension* extension, - GtkWidget* menuitem) + MidoriBrowser* browser) { MidoriApp* app = midori_extension_get_app (extension); - gtk_widget_destroy (menuitem); g_signal_handlers_disconnect_by_func ( - extension, shortcuts_deactivate_cb, menuitem); + browser, shortcuts_browser_populate_tool_menu_cb, extension); + g_signal_handlers_disconnect_by_func ( + extension, shortcuts_deactivate_cb, browser); g_signal_handlers_disconnect_by_func ( app, shortcuts_app_add_browser_cb, extension); } @@ -249,26 +255,28 @@ shortcuts_menu_configure_shortcuts_activate_cb (GtkWidget* menuitem, } static void -shortcuts_app_add_browser_cb (MidoriApp* app, - MidoriBrowser* browser, - MidoriExtension* extension) +shortcuts_browser_populate_tool_menu_cb (MidoriBrowser* browser, + GtkWidget* menu, + MidoriExtension* extension) { - GtkWidget* panel; - GtkWidget* menu; GtkWidget* menuitem; - panel = katze_object_get_object (browser, "panel"); - menu = katze_object_get_object (panel, "menu"); - g_object_unref (panel); menuitem = gtk_menu_item_new_with_mnemonic (_("Customize Sh_ortcuts...")); g_signal_connect (menuitem, "activate", G_CALLBACK (shortcuts_menu_configure_shortcuts_activate_cb), extension); gtk_widget_show (menuitem); - gtk_menu_shell_insert (GTK_MENU_SHELL (menu), menuitem, 3); - g_object_unref (menu); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); +} +static void +shortcuts_app_add_browser_cb (MidoriApp* app, + MidoriBrowser* browser, + MidoriExtension* extension) +{ + g_signal_connect (browser, "populate-tool-menu", + G_CALLBACK (shortcuts_browser_populate_tool_menu_cb), extension); g_signal_connect (extension, "deactivate", - G_CALLBACK (shortcuts_deactivate_cb), menuitem); + G_CALLBACK (shortcuts_deactivate_cb), browser); } static void diff --git a/extensions/toolbar-editor.c b/extensions/toolbar-editor.c index bf73ebb3..dd038a94 100644 --- a/extensions/toolbar-editor.c +++ b/extensions/toolbar-editor.c @@ -48,16 +48,17 @@ static const GtkTargetEntry tb_editor_dnd_targets[] = }; static const gint tb_editor_dnd_targets_len = G_N_ELEMENTS(tb_editor_dnd_targets); +static void tb_editor_browser_populate_tool_menu_cb(MidoriBrowser *browser, GtkWidget *menu, MidoriExtension *ext); static void tb_editor_app_add_browser_cb(MidoriApp *app, MidoriBrowser *browser, MidoriExtension *ext); -static void tb_editor_deactivate_cb(MidoriExtension *extension, GtkWidget *menuitem) +static void tb_editor_deactivate_cb(MidoriExtension *extension, MidoriBrowser *browser) { MidoriApp *app = midori_extension_get_app(extension); - gtk_widget_destroy(menuitem); - g_signal_handlers_disconnect_by_func(extension, tb_editor_deactivate_cb, menuitem); + g_signal_handlers_disconnect_by_func(browser, tb_editor_browser_populate_tool_menu_cb, extension); + g_signal_handlers_disconnect_by_func(extension, tb_editor_deactivate_cb, browser); g_signal_handlers_disconnect_by_func(app, tb_editor_app_add_browser_cb, extension); } @@ -571,24 +572,21 @@ static void tb_editor_menu_configure_toolbar_activate_cb(GtkWidget *menuitem, Mi g_free(tbw); } +static void tb_editor_browser_populate_tool_menu_cb(MidoriBrowser *browser, GtkWidget *menu, MidoriExtension *ext) +{ + GtkWidget *menuitem; + + menuitem = gtk_menu_item_new_with_mnemonic (_("Customize _Toolbar...")); + g_signal_connect (menuitem, "activate", + G_CALLBACK (tb_editor_menu_configure_toolbar_activate_cb), browser); + gtk_widget_show (menuitem); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); +} static void tb_editor_app_add_browser_cb(MidoriApp *app, MidoriBrowser *browser, MidoriExtension *ext) { - GtkWidget *panel; - GtkWidget *menu; - GtkWidget *menuitem; - - panel = katze_object_get_object(browser, "panel"); - menu = katze_object_get_object(panel, "menu"); - g_object_unref(panel); - menuitem = gtk_menu_item_new_with_mnemonic(_("Customize _Toolbar...")); - g_signal_connect(menuitem, "activate", - G_CALLBACK(tb_editor_menu_configure_toolbar_activate_cb), browser); - gtk_widget_show(menuitem); - gtk_menu_shell_insert(GTK_MENU_SHELL (menu), menuitem, 3); - g_object_unref(menu); - - g_signal_connect(ext, "deactivate", G_CALLBACK(tb_editor_deactivate_cb), menuitem); + g_signal_connect(browser, "populate-tool-menu", G_CALLBACK(tb_editor_browser_populate_tool_menu_cb), ext); + g_signal_connect(ext, "deactivate", G_CALLBACK(tb_editor_deactivate_cb), browser); } diff --git a/midori/midori-browser.c b/midori/midori-browser.c index af7b4013..2c28f6cc 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -132,6 +132,7 @@ enum CONTEXT_READY, ADD_DOWNLOAD, SEND_NOTIFICATION, + POPULATE_TOOL_MENU, QUIT, LAST_SIGNAL @@ -175,6 +176,10 @@ static void _midori_browser_set_toolbar_style (MidoriBrowser* browser, MidoriToolbarStyle toolbar_style); +GtkWidget* +midori_panel_construct_menu_item (MidoriPanel* panel, + MidoriViewable* viewable); + static GtkAction* _action_by_name (MidoriBrowser* browser, const gchar* name) @@ -1695,6 +1700,27 @@ midori_browser_class_init (MidoriBrowserClass* class) G_TYPE_STRING, G_TYPE_STRING); + /** + * MidoriBrowser::populate-tool-menu: + * @browser: the object on which the signal is emitted + * @menu: the #GtkMenu to populate + * + * Emitted when a Tool menu is displayed, such as the + * toplevel Tools in the menubar or the compact menu. + * + * Since: 0.1.9 + */ + signals[POPULATE_TOOL_MENU] = g_signal_new ( + "populate-tool-menu", + G_TYPE_FROM_CLASS (class), + (GSignalFlags)(G_SIGNAL_RUN_LAST), + 0, + 0, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, + GTK_TYPE_MENU); + signals[QUIT] = g_signal_new ( "quit", G_TYPE_FROM_CLASS (class), @@ -2481,6 +2507,59 @@ _action_bookmarks_activate_item (GtkAction* action, gtk_widget_grab_focus (midori_browser_get_current_tab (browser)); } +static void +_action_tools_populate_popup (GtkAction* action, + GtkMenu* menu, + MidoriBrowser* browser) +{ + static const GtkActionEntry actions[] = { + { "ManageSearchEngines" }, + { "ClearPrivateData" }, + { "-" }, + { NULL }, + { "p" }, + #ifdef G_OS_WIN32 + { NULL }, + { "Preferences" }, + #endif + }; + guint i; + + for (i = 0; i < G_N_ELEMENTS (actions); i++) + { + GtkWidget* menuitem; + if (actions[i].name != NULL) + { + if (actions[i].name[0] == '-') + { + g_signal_emit (browser, signals[POPULATE_TOOL_MENU], 0, menu); + continue; + } + else if (actions[i].name[0] == 'p') + { + MidoriPanel* panel; + gsize j; + GtkWidget* widget; + + panel = MIDORI_PANEL (browser->panel); + j = 0; + while ((widget = midori_panel_get_nth_page (panel, j++))) + { + menuitem = midori_panel_construct_menu_item (panel, MIDORI_VIEWABLE (widget)); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + } + continue; + } + menuitem = sokoke_action_create_popup_menu_item ( + _action_by_name (browser, actions[i].name)); + } + else + menuitem = gtk_separator_menu_item_new (); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); + } +} + static gboolean _action_menus_activate_item_alt (GtkAction* action, KatzeItem* item, @@ -2542,13 +2621,14 @@ _action_compact_menu_populate_popup (GtkAction* action, { "TabNew" }, { "WindowNew" }, { "Open" }, - { "PrivateBrowsing" }, { "Print" }, + { "PrivateBrowsing" }, { NULL }, { "Bookmarkbar" }, { "Panel" }, { "Statusbar" }, { NULL }, + { "-" }, { "ClearPrivateData" }, { "Fullscreen" }, { "Preferences" }, @@ -2559,14 +2639,20 @@ _action_compact_menu_populate_popup (GtkAction* action, { GtkWidget* menuitem; if (actions[i].name != NULL) + { + if (actions[i].name[0] == '-') + { + g_signal_emit (browser, signals[POPULATE_TOOL_MENU], 0, menu); + continue; + } menuitem = sokoke_action_create_popup_menu_item ( _action_by_name (browser, actions[i].name)); + } else menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); + gtk_widget_show (menuitem); } - - gtk_widget_show_all (GTK_WIDGET (menu)); } static void @@ -4145,7 +4231,6 @@ static const GtkActionEntry entries[] = { { "BookmarkFolderAdd", NULL, N_("Add a new _folder"), "", N_("Add a new bookmark folder"), G_CALLBACK (_action_bookmark_folder_add_activate) }, - { "Tools", NULL, N_("_Tools") }, { "ManageSearchEngines", GTK_STOCK_PROPERTIES, N_("_Manage Search Engines"), "s", N_("Add, edit and remove search engines..."), @@ -4399,15 +4484,7 @@ static const gchar* ui_markup = "" "" "" - "" - "" - "" - /* Panel items shall be appended here */ - #ifdef G_OS_WIN32 - "" - "" - #endif - "" + "" "" "" "" @@ -4422,10 +4499,13 @@ static const gchar* ui_markup = "" "" "" + "" + "" "" "" "" "" + "" "" "" "" @@ -4780,6 +4860,18 @@ midori_browser_init (MidoriBrowser* browser) gtk_action_group_add_action_with_accel (browser->action_group, action, ""); g_object_unref (action); + action = g_object_new (KATZE_TYPE_ARRAY_ACTION, + "name", "Tools", + "label", _("_Tools"), + "array", katze_array_new (KATZE_TYPE_ITEM), + NULL); + g_object_connect (action, + "signal::populate-popup", + _action_tools_populate_popup, browser, + NULL); + gtk_action_group_add_action (browser->action_group, action); + g_object_unref (action); + action = g_object_new (KATZE_TYPE_ARRAY_ACTION, "name", "Window", "label", _("_Window"), @@ -4841,11 +4933,7 @@ midori_browser_init (MidoriBrowser* browser) gtk_widget_set_sensitive (menuitem, FALSE); gtk_menu_item_set_right_justified (GTK_MENU_ITEM (menuitem), TRUE); gtk_menu_shell_append (GTK_MENU_SHELL (browser->menubar), menuitem); - browser->menu_tools = gtk_menu_item_get_submenu (GTK_MENU_ITEM ( - gtk_ui_manager_get_widget (ui_manager, "/menubar/Tools"))); - menuitem = gtk_separator_menu_item_new (); - gtk_widget_show (menuitem); - gtk_menu_shell_insert (GTK_MENU_SHELL (browser->menu_tools), menuitem, 3); + browser->menu_tools = gtk_menu_new (); homepage = gtk_ui_manager_get_widget (ui_manager, "/menubar/Go/Homepage"); g_signal_connect (homepage, "button-press-event", diff --git a/midori/midori-panel.c b/midori/midori-panel.c index c299a9f4..655118c4 100644 --- a/midori/midori-panel.c +++ b/midori/midori-panel.c @@ -133,6 +133,15 @@ midori_panel_class_init (MidoriPanelClass* class) GTK_SHADOW_NONE, flags)); + /** + * MidoriWebSettings:menu: + * + * This is the menu that holds the panel menu items. + * + * You shouldn't use this menu or add items. + * + * Deprecated: 0.1.9 + */ g_object_class_install_property (gobject_class, PROP_MENU, g_param_spec_object ( @@ -404,7 +413,6 @@ midori_panel_set_property (GObject* object, break; case PROP_MENU: katze_object_assign (panel->menu, g_value_dup_object (value)); - /* FIXME: Move existing items to the new menu */ break; case PROP_PAGE: midori_panel_set_current_page (panel, g_value_get_int (value)); @@ -515,26 +523,46 @@ midori_panel_menu_item_activate_cb (GtkWidget* widget, MidoriPanel* panel) { GtkWidget* child; - GtkToggleToolButton* toolitem; + GtkToolItem* toolitem; guint n; child = g_object_get_data (G_OBJECT (widget), "page"); - toolitem = g_object_get_data (G_OBJECT (widget), "toolitem"); + n = midori_panel_page_num (panel, child); + toolitem = gtk_toolbar_get_nth_item (GTK_TOOLBAR (panel->toolbar), n); if (toolitem) { /* Unsetting the button before setting it ensures that it will emit signals even if it was active before */ - gtk_toggle_tool_button_set_active (toolitem, FALSE); - gtk_toggle_tool_button_set_active (toolitem, TRUE); - } - else - { - n = midori_panel_page_num (panel, child); - midori_panel_set_current_page (panel, n); - g_signal_emit (panel, signals[SWITCH_PAGE], 0, n); - gtk_widget_show (GTK_WIDGET (panel)); + GtkToggleToolButton* button = GTK_TOGGLE_TOOL_BUTTON (toolitem); + g_signal_handlers_block_by_func (widget, + midori_panel_menu_item_activate_cb, panel); + gtk_toggle_tool_button_set_active (button, FALSE); + gtk_toggle_tool_button_set_active (button, TRUE); + g_signal_handlers_unblock_by_func (widget, + midori_panel_menu_item_activate_cb, panel); } + + midori_panel_set_current_page (panel, n); + g_signal_emit (panel, signals[SWITCH_PAGE], 0, n); + gtk_widget_show (GTK_WIDGET (panel)); +} + +/* Private function, used by MidoriBrowser */ +/* static */ GtkWidget* +midori_panel_construct_menu_item (MidoriPanel* panel, + MidoriViewable* viewable) +{ + const gchar* stock_id; + GtkWidget* menuitem; + + stock_id = midori_viewable_get_stock_id (viewable); + menuitem = gtk_image_menu_item_new_from_stock (stock_id, NULL); + gtk_widget_show (menuitem); + g_object_set_data (G_OBJECT (menuitem), "page", viewable); + g_signal_connect (menuitem, "activate", + G_CALLBACK (midori_panel_menu_item_activate_cb), panel); + return menuitem; } static void @@ -609,9 +637,6 @@ midori_panel_append_page (MidoriPanel* panel, GtkWidget* widget; GtkWidget* toolbar; const gchar* label; - const gchar* stock_id; - GtkToolItem* toolitem; - GtkWidget* menuitem; guint n; g_return_val_if_fail (MIDORI_IS_PANEL (panel), -1); @@ -648,26 +673,9 @@ midori_panel_append_page (MidoriPanel* panel, n = midori_panel_page_num (panel, scrolled); label = midori_viewable_get_label (viewable); - stock_id = midori_viewable_get_stock_id (viewable); - - toolitem = midori_panel_construct_tool_item (panel, viewable); - - if (panel->menu) - { - menuitem = gtk_image_menu_item_new_from_stock (stock_id, NULL); - gtk_widget_show (menuitem); - g_object_set_data (G_OBJECT (menuitem), "page", viewable); - g_object_set_data (G_OBJECT (menuitem), "toolitem", toolitem); - g_signal_connect (menuitem, "activate", - G_CALLBACK (midori_panel_menu_item_activate_cb), - panel); - gtk_menu_shell_insert (GTK_MENU_SHELL (panel->menu), menuitem, 4); - g_object_set_data (G_OBJECT (scrolled), "panel-menuitem", menuitem); - g_signal_connect (viewable, "destroy", - G_CALLBACK (midori_panel_widget_destroy_cb), menuitem); - } g_object_set_data (G_OBJECT (viewable), "parent", scrolled); + midori_panel_construct_tool_item (panel, viewable); g_signal_connect (viewable, "destroy", G_CALLBACK (midori_panel_viewable_destroy_cb), panel);