[gthumb: 1/2] drag&drop: allow alt action via keyboard modifiers




commit d8636d0cbf0564b6296af5b803652012e7627717
Author: matthewmelvin <matthewmelvin gmail com>
Date:   Mon May 2 16:43:22 2022 +0000

    drag&drop: allow alt action via keyboard modifiers

 extensions/file_manager/callbacks.c |  9 +++++++--
 gthumb/gth-browser.c                |  6 +++++-
 gthumb/gtk-utils.c                  | 18 ++++++++++++++++++
 gthumb/gtk-utils.h                  |  1 +
 4 files changed, 31 insertions(+), 3 deletions(-)
---
diff --git a/extensions/file_manager/callbacks.c b/extensions/file_manager/callbacks.c
index eb0a9bb8..8877bd8d 100644
--- a/extensions/file_manager/callbacks.c
+++ b/extensions/file_manager/callbacks.c
@@ -477,7 +477,12 @@ gth_file_list_drag_motion (GtkWidget      *file_view,
                        }
                }
 
-               gdk_drag_status (context, source_is_reorderable ? GDK_ACTION_COPY : GDK_ACTION_MOVE, time);
+               if (source_is_reorderable)
+                       gdk_drag_status (context, GDK_ACTION_COPY, time);
+               else if (_gtk_drag_drop_modifier_state (file_view))
+                       gdk_drag_status (context, GDK_ACTION_COPY, time);
+               else
+                       gdk_drag_status (context, GDK_ACTION_MOVE, time);
        }
 
        return TRUE;
@@ -878,7 +883,7 @@ fm__gth_browser_load_location_after_cb (GthBrowser   *browser,
                                   G_N_ELEMENTS (non_reorderable_drag_dest_targets),
                                   GDK_ACTION_COPY | GDK_ACTION_MOVE);
 
-               source_actions = GDK_ACTION_MOVE | GDK_ACTION_ASK;
+               source_actions = GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK;
        }
 
        /* set the drag source targets */
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 006ad96f..c85c5e8f 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -2856,7 +2856,11 @@ folder_tree_drag_motion_cb (GtkWidget      *file_view,
                browser->priv->folder_tree_open_folder_id = g_timeout_add (AUTO_OPEN_FOLDER_DELAY, 
folder_tree_open_folder_cb, browser);
        }
 
-       gdk_drag_status (context, GDK_ACTION_MOVE, time);
+       if (_gtk_drag_drop_modifier_state (file_view))
+               gdk_drag_status (context, GDK_ACTION_COPY, time);
+       else
+               gdk_drag_status (context, GDK_ACTION_MOVE, time);
+
        gtk_tree_path_free (path);
 
        return TRUE;
diff --git a/gthumb/gtk-utils.c b/gthumb/gtk-utils.c
index 7c5731b0..b7289da3 100644
--- a/gthumb/gtk-utils.c
+++ b/gthumb/gtk-utils.c
@@ -877,6 +877,24 @@ _gtk_menu_ask_drag_drop_action (GtkWidget     *widget,
 }
 
 
+gboolean
+_gtk_drag_drop_modifier_state (GtkWidget *widget)
+{
+       GdkModifierType mask;
+
+        gdk_window_get_device_position (gtk_widget_get_window (widget),
+                                _gtk_widget_get_client_pointer (widget),
+                                NULL,
+                                NULL,
+                                &mask);
+
+        if (mask & (GDK_SHIFT_MASK | GDK_CONTROL_MASK))
+               return TRUE;
+       
+       return FALSE;
+}
+
+
 static gboolean
 _gdk_rgba_shade (GdkRGBA *color,
                 GdkRGBA *result,
diff --git a/gthumb/gtk-utils.h b/gthumb/gtk-utils.h
index a23b3d41..d61154a9 100644
--- a/gthumb/gtk-utils.h
+++ b/gthumb/gtk-utils.h
@@ -161,6 +161,7 @@ void            _gtk_window_resize_to_fit_screen_height    (GtkWidget        *wi
 void            _gtk_info_bar_clear_action_area            (GtkInfoBar       *info_bar);
 GdkDragAction   _gtk_menu_ask_drag_drop_action             (GtkWidget        *widget,
                                                            GdkDragAction     actions);
+gboolean        _gtk_drag_drop_modifier_state              (GtkWidget        *widget);
 gboolean        _gdk_rgba_darker                           (GdkRGBA          *color,
                                                            GdkRGBA          *result);
 gboolean        _gdk_rgba_lighter                          (GdkRGBA          *color,


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