[gthumb] list tools: install a shortcut for every script



commit da58e6cc51284791aba69ef9bb65f65f3bc6b08e
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Thu Nov 14 16:25:43 2019 +0100

    list tools: install a shortcut for every script

 extensions/list_tools/callbacks.c  | 112 +++++++++++--------------------------
 extensions/list_tools/callbacks.h  |   2 -
 extensions/list_tools/gth-script.c |  18 ++++++
 extensions/list_tools/gth-script.h |   1 +
 extensions/list_tools/main.c       |   1 -
 gthumb/gth-shortcut.c              |   8 +++
 gthumb/gth-shortcut.h              |   1 +
 gthumb/gth-window.c                |  71 ++++++++++++++++++++---
 gthumb/gth-window.h                |   6 ++
 9 files changed, 132 insertions(+), 88 deletions(-)
---
diff --git a/extensions/list_tools/callbacks.c b/extensions/list_tools/callbacks.c
index b598da94..f0f2422c 100644
--- a/extensions/list_tools/callbacks.c
+++ b/extensions/list_tools/callbacks.c
@@ -32,6 +32,7 @@
 
 
 #define BROWSER_DATA_KEY "list-tools-browser-data"
+#define SCRIPTS_GROUP "scripts"
 
 
 static const GActionEntry actions[] = {
@@ -43,7 +44,6 @@ static const GActionEntry actions[] = {
 typedef struct {
        GthBrowser *browser;
        gulong      scripts_changed_id;
-       gboolean    menu_initialized;
        guint       menu_merge_id;
 } BrowserData;
 
@@ -76,6 +76,7 @@ list_tools__gth_browser_update_sensitivity_cb (GthBrowser *browser)
 
 static void
 update_scripts_menu (BrowserData *data)
+update_scripts (BrowserData *data)
 {
        GthMenuManager  *menu_manager;
        GList           *script_list;
@@ -86,31 +87,33 @@ update_scripts_menu (BrowserData *data)
                gth_menu_manager_remove_entries (menu_manager, data->menu_merge_id);
        data->menu_merge_id = gth_menu_manager_new_merge_id (menu_manager);
 
+       gth_window_remove_shortcuts (GTH_WINDOW (data->browser), SCRIPTS_GROUP);
+
        script_list = gth_script_file_get_scripts (gth_script_file_get ());
        for (scan = script_list; scan; scan = scan->next) {
-               GthScript       *script = scan->data;
-               guint            keyval;
-               GdkModifierType  modifiers;
-               char            *accelerator_name;
-               char            *detailed_action;
-
-               if (! gth_script_is_visible (script))
-                       continue;
-
-               detailed_action = g_strdup_printf ("win.exec-script('%s')", gth_script_get_id (script));
-
-               gth_script_get_accelerator (script, &keyval, &modifiers);
-               accelerator_name = gtk_accelerator_name (keyval, modifiers);
-
-               gth_menu_manager_append_entry (menu_manager,
-                                              data->menu_merge_id,
-                                              gth_script_get_display_name (script),
-                                              detailed_action,
-                                              accelerator_name,
-                                              NULL);
+               GthScript   *script = scan->data;
+               GthShortcut *shortcut;
+
+               shortcut = gth_script_get_shortcut (script);
+               gth_window_add_removable_shortcut (GTH_WINDOW (data->browser),
+                                                  SCRIPTS_GROUP,
+                                                  shortcut);
+
+               if (gth_script_is_visible (script)) {
+                       char *detailed_action;
+
+                       detailed_action = g_strdup_printf ("win.exec-script('%s')", gth_script_get_id 
(script));
+                       gth_menu_manager_append_entry (menu_manager,
+                                                      data->menu_merge_id,
+                                                      gth_script_get_display_name (script),
+                                                      detailed_action,
+                                                      shortcut->label,
+                                                      NULL);
+
+                       g_free (detailed_action);
+               }
 
-               g_free (accelerator_name);
-               g_free (detailed_action);
+               gth_shortcut_free (shortcut);
        }
 
        list_tools__gth_browser_update_sensitivity_cb (data->browser);
@@ -121,33 +124,9 @@ update_scripts_menu (BrowserData *data)
 
 static void
 scripts_changed_cb (GthScriptFile *script_file,
-                    BrowserData   *data)
+                   BrowserData   *data)
 {
-       update_scripts_menu (data);
-}
-
-
-static void
-tools_menu_button_button_press_event_cb (GtkToggleButton *togglebutton,
-                                        GdkEvent        *event,
-                                        gpointer         user_data)
-{
-       BrowserData *data = user_data;
-
-       if (gtk_toggle_button_get_active (togglebutton))
-               return;
-
-       if (! data->menu_initialized) {
-               data->menu_initialized = TRUE;
-               update_scripts_menu (data);
-
-               data->scripts_changed_id = g_signal_connect (gth_script_file_get (),
-                                                            "changed",
-                                                            G_CALLBACK (scripts_changed_cb),
-                                                            data);
-       }
-
-       list_tools__gth_browser_update_sensitivity_cb (data->browser);
+       update_scripts (data);
 }
 
 
@@ -179,7 +158,6 @@ list_tools__gth_browser_construct_cb (GthBrowser *browser)
        /* browser tools */
 
        button = _gtk_menu_button_new_for_header_bar ("tools-symbolic");
-       g_signal_connect (button, "button-press-event", G_CALLBACK (tools_menu_button_button_press_event_cb), 
data);
        gtk_widget_set_tooltip_text (button, _("Tools"));
        gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), menu);
        gtk_widget_set_halign (GTK_WIDGET (gtk_menu_button_get_popup (GTK_MENU_BUTTON (button))), 
GTK_ALIGN_CENTER);
@@ -189,7 +167,6 @@ list_tools__gth_browser_construct_cb (GthBrowser *browser)
        /* viewer edit */
 
        button = _gtk_menu_button_new_for_header_bar ("tools-symbolic");
-       g_signal_connect (button, "button-press-event", G_CALLBACK (tools_menu_button_button_press_event_cb), 
data);
        gtk_widget_set_tooltip_text (button, _("Tools"));
        gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), menu);
        gtk_widget_set_halign (GTK_WIDGET (gtk_menu_button_get_popup (GTK_MENU_BUTTON (button))), 
GTK_ALIGN_CENTER);
@@ -197,37 +174,16 @@ list_tools__gth_browser_construct_cb (GthBrowser *browser)
        gtk_box_pack_end (GTK_BOX (gth_browser_get_headerbar_section (browser, 
GTH_BROWSER_HEADER_SECTION_VIEWER_EDIT)), button, FALSE, FALSE, 0);
 
        g_object_unref (builder);
+
+       update_scripts (data);
+       data->scripts_changed_id = g_signal_connect (gth_script_file_get (),
+                                                    "changed",
+                                                    G_CALLBACK (scripts_changed_cb),
+                                                    data);
 }
 
 
-gpointer
-list_tools__gth_browser_file_list_key_press_cb (GthBrowser  *browser,
-                                               GdkEventKey *event)
 {
-       gpointer         result = NULL;
-       guint            event_key;
-       GdkModifierType  event_modifiers;
-       GList           *script_list;
-       GList           *scan;
-
-       event_key = gdk_keyval_to_lower (event->keyval);
-       event_modifiers = event->state & gtk_accelerator_get_default_mod_mask ();
 
-       script_list = gth_script_file_get_scripts (gth_script_file_get ());
-       for (scan = script_list; scan; scan = scan->next) {
-               GthScript       *script = scan->data;
-               guint            keyval;
-               GdkModifierType  modifiers;
-
-               gth_script_get_accelerator (script, &keyval, &modifiers);
-               if ((keyval == event_key) && (modifiers == event_modifiers)) {
-                       gth_browser_exec_script (browser, script);
-                       result = GINT_TO_POINTER (1);
-                       break;
-               }
-       }
-
-       _g_object_list_unref (script_list);
 
-       return result;
 }
diff --git a/extensions/list_tools/callbacks.h b/extensions/list_tools/callbacks.h
index 897d8ab6..efb5e83b 100644
--- a/extensions/list_tools/callbacks.h
+++ b/extensions/list_tools/callbacks.h
@@ -25,7 +25,5 @@
 #include <gthumb.h>
 
 void      list_tools__gth_browser_construct_cb           (GthBrowser  *browser);
-gpointer  list_tools__gth_browser_file_list_key_press_cb (GthBrowser  *browser,
-                                                         GdkEventKey *event);
 
 #endif /* CALLBACKS_H */
diff --git a/extensions/list_tools/gth-script.c b/extensions/list_tools/gth-script.c
index 248c19e7..7dfebadc 100644
--- a/extensions/list_tools/gth-script.c
+++ b/extensions/list_tools/gth-script.c
@@ -1034,3 +1034,21 @@ gth_script_get_accelerator (GthScript       *self,
        if (keyval) *keyval = self->priv->accelerator.keyval;
        if (modifiers) *modifiers = self->priv->accelerator.modifiers;
 }
+
+
+GthShortcut *
+gth_script_get_shortcut (GthScript *self)
+{
+       GthShortcut *shortcut;
+
+       shortcut = gth_shortcut_new ();
+       shortcut->action_name = g_strdup ("exec-script");
+       shortcut->action_parameter = g_variant_ref_sink (g_variant_new_string (gth_script_get_id (self)));
+       shortcut->description = g_strdup (self->priv->display_name);
+       shortcut->context = GTH_SHORTCUT_CONTEXT_BROWSER_VIEWER;
+       shortcut->category = GTH_SHORTCUT_CATEGORY_FILE_MANAGER;
+       gth_shortcut_set_key (shortcut, self->priv->accelerator.keyval, self->priv->accelerator.modifiers);
+       shortcut->default_accelerator = g_strdup (shortcut->accelerator);
+
+       return shortcut;
+}
diff --git a/extensions/list_tools/gth-script.h b/extensions/list_tools/gth-script.h
index 2c1891e7..c3146d96 100644
--- a/extensions/list_tools/gth-script.h
+++ b/extensions/list_tools/gth-script.h
@@ -68,6 +68,7 @@ char *            gth_script_get_command_line          (GthScript       *script,
 void              gth_script_get_accelerator           (GthScript       *script,
                                                        guint           *keyval,
                                                        GdkModifierType *modifiers);
+GthShortcut *     gth_script_get_shortcut              (GthScript       *script);
 
 G_END_DECLS
 
diff --git a/extensions/list_tools/main.c b/extensions/list_tools/main.c
index 1c5011dc..1eaa5a4c 100644
--- a/extensions/list_tools/main.c
+++ b/extensions/list_tools/main.c
@@ -30,7 +30,6 @@ G_MODULE_EXPORT void
 gthumb_extension_activate (void)
 {
        gth_hook_add_callback ("gth-browser-construct", 5, G_CALLBACK (list_tools__gth_browser_construct_cb), 
NULL);
-       gth_hook_add_callback ("gth-browser-file-list-key-press", 10, G_CALLBACK 
(list_tools__gth_browser_file_list_key_press_cb), NULL);
 }
 
 
diff --git a/gthumb/gth-shortcut.c b/gthumb/gth-shortcut.c
index d6ae3eec..4ae9b371 100644
--- a/gthumb/gth-shortcut.c
+++ b/gthumb/gth-shortcut.c
@@ -23,6 +23,7 @@
 #include <glib/gi18n.h>
 #include "dom.h"
 #include "gio-utils.h"
+#include "glib-utils.h"
 #include "gth-shortcut.h"
 #include "gth-user-dir.h"
 
@@ -34,6 +35,7 @@ gth_shortcut_new (void)
 
        shortcut = g_new (GthShortcut, 1);
        shortcut->action_name = NULL;
+       shortcut->action_parameter = NULL;
        shortcut->description = NULL;
        shortcut->context = 0;
        shortcut->category = NULL;
@@ -54,6 +56,10 @@ gth_shortcut_dup (const GthShortcut *shortcut)
 
        new_shortcut = gth_shortcut_new ();
        new_shortcut->action_name = g_strdup (shortcut->action_name);
+       if (shortcut->action_parameter != NULL)
+               new_shortcut->action_parameter = g_variant_ref_sink (shortcut->action_parameter);
+       else
+               new_shortcut->action_parameter = NULL;
        new_shortcut->description = g_strdup (shortcut->description);
        new_shortcut->context = shortcut->context;
        new_shortcut->category = shortcut->category;
@@ -68,6 +74,8 @@ void
 gth_shortcut_free (GthShortcut *shortcut)
 {
        g_free (shortcut->action_name);
+       if (shortcut->action_parameter != NULL)
+               g_variant_unref (shortcut->action_parameter);
        g_free (shortcut->description);
        g_free (shortcut->default_accelerator);
        g_free (shortcut->accelerator);
diff --git a/gthumb/gth-shortcut.h b/gthumb/gth-shortcut.h
index 0c01d7e1..c194b9f8 100644
--- a/gthumb/gth-shortcut.h
+++ b/gthumb/gth-shortcut.h
@@ -52,6 +52,7 @@ typedef struct {
        char            *label;
        guint            keyval;
        GdkModifierType  modifiers;
+       GVariant        *action_parameter;
 } GthShortcut;
 
 
diff --git a/gthumb/gth-window.c b/gthumb/gth-window.c
index c266f1b4..2cad403a 100644
--- a/gthumb/gth-window.c
+++ b/gthumb/gth-window.c
@@ -58,6 +58,7 @@ struct _GthWindowPrivate {
        GtkAccelGroup   *accel_group;
        GHashTable      *shortcuts;
        GPtrArray       *shortcuts_v;
+       GHashTable      *shortcut_groups;
 };
 
 
@@ -255,6 +256,7 @@ gth_window_finalize (GObject *object)
        g_object_unref (window->priv->accel_group);
        g_hash_table_unref (window->priv->shortcuts);
        g_ptr_array_unref (window->priv->shortcuts_v);
+       g_hash_table_unref (window->priv->shortcut_groups);
 
        G_OBJECT_CLASS (gth_window_parent_class)->finalize (object);
 }
@@ -408,6 +410,8 @@ gth_window_init (GthWindow *window)
        window->priv->shortcuts = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
        window->priv->shortcuts_v = g_ptr_array_new_with_free_func ((GDestroyNotify) gth_shortcut_free);
 
+       window->priv->shortcut_groups = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, 
(GDestroyNotify) g_ptr_array_unref);
+
        gtk_window_set_application (GTK_WINDOW (window), Main_Application);
 }
 
@@ -712,6 +716,15 @@ _gth_window_add_shortcut (GthWindow   *window,
 }
 
 
+static void
+_gth_window_remove_shortcut (GthWindow   *window,
+                            GthShortcut *shorcut)
+{
+       g_hash_table_remove (window->priv->shortcuts, shorcut->action_name);
+       g_ptr_array_remove (window->priv->shortcuts_v, shorcut);
+}
+
+
 void
 gth_window_add_accelerators (GthWindow                 *window,
                             const GthAccelerator       *accelerators,
@@ -879,14 +892,8 @@ gth_window_activate_shortcut (GthWindow       *window,
 
                action = g_action_map_lookup_action (G_ACTION_MAP (window), shortcut->action_name);
                if (action != NULL) {
-                       GVariant *variant;
-
-                       variant = g_action_get_state (action);
-                       g_action_activate (action, variant);
+                       g_action_activate (action, shortcut->action_parameter);
                        activated = TRUE;
-
-                       if (variant != NULL)
-                               g_variant_unref (variant);
                }
        }
 
@@ -903,3 +910,53 @@ gth_window_load_shortcuts (GthWindow *window)
                                      window->priv->shortcuts,
                                      NULL);
 }
+
+
+void
+gth_window_add_removable_shortcut (GthWindow   *window,
+                                  const char  *group_name,
+                                  GthShortcut *shortcut)
+{
+       GPtrArray   *shortcuts_v;
+       GthShortcut *new_shortcut;
+
+       g_return_if_fail (GTH_IS_WINDOW (window));
+       g_return_if_fail (group_name != NULL);
+
+       shortcuts_v = g_hash_table_lookup (window->priv->shortcut_groups, group_name);
+       if (shortcuts_v == NULL) {
+               shortcuts_v = g_ptr_array_new ();
+               g_hash_table_insert (window->priv->shortcut_groups,
+                                    g_strdup (group_name),
+                                    shortcuts_v);
+       }
+
+       new_shortcut = gth_shortcut_dup (shortcut);
+       gth_shortcut_set_accelerator (new_shortcut, shortcut->default_accelerator);
+       _gth_window_add_shortcut (window, new_shortcut);
+
+       g_ptr_array_add (shortcuts_v, new_shortcut);
+}
+
+
+void
+gth_window_remove_shortcuts (GthWindow  *window,
+                            const char *group_name)
+{
+       GPtrArray *shortcuts_v;
+       int        i;
+
+       g_return_if_fail (GTH_IS_WINDOW (window));
+       g_return_if_fail (group_name != NULL);
+
+       shortcuts_v = g_hash_table_lookup (window->priv->shortcut_groups, group_name);
+       if (shortcuts_v == NULL)
+               return;
+
+       for (i = 0; i < shortcuts_v->len; i++) {
+               GthShortcut *shortcut = g_ptr_array_index (shortcuts_v, i);
+               _gth_window_remove_shortcut (window, shortcut);
+       }
+
+       g_hash_table_remove (window->priv->shortcut_groups, group_name);
+}
diff --git a/gthumb/gth-window.h b/gthumb/gth-window.h
index 9f459a05..7eeb89e4 100644
--- a/gthumb/gth-window.h
+++ b/gthumb/gth-window.h
@@ -132,6 +132,12 @@ gboolean   gth_window_activate_shortcut    (GthWindow              *window,
                                                 guint                   keycode,
                                                 GdkModifierType         modifiers);
 void           gth_window_load_shortcuts       (GthWindow              *window);
+void           gth_window_add_removable_shortcut
+                                               (GthWindow              *window,
+                                                const char             *group_name,
+                                                GthShortcut            *shortcut);
+void           gth_window_remove_shortcuts     (GthWindow              *window,
+                                                const char             *group_name);
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]