[gimp] Bug 780375 - Color picker won't pick on Wayland.



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]