[gimp] Bug 780375 - Color picker won't pick on Wayland.
- From: Jehan Pagès <jehanp src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 780375 - Color picker won't pick on Wayland.
- Date: Fri, 8 Dec 2017 22:38:25 +0000 (UTC)
commit 06bbf3e4369433d0d2c78963a7b1da2674d01460
Author: Jehan <jehan girinstud io>
Date: Fri Dec 8 23:32:45 2017 +0100
Bug 780375 - Color picker won't pick on Wayland.
Add support for KWin API, for KDE on Wayland.
Unfortunately though, KWin's "pick" API seems to have failures, so I
fallback to the default color picking when this happens. This will still
not work on Wayland, but at least won't cause regression for color
picking on KDE/X11.
See also KDE bug: https://bugs.kde.org/show_bug.cgi?id=387720
libgimpwidgets/Makefile.am | 2 +-
libgimpwidgets/gimppickbutton-kwin.c | 115 ++++++++++++++++++++++++++++++++++
libgimpwidgets/gimppickbutton.c | 17 +++--
3 files changed, 127 insertions(+), 7 deletions(-)
---
diff --git a/libgimpwidgets/Makefile.am b/libgimpwidgets/Makefile.am
index f55ca4e..8703a3e 100644
--- a/libgimpwidgets/Makefile.am
+++ b/libgimpwidgets/Makefile.am
@@ -296,7 +296,7 @@ if PLATFORM_OSX_QUARTZ
libgimpwidgets_sources += gimppickbutton-quartz.c
AM_CPPFLAGS += "-xobjective-c"
else
-libgimpwidgets_sources += gimppickbutton-default.c
+libgimpwidgets_sources += gimppickbutton-default.c gimppickbutton-kwin.c
endif
diff --git a/libgimpwidgets/gimppickbutton-kwin.c b/libgimpwidgets/gimppickbutton-kwin.c
new file mode 100644
index 0000000..ea95806
--- /dev/null
+++ b/libgimpwidgets/gimppickbutton-kwin.c
@@ -0,0 +1,115 @@
+/* LIBGIMP - The GIMP Library
+ * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball
+ *
+ * gimppickbutton-kwin.c
+ * Copyright (C) 2017 Jehan <jehan gimp org>
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <gtk/gtk.h>
+
+#include "libgimpcolor/gimpcolor.h"
+
+#include "gimpwidgetstypes.h"
+#include "gimppickbutton.h"
+
+#include "libgimp/libgimp-intl.h"
+
+void _gimp_pick_button_default_pick (GimpPickButton *button);
+
+gboolean _gimp_pick_button_kwin_available (void);
+void _gimp_pick_button_kwin_pick (GimpPickButton *button);
+
+gboolean
+_gimp_pick_button_kwin_available (void)
+{
+ GDBusProxy *proxy = NULL;
+ gboolean available = FALSE;
+
+ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+ NULL,
+ "org.kde.KWin",
+ "/ColorPicker",
+ "org.kde.kwin.ColorPicker",
+ NULL, NULL);
+
+ if (proxy)
+ {
+ GError *error = NULL;
+
+ g_dbus_proxy_call_sync (proxy, "org.freedesktop.DBus.Peer.Ping",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, &error);
+ if (! error)
+ available = TRUE;
+
+ g_clear_error (&error);
+ g_object_unref (proxy);
+ }
+
+ return available;
+}
+
+/* entry point to this file, called from gimppickbutton.c */
+void
+_gimp_pick_button_kwin_pick (GimpPickButton *button)
+{
+ GDBusProxy *proxy = NULL;
+ GError *error = NULL;
+ GVariant *retval;
+
+ proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+ G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
+ NULL,
+ "org.kde.KWin",
+ "/ColorPicker",
+ "org.kde.kwin.ColorPicker",
+ NULL, NULL);
+ g_return_if_fail (proxy);
+
+ retval = g_dbus_proxy_call_sync (proxy, "pick", NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1, NULL, &error);
+ if (retval)
+ {
+ GimpRGB rgb;
+ guint32 color;
+
+ g_variant_get (retval, "(u)", &color);
+ g_variant_unref (retval);
+ /* Returned value is ARGB stored in uint32. */
+ gimp_rgba_set_uchar (&rgb,
+ (color >> 16 ) & 0xff, /* Red */
+ (color >> 8) & 0xff, /* Green */
+ color & 0xff, /* Blue: least significant byte. */
+ (color >> 24) & 0xff); /* Alpha: most significant byte. */
+ g_signal_emit_by_name (button, "color-picked", &rgb);
+ }
+ else
+ {
+ /* I had failure of KDE's color picking API. So let's just
+ * fallback to the default color picking when this happens. This
+ * will at least work on X11.
+ * See: https://bugs.kde.org/show_bug.cgi?id=387720
+ */
+ if (error)
+ g_warning ("KWin backend for color picking failed with error: %s",
+ error->message);
+ _gimp_pick_button_default_pick (GIMP_PICK_BUTTON (button));
+ }
+ g_clear_error (&error);
+ g_object_unref (proxy);
+}
diff --git a/libgimpwidgets/gimppickbutton.c b/libgimpwidgets/gimppickbutton.c
index e34497f..87523af 100644
--- a/libgimpwidgets/gimppickbutton.c
+++ b/libgimpwidgets/gimppickbutton.c
@@ -50,13 +50,15 @@ enum
LAST_SIGNAL
};
-/* entry points to gimppickbutton-{default,quartz}.c */
-void _gimp_pick_button_default_pick (GimpPickButton *button);
-void _gimp_pick_button_quartz_pick (GimpPickButton *button);
+/* entry points to gimppickbutton-{default,kwin,quartz}.c */
+void _gimp_pick_button_default_pick (GimpPickButton *button);
+gboolean _gimp_pick_button_kwin_available (void);
+void _gimp_pick_button_kwin_pick (GimpPickButton *button);
+void _gimp_pick_button_quartz_pick (GimpPickButton *button);
-static void gimp_pick_button_dispose (GObject *object);
+static void gimp_pick_button_dispose (GObject *object);
-static void gimp_pick_button_clicked (GtkButton *button);
+static void gimp_pick_button_clicked (GtkButton *button);
G_DEFINE_TYPE (GimpPickButton, gimp_pick_button, GTK_TYPE_BUTTON)
@@ -138,7 +140,10 @@ gimp_pick_button_clicked (GtkButton *button)
#ifdef GDK_WINDOWING_QUARTZ
_gimp_pick_button_quartz_pick (GIMP_PICK_BUTTON (button));
#else
- _gimp_pick_button_default_pick (GIMP_PICK_BUTTON (button));
+ if (_gimp_pick_button_kwin_available ())
+ _gimp_pick_button_kwin_pick (GIMP_PICK_BUTTON (button));
+ else
+ _gimp_pick_button_default_pick (GIMP_PICK_BUTTON (button));
#endif
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]