[epiphany] WebExtensions: Implement special shortcuts



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]