summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamie Murphy <hello@itsjamie.dev>2022-08-05 02:27:17 -0700
committerJamie Murphy <hello@itsjamie.dev>2022-10-07 13:14:42 -0700
commit7c3c9d4fd86f1a7380a42c76a578c4426d2d896a (patch)
tree6a6ab471a9fbc2e7c5eeef2a122c1e9f14fd813a
parent084ddc4970e1d254315a62b2c3079f117f64c9a4 (diff)
downloadepiphany-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.c16
-rw-r--r--src/webextension/api/menus.c50
-rw-r--r--src/webextension/ephy-web-extension-manager.c37
-rw-r--r--src/webextension/ephy-web-extension-manager.h4
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);