[gimp] app: fix drag'n drop of fg/bg colors under Wayland.
- From: Jehan <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] app: fix drag'n drop of fg/bg colors under Wayland.
- Date: Sun, 26 Sep 2021 17:08:11 +0000 (UTC)
commit d4733e5b21e9d949ccc8af69bdac9a4a7513a9e9
Author: Jehan <jehan girinstud io>
Date: Sun Sep 26 18:54:39 2021 +0200
app: fix drag'n drop of fg/bg colors under Wayland.
Commit 086ae77929 had broken dnd of colors from toolbox's color area on
Wayland. Clearly Wayland did not like we changed focus on a click,
breaking the drag.
To fix this, do not propagate button press and release events from the
GimpFgBgEditor editor anymore. Yet, since changing colors is usually to
be used (often immediately) on the canvas, giving back the focus to
canvas still makes sense. Therefore, instead of using press/release
events, add semantic signals to GimpFgBgEditor: color-dropped,
colors-swapped and colors-default (additionally to already existing
color-clicked). Then connect to these new signals to grab focus for
canvas when relevant.
Thanks to Massimo for raising the broken color dnd feature.
app/widgets/gimpfgbgeditor.c | 46 ++++++++++++++++++++++++++++++++----
app/widgets/gimpfgbgeditor.h | 16 ++++++++-----
app/widgets/gimptoolbox-color-area.c | 21 ++++++++++++++++
3 files changed, 73 insertions(+), 10 deletions(-)
---
diff --git a/app/widgets/gimpfgbgeditor.c b/app/widgets/gimpfgbgeditor.c
index 8e3a586550..c7f319292a 100644
--- a/app/widgets/gimpfgbgeditor.c
+++ b/app/widgets/gimpfgbgeditor.c
@@ -57,6 +57,9 @@ enum
enum
{
COLOR_CLICKED,
+ COLOR_DROPPED,
+ COLORS_SWAPPED,
+ COLORS_DEFAULT,
TOOLTIP,
LAST_SIGNAL
};
@@ -145,6 +148,31 @@ gimp_fg_bg_editor_class_init (GimpFgBgEditorClass *klass)
G_TYPE_NONE, 1,
GIMP_TYPE_ACTIVE_COLOR);
+ editor_signals[COLOR_DROPPED] =
+ g_signal_new ("color-dropped",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GimpFgBgEditorClass, color_dropped),
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 1,
+ GIMP_TYPE_ACTIVE_COLOR);
+
+ editor_signals[COLORS_SWAPPED] =
+ g_signal_new ("colors-swapped",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GimpFgBgEditorClass, colors_swapped),
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
+
+ editor_signals[COLORS_DEFAULT] =
+ g_signal_new ("colors-default",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (GimpFgBgEditorClass, colors_default),
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
+
editor_signals[TOOLTIP] =
g_signal_new ("tooltip",
G_TYPE_FROM_CLASS (klass),
@@ -512,12 +540,18 @@ gimp_fg_bg_editor_button_press (GtkWidget *widget,
case GIMP_FG_BG_TARGET_SWAP:
if (editor->context)
- gimp_context_swap_colors (editor->context);
+ {
+ gimp_context_swap_colors (editor->context);
+ g_signal_emit (editor, editor_signals[COLORS_SWAPPED], 0);
+ }
break;
case GIMP_FG_BG_TARGET_DEFAULT:
if (editor->context)
- gimp_context_set_default_colors (editor->context);
+ {
+ gimp_context_set_default_colors (editor->context);
+ g_signal_emit (editor, editor_signals[COLORS_DEFAULT], 0);
+ }
break;
default:
@@ -525,7 +559,7 @@ gimp_fg_bg_editor_button_press (GtkWidget *widget,
}
}
- return FALSE;
+ return GDK_EVENT_STOP;
}
static gboolean
@@ -561,7 +595,7 @@ gimp_fg_bg_editor_button_release (GtkWidget *widget,
editor->click_target = GIMP_FG_BG_TARGET_INVALID;
}
- return FALSE;
+ return GDK_EVENT_STOP;
}
static gboolean
@@ -729,10 +763,14 @@ gimp_fg_bg_editor_drop_color (GtkWidget *widget,
{
case GIMP_FG_BG_TARGET_FOREGROUND:
gimp_context_set_foreground (editor->context, color);
+ g_signal_emit (editor, editor_signals[COLOR_DROPPED], 0,
+ GIMP_ACTIVE_COLOR_FOREGROUND);
break;
case GIMP_FG_BG_TARGET_BACKGROUND:
gimp_context_set_background (editor->context, color);
+ g_signal_emit (editor, editor_signals[COLOR_DROPPED], 0,
+ GIMP_ACTIVE_COLOR_BACKGROUND);
break;
default:
diff --git a/app/widgets/gimpfgbgeditor.h b/app/widgets/gimpfgbgeditor.h
index 43113d50ca..c06af6930c 100644
--- a/app/widgets/gimpfgbgeditor.h
+++ b/app/widgets/gimpfgbgeditor.h
@@ -68,12 +68,16 @@ struct _GimpFgBgEditorClass
/* signals */
- void (* color_clicked) (GimpFgBgEditor *editor,
- GimpActiveColor color);
-
- void (* tooltip) (GimpFgBgEditor *editor,
- GimpFgBgTarget target,
- GtkTooltip tooltip);
+ void (* color_clicked) (GimpFgBgEditor *editor,
+ GimpActiveColor color);
+ void (* color_dropped) (GimpFgBgEditor *editor,
+ GimpActiveColor color);
+ void (* colors_swapped) (GimpFgBgEditor *editor);
+ void (* colors_default) (GimpFgBgEditor *editor);
+
+ void (* tooltip) (GimpFgBgEditor *editor,
+ GimpFgBgTarget target,
+ GtkTooltip tooltip);
};
diff --git a/app/widgets/gimptoolbox-color-area.c b/app/widgets/gimptoolbox-color-area.c
index 56f7c8197d..b8e0c0d72b 100644
--- a/app/widgets/gimptoolbox-color-area.c
+++ b/app/widgets/gimptoolbox-color-area.c
@@ -28,6 +28,7 @@
#include "core/gimp.h"
#include "core/gimpcontext.h"
+#include "core/gimpdisplay.h"
#include "gimpaction.h"
#include "gimpcolordialog.h"
@@ -59,6 +60,7 @@ static void color_area_dialog_update (GimpColorDialog *dialog,
static void color_area_color_clicked (GimpFgBgEditor *editor,
GimpActiveColor active_color,
GimpContext *context);
+static void color_area_color_changed (GimpContext *context);
static void color_area_tooltip (GimpFgBgEditor *editor,
GimpFgBgTarget target,
GtkTooltip *tooltip,
@@ -98,6 +100,15 @@ gimp_toolbox_color_area_create (GimpToolbox *toolbox,
g_signal_connect (color_area, "color-clicked",
G_CALLBACK (color_area_color_clicked),
context);
+ g_signal_connect_swapped (color_area, "colors-swapped",
+ G_CALLBACK (color_area_color_changed),
+ context);
+ g_signal_connect_swapped (color_area, "colors-default",
+ G_CALLBACK (color_area_color_changed),
+ context);
+ g_signal_connect_swapped (color_area, "color-dropped",
+ G_CALLBACK (color_area_color_changed),
+ context);
g_signal_connect (color_area, "tooltip",
G_CALLBACK (color_area_tooltip),
@@ -198,6 +209,9 @@ color_area_dialog_update (GimpColorDialog *dialog,
gimp_context_set_background (context, &revert_bg);
break;
}
+
+ if (gimp_context_get_display (context))
+ gimp_display_grab_focus (gimp_context_get_display (context));
}
static void
@@ -263,6 +277,13 @@ color_area_color_clicked (GimpFgBgEditor *editor,
color_dialog_active = TRUE;
}
+static void
+color_area_color_changed (GimpContext *context)
+{
+ if (gimp_context_get_display (context))
+ gimp_display_grab_focus (gimp_context_get_display (context));
+}
+
static gboolean
accel_find_func (GtkAccelKey *key,
GClosure *closure,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]