[epiphany] WebExtensions: Implement special shortcuts
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany] WebExtensions: Implement special shortcuts
- Date: Sun, 9 Oct 2022 02:17:41 +0000 (UTC)
commit 7c3c9d4fd86f1a7380a42c76a578c4426d2d896a
Author: Jamie Murphy <hello itsjamie dev>
Date: Fri Aug 5 02:27:17 2022 -0700
WebExtensions: Implement special shortcuts
Part-of: <https://gitlab.gnome.org/GNOME/epiphany/-/merge_requests/1186>
src/webextension/api/commands.c | 16 ++++++++-
src/webextension/api/menus.c | 50 +++++++++++++++++++++++++--
src/webextension/ephy-web-extension-manager.c | 37 ++++++++++++++++++--
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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]