portal.patch (20434B)
1 From d0cc2acd9dd67e51500b5ce96519ed21d2fc4776 Mon Sep 17 00:00:00 2001 2 From: Christopher Davis <brainblasted@disroot.org> 3 Date: Tue, 25 Aug 2020 18:03:29 -0700 4 Subject: [PATCH] build: Add libportal as a subproject 5 6 Should make Color Picker simpler to build on distros 7 that don't yet ship libportal. 8 --- 9 .gitignore | 1 + 10 meson.build | 11 ++++++----- 11 subprojects/libportal.wrap | 4 ++++ 12 3 files changed, 11 insertions(+), 5 deletions(-) 13 create mode 100644 subprojects/libportal.wrap 14 15 diff --git a/.gitignore b/.gitignore 16 index 797d03e..697ee9e 100644 17 --- a/.gitignore 18 +++ b/.gitignore 19 @@ -6,3 +6,4 @@ build/ 20 *.lo 21 *.o 22 *.gresource 23 +/subprojects/libportal/ 24 diff --git a/meson.build b/meson.build 25 index 5ffa858..195de61 100644 26 --- a/meson.build 27 +++ b/meson.build 28 @@ -1,14 +1,15 @@ 29 project('gcolor3', 'c', version: '2.3.1', 30 license: 'GPL2+', 31 meson_version: '>= 0.40.0', 32 - default_options: [ 33 - 'c_std=c99', 34 - 'werror=true' 35 - ] 36 ) 37 38 dep_gtk = dependency('gtk+-3.0', version: '>= 3.20.0', required: true) 39 -dep_libportal = dependency('libportal', required: true) 40 +dep_libportal = dependency( 41 + 'libportal', 42 + required: true, 43 + fallback: ['libportal', 'libportal_dep'], 44 + default_options: ['gtk_doc=false'], 45 +) 46 cc = meson.get_compiler('c') 47 dep_lm = cc.find_library('m', required: true) 48 49 diff --git a/subprojects/libportal.wrap b/subprojects/libportal.wrap 50 new file mode 100644 51 index 0000000..0ee4948 52 --- /dev/null 53 +++ b/subprojects/libportal.wrap 54 @@ -0,0 +1,4 @@ 55 +[wrap-git] 56 +directory=libportal 57 +url=https://github.com/flatpak/libportal.git 58 +revision=origin/master 59 From f68055ce3f91001503a31753b03836b6cf86b3dd Mon Sep 17 00:00:00 2001 60 From: Christopher Davis <brainblasted@disroot.org> 61 Date: Thu, 14 Nov 2019 16:09:21 -0800 62 Subject: [PATCH] color-selection: Use libportal for Wayland suport 63 64 Greatly simplify our color selection code by 65 using libportal instead of implementing it manually. 66 67 Fixes https://gitlab.gnome.org/World/gcolor3/issues/38 68 --- 69 meson.build | 1 + 70 nl.hjdskes.gcolor3.json | 10 ++ 71 src/gcolor3-color-selection.c | 275 +++++++--------------------------- 72 src/meson.build | 1 + 73 4 files changed, 66 insertions(+), 221 deletions(-) 74 75 diff --git a/meson.build b/meson.build 76 index e5d737b..5ffa858 100644 77 --- a/meson.build 78 +++ b/meson.build 79 @@ -8,6 +8,7 @@ project('gcolor3', 'c', version: '2.3.1', 80 ) 81 82 dep_gtk = dependency('gtk+-3.0', version: '>= 3.20.0', required: true) 83 +dep_libportal = dependency('libportal', required: true) 84 cc = meson.get_compiler('c') 85 dep_lm = cc.find_library('m', required: true) 86 87 diff --git a/nl.hjdskes.gcolor3.json b/nl.hjdskes.gcolor3.json 88 index 04d495a..8ad4423 100644 89 --- a/nl.hjdskes.gcolor3.json 90 +++ b/nl.hjdskes.gcolor3.json 91 @@ -17,6 +17,16 @@ 92 "/share/man" 93 ], 94 "modules": [ 95 + { 96 + "name": "libportal", 97 + "buildsystem": "meson", 98 + "sources": [ 99 + { 100 + "type": "git", 101 + "url": "https://github.com/flatpak/libportal.git" 102 + } 103 + ] 104 + }, 105 { 106 "name": "gcolor3", 107 "buildsystem": "meson", 108 diff --git a/src/gcolor3-color-selection.c b/src/gcolor3-color-selection.c 109 index 58503d7..6eccf43 100644 110 --- a/src/gcolor3-color-selection.c 111 +++ b/src/gcolor3-color-selection.c 112 @@ -37,11 +37,11 @@ 113 #include <math.h> 114 #include <string.h> 115 #include <gdk/gdk.h> 116 -#ifdef GDK_WINDOWING_WAYLAND 117 -#include <gdk/gdkwayland.h> 118 -#endif 119 +#include <gio/gio.h> 120 #include <gtk/gtk.h> 121 #include <glib/gi18n.h> 122 +#include <libportal/portal.h> 123 +#include <libportal/portal-gtk3.h> 124 125 #ifdef ENABLE_NLS 126 #define P_(String) g_dgettext(GETTEXT_PACKAGE "-properties",String) 127 @@ -153,11 +153,7 @@ struct _Gcolor3ColorSelectionPrivate 128 GtkWidget *cur_sample; 129 GtkWidget *colorsel; 130 131 - /* Window for grabbing on */ 132 - GtkWidget *dropper_grab_widget; 133 - guint32 grab_time; 134 - GdkDevice *keyboard_device; 135 - GdkDevice *pointer_device; 136 + GCancellable *cancellable; 137 138 /* Connection to settings */ 139 gulong settings_connection; 140 @@ -179,8 +175,6 @@ static void gcolor3_color_selection_get_property (GObject *ob 141 static void gcolor3_color_selection_realize (GtkWidget *widget); 142 static void gcolor3_color_selection_unrealize (GtkWidget *widget); 143 static void gcolor3_color_selection_show_all (GtkWidget *widget); 144 -static gboolean gcolor3_color_selection_grab_broken (GtkWidget *widget, 145 - GdkEventGrabBroken *event); 146 147 static void gcolor3_color_selection_set_palette_color (Gcolor3ColorSelection *colorsel, 148 gint index, 149 @@ -201,6 +195,9 @@ static void make_all_relations (AtkObject 150 static void hsv_changed (GtkWidget *hsv, 151 gpointer data); 152 static void get_screen_color (GtkWidget *button); 153 +static void pick_color_cb (GObject *source_object, 154 + GAsyncResult *result, 155 + gpointer user_data); 156 static void adjustment_changed (GtkAdjustment *adjustment, 157 gpointer data); 158 static void opacity_entry_changed (GtkWidget *opacity_entry, 159 @@ -236,56 +233,12 @@ static void palette_change_notify_instance (GObject *object, 160 GParamSpec *pspec, 161 gpointer data); 162 static void update_palette (Gcolor3ColorSelection *colorsel); 163 -static void shutdown_eyedropper (GtkWidget *widget); 164 165 static guint color_selection_signals[LAST_SIGNAL] = { 0 }; 166 167 static Gcolor3ColorSelectionChangePaletteFunc noscreen_change_palette_hook = default_noscreen_change_palette_func; 168 static Gcolor3ColorSelectionChangePaletteWithScreenFunc change_palette_hook = default_change_palette_func; 169 170 -static const guchar dropper_bits[] = { 171 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 172 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377" 173 - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 174 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\0\0\0\377" 175 - "\0\0\0\377\0\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 176 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" 177 - "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377\377" 178 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377" 179 - "\377\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\377\0\0" 180 - "\0\377\0\0\0\377\0\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0" 181 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\0\0\0\377\0\0\0\377\0" 182 - "\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\377\377\377" 183 - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 184 - "\377\377\377\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0" 185 - "\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 186 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\0\0\0\377\0\0" 187 - "\0\377\0\0\0\377\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0" 188 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377" 189 - "\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\377\377\377" 190 - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 191 - "\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\377\377" 192 - "\0\0\0\377\377\377\377\377\0\0\0\377\377\377\377\377\0\0\0\0\0\0\0\0" 193 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377" 194 - "\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\0\0\0\0\0\377\377" 195 - "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 196 - "\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0" 197 - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 198 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\377" 199 - "\377\377\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 200 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377" 201 - "\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0" 202 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 203 - "\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0\377\0\0\0" 204 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 205 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377\377\377\377\377\377\0\0" 206 - "\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 207 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\377\0\0\0" 208 - "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 209 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0" 210 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 211 - "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}; 212 - 213 G_DEFINE_TYPE_WITH_PRIVATE (Gcolor3ColorSelection, gcolor3_color_selection, GTK_TYPE_BOX) 214 215 static void 216 @@ -304,7 +257,6 @@ gcolor3_color_selection_class_init (Gcolor3ColorSelectionClass *klass) 217 widget_class->realize = gcolor3_color_selection_realize; 218 widget_class->unrealize = gcolor3_color_selection_unrealize; 219 widget_class->show_all = gcolor3_color_selection_show_all; 220 - widget_class->grab_broken_event = gcolor3_color_selection_grab_broken; 221 222 g_object_class_install_property (gobject_class, 223 PROP_HAS_OPACITY_CONTROL, 224 @@ -393,6 +345,7 @@ gcolor3_color_selection_init (Gcolor3ColorSelection *colorsel) 225 priv->changing = FALSE; 226 priv->default_set = FALSE; 227 priv->default_alpha_set = FALSE; 228 + priv->cancellable = g_cancellable_new (); 229 230 top_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12); 231 gtk_box_pack_start (GTK_BOX (colorsel), top_hbox, FALSE, FALSE, 0); 232 @@ -430,25 +383,9 @@ gcolor3_color_selection_init (Gcolor3ColorSelection *colorsel) 233 gtk_widget_show (GTK_WIDGET (picker_image)); 234 gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0); 235 236 -#ifdef GDK_WINDOWING_WAYLAND 237 - if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default())) 238 - { 239 - gtk_widget_set_sensitive (button, FALSE); 240 - gtk_widget_set_tooltip_text (button, 241 - _("Picking a color is currently not supported on " 242 - "Wayland.")); 243 - } 244 -#else 245 - if (FALSE) 246 - { 247 - } 248 -#endif 249 - else 250 - { 251 - gtk_widget_set_tooltip_text (button, 252 - _("Click the eyedropper, then click a color " 253 - "anywhere on your screen to select that color.")); 254 - } 255 + gtk_widget_set_tooltip_text (button, 256 + _("Click the eyedropper, then click a color " 257 + "anywhere on your screen to select that color.")); 258 259 top_right_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6); 260 gtk_box_pack_start (GTK_BOX (top_hbox), top_right_vbox, FALSE, FALSE, 0); 261 @@ -656,14 +593,10 @@ gcolor3_color_selection_get_property (GObject *object, 262 static void 263 gcolor3_color_selection_destroy (GtkWidget *widget) 264 { 265 - Gcolor3ColorSelection *cselection = GCOLOR3_COLOR_SELECTION (widget); 266 - Gcolor3ColorSelectionPrivate *priv = cselection->private_data; 267 + Gcolor3ColorSelection *colorsel = GCOLOR3_COLOR_SELECTION (widget); 268 + Gcolor3ColorSelectionPrivate *priv = colorsel->private_data; 269 270 - if (priv->dropper_grab_widget) 271 - { 272 - gtk_widget_destroy (priv->dropper_grab_widget); 273 - priv->dropper_grab_widget = NULL; 274 - } 275 + g_cancellable_cancel (priv->cancellable); 276 277 GTK_WIDGET_CLASS (gcolor3_color_selection_parent_class)->destroy (widget); 278 } 279 @@ -706,15 +639,6 @@ gcolor3_color_selection_show_all (GtkWidget *widget) 280 gtk_widget_show (widget); 281 } 282 283 -static gboolean 284 -gcolor3_color_selection_grab_broken (GtkWidget *widget, 285 - UNUSED GdkEventGrabBroken *event) 286 -{ 287 - shutdown_eyedropper (widget); 288 - 289 - return TRUE; 290 -} 291 - 292 /* 293 * 294 * The Sample Color 295 @@ -1636,34 +1560,6 @@ palette_new (Gcolor3ColorSelection *colorsel) 296 297 /* The actual Gcolor3ColorSelection widget */ 298 299 -static GdkCursor * 300 -make_picker_cursor (GdkScreen *screen) 301 -{ 302 - GdkCursor *cursor; 303 - 304 - cursor = gdk_cursor_new_from_name (gdk_screen_get_display (screen), 305 - "color-picker"); 306 - 307 - if (!cursor) 308 - { 309 - GdkPixbuf *pixbuf; 310 - 311 - pixbuf = gdk_pixbuf_new_from_data (dropper_bits, 312 - GDK_COLORSPACE_RGB, TRUE, 8, 313 - DROPPER_WIDTH, DROPPER_HEIGHT, 314 - DROPPER_STRIDE, 315 - NULL, NULL); 316 - 317 - cursor = gdk_cursor_new_from_pixbuf (gdk_screen_get_display (screen), 318 - pixbuf, 319 - DROPPER_X_HOT, DROPPER_Y_HOT); 320 - 321 - g_object_unref (pixbuf); 322 - } 323 - 324 - return cursor; 325 -} 326 - 327 static void 328 grab_color_at_pointer (GdkScreen *screen, 329 GdkDevice *device, 330 @@ -1710,27 +1606,6 @@ grab_color_at_pointer (GdkScreen *screen, 331 update_color (colorsel); 332 } 333 334 -static void 335 -shutdown_eyedropper (GtkWidget *widget) 336 -{ 337 - Gcolor3ColorSelection *colorsel; 338 - Gcolor3ColorSelectionPrivate *priv; 339 - 340 - colorsel = GCOLOR3_COLOR_SELECTION (widget); 341 - priv = colorsel->private_data; 342 - 343 - if (priv->has_grab) 344 - { 345 - gdk_seat_ungrab (gdk_device_get_seat (priv->keyboard_device)); 346 - gdk_seat_ungrab (gdk_device_get_seat(priv->pointer_device)); 347 - gtk_device_grab_remove (priv->dropper_grab_widget, priv->pointer_device); 348 - 349 - priv->has_grab = FALSE; 350 - priv->keyboard_device = NULL; 351 - priv->pointer_device = NULL; 352 - } 353 -} 354 - 355 static void 356 mouse_motion (UNUSED GtkWidget *invisible, 357 GdkEventMotion *event, 358 @@ -1755,8 +1630,6 @@ mouse_release (GtkWidget *invisible, 359 gdk_event_get_device ((GdkEvent *) event), 360 event->x_root, event->y_root, data); 361 362 - shutdown_eyedropper (GTK_WIDGET (data)); 363 - 364 g_signal_handlers_disconnect_by_func (invisible, 365 mouse_motion, 366 data); 367 @@ -1798,8 +1671,6 @@ key_press (GtkWidget *invisible, 368 /* fall through */ 369 370 case GDK_KEY_Escape: 371 - shutdown_eyedropper (data); 372 - 373 g_signal_handlers_disconnect_by_func (invisible, 374 mouse_press, 375 data); 376 @@ -1868,95 +1739,57 @@ get_screen_color (GtkWidget *button) 377 { 378 Gcolor3ColorSelection *colorsel = g_object_get_data (G_OBJECT (button), "COLORSEL"); 379 Gcolor3ColorSelectionPrivate *priv = colorsel->private_data; 380 - GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (button)); 381 - GdkDevice *device, *keyb_device, *pointer_device; 382 - GdkSeat *keyb_seat, *pointer_seat; 383 - GdkCursor *picker_cursor; 384 - GdkGrabStatus grab_status; 385 - GdkWindow *window; 386 - GtkWidget *grab_widget, *toplevel; 387 - 388 - guint32 time = gtk_get_current_event_time (); 389 - 390 - device = gtk_get_current_event_device (); 391 - 392 - if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) 393 - { 394 - keyb_device = device; 395 - keyb_seat = gdk_device_get_seat (keyb_device); 396 - pointer_device = gdk_device_get_associated_device (device); 397 - pointer_seat = gdk_device_get_seat (pointer_device); 398 - } 399 - else 400 - { 401 - pointer_device = device; 402 - pointer_seat = gdk_device_get_seat (pointer_device); 403 - keyb_device = gdk_device_get_associated_device (device); 404 - keyb_seat = gdk_device_get_seat (keyb_device); 405 - } 406 + XdpPortal *portal; 407 + XdpParent *parent; 408 + GtkWindow *window; 409 + GtkApplication *app; 410 411 - if (priv->dropper_grab_widget == NULL) 412 - { 413 - grab_widget = gtk_window_new (GTK_WINDOW_POPUP); 414 - gtk_window_set_screen (GTK_WINDOW (grab_widget), screen); 415 - gtk_window_resize (GTK_WINDOW (grab_widget), 1, 1); 416 - gtk_window_move (GTK_WINDOW (grab_widget), -100, -100); 417 - gtk_widget_show (grab_widget); 418 - 419 - gtk_widget_add_events (grab_widget, 420 - GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK); 421 - 422 - toplevel = gtk_widget_get_toplevel (GTK_WIDGET (colorsel)); 423 + app = GTK_APPLICATION (g_application_get_default ()); 424 + window = gtk_application_get_active_window (app); 425 426 - if (GTK_IS_WINDOW (toplevel)) 427 - { 428 - if (gtk_window_has_group (GTK_WINDOW (toplevel))) 429 - gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)), 430 - GTK_WINDOW (grab_widget)); 431 - } 432 + portal = xdp_portal_new (); 433 + parent = xdp_parent_new_gtk (window); 434 435 - priv->dropper_grab_widget = grab_widget; 436 - } 437 - 438 - window = gtk_widget_get_window (priv->dropper_grab_widget); 439 - 440 - if (gdk_seat_grab (keyb_seat, 441 - window, 442 - GDK_SEAT_CAPABILITY_ALL, FALSE, 443 - NULL, 444 - gtk_get_current_event (), 445 - NULL, NULL) != GDK_GRAB_SUCCESS) 446 - return; 447 + xdp_portal_pick_color (portal, parent, 448 + priv->cancellable, 449 + pick_color_cb, colorsel); 450 +} 451 452 - picker_cursor = make_picker_cursor (screen); 453 - grab_status = gdk_seat_grab (pointer_seat, 454 - window, 455 - GDK_SEAT_CAPABILITY_ALL, FALSE, 456 - picker_cursor, 457 - gtk_get_current_event (), 458 - NULL, NULL); 459 +static void 460 +pick_color_cb (GObject *source_object, 461 + GAsyncResult *result, 462 + gpointer user_data) 463 +{ 464 + Gcolor3ColorSelection *colorsel; 465 + Gcolor3ColorSelectionPrivate *priv; 466 + GdkRGBA color; 467 + GVariant *variant; 468 + GError *error = NULL; 469 470 - g_object_unref (picker_cursor); 471 + colorsel = GCOLOR3_COLOR_SELECTION (user_data); 472 + priv = colorsel->private_data; 473 474 - if (grab_status != GDK_GRAB_SUCCESS) 475 + variant = xdp_portal_pick_color_finish (XDP_PORTAL (source_object), result, &error); 476 + if (!variant) 477 { 478 - gdk_seat_ungrab (keyb_seat); 479 + if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) 480 + g_warning ("Failed to pick color: %s", error->message); 481 + g_error_free (error); 482 return; 483 } 484 485 - gtk_device_grab_add (priv->dropper_grab_widget, 486 - pointer_device, 487 - TRUE); 488 - 489 - priv->grab_time = time; 490 - priv->has_grab = TRUE; 491 - priv->keyboard_device = keyb_device; 492 - priv->pointer_device = pointer_device; 493 + g_variant_get (variant, "(ddd)", &color.red, &color.green, &color.blue); 494 495 - g_signal_connect (priv->dropper_grab_widget, "button-press-event", 496 - G_CALLBACK (mouse_press), colorsel); 497 - g_signal_connect (priv->dropper_grab_widget, "key-press-event", 498 - G_CALLBACK (key_press), colorsel); 499 + priv->color[COLORSEL_RED] = color.red; 500 + priv->color[COLORSEL_GREEN] = color.green; 501 + priv->color[COLORSEL_BLUE] = color.blue; 502 + gtk_rgb_to_hsv (priv->color[COLORSEL_RED], 503 + priv->color[COLORSEL_GREEN], 504 + priv->color[COLORSEL_BLUE], 505 + &priv->color[COLORSEL_HUE], 506 + &priv->color[COLORSEL_SATURATION], 507 + &priv->color[COLORSEL_VALUE]); 508 + update_color (colorsel); 509 } 510 511 static void 512 diff --git a/src/meson.build b/src/meson.build 513 index c95b557..3998f68 100644 514 --- a/src/meson.build 515 +++ b/src/meson.build 516 @@ -41,6 +41,7 @@ executable( 517 ], 518 dependencies: [ 519 dep_gtk, 520 + dep_libportal, 521 dep_lm 522 ], 523 install: true, 524 -- 525 GitLab 526