alicelinux

A lightweight musl + clang/llvm + libressl + busybox distro
git clone https://codeberg.org/emmett1/alicelinux
Log | Files | Refs | README | LICENSE

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