diff options
author | Jamie Murphy <hello@itsjamie.dev> | 2022-08-05 02:27:17 -0700 |
---|---|---|
committer | Jamie Murphy <hello@itsjamie.dev> | 2022-10-07 13:14:42 -0700 |
commit | 7c3c9d4fd86f1a7380a42c76a578c4426d2d896a (patch) | |
tree | 6a6ab471a9fbc2e7c5eeef2a122c1e9f14fd813a | |
parent | 084ddc4970e1d254315a62b2c3079f117f64c9a4 (diff) | |
download | epiphany-7c3c9d4fd86f1a7380a42c76a578c4426d2d896a.tar.gz |
WebExtensions: Implement special shortcuts
Part-of: <https://gitlab.gnome.org/GNOME/epiphany/-/merge_requests/1186>
-rw-r--r-- | src/webextension/api/commands.c | 16 | ||||
-rw-r--r-- | src/webextension/api/menus.c | 50 | ||||
-rw-r--r-- | src/webextension/ephy-web-extension-manager.c | 37 | ||||
-rw-r--r-- | src/webextension/ephy-web-extension-manager.h | 4 |
4 files changed, 101 insertions, 6 deletions
diff --git a/src/webextension/api/commands.c b/src/webextension/api/commands.c index 336f7f904..31e3c4a2e 100644 --- a/src/webextension/api/commands.c +++ b/src/webextension/api/commands.c @@ -31,11 +31,25 @@ on_command_activated (GAction *action, { EphyWebExtension *self = user_data; EphyWebExtensionManager *manager = ephy_web_extension_manager_get_default (); + EphyShell *shell = ephy_shell_get_default (); + EphyWebView *view = EPHY_WEB_VIEW (ephy_shell_get_active_web_view (shell)); + EphyWindow *window = EPHY_WINDOW (gtk_application_get_active_window (GTK_APPLICATION (shell))); + GtkWidget *button; + const char *command_name = g_object_get_data (G_OBJECT (action), "command-name-json"); + + if (strcmp (command_name, "\"_execute_browser_action\"") == 0) { + ephy_web_extension_manager_activate_browser_action (manager, self, window); + return; + } else if (strcmp (command_name, "\"_execute_page_action\"") == 0) { + button = ephy_web_extension_manager_get_page_action (manager, self, view); + gtk_widget_mnemonic_activate (button, false); + return; + } ephy_web_extension_manager_emit_in_extension_views (manager, self, "commands.onCommand", - g_object_get_data (G_OBJECT (action), "command-name-json")); + command_name); } char * diff --git a/src/webextension/api/menus.c b/src/webextension/api/menus.c index c09a63a52..674f39a75 100644 --- a/src/webextension/api/menus.c +++ b/src/webextension/api/menus.c @@ -62,7 +62,6 @@ typedef enum { COMMAND_NONE, COMMAND_BROWSER_ACTION, COMMAND_PAGE_ACTION, - COMMAND_SIDEBAR_ACTION, } Command; typedef struct { @@ -128,8 +127,6 @@ get_command_property (JsonObject *object) return COMMAND_BROWSER_ACTION; if (strcmp (command, "_execute_page_action") == 0) return COMMAND_PAGE_ACTION; - if (strcmp (command, "_execute_sidebar_action") == 0) - return COMMAND_SIDEBAR_ACTION; return COMMAND_NONE; } @@ -556,6 +553,46 @@ rules_match_uri (GStrv rules, return FALSE; } +gboolean +menu_activate_browser_action (gpointer user_data) +{ + EphyWebExtension *web_extension = user_data; + EphyWebExtensionManager *manager = ephy_web_extension_manager_get_default (); + EphyShell *shell = ephy_shell_get_default (); + EphyWindow *window = EPHY_WINDOW (gtk_application_get_active_window (GTK_APPLICATION (shell))); + + ephy_web_extension_manager_activate_browser_action (manager, web_extension, window); + return G_SOURCE_REMOVE; +} + +gboolean +menu_activate_page_button (gpointer user_data) +{ + EphyWebExtension *web_extension = user_data; + EphyWebExtensionManager *manager = ephy_web_extension_manager_get_default (); + EphyShell *shell = ephy_shell_get_default (); + EphyWebView *view = EPHY_WEB_VIEW (ephy_shell_get_active_web_view (shell)); + GtkWidget *button = ephy_web_extension_manager_get_page_action (manager, web_extension, view); + + gtk_widget_mnemonic_activate (button, false); + return G_SOURCE_REMOVE; +} + +void +menu_activate_command_action (GAction *action, + GVariant *params, + gpointer user_data) +{ + EphyWebExtension *web_extension = user_data; + Command command = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action), "command")); + + if (command == COMMAND_BROWSER_ACTION) { + g_idle_add (menu_activate_browser_action, web_extension); + } else if (command == COMMAND_PAGE_ACTION) { + g_idle_add (menu_activate_page_button, web_extension); + } +} + static WebKitContextMenuItem * create_context_menu_item (GHashTable *menus, const char *name, @@ -625,6 +662,13 @@ create_context_menu_item (GHashTable *menus, tab_data)); } + if (item->command != COMMAND_NONE) { + g_object_set_data (G_OBJECT (action), "command", GINT_TO_POINTER (item->command)); + g_signal_connect (action, "activate", + G_CALLBACK (menu_activate_command_action), + self); + } + menu_items = g_list_append (menu_items, menu_item); } diff --git a/src/webextension/ephy-web-extension-manager.c b/src/webextension/ephy-web-extension-manager.c index 81d446983..eb2667bfa 100644 --- a/src/webextension/ephy-web-extension-manager.c +++ b/src/webextension/ephy-web-extension-manager.c @@ -1124,7 +1124,8 @@ on_browser_action_visible_changed (GtkWidget *popover, } GtkWidget * -create_browser_action (EphyWebExtension *web_extension) +create_browser_action (EphyWebExtension *web_extension, + EphyWindow *window) { GtkWidget *button; GtkWidget *image; @@ -1149,6 +1150,9 @@ create_browser_action (EphyWebExtension *web_extension) gtk_button_set_image (GTK_BUTTON (button), image); } + /* This makes it much easier then going through layers of HeaderBars and ActionBars */ + g_object_set_data (G_OBJECT (button), "window", window); + gtk_widget_set_visible (button, TRUE); return button; @@ -1174,7 +1178,7 @@ ephy_web_extension_manager_add_web_extension_to_window (EphyWebExtensionManager } if (ephy_web_extension_has_browser_action (web_extension)) { - GtkWidget *browser_action_widget = create_browser_action (web_extension); + GtkWidget *browser_action_widget = create_browser_action (web_extension, window); GSList *widget_list = g_hash_table_lookup (self->browser_action_map, web_extension); ephy_header_bar_add_browser_action (EPHY_HEADER_BAR (ephy_window_get_header_bar (window)), browser_action_widget); @@ -1411,6 +1415,35 @@ ephy_web_extension_manager_set_active (EphyWebExtensionManager *self, } } +gint +get_browser_action_for_window (gconstpointer value, + gconstpointer user_data) +{ + const EphyWindow *window = user_data; + const GtkWidget *widget = value; + + if (g_object_get_data (G_OBJECT (widget), "window") == window) + return 0; + + return -1; +} + + +void +ephy_web_extension_manager_activate_browser_action (EphyWebExtensionManager *self, + EphyWebExtension *web_extension, + EphyWindow *window) +{ + GSList *table; + GtkWidget *button; + + table = g_hash_table_lookup (self->browser_action_map, web_extension); + if (table) { + button = g_slist_find_custom (table, window, get_browser_action_for_window)->data; + gtk_widget_mnemonic_activate (button, false); + } +} + GtkWidget * ephy_web_extension_manager_get_page_action (EphyWebExtensionManager *self, EphyWebExtension *web_extension, diff --git a/src/webextension/ephy-web-extension-manager.h b/src/webextension/ephy-web-extension-manager.h index 77e1adba9..13f68b22d 100644 --- a/src/webextension/ephy-web-extension-manager.h +++ b/src/webextension/ephy-web-extension-manager.h @@ -64,6 +64,10 @@ void ephy_web_extension_manager_set_active EphyWebExtension *web_extension, gboolean active); +void ephy_web_extension_manager_activate_browser_action (EphyWebExtensionManager *self, + EphyWebExtension *web_extension, + EphyWindow *window); + GtkWidget *ephy_web_extension_manager_get_page_action (EphyWebExtensionManager *self, EphyWebExtension *web_extension, EphyWebView *web_view); |