[gthumb: 8/13] shortcuts: allow same shortcut for different viewer



commit ad5bc1728d2b240b68c86e72d510e5fba8c09ce0
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Mon Jul 13 12:05:59 2020 +0200

    shortcuts: allow same shortcut for different viewer
    
    Added a viewer context to the shortcuts to allow to use the
    same shortcut for different actions if the actions belong to
    different viewers.
    
    This is possible because you can't have more viewers active
    at the same time.

 extensions/file_tools/callbacks.c                  |  7 +++--
 extensions/gstreamer_tools/callbacks.c             |  7 +++--
 extensions/gstreamer_tools/gth-media-viewer-page.c |  9 ++++++
 extensions/gstreamer_tools/shortcuts.h             |  1 +
 extensions/image_viewer/callbacks.c                |  7 +++--
 extensions/image_viewer/gth-image-viewer-page.c    |  9 ++++++
 extensions/image_viewer/shortcuts.h                |  1 +
 extensions/list_tools/dlg-personalize-scripts.c    |  1 +
 extensions/list_tools/gth-script-editor-dialog.c   |  1 +
 extensions/slideshow/gth-slideshow.c               |  1 +
 gthumb/dlg-preferences-shortcuts.c                 |  2 ++
 gthumb/gth-browser.c                               |  2 ++
 gthumb/gth-shortcut.c                              | 34 ++++++++++++++++++++--
 gthumb/gth-shortcut.h                              |  6 ++++
 gthumb/gth-viewer-page.c                           | 10 +++++++
 gthumb/gth-viewer-page.h                           |  4 +++
 gthumb/gth-window.c                                | 22 +++++++++++---
 gthumb/gth-window.h                                |  8 ++++-
 18 files changed, 116 insertions(+), 16 deletions(-)
---
diff --git a/extensions/file_tools/callbacks.c b/extensions/file_tools/callbacks.c
index bacdeecc..9fffd8d1 100644
--- a/extensions/file_tools/callbacks.c
+++ b/extensions/file_tools/callbacks.c
@@ -68,7 +68,8 @@ file_tools__gth_browser_construct_cb (GthBrowser *browser)
                                         G_N_ELEMENTS (actions),
                                         browser);
 
-       gth_window_add_shortcuts (GTH_WINDOW (browser),
-                                 shortcuts,
-                                 G_N_ELEMENTS (shortcuts));
+       gth_window_add_viewer_shortcuts (GTH_WINDOW (browser),
+                                        GTH_SHORTCUT_VIEWER_CONTEXT_IMAGE,
+                                        shortcuts,
+                                        G_N_ELEMENTS (shortcuts));
 }
diff --git a/extensions/gstreamer_tools/callbacks.c b/extensions/gstreamer_tools/callbacks.c
index 92ddebdc..bb5e4ebc 100644
--- a/extensions/gstreamer_tools/callbacks.c
+++ b/extensions/gstreamer_tools/callbacks.c
@@ -39,7 +39,8 @@ media_viewer__gth_browser_construct_cb (GthBrowser *browser)
 {
        g_return_if_fail (GTH_IS_BROWSER (browser));
 
-       gth_window_add_shortcuts (GTH_WINDOW (browser),
-                                 shortcuts,
-                                 G_N_ELEMENTS (shortcuts));
+       gth_window_add_viewer_shortcuts (GTH_WINDOW (browser),
+                                        GTH_SHORTCUT_VIEWER_CONTEXT_MEDIA,
+                                        shortcuts,
+                                        G_N_ELEMENTS (shortcuts));
 }
diff --git a/extensions/gstreamer_tools/gth-media-viewer-page.c 
b/extensions/gstreamer_tools/gth-media-viewer-page.c
index b76e5629..316476d6 100644
--- a/extensions/gstreamer_tools/gth-media-viewer-page.c
+++ b/extensions/gstreamer_tools/gth-media-viewer-page.c
@@ -28,6 +28,7 @@
 #include "actions.h"
 #include "gth-media-viewer-page.h"
 #include "preferences.h"
+#include "shortcuts.h"
 
 
 #define GET_WIDGET(x) (_gtk_builder_get_widget (self->priv->builder, (x)))
@@ -1327,6 +1328,13 @@ gth_media_viewer_page_real_update_info (GthViewerPage *base,
 }
 
 
+static const char *
+gth_media_viewer_page_shortcut_context (GthViewerPage *base)
+{
+       return GTH_SHORTCUT_VIEWER_CONTEXT_MEDIA;
+}
+
+
 static void
 gth_media_viewer_page_finalize (GObject *obj)
 {
@@ -1382,6 +1390,7 @@ gth_viewer_page_interface_init (GthViewerPageInterface *iface)
        iface->save_as = gth_media_viewer_page_real_save_as;
        iface->revert = gth_media_viewer_page_real_revert;
        iface->update_info = gth_media_viewer_page_real_update_info;
+       iface->shortcut_context = gth_media_viewer_page_shortcut_context;
 }
 
 
diff --git a/extensions/gstreamer_tools/shortcuts.h b/extensions/gstreamer_tools/shortcuts.h
index 2e0215c8..82187851 100644
--- a/extensions/gstreamer_tools/shortcuts.h
+++ b/extensions/gstreamer_tools/shortcuts.h
@@ -23,5 +23,6 @@
 #define IMAGE_VIEWER_SHORTCUTS_H
 
 #define GTH_SHORTCUT_CATEGORY_MEDIA_VIEWER "media-viewer"
+#define GTH_SHORTCUT_VIEWER_CONTEXT_MEDIA "media-viewer"
 
 #endif /* IMAGE_VIEWER_SHORTCUTS_H */
diff --git a/extensions/image_viewer/callbacks.c b/extensions/image_viewer/callbacks.c
index 3f60090d..1e36cded 100644
--- a/extensions/image_viewer/callbacks.c
+++ b/extensions/image_viewer/callbacks.c
@@ -64,7 +64,8 @@ image_viewer__gth_browser_construct_cb (GthBrowser *browser)
 {
        g_return_if_fail (GTH_IS_BROWSER (browser));
 
-       gth_window_add_shortcuts (GTH_WINDOW (browser),
-                                 shortcuts,
-                                 G_N_ELEMENTS (shortcuts));
+       gth_window_add_viewer_shortcuts (GTH_WINDOW (browser),
+                                        GTH_SHORTCUT_VIEWER_CONTEXT_IMAGE,
+                                        shortcuts,
+                                        G_N_ELEMENTS (shortcuts));
 }
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 9dcb1a54..2940c781 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -26,6 +26,7 @@
 #include "actions.h"
 #include "gth-image-viewer-page.h"
 #include "preferences.h"
+#include "shortcuts.h"
 
 
 #define UPDATE_QUALITY_DELAY 200
@@ -1953,6 +1954,13 @@ gth_image_viewer_page_real_show_properties (GthViewerPage *base,
 }
 
 
+static const char *
+gth_image_viewer_page_shortcut_context (GthViewerPage *base)
+{
+       return GTH_SHORTCUT_VIEWER_CONTEXT_IMAGE;
+}
+
+
 static void
 gth_image_viewer_page_finalize (GObject *obj)
 {
@@ -2015,6 +2023,7 @@ gth_viewer_page_interface_init (GthViewerPageInterface *iface)
        iface->update_info = gth_image_viewer_page_real_update_info;
        iface->zoom_from_scroll = gth_image_viewer_page_real_zoom_from_scroll;
        iface->show_properties = gth_image_viewer_page_real_show_properties;
+       iface->shortcut_context = gth_image_viewer_page_shortcut_context;
 }
 
 
diff --git a/extensions/image_viewer/shortcuts.h b/extensions/image_viewer/shortcuts.h
index 23461131..8ed274a9 100644
--- a/extensions/image_viewer/shortcuts.h
+++ b/extensions/image_viewer/shortcuts.h
@@ -25,5 +25,6 @@
 #define GTH_SHORTCUT_CATEGORY_IMAGE_VIEWER "image-viewer"
 #define GTH_SHORTCUT_CATEGORY_SCROLL_IMAGE "scroll-image"
 #define GTH_SHORTCUT_CATEGORY_IMAGE_EDITOR "image-editor"
+#define GTH_SHORTCUT_VIEWER_CONTEXT_IMAGE  "image-viewer"
 
 #endif /* IMAGE_VIEWER_SHORTCUTS_H */
diff --git a/extensions/list_tools/dlg-personalize-scripts.c b/extensions/list_tools/dlg-personalize-scripts.c
index 8c4977d0..21ba7a62 100644
--- a/extensions/list_tools/dlg-personalize-scripts.c
+++ b/extensions/list_tools/dlg-personalize-scripts.c
@@ -381,6 +381,7 @@ script_editor_dialog__response_cb (GtkDialog *dialog,
 
        shortcut = gth_shortcut_array_find_by_accel (shortcuts_v,
                                                     GTH_SHORTCUT_CONTEXT_BROWSER_VIEWER,
+                                                    GTH_SHORTCUT_VIEWER_CONTEXT_ANY,
                                                     gth_script_get_accelerator (script));
        if (shortcut != NULL) {
                if (g_strcmp0 (shortcut->detailed_action, gth_script_get_detailed_action (script)) != 0) {
diff --git a/extensions/list_tools/gth-script-editor-dialog.c 
b/extensions/list_tools/gth-script-editor-dialog.c
index b4dadfff..29d8dbc0 100644
--- a/extensions/list_tools/gth-script-editor-dialog.c
+++ b/extensions/list_tools/gth-script-editor-dialog.c
@@ -133,6 +133,7 @@ accel_button_change_value_cb (GthAccelButton  *button,
        change = gth_window_can_change_shortcut (self->priv->shortcut_window,
                                                 self->priv->shortcut != NULL ? 
self->priv->shortcut->detailed_action : NULL,
                                                 GTH_SHORTCUT_CONTEXT_BROWSER_VIEWER,
+                                                GTH_SHORTCUT_VIEWER_CONTEXT_ANY,
                                                 keycode,
                                                 modifiers,
                                                 GTK_WINDOW (self));
diff --git a/extensions/slideshow/gth-slideshow.c b/extensions/slideshow/gth-slideshow.c
index 8f2a78b6..082475f6 100644
--- a/extensions/slideshow/gth-slideshow.c
+++ b/extensions/slideshow/gth-slideshow.c
@@ -385,6 +385,7 @@ _gth_slideshow_key_press_cb (GthSlideshow *self,
 {
        return gth_window_activate_shortcut (GTH_WINDOW (self),
                                             GTH_SHORTCUT_CONTEXT_SLIDESHOW,
+                                            NULL,
                                             event->keyval,
                                             event->state);
 }
diff --git a/gthumb/dlg-preferences-shortcuts.c b/gthumb/dlg-preferences-shortcuts.c
index 6d635a59..c85a9415 100644
--- a/gthumb/dlg-preferences-shortcuts.c
+++ b/gthumb/dlg-preferences-shortcuts.c
@@ -159,6 +159,7 @@ row_data_update_shortcut (RowData         *row_data,
        change = gth_window_can_change_shortcut (GTH_WINDOW (row_data->browser_data->browser),
                                                 row_data->shortcut->detailed_action,
                                                 row_data->shortcut->context,
+                                                row_data->shortcut->viewer_context,
                                                 keycode,
                                                 modifiers,
                                                 parent);
@@ -170,6 +171,7 @@ row_data_update_shortcut (RowData         *row_data,
                shortcuts_v = gth_window_get_shortcuts (GTH_WINDOW (row_data->browser_data->browser));
                shortcut = gth_shortcut_array_find (shortcuts_v,
                                                    row_data->shortcut->context,
+                                                   row_data->shortcut->viewer_context,
                                                    keycode,
                                                    modifiers);
                if (shortcut != NULL) {
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 875cf7c2..0e4af4f2 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -3802,6 +3802,7 @@ gth_browser_file_list_key_press_cb (GthBrowser  *browser,
 
        activated = gth_window_activate_shortcut (GTH_WINDOW (browser),
                                                  GTH_SHORTCUT_CONTEXT_BROWSER,
+                                                 NULL,
                                                  event->keyval,
                                                  event->state);
 
@@ -5778,6 +5779,7 @@ gth_browser_viewer_key_press_cb (GthBrowser  *browser,
 
        activated = gth_window_activate_shortcut (GTH_WINDOW (browser),
                                                  GTH_SHORTCUT_CONTEXT_VIEWER,
+                                                 gth_viewer_page_get_shortcut_context 
(browser->priv->viewer_page),
                                                  event->keyval,
                                                  event->state);
 
diff --git a/gthumb/gth-shortcut.c b/gthumb/gth-shortcut.c
index ff00f23b..cb975da5 100644
--- a/gthumb/gth-shortcut.c
+++ b/gthumb/gth-shortcut.c
@@ -48,6 +48,7 @@ gth_shortcut_new (const char *action_name,
        shortcut->label = NULL;
        shortcut->keyval = 0;
        shortcut->modifiers = 0;
+       shortcut->viewer_context = NULL;
 
        return shortcut;
 }
@@ -63,6 +64,7 @@ gth_shortcut_dup (const GthShortcut *shortcut)
        new_shortcut->context = shortcut->context;
        new_shortcut->category = shortcut->category;
        new_shortcut->default_accelerator = g_strdup (shortcut->default_accelerator);
+       new_shortcut->viewer_context = shortcut->viewer_context;
        gth_shortcut_set_accelerator (new_shortcut, shortcut->accelerator);
 
        return new_shortcut;
@@ -105,7 +107,14 @@ gth_shortcut_set_accelerator (GthShortcut *shortcut,
                shortcut->accelerator = g_strdup (accelerator);
                shortcut->label = g_strdup (accelerator);
        }
+}
+
 
+void
+gth_shortcut_set_viewer_context (GthShortcut *shortcut,
+                                const char  *viewer_context)
+{
+       shortcut->viewer_context = viewer_context;
 }
 
 
@@ -133,9 +142,27 @@ gth_shortcut_customizable (GthShortcut *shortcut)
 }
 
 
+static gboolean
+_gth_shortcut_for_different_viewer (GthShortcut *shortcut,
+                                   int          context,
+                                   const char  *viewer_context)
+{
+       /* Two shortcuts can be equal if they both belong to the viewer context
+        * but have different categories.
+        * For example the image viewer shortcuts do not collide with the video
+        * viewer shortcuts. */
+       return ((context & GTH_SHORTCUT_CONTEXT_VIEWER) != 0)
+                       && ((shortcut->context & GTH_SHORTCUT_CONTEXT_VIEWER) != 0)
+                       && (viewer_context != NULL)
+                       && (shortcut->viewer_context != NULL)
+                       && ! _g_str_equal (shortcut->viewer_context, viewer_context);
+}
+
+
 GthShortcut *
 gth_shortcut_array_find (GPtrArray       *shortcuts_v,
                         int              context,
+                        const char      *viewer_context,
                         guint            keycode,
                         GdkModifierType  modifiers)
 {
@@ -155,7 +182,8 @@ gth_shortcut_array_find (GPtrArray       *shortcuts_v,
                        && (shortcut->keyval == keycode)
                        && (shortcut->modifiers == modifiers))
                {
-                       return shortcut;
+                       if (! _gth_shortcut_for_different_viewer (shortcut, context, viewer_context))
+                               return shortcut;
                }
        }
 
@@ -166,6 +194,7 @@ gth_shortcut_array_find (GPtrArray       *shortcuts_v,
 GthShortcut *
 gth_shortcut_array_find_by_accel (GPtrArray  *shortcuts_v,
                                  int         context,
+                                 const char *viewer_context,
                                  const char *accelerator)
 {
        int i;
@@ -182,7 +211,8 @@ gth_shortcut_array_find_by_accel (GPtrArray  *shortcuts_v,
                if (((shortcut->context & context) != 0)
                        && (g_strcmp0 (shortcut->accelerator, accelerator) == 0))
                {
-                       return shortcut;
+                       if (! _gth_shortcut_for_different_viewer (shortcut, context, viewer_context))
+                               return shortcut;
                }
        }
 
diff --git a/gthumb/gth-shortcut.h b/gthumb/gth-shortcut.h
index 0596c398..4266e821 100644
--- a/gthumb/gth-shortcut.h
+++ b/gthumb/gth-shortcut.h
@@ -32,6 +32,7 @@ G_BEGIN_DECLS
 #define GTH_SHORTCUT_CATEGORY_NAVIGATION "file-navigation"
 #define GTH_SHORTCUT_CATEGORY_FILE_MANAGER "file-manager"
 #define GTH_SHORTCUT_CATEGORY_VIEWER "file-viewer"
+#define GTH_SHORTCUT_VIEWER_CONTEXT_ANY NULL
 
 
 typedef struct {
@@ -53,6 +54,7 @@ typedef struct {
        GdkModifierType  modifiers;
        GVariant        *action_parameter;
        char            *detailed_action;
+       const char      *viewer_context;
 } GthShortcut;
 
 
@@ -65,13 +67,17 @@ void          gth_shortcut_set_key          (GthShortcut       *shortcut,
                                                 GdkModifierType    modifiers);
 void          gth_shortcut_set_accelerator     (GthShortcut       *shortcut,
                                                 const char        *name);
+void          gth_shortcut_set_viewer_context   (GthShortcut       *shortcut,
+                                                const char        *viewer_context);
 gboolean      gth_shortcut_customizable         (GthShortcut       *shortcut);
 GthShortcut * gth_shortcut_array_find           (GPtrArray         *shortcuts_v,
                                                 int                context,
+                                                const char        *viewer_context,
                                                 guint              keycode,
                                                 GdkModifierType    modifiers);
 GthShortcut * gth_shortcut_array_find_by_accel  (GPtrArray         *shortcuts_v,
                                                 int                context,
+                                                const char        *viewer_context,
                                                 const char        *accelerator);
 GthShortcut * gth_shortcut_array_find_by_action (GPtrArray         *shortcuts_v,
                                                 const char        *detailed_action);
diff --git a/gthumb/gth-viewer-page.c b/gthumb/gth-viewer-page.c
index 61d215d9..32af024f 100644
--- a/gthumb/gth-viewer-page.c
+++ b/gthumb/gth-viewer-page.c
@@ -210,3 +210,13 @@ gth_viewer_page_file_loaded (GthViewerPage *self,
 {
        g_signal_emit (self, gth_viewer_page_signals[FILE_LOADED], 0, file_data, updated_metadata, success);
 }
+
+
+const char *
+gth_viewer_page_get_shortcut_context (GthViewerPage  *self)
+{
+       if (GTH_VIEWER_PAGE_GET_INTERFACE (self)->shortcut_context != NULL)
+               return GTH_VIEWER_PAGE_GET_INTERFACE (self)->shortcut_context (self);
+       else
+               return NULL;
+}
diff --git a/gthumb/gth-viewer-page.h b/gthumb/gth-viewer-page.h
index 277a4f1d..6fe0e17a 100644
--- a/gthumb/gth-viewer-page.h
+++ b/gthumb/gth-viewer-page.h
@@ -79,6 +79,8 @@ struct _GthViewerPageInterface {
        gboolean  (*zoom_from_scroll)    (GthViewerPage *self,
                                          GdkEventScroll *event);
 
+       const char * (*shortcut_context) (GthViewerPage *self);
+
        /*< signals >*/
 
        void      (*file_loaded)         (GthViewerPage *self,
@@ -121,6 +123,8 @@ void         gth_viewer_page_file_loaded         (GthViewerPage  *self,
                                                  GthFileData    *file_data,
                                                  GFileInfo      *updated_metadata,
                                                  gboolean        success);
+const char * gth_viewer_page_get_shortcut_context
+                                                (GthViewerPage  *self);
 
 G_END_DECLS
 
diff --git a/gthumb/gth-window.c b/gthumb/gth-window.c
index 247a31b9..ac82e167 100644
--- a/gthumb/gth-window.c
+++ b/gthumb/gth-window.c
@@ -808,9 +808,10 @@ gth_window_change_action_state (GthWindow  *window,
 
 
 void
-gth_window_add_shortcuts (GthWindow         *window,
-                         const GthShortcut *shortcuts,
-                         int                n_shortcuts)
+gth_window_add_viewer_shortcuts (GthWindow         *window,
+                                const char        *viewer_context,
+                                const GthShortcut *shortcuts,
+                                int                n_shortcuts)
 {
        int i;
 
@@ -820,12 +821,22 @@ gth_window_add_shortcuts (GthWindow         *window,
 
                new_shortcut = gth_shortcut_dup (shortcut);
                gth_shortcut_set_accelerator (new_shortcut, shortcut->default_accelerator);
+               gth_shortcut_set_viewer_context (new_shortcut, viewer_context);
 
                _gth_window_add_shortcut (window, new_shortcut);
        }
 }
 
 
+void
+gth_window_add_shortcuts (GthWindow         *window,
+                         const GthShortcut *shortcuts,
+                         int                n_shortcuts)
+{
+       gth_window_add_viewer_shortcuts (window, NULL, shortcuts, n_shortcuts);
+}
+
+
 GPtrArray *
 gth_window_get_shortcuts (GthWindow *window)
 {
@@ -884,6 +895,7 @@ gth_window_get_shortcuts_by_category (GthWindow *window)
 gboolean
 gth_window_activate_shortcut (GthWindow       *window,
                              int              context,
+                             const char      *viewer_context,
                              guint            keycode,
                              GdkModifierType  modifiers)
 {
@@ -891,7 +903,7 @@ gth_window_activate_shortcut (GthWindow       *window,
        GthShortcut *shortcut;
 
        modifiers = modifiers & gtk_accelerator_get_default_mod_mask ();
-       shortcut = gth_shortcut_array_find (window->priv->shortcuts_v, context, keycode, modifiers);
+       shortcut = gth_shortcut_array_find (window->priv->shortcuts_v, context, viewer_context, keycode, 
modifiers);
        if (shortcut != NULL) {
                GAction *action;
 
@@ -990,6 +1002,7 @@ gboolean
 gth_window_can_change_shortcut (GthWindow         *window,
                                const char        *detailed_action,
                                int                context,
+                               const char        *viewer_context,
                                guint              keycode,
                                GdkModifierType    modifiers,
                                GtkWindow         *parent)
@@ -1001,6 +1014,7 @@ gth_window_can_change_shortcut (GthWindow         *window,
 
        shortcut = gth_shortcut_array_find (gth_window_get_shortcuts (window ),
                                            context,
+                                           viewer_context,
                                            keycode,
                                            modifiers);
 
diff --git a/gthumb/gth-window.h b/gthumb/gth-window.h
index 66c88f11..f152e2e2 100644
--- a/gthumb/gth-window.h
+++ b/gthumb/gth-window.h
@@ -121,16 +121,21 @@ gboolean  gth_window_get_action_state     (GthWindow              *window,
 void           gth_window_change_action_state  (GthWindow              *window,
                                                 const char             *action_name,
                                                 gboolean                value);
+void           gth_window_add_viewer_shortcuts (GthWindow              *window,
+                                                const char             *viewer_context,
+                                                const GthShortcut      *shortcuts,
+                                                int                     n_shortcuts);
 void           gth_window_add_shortcuts        (GthWindow              *window,
                                                 const GthShortcut      *shortcuts,
                                                 int                     n_shortcuts);
 GPtrArray *    gth_window_get_shortcuts        (GthWindow              *window);
-GthShortcut *   gth_window_get_shortcut                (GthWindow              *window,
+GthShortcut *   gth_window_get_shortcut        (GthWindow              *window,
                                                 const char             *detailed_action);
 GPtrArray *    gth_window_get_shortcuts_by_category
                                                (GthWindow              *window);
 gboolean       gth_window_activate_shortcut    (GthWindow              *window,
                                                 int                     context,
+                                                const char             *viewer_context,
                                                 guint                   keycode,
                                                 GdkModifierType         modifiers);
 void           gth_window_load_shortcuts       (GthWindow              *window);
@@ -143,6 +148,7 @@ void                gth_window_remove_shortcuts     (GthWindow              *window,
 gboolean       gth_window_can_change_shortcut  (GthWindow              *window,
                                                 const char             *detailed_action,
                                                 int                     context,
+                                                const char             *viewer_context,
                                                 guint                   keycode,
                                                 GdkModifierType         modifiers,
                                                 GtkWindow              *parent);


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