[gnome-control-center/gbsneto/gtk4: 1/2] wacom: Port to GTK4




commit 4df3c97886e75533947af8ee14fe09c98c43c394
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Nov 18 15:51:43 2021 -0300

    wacom: Port to GTK4
    
    Many part of this commit were made by Carlos
    Garnacho <carlosg gnome org>
    
    WIP wacom: Port to GTK4
    
    Lots of stuff missing and probably broken.
    
    wacom: Port CcDrawingArea input to gestures
    
    We have a handy GtkGestureStylus to use here, which avoids direct
    handling of GdkEvents.
    
    wacom: Update current stylus tracking to GtkGestureStylus
    
    Use the ::proximity signal to notice when we are being hovered with
    a tablet stylus, and look up the tool from there.

 panels/meson.build                           |   2 +-
 panels/wacom/button-mapping.ui               | 126 +++---------
 panels/wacom/calibrator/calibrator-gui.c     | 103 ++++------
 panels/wacom/calibrator/calibrator-gui.h     |   2 +-
 panels/wacom/calibrator/calibrator.ui        | 127 +++++-------
 panels/wacom/calibrator/cc-clock.c           |  41 ++--
 panels/wacom/calibrator/main.c               |   9 +-
 panels/wacom/cc-drawing-area.c               | 136 +++++--------
 panels/wacom/cc-drawing-area.h               |   2 +-
 panels/wacom/cc-wacom-button-row.c           |   2 +-
 panels/wacom/cc-wacom-device.c               |   2 +-
 panels/wacom/cc-wacom-device.h               |   2 +-
 panels/wacom/cc-wacom-mapping-panel.c        |  32 +--
 panels/wacom/cc-wacom-nav-button.c           |  33 +--
 panels/wacom/cc-wacom-page.c                 | 123 +++++++-----
 panels/wacom/cc-wacom-panel.c                |  87 ++++----
 panels/wacom/cc-wacom-stylus-page.c          |  59 +++---
 panels/wacom/gnome-wacom-properties.ui       | 289 +++++++--------------------
 panels/wacom/gsd-wacom-key-shortcut-button.c | 132 +++++-------
 panels/wacom/meson.build                     |   4 +-
 panels/wacom/test-wacom.c                    |  22 +-
 panels/wacom/wacom-stylus-page.ui            | 223 ++++++---------------
 shell/cc-panel-loader.c                      |   6 +-
 23 files changed, 564 insertions(+), 1000 deletions(-)
---
diff --git a/panels/meson.build b/panels/meson.build
index 29b96450c..5382bb034 100644
--- a/panels/meson.build
+++ b/panels/meson.build
@@ -39,7 +39,7 @@ if host_is_linux_not_s390
   panels += [
     'bluetooth',
     'thunderbolt',
-#    'wacom'
+    'wacom'
   ]
 endif
 
diff --git a/panels/wacom/button-mapping.ui b/panels/wacom/button-mapping.ui
index 23b22262b..add7e454d 100644
--- a/panels/wacom/button-mapping.ui
+++ b/panels/wacom/button-mapping.ui
@@ -4,141 +4,73 @@
   <object class="GtkDialog" id="button-mapping-dialog">
     <property name="width_request">600</property>
     <property name="height_request">450</property>
-    <property name="can_focus">False</property>
-    <property name="border_width">5</property>
     <property name="title" translatable="yes">Map Buttons</property>
     <property name="resizable">False</property>
     <property name="modal">True</property>
     <property name="default_width">600</property>
     <property name="default_height">450</property>
-    <property name="type_hint">dialog</property>
-    <child internal-child="vbox">
+    <child>
       <object class="GtkBox" id="top_vbox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <placeholder/>
-            </child>
-            <child>
-              <object class="GtkButton" id="close_button">
-                <property name="label" translatable="yes">_Close</property>
-                <property name="use_action_appearance">False</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="receives_default">False</property>
-                <property name="use_action_appearance">False</property>
-                <property name="use_underline">True</property>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">3</property>
-              </packing>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
         <child>
-          <object class="GtkVBox" id="shortcuts_vbox">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
+          <object class="GtkBox" id="shortcuts_vbox">
+            <property name="orientation">vertical</property>
             <property name="spacing">6</property>
+            <property name="expand">True</property>
             <child>
               <object class="GtkLabel" id="label1">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="xalign">0</property>
-                <property name="ypad">12</property>
+                <property name="margin-top">12</property>
                 <property name="label" translatable="yes">Map buttons to functions</property>
                 <attributes>
                   <attribute name="weight" value="bold"/>
                 </attributes>
               </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">0</property>
-              </packing>
             </child>
             <child>
-              <object class="GtkTable" id="table11">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="column_spacing">5</property>
+              <object class="GtkScrolledWindow" id="actions_swindow">
+                <property name="hscrollbar_policy">never</property>
                 <child>
-                  <object class="GtkScrolledWindow" id="actions_swindow">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="hscrollbar_policy">never</property>
-                    <property name="shadow_type">in</property>
-                    <child>
-                      <object class="GtkListBox" id="shortcuts_list">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                      </object>
-                    </child>
+                  <object class="GtkListBox" id="shortcuts_list">
                   </object>
                 </child>
               </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">1</property>
-              </packing>
             </child>
             <child>
-              <object class="GtkHBox" id="hbox1">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="border_width">5</property>
+              <object class="GtkBox" id="hbox1">
+                <property name="margin-top">5</property>
+                <property name="margin-bottom">5</property>
+                <property name="margin-start">5</property>
+                <property name="margin-end">5</property>
                 <property name="spacing">12</property>
                 <child>
                   <object class="GtkLabel" id="label12">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="xalign">0</property>
                     <property name="label" translatable="yes">To edit a shortcut, choose the “Send 
Keystroke” action, press the keyboard shortcut button and hold down the new keys or press Backspace to 
clear.</property>
                     <property name="justify">fill</property>
                     <property name="wrap">True</property>
+                    <property name="hexpand">True</property>
                   </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">2</property>
-              </packing>
             </child>
           </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="dialog-action_area1">
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="close_button">
+                <property name="label" translatable="yes">_Close</property>
+                <property name="use_action_appearance">False</property>
+                <property name="can_default">True</property>
+                <property name="receives_default">False</property>
+                <property name="use_action_appearance">False</property>
+                <property name="use_underline">True</property>
+              </object>
+            </child>
+          </object>
         </child>
       </object>
     </child>
diff --git a/panels/wacom/calibrator/calibrator-gui.c b/panels/wacom/calibrator/calibrator-gui.c
index 012291f8b..1c9d6f4d9 100644
--- a/panels/wacom/calibrator/calibrator-gui.c
+++ b/panels/wacom/calibrator/calibrator-gui.c
@@ -24,7 +24,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <glib/gi18n.h>
-#include <gdk/gdkx.h>
+#include <gdk/x11/gdkx.h>
 #include <gtk/gtk.h>
 
 #include "calibrator.h"
@@ -96,12 +96,11 @@ calib_area_notify_finish (CalibArea *area)
 }
 
 static gboolean
-on_delete_event (GtkWidget *widget,
-                 GdkEvent  *event,
-                 CalibArea *area)
+on_close_request (GtkWidget *widget,
+                  CalibArea *area)
 {
   calib_area_notify_finish (area);
-  return TRUE;
+  return GDK_EVENT_PROPAGATE;
 }
 
 static gboolean
@@ -167,23 +166,20 @@ set_active_target (CalibArea *area,
 }
 
 static void
-on_gesture_press (GtkGestureMultiPress *gesture,
-                  guint                 n_press,
-                  gdouble               x,
-                  gdouble               y,
-                  CalibArea            *area)
+on_gesture_press (GtkGestureClick *gesture,
+                  guint            n_press,
+                  gdouble          x,
+                  gdouble          y,
+                  CalibArea       *area)
 {
   gint num_clicks;
   gboolean success;
   GdkDevice *source;
-  GdkEvent *event;
 
   if (area->success)
     return;
 
-  event = gtk_get_current_event ();
-  source = gdk_event_get_source_device ((GdkEvent *) event);
-  gdk_event_free (event);
+  source = gtk_gesture_get_device (GTK_GESTURE (gesture));
 
   /* Check matching device if a device was provided */
   if (area->device && area->device != source)
@@ -217,12 +213,13 @@ on_gesture_press (GtkGestureMultiPress *gesture,
 }
 
 static gboolean
-on_key_release_event (GtkWidget   *widget,
-                      GdkEventKey *event,
-                      CalibArea   *area)
+on_key_release_event (GtkWidget       *widget,
+                      guint            keyval,
+                      guint            keycode,
+                      GdkModifierType  state,
+                      CalibArea       *area)
 {
-  if (area->success ||
-      event->keyval != GDK_KEY_Escape)
+  if (area->success || keyval != GDK_KEY_Escape)
     return GDK_EVENT_PROPAGATE;
 
   calib_area_notify_finish (area);
@@ -259,15 +256,15 @@ on_title_revealed (CalibArea *area)
   gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), TRUE);
 }
 
-static gboolean
-on_fullscreen (GtkWindow           *window,
-               GdkEventWindowState *event,
-               CalibArea           *area)
+static void
+on_fullscreen (GtkWindow  *window,
+               GParamSpec *pspec,
+               CalibArea  *area)
 {
   GtkWidget *revealer;
 
-  if ((event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) == 0)
-    return FALSE;
+  if (!gtk_window_is_fullscreen (window))
+    return;
 
   revealer = GTK_WIDGET (gtk_builder_get_object (area->builder, "title_revealer"));
   g_signal_connect_swapped (revealer, "notify::child-revealed",
@@ -276,8 +273,6 @@ on_fullscreen (GtkWindow           *window,
   gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), TRUE);
 
   set_active_target (area, 0);
-
-  return FALSE;
 }
 
 static void
@@ -295,7 +290,7 @@ on_size_allocate (GtkWidget     *widget,
  * calib_area_finish().
  */
 CalibArea *
-calib_area_new (GdkScreen      *screen,
+calib_area_new (GdkDisplay     *display,
                 int             n_monitor,
                 GdkDevice      *device,
                 FinishCallback  callback,
@@ -303,15 +298,10 @@ calib_area_new (GdkScreen      *screen,
                 int             threshold_doubleclick,
                 int             threshold_misclick)
 {
+  g_autoptr(GdkMonitor) monitor = NULL;
   CalibArea *calib_area;
   GdkRectangle rect;
-  GdkVisual *visual;
-  GdkMonitor *monitor;
-#ifndef FAKE_AREA
-  GdkWindow *window;
-  g_autoptr(GdkCursor) cursor = NULL;
-#endif /* FAKE_AREA */
-  GtkGesture *press;
+  GtkGesture *click;
 
   g_return_val_if_fail (callback, NULL);
 
@@ -330,9 +320,9 @@ calib_area_new (GdkScreen      *screen,
   calib_area->clock = GTK_WIDGET (gtk_builder_get_object (calib_area->builder, "clock"));
   calib_area->style_provider = gtk_css_provider_new ();
   gtk_css_provider_load_from_resource (calib_area->style_provider, 
"/org/gnome/control-center/wacom/calibrator/calibrator.css");
-  gtk_style_context_add_provider_for_screen (gtk_widget_get_screen (calib_area->window),
-                                             GTK_STYLE_PROVIDER (calib_area->style_provider),
-                                             GTK_STYLE_PROVIDER_PRIORITY_USER);
+  gtk_style_context_add_provider_for_display (gtk_widget_get_display (calib_area->window),
+                                              GTK_STYLE_PROVIDER (calib_area->style_provider),
+                                              GTK_STYLE_PROVIDER_PRIORITY_USER);
 
   cc_clock_set_duration (CC_CLOCK (calib_area->clock), MAX_TIME);
   g_signal_connect (calib_area->clock, "finished",
@@ -341,18 +331,15 @@ calib_area_new (GdkScreen      *screen,
 #ifndef FAKE_AREA
   /* No cursor */
   gtk_widget_realize (calib_area->window);
-  window = gtk_widget_get_window (calib_area->window);
-  cursor = gdk_cursor_new_for_display (gdk_display_get_default (), GDK_BLANK_CURSOR);
-  gdk_window_set_cursor (window, cursor);
+  gtk_widget_set_cursor_from_name (calib_area->window, "blank");
 
   gtk_widget_set_can_focus (calib_area->window, TRUE);
-  gtk_window_set_keep_above (GTK_WINDOW (calib_area->window), TRUE);
 #endif /* FAKE_AREA */
 
   /* Move to correct screen */
-  if (screen == NULL)
-    screen = gdk_screen_get_default ();
-  monitor = gdk_display_get_monitor (gdk_screen_get_display (screen), n_monitor);
+  if (display == NULL)
+    display = gdk_display_get_default ();
+  monitor = g_list_model_get_item (gdk_display_get_monitors (display), n_monitor);
   gdk_monitor_get_geometry (monitor, &rect);
 
   calib_area->calibrator.geometry = rect;
@@ -362,15 +349,15 @@ calib_area_new (GdkScreen      *screen,
                     G_CALLBACK (on_key_release_event),
                     calib_area);
   g_signal_connect (calib_area->window,
-                    "delete-event",
-                    G_CALLBACK (on_delete_event),
+                    "close-request",
+                    G_CALLBACK (on_close_request),
                     calib_area);
   g_signal_connect (calib_area->window,
                     "focus-out-event",
                     G_CALLBACK(on_focus_out_event),
                     calib_area);
   g_signal_connect (calib_area->window,
-                    "window-state-event",
+                    "notify::fullscreened",
                     G_CALLBACK (on_fullscreen),
                     calib_area);
   g_signal_connect (calib_area->window,
@@ -378,17 +365,13 @@ calib_area_new (GdkScreen      *screen,
                     G_CALLBACK (on_size_allocate),
                     calib_area);
 
-  press = gtk_gesture_multi_press_new (calib_area->window);
-  gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (press), GDK_BUTTON_PRIMARY);
-  g_signal_connect (press, "pressed",
+  click = gtk_gesture_click_new ();
+  gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (click), GDK_BUTTON_PRIMARY);
+  g_signal_connect (click, "pressed",
                     G_CALLBACK (on_gesture_press), calib_area);
+  gtk_widget_add_controller (calib_area->window, GTK_EVENT_CONTROLLER (click));
 
-  gtk_window_fullscreen_on_monitor (GTK_WINDOW (calib_area->window), screen, n_monitor);
-
-  visual = gdk_screen_get_rgba_visual (screen);
-  if (visual != NULL)
-    gtk_widget_set_visual (GTK_WIDGET (calib_area->window), visual);
-
+  gtk_window_fullscreen_on_monitor (GTK_WINDOW (calib_area->window), monitor);
   gtk_widget_show (calib_area->window);
 
   return calib_area;
@@ -418,9 +401,9 @@ calib_area_free (CalibArea *area)
 {
   g_return_if_fail (area != NULL);
 
-  gtk_style_context_remove_provider_for_screen (gtk_widget_get_screen (area->window),
-                                                GTK_STYLE_PROVIDER (area->style_provider));
-  gtk_widget_destroy (area->window);
+  gtk_style_context_remove_provider_for_display (gtk_widget_get_display (area->window),
+                                                 GTK_STYLE_PROVIDER (area->style_provider));
+  gtk_window_destroy (GTK_WINDOW (area->window));
   g_free (area);
 }
 
diff --git a/panels/wacom/calibrator/calibrator-gui.h b/panels/wacom/calibrator/calibrator-gui.h
index d3301c138..6e0dc7a08 100644
--- a/panels/wacom/calibrator/calibrator-gui.h
+++ b/panels/wacom/calibrator/calibrator-gui.h
@@ -39,7 +39,7 @@ typedef struct
 typedef struct CalibArea CalibArea;
 typedef void (*FinishCallback) (CalibArea *area, gpointer user_data);
 
-CalibArea * calib_area_new (GdkScreen      *screen,
+CalibArea * calib_area_new (GdkDisplay      *display,
                            int             monitor,
                            GdkDevice      *device,
                            FinishCallback  callback,
diff --git a/panels/wacom/calibrator/calibrator.ui b/panels/wacom/calibrator/calibrator.ui
index 6734b76f1..81b0ee11b 100644
--- a/panels/wacom/calibrator/calibrator.ui
+++ b/panels/wacom/calibrator/calibrator.ui
@@ -5,46 +5,39 @@
     <property name="name">calibrator</property>
     <child>
       <object class="GtkStack" id="stack">
-        <property name="visible">True</property>
         <property name="transition_duration">0</property>
         <child>
           <object class="GtkGrid">
-            <property name="visible">True</property>
             <property name="row_homogeneous">True</property>
             <property name="column_homogeneous">True</property>
             <child>
               <object class="GtkBox">
-                <property name="visible">True</property>
                 <property name="orientation">vertical</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">0</property>
+                  <property name="column-span">8</property>
+                  <property name="row-span">8</property>
+                </layout>
                 <child>
                   <object class="GtkBox" id="box1">
-                    <property name="visible">True</property>
                     <property name="orientation">vertical</property>
+                    <property name="vexpand">True</property>
                   </object>
-                  <packing>
-                    <property name="expand">True</property>
-                  </packing>
                 </child>
                 <child>
-                  <object class="CcClock" id="clock">
-                    <property name="visible">True</property>
-                  </object>
-                  <packing>
-                    <property name="position">1</property>
-                  </packing>
+                  <object class="CcClock" id="clock" />
                 </child>
                 <child>
                   <object class="GtkBox" id="box2">
-                    <property name="visible">True</property>
                     <property name="orientation">vertical</property>
+                    <property name="vexpand">True</property>
                     <child>
                       <object class="GtkRevealer" id="title_revealer">
-                        <property name="visible">True</property>
                         <property name="transition_duration">300</property>
                         <child>
                           <object class="GtkLabel">
                             <property name="name">title</property>
-                            <property name="visible">True</property>
                             <property name="label" translatable="yes">Screen Calibration</property>
                           </object>
                         </child>
@@ -52,143 +45,117 @@
                     </child>
                     <child>
                       <object class="GtkRevealer" id="subtitle_revealer">
-                        <property name="visible">True</property>
                         <property name="transition_duration">300</property>
                         <child>
                           <object class="GtkLabel">
                             <property name="name">subtitle</property>
-                            <property name="visible">True</property>
                             <property name="label" translatable="yes">Please tap the target markers as they 
appear on screen to calibrate the tablet.</property>
                           </object>
                         </child>
                       </object>
-                      <packing>
-                        <property name="position">1</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkRevealer" id="error_revealer">
-                        <property name="visible">True</property>
                         <property name="transition_type">crossfade</property>
                         <property name="transition_duration">500</property>
                         <child>
                           <object class="GtkLabel">
                             <property name="name">error</property>
-                            <property name="visible">True</property>
                             <property name="label" translatable="yes">Mis-click detected, 
restarting…</property>
                           </object>
                         </child>
                       </object>
-                      <packing>
-                        <property name="position">2</property>
-                      </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="position">2</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">0</property>
-                <property name="width">8</property>
-                <property name="height">8</property>
-              </packing>
             </child>
             <child>
               <object class="GtkEventBox" id="target1">
                 <property name="name">target</property>
                 <property name="width_request">100</property>
                 <property name="height_request">100</property>
-                <property name="visible">True</property>
-               <property name="visible_window">True</property>
+                <property name="visible_window">True</property>
                 <property name="sensitive">False</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">0</property>
+                  <property name="column-span">2</property>
+                  <property name="row-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">0</property>
-                <property name="width">2</property>
-                <property name="height">2</property>
-              </packing>
             </child>
             <child>
               <object class="GtkEventBox" id="target2">
                 <property name="name">target</property>
                 <property name="width_request">100</property>
                 <property name="height_request">100</property>
-                <property name="visible">True</property>
-               <property name="visible_window">True</property>
+                <property name="visible_window">True</property>
                 <property name="sensitive">False</property>
+                <layout>
+                  <property name="column">6</property>
+                  <property name="row">0</property>
+                  <property name="column-span">2</property>
+                  <property name="row-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">6</property>
-                <property name="top_attach">0</property>
-                <property name="width">2</property>
-                <property name="height">2</property>
-              </packing>
             </child>
             <child>
               <object class="GtkEventBox" id="target3">
                 <property name="name">target</property>
                 <property name="width_request">100</property>
                 <property name="height_request">100</property>
-                <property name="visible">True</property>
-               <property name="visible_window">True</property>
+                <property name="visible_window">True</property>
                 <property name="sensitive">False</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">6</property>
+                  <property name="column-span">2</property>
+                  <property name="row-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">6</property>
-                <property name="width">2</property>
-                <property name="height">2</property>
-              </packing>
             </child>
             <child>
               <object class="GtkEventBox" id="target4">
                 <property name="name">target</property>
                 <property name="width_request">100</property>
                 <property name="height_request">100</property>
-                <property name="visible">True</property>
-               <property name="visible_window">True</property>
+                <property name="visible_window">True</property>
                 <property name="sensitive">False</property>
+                <layout>
+                  <property name="column">6</property>
+                  <property name="row">6</property>
+                  <property name="column-span">2</property>
+                  <property name="row-span">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">6</property>
-                <property name="top_attach">6</property>
-                <property name="width">2</property>
-                <property name="height">2</property>
-              </packing>
             </child>
             <child>
               <object class="GtkRevealer">
-                <property name="visible">True</property>
                 <property name="transition_type">none</property>
                 <property name="transition_duration">0</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">0</property>
+                  <property name="column-span">8</property>
+                  <property name="row-span">8</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">0</property>
-                <property name="width">8</property>
-                <property name="height">8</property>
-              </packing>
             </child>
           </object>
-          <packing>
+          <layout>
             <property name="name">page0</property>
-          </packing>
+          </layout>
         </child>
         <child>
           <object class="GtkImage">
-            <property name="visible">True</property>
             <property name="pixel_size">300</property>
             <property name="icon_name">emblem-ok-symbolic</property>
           </object>
-          <packing>
+          <layout>
             <property name="name">page1</property>
             <property name="position">1</property>
-          </packing>
+          </layout>
         </child>
       </object>
     </child>
diff --git a/panels/wacom/calibrator/cc-clock.c b/panels/wacom/calibrator/cc-clock.c
index b39ddacdc..26afd8136 100644
--- a/panels/wacom/calibrator/cc-clock.c
+++ b/panels/wacom/calibrator/cc-clock.c
@@ -79,19 +79,19 @@ cc_clock_get_angle (CcClock *clock)
   return ((gdouble) time_diff / (clock->duration * 1000)) * 360;
 }
 
-static gboolean
-cc_clock_draw (GtkWidget *widget,
-               cairo_t   *cr)
+static void
+cc_clock_snapshot (GtkWidget   *widget,
+                   GtkSnapshot *snapshot)
 {
   GtkAllocation allocation;
+  cairo_t *cr;
   gdouble angle;
 
   gtk_widget_get_allocation (widget, &allocation);
   angle = cc_clock_get_angle (CC_CLOCK (widget));
 
-  cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
-  cairo_paint (cr);
-  cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
+  cr = gtk_snapshot_append_cairo (snapshot,
+                                  &GRAPHENE_RECT_INIT (0, 0, allocation.width, allocation.height));
 
   /* Draw the clock background */
   cairo_arc (cr, allocation.width / 2, allocation.height / 2, CLOCK_RADIUS / 2, 0.0, 2.0 * M_PI);
@@ -109,8 +109,6 @@ cc_clock_draw (GtkWidget *widget,
              3 * M_PI_2 + angle * M_PI / 180.0);
   cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
   cairo_stroke (cr);
-
-  return TRUE;
 }
 
 static void
@@ -199,20 +197,13 @@ cc_clock_get_property (GObject    *object,
 }
 
 static void
-cc_clock_get_preferred_width (GtkWidget *widget,
-                              gint      *minimum,
-                              gint      *natural)
-{
-  if (minimum)
-    *minimum = CLOCK_RADIUS + EXTRA_SPACE;
-  if (natural)
-    *natural = CLOCK_RADIUS + EXTRA_SPACE;
-}
-
-static void
-cc_clock_get_preferred_height (GtkWidget *widget,
-                               gint      *minimum,
-                               gint      *natural)
+cc_clock_measure (GtkWidget      *widget,
+                  GtkOrientation  orientation,
+                  gint            for_size,
+                  gint           *minimum,
+                  gint           *natural,
+                  gint           *minimum_baseline,
+                  gint           *natural_baseline)
 {
   if (minimum)
     *minimum = CLOCK_RADIUS + EXTRA_SPACE;
@@ -230,9 +221,8 @@ cc_clock_class_init (CcClockClass *klass)
   object_class->get_property = cc_clock_get_property;
 
   widget_class->map = cc_clock_map;
-  widget_class->draw = cc_clock_draw;
-  widget_class->get_preferred_width = cc_clock_get_preferred_width;
-  widget_class->get_preferred_height = cc_clock_get_preferred_height;
+  widget_class->snapshot = cc_clock_snapshot;
+  widget_class->measure = cc_clock_measure;
 
   signals[FINISHED] =
     g_signal_new ("finished",
@@ -256,7 +246,6 @@ cc_clock_class_init (CcClockClass *klass)
 static void
 cc_clock_init (CcClock *clock)
 {
-  gtk_widget_set_has_window (GTK_WIDGET (clock), FALSE);
 }
 
 GtkWidget *
diff --git a/panels/wacom/calibrator/main.c b/panels/wacom/calibrator/main.c
index 1a82e87b3..e35d48e49 100644
--- a/panels/wacom/calibrator/main.c
+++ b/panels/wacom/calibrator/main.c
@@ -34,6 +34,8 @@
 #include "calibrator-gui.h"
 #include "calibrator.h"
 
+static GMainLoop *mainloop = NULL;
+
 /**
  * find a calibratable touchscreen device (using XInput)
  *
@@ -383,7 +385,7 @@ calibration_finished_cb (CalibArea *area,
        else
                fprintf(stderr, "Error: unable to apply or save configuration values\n");
 
-       gtk_main_quit ();
+       g_main_loop_quit (mainloop);
 }
 
 int main(int argc, char** argv)
@@ -396,7 +398,7 @@ int main(int argc, char** argv)
     bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
     textdomain (GETTEXT_PACKAGE);
 
-    gtk_init (&argc, &argv);
+    gtk_init ();
 
     g_setenv ("G_MESSAGES_DEBUG", "all", TRUE);
 
@@ -408,7 +410,8 @@ int main(int argc, char** argv)
                                 calibrator->threshold_doubleclick,
                                 calibrator->threshold_misclick);
 
-    gtk_main ();
+               mainloop = g_main_loop_new (NULL, FALSE);
+               g_main_loop_run (mainloop);
 
     calib_area_free (calib_area);
 
diff --git a/panels/wacom/cc-drawing-area.c b/panels/wacom/cc-drawing-area.c
index 6c635977f..3f570ad66 100644
--- a/panels/wacom/cc-drawing-area.c
+++ b/panels/wacom/cc-drawing-area.c
@@ -24,13 +24,13 @@
 typedef struct _CcDrawingArea CcDrawingArea;
 
 struct _CcDrawingArea {
-       GtkEventBox parent;
-       GdkDevice *current_device;
+       GtkDrawingArea parent;
+       GtkGesture *stylus_gesture;
        cairo_surface_t *surface;
        cairo_t *cr;
 };
 
-G_DEFINE_TYPE (CcDrawingArea, cc_drawing_area, GTK_TYPE_EVENT_BOX)
+G_DEFINE_TYPE (CcDrawingArea, cc_drawing_area, GTK_TYPE_DRAWING_AREA)
 
 static void
 ensure_drawing_surface (CcDrawingArea *area,
@@ -61,18 +61,6 @@ ensure_drawing_surface (CcDrawingArea *area,
        }
 }
 
-static void
-cc_drawing_area_size_allocate (GtkWidget     *widget,
-                              GtkAllocation *allocation)
-{
-       CcDrawingArea *area = CC_DRAWING_AREA (widget);
-
-       ensure_drawing_surface (area, allocation->width, allocation->height);
-
-       GTK_WIDGET_CLASS (cc_drawing_area_parent_class)->size_allocate (widget,
-                                                                       allocation);
-}
-
 static void
 cc_drawing_area_map (GtkWidget *widget)
 {
@@ -103,16 +91,17 @@ cc_drawing_area_unmap (GtkWidget *widget)
        GTK_WIDGET_CLASS (cc_drawing_area_parent_class)->unmap (widget);
 }
 
-static gboolean
-cc_drawing_area_draw (GtkWidget *widget,
-                     cairo_t   *cr)
+static void
+draw_cb (GtkDrawingArea *drawing_area,
+         cairo_t   *cr,
+         gint       width,
+         gint       height,
+         gpointer   user_data)
 {
-       CcDrawingArea *area = CC_DRAWING_AREA (widget);
-       GtkAllocation allocation;
+       CcDrawingArea *area = CC_DRAWING_AREA (drawing_area);
 
-       GTK_WIDGET_CLASS (cc_drawing_area_parent_class)->draw (widget, cr);
+       ensure_drawing_surface (area, width, height);
 
-       gtk_widget_get_allocation (widget, &allocation);
        cairo_set_source_rgb (cr, 1, 1, 1);
        cairo_paint (cr);
 
@@ -120,69 +109,48 @@ cc_drawing_area_draw (GtkWidget *widget,
        cairo_paint (cr);
 
        cairo_set_source_rgb (cr, 0.6, 0.6, 0.6);
-       cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
+       cairo_rectangle (cr, 0, 0, width, height);
        cairo_stroke (cr);
+}
 
-       return FALSE;
+static void
+stylus_down_cb (GtkGestureStylus *gesture,
+               double            x,
+               double            y,
+               CcDrawingArea    *area)
+{
+       cairo_new_path (area->cr);
 }
 
-static gboolean
-cc_drawing_area_event (GtkWidget *widget,
-                      GdkEvent  *event)
+static void
+stylus_motion_cb (GtkGestureStylus *gesture,
+                 double            x,
+                 double            y,
+                 CcDrawingArea    *area)
 {
-       CcDrawingArea *area = CC_DRAWING_AREA (widget);
-       GdkInputSource source;
        GdkDeviceTool *tool;
-       GdkDevice *device;
-
-       device = gdk_event_get_source_device (event);
-
-       if (!device)
-               return GDK_EVENT_PROPAGATE;
-
-       source = gdk_device_get_source (device);
-       tool = gdk_event_get_device_tool (event);
-
-       if (source != GDK_SOURCE_PEN && source != GDK_SOURCE_ERASER)
-               return GDK_EVENT_PROPAGATE;
-
-       if (area->current_device && area->current_device != device)
-               return GDK_EVENT_PROPAGATE;
-
-       if (event->type == GDK_BUTTON_PRESS &&
-           event->button.button == 1 && !area->current_device) {
-               area->current_device = device;
-       } else if (event->type == GDK_BUTTON_RELEASE &&
-                  event->button.button == 1 && area->current_device) {
-               cairo_new_path (area->cr);
-               area->current_device = NULL;
-       } else if (event->type == GDK_MOTION_NOTIFY &&
-                  event->motion.state & GDK_BUTTON1_MASK) {
-               gdouble x, y, pressure;
-
-               gdk_event_get_coords (event, &x, &y);
-               gdk_event_get_axis (event, GDK_AXIS_PRESSURE, &pressure);
-
-               if (gdk_device_tool_get_tool_type (tool) == GDK_DEVICE_TOOL_TYPE_ERASER) {
-                       cairo_set_line_width (area->cr, 10 * pressure);
-                       cairo_set_operator (area->cr, CAIRO_OPERATOR_DEST_OUT);
-               } else {
-                       cairo_set_line_width (area->cr, 4 * pressure);
-                       cairo_set_operator (area->cr, CAIRO_OPERATOR_SATURATE);
-               }
-
-               cairo_set_source_rgba (area->cr, 0, 0, 0, pressure);
-               cairo_line_to (area->cr, x, y);
-               cairo_stroke (area->cr);
-
-               cairo_move_to (area->cr, x, y);
+       gdouble pressure;
+
+       tool = gtk_gesture_stylus_get_device_tool (gesture);
+       gtk_gesture_stylus_get_axis (gesture,
+                                    GDK_AXIS_PRESSURE,
+                                    &pressure);
+
+       if (gdk_device_tool_get_tool_type (tool) == GDK_DEVICE_TOOL_TYPE_ERASER) {
+               cairo_set_line_width (area->cr, 10 * pressure);
+               cairo_set_operator (area->cr, CAIRO_OPERATOR_DEST_OUT);
+       } else {
+               cairo_set_line_width (area->cr, 4 * pressure);
+               cairo_set_operator (area->cr, CAIRO_OPERATOR_SATURATE);
+       }
 
-               gtk_widget_queue_draw (widget);
+       cairo_set_source_rgba (area->cr, 0, 0, 0, pressure);
+       cairo_line_to (area->cr, x, y);
+       cairo_stroke (area->cr);
 
-               return GDK_EVENT_STOP;
-       }
+       cairo_move_to (area->cr, x, y);
 
-       return GDK_EVENT_PROPAGATE;
+       gtk_widget_queue_draw (GTK_WIDGET (area));
 }
 
 static void
@@ -190,9 +158,6 @@ cc_drawing_area_class_init (CcDrawingAreaClass *klass)
 {
        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-       widget_class->size_allocate = cc_drawing_area_size_allocate;
-       widget_class->draw = cc_drawing_area_draw;
-       widget_class->event = cc_drawing_area_event;
        widget_class->map = cc_drawing_area_map;
        widget_class->unmap = cc_drawing_area_unmap;
 }
@@ -200,11 +165,14 @@ cc_drawing_area_class_init (CcDrawingAreaClass *klass)
 static void
 cc_drawing_area_init (CcDrawingArea *area)
 {
-       gtk_event_box_set_above_child (GTK_EVENT_BOX (area), TRUE);
-       gtk_widget_add_events (GTK_WIDGET (area),
-                              GDK_BUTTON_PRESS_MASK |
-                              GDK_BUTTON_RELEASE_MASK |
-                              GDK_POINTER_MOTION_MASK);
+       gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (area), draw_cb, NULL, NULL);
+       area->stylus_gesture = gtk_gesture_stylus_new ();
+       g_signal_connect (area->stylus_gesture, "down",
+                         G_CALLBACK (stylus_down_cb), area);
+       g_signal_connect (area->stylus_gesture, "motion",
+                         G_CALLBACK (stylus_motion_cb), area);
+       gtk_widget_add_controller (GTK_WIDGET (area),
+                                  GTK_EVENT_CONTROLLER (area->stylus_gesture));
 }
 
 GtkWidget *
diff --git a/panels/wacom/cc-drawing-area.h b/panels/wacom/cc-drawing-area.h
index 9b22a4233..1d3d6baad 100644
--- a/panels/wacom/cc-drawing-area.h
+++ b/panels/wacom/cc-drawing-area.h
@@ -24,7 +24,7 @@
 G_BEGIN_DECLS
 
 #define CC_TYPE_DRAWING_AREA (cc_drawing_area_get_type ())
-G_DECLARE_FINAL_TYPE (CcDrawingArea, cc_drawing_area, CC, DRAWING_AREA, GtkEventBox)
+G_DECLARE_FINAL_TYPE (CcDrawingArea, cc_drawing_area, CC, DRAWING_AREA, GtkDrawingArea)
 
 GtkWidget *cc_drawing_area_new (void);
 
diff --git a/panels/wacom/cc-wacom-button-row.c b/panels/wacom/cc-wacom-button-row.c
index b3ae07eae..3c8536b81 100644
--- a/panels/wacom/cc-wacom-button-row.c
+++ b/panels/wacom/cc-wacom-button-row.c
@@ -272,7 +272,7 @@ cc_wacom_button_row_new (guint      button,
                            row,
                            G_CONNECT_SWAPPED);
 
-  gtk_container_add (GTK_CONTAINER (row), grid);
+  gtk_list_box_row_set_child (GTK_LIST_BOX_ROW (row), grid);
 
   cc_wacom_button_row_update (CC_WACOM_BUTTON_ROW (row));
 
diff --git a/panels/wacom/cc-wacom-device.c b/panels/wacom/cc-wacom-device.c
index 57893d241..28ee54f3e 100644
--- a/panels/wacom/cc-wacom-device.c
+++ b/panels/wacom/cc-wacom-device.c
@@ -339,7 +339,7 @@ cc_wacom_device_get_output (CcWacomDevice *device,
        GnomeRRCrtc *crtc;
 
         g_return_val_if_fail (CC_IS_WACOM_DEVICE (device), NULL);
-        g_return_val_if_fail (GNOME_IS_RR_SCREEN (rr_screen), NULL);
+        g_return_val_if_fail (GNOME_RR_IS_SCREEN (rr_screen), NULL);
 
        rr_output = find_output (rr_screen, device);
        if (rr_output == NULL) {
diff --git a/panels/wacom/cc-wacom-device.h b/panels/wacom/cc-wacom-device.h
index fae504a36..3e2c2ee61 100644
--- a/panels/wacom/cc-wacom-device.h
+++ b/panels/wacom/cc-wacom-device.h
@@ -27,7 +27,7 @@
 #include "gsd-device-manager.h"
 
 #define GNOME_DESKTOP_USE_UNSTABLE_API
-#include <libgnome-desktop/gnome-rr.h>
+#include <gnome-rr/gnome-rr.h>
 
 #define CC_TYPE_WACOM_DEVICE (cc_wacom_device_get_type ())
 G_DECLARE_FINAL_TYPE (CcWacomDevice, cc_wacom_device, CC, WACOM_DEVICE, GObject)
diff --git a/panels/wacom/cc-wacom-mapping-panel.c b/panels/wacom/cc-wacom-mapping-panel.c
index 2b8b012a8..eda914cfc 100644
--- a/panels/wacom/cc-wacom-mapping-panel.c
+++ b/panels/wacom/cc-wacom-mapping-panel.c
@@ -23,8 +23,8 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 #define GNOME_DESKTOP_USE_UNSTABLE_API
-#include <libgnome-desktop/gnome-rr.h>
-#include <libgnome-desktop/gnome-rr-config.h>
+#include <gnome-rr/gnome-rr.h>
+#include <gnome-rr/gnome-rr-config.h>
 
 #include <string.h>
 
@@ -96,7 +96,7 @@ update_monitor_chooser (CcWacomMappingPanel *self)
                                                 self->rr_screen);
 
        g_signal_handlers_block_by_func (G_OBJECT (self->checkbutton), checkbutton_toggled_cb, self);
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(self->checkbutton), cur_output != NULL);
+       gtk_check_button_set_active (GTK_CHECK_BUTTON(self->checkbutton), cur_output != NULL);
        g_signal_handlers_unblock_by_func (G_OBJECT (self->checkbutton), checkbutton_toggled_cb, self);
 
        g_signal_handlers_block_by_func (G_OBJECT (self->aspectswitch), aspectswitch_toggled_cb, self);
@@ -143,7 +143,7 @@ update_ui (CcWacomMappingPanel *self)
 {
        if (self->device == NULL) {
                gtk_widget_set_sensitive (GTK_WIDGET(self->checkbutton), FALSE);
-               gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON(self->checkbutton), TRUE);
+               gtk_check_button_set_inconsistent (GTK_CHECK_BUTTON(self->checkbutton), TRUE);
        } else {
                gboolean is_screen_tablet;
 
@@ -152,7 +152,7 @@ update_ui (CcWacomMappingPanel *self)
                        WACOM_DEVICE_INTEGRATED_DISPLAY;
 
                gtk_widget_set_sensitive (GTK_WIDGET(self->checkbutton), !is_screen_tablet);
-               gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON(self->checkbutton), FALSE);
+               gtk_check_button_set_inconsistent (GTK_CHECK_BUTTON(self->checkbutton), FALSE);
        }
 
        update_monitor_chooser (self);
@@ -163,7 +163,7 @@ update_mapping (CcWacomMappingPanel *self)
 {
        GnomeRROutput *output = NULL;
 
-       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->checkbutton))) {
+       if (gtk_check_button_get_active (GTK_CHECK_BUTTON (self->checkbutton))) {
                GtkTreeIter iter;
                GtkTreeModel *model;
                char *name;
@@ -193,7 +193,7 @@ checkbutton_toggled_cb (CcWacomMappingPanel *self)
 {
        gboolean active;
 
-       active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->checkbutton));
+       active = gtk_check_button_get_active (GTK_CHECK_BUTTON (self->checkbutton));
        set_combobox_sensitive (self, active);
        if (!active)
                gtk_switch_set_active (GTK_SWITCH(self->aspectswitch), FALSE);
@@ -224,7 +224,7 @@ cc_wacom_mapping_panel_init (CcWacomMappingPanel *self)
        GtkCellRenderer *renderer;
        g_autoptr(GError) error = NULL;
 
-       self->rr_screen = gnome_rr_screen_new (gdk_screen_get_default (), &error);
+       self->rr_screen = gnome_rr_screen_new (gdk_display_get_default (), &error);
 
        if (error)
                g_warning ("Could not get RR screen: %s", error->message);
@@ -233,8 +233,11 @@ cc_wacom_mapping_panel_init (CcWacomMappingPanel *self)
                                 G_CALLBACK (update_monitor_chooser), self, G_CONNECT_SWAPPED);
 
        vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8);
-       gtk_container_add (GTK_CONTAINER (self), vbox);
-       gtk_container_set_border_width (GTK_CONTAINER (self), 12);
+       gtk_box_append (GTK_BOX (self), vbox);
+       gtk_widget_set_margin_top (GTK_WIDGET (self), 12);
+       gtk_widget_set_margin_bottom (GTK_WIDGET (self), 12);
+       gtk_widget_set_margin_start (GTK_WIDGET (self), 12);
+       gtk_widget_set_margin_end (GTK_WIDGET (self), 12);
        gtk_widget_set_vexpand (GTK_WIDGET (vbox), TRUE);
        gtk_widget_set_hexpand (GTK_WIDGET (vbox), TRUE);
 
@@ -266,18 +269,15 @@ cc_wacom_mapping_panel_init (CcWacomMappingPanel *self)
 
        /* Whole-desktop checkbox */
        self->checkbutton = gtk_check_button_new_with_label (_("Map to single monitor"));
-       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->checkbutton), FALSE);
+       gtk_check_button_set_active (GTK_CHECK_BUTTON (self->checkbutton), FALSE);
        g_signal_connect_object (self->checkbutton, "toggled",
                                  G_CALLBACK (checkbutton_toggled_cb), self, G_CONNECT_SWAPPED);
 
-       gtk_box_pack_start (GTK_BOX(vbox), GTK_WIDGET(self->checkbutton),
-                               FALSE, FALSE, 0);
-       gtk_box_pack_start (GTK_BOX(vbox), GTK_WIDGET(grid),
-                               FALSE, FALSE, 8);
+       gtk_box_append (GTK_BOX(vbox), GTK_WIDGET(self->checkbutton));
+       gtk_box_append (GTK_BOX(vbox), GTK_WIDGET(grid));
 
        /* Update display */
        cc_wacom_mapping_panel_set_device (self, NULL);
-       gtk_widget_show_all(GTK_WIDGET(self));
 }
 
 GtkWidget *
diff --git a/panels/wacom/cc-wacom-nav-button.c b/panels/wacom/cc-wacom-nav-button.c
index 3239f5f1e..881a79938 100644
--- a/panels/wacom/cc-wacom-nav-button.c
+++ b/panels/wacom/cc-wacom-nav-button.c
@@ -173,44 +173,33 @@ cc_wacom_nav_button_class_init (CcWacomNavButtonClass *klass)
 static void
 cc_wacom_nav_button_init (CcWacomNavButton *self)
 {
-       GtkStyleContext *context;
-       GtkWidget *image, *box;
+       GtkWidget *box;
+
+       gtk_box_set_spacing (GTK_BOX (self), 12);
 
        /* Label */
        self->label = gtk_label_new (NULL);
-       gtk_style_context_add_class (gtk_widget_get_style_context (self->label), "dim-label");
-       gtk_box_pack_start (GTK_BOX (self), self->label,
-                           FALSE, FALSE, 8);
+       gtk_widget_add_css_class (self->label, "dim-label");
+       gtk_box_append (GTK_BOX (self), self->label);
 
        box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-       context = gtk_widget_get_style_context (GTK_WIDGET (box));
-       gtk_style_context_add_class (context, GTK_STYLE_CLASS_LINKED);
-       gtk_box_pack_start (GTK_BOX (self), box,
-                           FALSE, FALSE, 0);
+       gtk_widget_add_css_class (box, "linked");
+       gtk_box_append (GTK_BOX (self), box);
 
        /* Prev button */
-       self->prev = gtk_button_new ();
-       image = gtk_image_new_from_icon_name ("go-previous-symbolic", GTK_ICON_SIZE_MENU);
-       gtk_container_add (GTK_CONTAINER (self->prev), image);
+       self->prev = gtk_button_new_from_icon_name ("go-previous-symbolic");
        g_signal_connect_object (G_OBJECT (self->prev), "clicked",
                                  G_CALLBACK (prev_clicked), self, G_CONNECT_SWAPPED);
        gtk_widget_set_valign (self->prev, GTK_ALIGN_CENTER);
 
        /* Next button */
-       self->next = gtk_button_new ();
-       image = gtk_image_new_from_icon_name ("go-next-symbolic", GTK_ICON_SIZE_MENU);
-       gtk_container_add (GTK_CONTAINER (self->next), image);
+       self->next = gtk_button_new_from_icon_name ("go-next-symbolic");
        g_signal_connect_object (G_OBJECT (self->next), "clicked",
                                  G_CALLBACK (next_clicked), self, G_CONNECT_SWAPPED);
        gtk_widget_set_valign (self->next, GTK_ALIGN_CENTER);
 
-       gtk_box_pack_start (GTK_BOX (box), self->prev,
-                           FALSE, FALSE, 0);
-       gtk_box_pack_start (GTK_BOX (box), self->next,
-                           FALSE, FALSE, 0);
-
-       gtk_widget_show (self->label);
-       gtk_widget_show_all (box);
+       gtk_box_append (GTK_BOX (box), self->prev);
+       gtk_box_append (GTK_BOX (box), self->next);
 }
 
 GtkWidget *
diff --git a/panels/wacom/cc-wacom-page.c b/panels/wacom/cc-wacom-page.c
index b85bce75e..86b098f10 100644
--- a/panels/wacom/cc-wacom-page.c
+++ b/panels/wacom/cc-wacom-page.c
@@ -29,10 +29,10 @@
 #include <gtk/gtk.h>
 #include <gdesktop-enums.h>
 #ifdef GDK_WINDOWING_X11
-#include <gdk/gdkx.h>
+#include <gdk/x11/gdkx.h>
 #endif
 #ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/gdkwayland.h>
+#include <gdk/wayland/gdkwayland.h>
 #endif
 
 #include "cc-wacom-device.h"
@@ -48,7 +48,6 @@
 #include <string.h>
 
 #define WID(x) (GtkWidget *) gtk_builder_get_object (page->builder, x)
-#define CWID(x) (GtkContainer *) gtk_builder_get_object (page->builder, x)
 #define MWID(x) (GtkWidget *) gtk_builder_get_object (page->mapping_builder, x)
 
 #define THRESHOLD_MISCLICK     15
@@ -79,12 +78,12 @@ struct _CcWacomPage
 
        /* Button mapping */
        GtkBuilder     *mapping_builder;
-       GtkWidget      *button_map;
+       GtkWindow      *button_map;
        GtkListStore   *action_store;
 
        /* Display mapping */
        GtkWidget      *mapping;
-       GtkWidget      *dialog;
+       GtkWindow      *dialog;
 
        GCancellable   *cancellable;
 
@@ -225,7 +224,7 @@ cc_wacom_page_get_gdk_device (CcWacomPage *page)
 
        display = gtk_widget_get_display (GTK_WIDGET (page));
        seat = gdk_display_get_default_seat (display);
-       slaves = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_TABLET_STYLUS);
+       slaves = gdk_seat_get_devices (seat, GDK_SEAT_CAPABILITY_TABLET_STYLUS);
 
        for (l = slaves; l && !gdk_device; l = l->next) {
                g_autofree gchar *device_node = NULL;
@@ -256,12 +255,15 @@ run_calibration (CcWacomPage *page,
                 GdkMonitor  *monitor)
 {
        GdkDisplay *display = gdk_monitor_get_display (monitor);
-       gint i, n_monitor = 0;
+  GListModel *monitors;
+       guint i, n_monitor = 0;
 
        g_assert (page->area == NULL);
 
-       for (i = 0; i < gdk_display_get_n_monitors (display); i++) {
-               if (monitor == gdk_display_get_monitor (display, i)) {
+  monitors = gdk_display_get_monitors (display);
+       for (i = 0; i < g_list_model_get_n_items (monitors); i++) {
+    g_autoptr(GdkMonitor) m = g_list_model_get_item (monitors, i);
+               if (monitor == m) {
                        n_monitor = i;
                        break;
                }
@@ -291,15 +293,16 @@ calibrate (CcWacomPage *page)
        g_autofree GVariant **tmp = NULL;
        g_autofree gdouble *calibration = NULL;
        gsize ncal;
-       GdkMonitor *monitor;
-       GdkScreen *screen;
+       g_autoptr(GdkMonitor) monitor = NULL;
+  GListModel *monitors;
+       GdkDisplay *display;
        g_autoptr(GnomeRRScreen) rr_screen = NULL;
        GnomeRROutput *output;
        g_autoptr(GError) error = NULL;
        gint x, y;
 
-       screen = gdk_screen_get_default ();
-       rr_screen = gnome_rr_screen_new (screen, &error);
+       display = gdk_display_get_default ();
+       rr_screen = gnome_rr_screen_new (display, &error);
        if (error) {
                g_warning ("Could not connect to display manager: %s", error->message);
                return;
@@ -307,7 +310,19 @@ calibrate (CcWacomPage *page)
 
        output = cc_wacom_device_get_output (page->stylus, rr_screen);
        gnome_rr_output_get_position (output, &x, &y);
-       monitor = gdk_display_get_monitor_at_point (gdk_screen_get_display (screen), x, y);
+
+  monitors = gdk_display_get_monitors (display);
+  for (i = 0; i < g_list_model_get_n_items (monitors); i++) {
+    g_autoptr(GdkMonitor) m = g_list_model_get_item (monitors, i);
+    GdkRectangle geometry;
+
+    gdk_monitor_get_geometry (m, &geometry);
+    if (gdk_rectangle_contains_point (&geometry, x, y))
+      {
+        monitor = g_steal_pointer (&m);
+        break;
+      }
+  }
 
        if (!monitor) {
                /* The display the tablet should be mapped to could not be located.
@@ -364,11 +379,8 @@ create_row_from_button (GtkWidget *list_box,
                        guint      button,
                        GSettings *settings)
 {
-       GtkWidget *row;
-
-       row = cc_wacom_button_row_new (button, settings);
-       gtk_container_add (GTK_CONTAINER (list_box), row);
-       gtk_widget_show (row);
+       gtk_list_box_append (GTK_LIST_BOX (list_box),
+                       cc_wacom_button_row_new (button, settings));
 }
 
 static void
@@ -400,7 +412,7 @@ setup_button_mapping (CcWacomPage *page)
 static void
 button_mapping_dialog_closed (CcWacomPage *page)
 {
-       gtk_widget_destroy (MWID ("button-mapping-dialog"));
+       gtk_window_destroy (GTK_WINDOW (MWID ("button-mapping-dialog")));
        g_clear_object (&page->mapping_builder);
 }
 
@@ -426,7 +438,7 @@ show_button_mapping_dialog (CcWacomPage *page)
        setup_button_mapping (page);
 
        dialog = MWID ("button-mapping-dialog");
-       toplevel = gtk_widget_get_toplevel (GTK_WIDGET (page));
+       toplevel = GTK_WIDGET (gtk_widget_get_native (GTK_WIDGET (page)));
        gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
        gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
        g_signal_connect_object (dialog, "response",
@@ -434,7 +446,7 @@ show_button_mapping_dialog (CcWacomPage *page)
 
        gtk_widget_show (dialog);
 
-       page->button_map = dialog;
+       page->button_map = GTK_WINDOW (dialog);
        g_object_add_weak_pointer (G_OBJECT (dialog), (gpointer *) &page->button_map);
 }
 
@@ -501,7 +513,7 @@ display_mapping_dialog_closed (CcWacomPage *page)
 {
        int layout;
 
-       gtk_widget_destroy (page->dialog);
+       gtk_window_destroy (page->dialog);
        page->dialog = NULL;
        page->mapping = NULL;
        layout = get_layout_type (page->stylus);
@@ -511,22 +523,24 @@ display_mapping_dialog_closed (CcWacomPage *page)
 static void
 display_mapping_button_clicked_cb (CcWacomPage *page)
 {
+  GtkWidget *dialog;
+
        g_assert (page->mapping == NULL);
 
-       page->dialog = gtk_dialog_new_with_buttons (_("Display Mapping"),
-                                                   GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (page))),
+       dialog = gtk_dialog_new_with_buttons (_("Display Mapping"),
+                                                   GTK_WINDOW (gtk_widget_get_native (GTK_WIDGET (page))),
                                                    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
                                                    _("_Close"),
                                                    GTK_RESPONSE_ACCEPT,
                                                    NULL);
+  page->dialog = GTK_WINDOW (dialog);
        page->mapping = cc_wacom_mapping_panel_new ();
        cc_wacom_mapping_panel_set_device (CC_WACOM_MAPPING_PANEL (page->mapping),
                                           page->stylus);
-       gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area (GTK_DIALOG (page->dialog))),
-                          page->mapping);
+  gtk_window_set_child (page->dialog, page->mapping);
        g_signal_connect_object (page->dialog, "response",
                                 G_CALLBACK (display_mapping_dialog_closed), page, G_CONNECT_SWAPPED);
-       gtk_widget_show_all (page->dialog);
+       gtk_window_present (page->dialog);
 
        g_object_add_weak_pointer (G_OBJECT (page->mapping), (gpointer *) &page->dialog);
 }
@@ -639,14 +653,14 @@ decouple_display_toggled_cb (CcWacomPage *page)
        if (!active) {
                cc_wacom_device_set_output (page->stylus, NULL);
        } else {
-               GdkScreen *screen;
+               GdkDisplay *display;
                GnomeRRScreen *rr_screen;
                GnomeRROutput **outputs, *picked = NULL;
                g_autoptr(GError) error = NULL;
                int i;
 
-               screen = gtk_widget_get_screen (GTK_WIDGET (WID ("switch-decouple-display")));
-               rr_screen = gnome_rr_screen_new (screen, &error);
+               display = gtk_widget_get_display (GTK_WIDGET (WID ("switch-decouple-display")));
+               rr_screen = gnome_rr_screen_new (display, &error);
                if (rr_screen == NULL) {
                        g_warning ("Could not connect to display manager: %s", error->message);
                        return;
@@ -707,8 +721,8 @@ cc_wacom_page_dispose (GObject *object)
        g_cancellable_cancel (self->cancellable);
        g_clear_object (&self->cancellable);
        g_clear_pointer (&self->area, calib_area_free);
-       g_clear_pointer (&self->button_map, gtk_widget_destroy);
-       g_clear_pointer (&self->dialog, gtk_widget_destroy);
+       g_clear_pointer (&self->button_map, gtk_window_destroy);
+       g_clear_pointer (&self->dialog, gtk_window_destroy);
        g_clear_object (&self->builder);
        g_clear_object (&self->header_group);
        g_list_free_full (self->pads, g_object_unref);
@@ -736,7 +750,7 @@ remove_link_padding (GtkWidget *widget)
 
        provider = gtk_css_provider_new ();
        gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider),
-                                        ".link { padding: 0px; }", -1, NULL);
+                                        ".link { padding: 0px; }", -1);
        gtk_style_context_add_provider (gtk_widget_get_style_context (widget),
                                        GTK_STYLE_PROVIDER (provider),
                                        GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
@@ -769,7 +783,7 @@ cc_wacom_page_init (CcWacomPage *page)
        }
 
        box = WID ("main-grid");
-       gtk_container_add (GTK_CONTAINER (page), box);
+       gtk_box_append (GTK_BOX (page), box);
        gtk_widget_set_vexpand (GTK_WIDGET (box), TRUE);
 
        g_signal_connect_object (WID ("button-calibrate"), "clicked",
@@ -804,7 +818,7 @@ cc_wacom_page_init (CcWacomPage *page)
         gtk_widget_set_halign (page->nav, GTK_ALIGN_END);
         gtk_widget_set_margin_start (page->nav, 10);
        gtk_widget_show (page->nav);
-       gtk_container_add (CWID ("navigation-placeholder"), page->nav);
+       gtk_revealer_set_child (GTK_REVEALER (WID ("navigation-placeholder")), page->nav);
 
        page->cancellable = g_cancellable_new ();
 }
@@ -817,34 +831,34 @@ set_icon_name (CcWacomPage *page,
        g_autofree gchar *resource = NULL;
 
        resource = g_strdup_printf ("/org/gnome/control-center/wacom/%s.svg", icon_name);
-       gtk_image_set_from_resource (GTK_IMAGE (WID (widget_name)), resource);
+       gtk_picture_set_resource (GTK_PICTURE (WID (widget_name)), resource);
 }
 
 static void
 remove_left_handed (CcWacomPage *page)
 {
-       gtk_widget_destroy (WID ("label-left-handed"));
-       gtk_widget_destroy (WID ("switch-left-handed"));
+  gtk_grid_remove (GTK_GRID (WID ("main-controls-grid")), WID ("label-left-handed"));
+  gtk_grid_remove (GTK_GRID (WID ("main-controls-grid")), WID ("switch-left-handed"));
 }
 
 static void
 remove_display_link (CcWacomPage *page)
 {
-       gtk_widget_destroy (WID ("display-link"));
+  gtk_grid_remove (GTK_GRID (WID ("main-controls-grid")), WID ("display-link"));
 }
 
 static void
 remove_mouse_link (CcWacomPage *page)
 {
-        gtk_widget_destroy (WID ("mouse-link"));
+  gtk_grid_remove (GTK_GRID (WID ("main-controls-grid")), WID ("mouse-link"));
 }
 
 static void
 remove_decouple_options (CcWacomPage *page)
 {
-       gtk_widget_destroy (WID ("label-decouple-display"));
-       gtk_widget_destroy (WID ("switch-decouple-display"));
-       gtk_widget_destroy (WID ("display-mapping-button-2"));
+  gtk_grid_remove (GTK_GRID (WID ("main-controls-grid")), WID ("label-decouple-display"));
+  gtk_grid_remove (GTK_GRID (WID ("main-controls-grid")), WID ("switch-decouple-display"));
+  gtk_grid_remove (GTK_GRID (WID ("main-controls-grid")), WID ("display-mapping-button-2"));
 }
 
 static gboolean
@@ -858,6 +872,17 @@ has_monitor (CcWacomPage *page)
                 (WACOM_DEVICE_INTEGRATED_DISPLAY | WACOM_DEVICE_INTEGRATED_SYSTEM)) != 0);
 }
 
+static void
+set_grid_row (CcWacomPage *page,
+              const gchar *grid_name,
+              const gchar *widget_name,
+              gint         row)
+{
+  GtkLayoutManager *layout_manager = gtk_widget_get_layout_manager (WID (grid_name));
+  GtkLayoutChild *layout_child = gtk_layout_manager_get_layout_child (layout_manager, WID (widget_name));
+  gtk_grid_layout_child_set_row (GTK_GRID_LAYOUT_CHILD (layout_child), row);
+}
+
 static void
 set_page_layout (CcWacomPage *page,
                 int          layout)
@@ -885,18 +910,14 @@ set_page_layout (CcWacomPage *page,
        case LAYOUT_SCREEN:
                remove_left_handed (page);
 
-               gtk_widget_destroy (WID ("display-mapping-button"));
+    gtk_box_remove (GTK_BOX (WID ("tablet-buttons-box")), WID ("display-mapping-button"));
 
                gtk_widget_show (WID ("button-calibrate"));
                gtk_widget_set_sensitive (WID ("button-calibrate"),
                                          has_monitor (page));
 
-               gtk_container_child_set (CWID ("main-controls-grid"),
-                                        WID ("label-trackingmode"),
-                                        "top_attach", 5, NULL);
-               gtk_container_child_set (CWID ("main-controls-grid"),
-                                        WID ("combo-tabletmode"),
-                                        "top_attach", 5, NULL);
+               set_grid_row (page, "main-controls-grid", "label-trackingmode", 5);
+    set_grid_row (page, "main-controls-grid", "combo-tabletmode", 5);
                break;
        default:
                g_assert_not_reached ();
diff --git a/panels/wacom/cc-wacom-panel.c b/panels/wacom/cc-wacom-panel.c
index 0c2b02f38..8d1660810 100644
--- a/panels/wacom/cc-wacom-panel.c
+++ b/panels/wacom/cc-wacom-panel.c
@@ -36,7 +36,7 @@
 #include "gsd-device-manager.h"
 
 #ifdef GDK_WINDOWING_WAYLAND
-#include <gdk/gdkwayland.h>
+#include <gdk/wayland/gdkwayland.h>
 #endif
 
 #define WID(x) (GtkWidget *) gtk_builder_get_object (self->builder, x)
@@ -60,6 +60,8 @@ struct _CcWacomPanel
 
        CcTabletToolMap  *tablet_tool_map;
 
+       GtkGesture       *stylus_gesture;
+
        /* DBus */
        GDBusProxy    *proxy;
 };
@@ -255,6 +257,14 @@ static void
 cc_wacom_panel_dispose (GObject *object)
 {
        CcWacomPanel *self = CC_WACOM_PANEL (object);
+       CcShell *shell;
+
+       shell = cc_panel_get_shell (CC_PANEL (self));
+       if (shell) {
+               gtk_widget_remove_controller (GTK_WIDGET (shell),
+                                             GTK_EVENT_CONTROLLER (self->stylus_gesture));
+       }
+
 
        g_clear_object (&self->builder);
 
@@ -289,9 +299,13 @@ check_remove_stylus_pages (CcWacomPanel *self)
         */
        g_hash_table_iter_init (&iter, self->stylus_pages);
        while (g_hash_table_iter_next (&iter, (gpointer*) &tool, (gpointer*) &page)) {
+               gint page_num;
+
                if (g_list_find (total, tool))
                        continue;
-               gtk_widget_destroy (page);
+
+               page_num = gtk_notebook_page_num (GTK_NOTEBOOK (self->stylus_notebook), page);
+               gtk_notebook_remove_page (GTK_NOTEBOOK (self->stylus_notebook), page_num);
                g_hash_table_iter_remove (&iter);
        }
 }
@@ -308,7 +322,6 @@ add_stylus (CcWacomPanel *self,
        page = cc_wacom_stylus_page_new (tool);
        cc_wacom_stylus_page_set_navigation (CC_WACOM_STYLUS_PAGE (page),
                                             GTK_NOTEBOOK (self->stylus_notebook));
-       gtk_widget_show (page);
        gtk_notebook_append_page (GTK_NOTEBOOK (self->stylus_notebook), page, NULL);
        g_hash_table_insert (self->stylus_pages, tool, page);
 
@@ -325,7 +338,7 @@ update_test_button (CcWacomPanel *self)
                return;
 
        if (g_hash_table_size (self->devices) == 0) {
-               gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->test_button), FALSE);
+               gtk_popover_popdown (GTK_POPOVER (self->test_popover));
                gtk_widget_set_sensitive (self->test_button, FALSE);
        } else {
                gtk_widget_set_sensitive (self->test_button, TRUE);
@@ -345,10 +358,8 @@ update_stylus_notebook (CcWacomPanel *panel,
                page = gtk_notebook_page_num (GTK_NOTEBOOK (panel->stylus_notebook), widget);
                gtk_notebook_set_current_page (GTK_NOTEBOOK (panel->stylus_notebook), page);
        } else {
-               gtk_container_child_set (GTK_CONTAINER (panel->stack),
-                                        panel->stylus_notebook,
-                                        "needs-attention", TRUE,
-                                        NULL);
+               GtkStackPage *page = gtk_stack_get_page (GTK_STACK (panel->stack), panel->stylus_notebook);
+               gtk_stack_page_set_needs_attention (page, TRUE);
        }
 }
 
@@ -421,17 +432,18 @@ update_current_tool (CcWacomPanel  *panel,
                                         wacom_device, stylus);
 }
 
-static gboolean
-on_shell_event_cb (CcWacomPanel *panel,
-                  GdkEvent     *event)
+static void
+on_stylus_proximity_cb (GtkGestureStylus *gesture,
+                       double            x,
+                       double            y,
+                       CcWacomPanel     *panel)
 {
-       if (event->type == GDK_MOTION_NOTIFY) {
-               update_current_tool (panel,
-                                    gdk_event_get_source_device (event),
-                                    gdk_event_get_device_tool (event));
-       }
+       GdkDevice *device;
+       GdkDeviceTool *tool;
 
-       return GDK_EVENT_PROPAGATE;
+       device = gtk_event_controller_get_current_event_device (GTK_EVENT_CONTROLLER (gesture));
+       tool = gtk_gesture_stylus_get_device_tool (gesture);
+       update_current_tool (panel, device, tool);
 }
 
 static gboolean
@@ -474,29 +486,27 @@ cc_wacom_panel_constructed (GObject *object)
        /* Add test area button to shell header. */
        shell = cc_panel_get_shell (CC_PANEL (self));
 
-       button = gtk_toggle_button_new_with_mnemonic (_("Test Your _Settings"));
-       gtk_style_context_add_class (gtk_widget_get_style_context (button),
-                                    "text-button");
+       button = gtk_menu_button_new ();
+       gtk_menu_button_set_use_underline (GTK_MENU_BUTTON (button), TRUE);
+       gtk_menu_button_set_label (GTK_MENU_BUTTON (button), _("Test Your _Settings"));
+       gtk_widget_add_css_class (button, "text-button");
        gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
-       gtk_widget_set_visible (button, TRUE);
 
        cc_shell_embed_widget_in_header (shell, button, GTK_POS_RIGHT);
 
-       self->test_popover = gtk_popover_new (button);
-       gtk_container_set_border_width (GTK_CONTAINER (self->test_popover), 6);
+       self->test_popover = gtk_popover_new ();
+       gtk_menu_button_set_popover (GTK_MENU_BUTTON (button), self->test_popover);
 
        self->test_draw_area = cc_drawing_area_new ();
        gtk_widget_set_size_request (self->test_draw_area, 400, 300);
-       gtk_container_add (GTK_CONTAINER (self->test_popover),
-                          self->test_draw_area);
+       gtk_popover_set_child (GTK_POPOVER (self->test_popover), self->test_draw_area);
        gtk_widget_show (self->test_draw_area);
 
-       g_object_bind_property (button, "active",
-                               self->test_popover, "visible",
-                               G_BINDING_BIDIRECTIONAL);
-
-       g_signal_connect_object (shell, "event",
-                                G_CALLBACK (on_shell_event_cb), self, G_CONNECT_SWAPPED);
+       self->stylus_gesture = gtk_gesture_stylus_new ();
+       g_signal_connect (self->stylus_gesture, "proximity",
+                         G_CALLBACK (on_stylus_proximity_cb), self);
+       gtk_widget_add_controller (GTK_WIDGET (shell),
+                                  GTK_EVENT_CONTROLLER (self->stylus_gesture));
 
        if (g_getenv ("UMOCKDEV_DIR") != NULL)
                self->mock_stylus_id = g_idle_add (show_mock_stylus_cb, self);
@@ -602,8 +612,9 @@ device_removed_cb (CcWacomPanel     *self,
 
        page = g_hash_table_lookup (self->pages, device);
        if (page) {
+    gint page_num = gtk_notebook_page_num (GTK_NOTEBOOK (self->tablet_notebook), page);
+    gtk_notebook_remove_page (GTK_NOTEBOOK (self->tablet_notebook), page_num);
                g_hash_table_remove (self->pages, device);
-               gtk_widget_destroy (page);
        }
 
        g_hash_table_remove (self->devices, gsd_device);
@@ -676,10 +687,8 @@ on_stack_visible_child_notify_cb (CcWacomPanel *panel)
        child = gtk_stack_get_visible_child (GTK_STACK (panel->stack));
 
        if (child == panel->stylus_notebook) {
-               gtk_container_child_set (GTK_CONTAINER (panel->stack),
-                                        panel->stylus_notebook,
-                                        "needs-attention", FALSE,
-                                        NULL);
+               GtkStackPage *page = gtk_stack_get_page (GTK_STACK (panel->stack), panel->stylus_notebook);
+               gtk_stack_page_set_needs_attention (page, FALSE);
        }
 }
 
@@ -741,22 +750,18 @@ cc_wacom_panel_init (CcWacomPanel *self)
        self->switcher = gtk_stack_switcher_new ();
        gtk_stack_switcher_set_stack (GTK_STACK_SWITCHER (self->switcher),
                                      GTK_STACK (self->stack));
-       gtk_widget_show (self->switcher);
 
-       gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (self->stack));
+       adw_bin_set_child (ADW_BIN (self), GTK_WIDGET (self->stack));
        gtk_widget_show (self->stack);
 
        self->tablet_notebook = gtk_notebook_new ();
-       gtk_widget_show (self->tablet_notebook);
        gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->tablet_notebook), FALSE);
        gtk_notebook_set_show_border (GTK_NOTEBOOK (self->tablet_notebook), FALSE);
        gtk_widget_set_vexpand (self->tablet_notebook, TRUE);
 
        self->stylus_notebook = gtk_notebook_new ();
-       gtk_widget_show (self->stylus_notebook);
        gtk_notebook_set_show_tabs (GTK_NOTEBOOK (self->stylus_notebook), FALSE);
        gtk_notebook_set_show_border (GTK_NOTEBOOK (self->stylus_notebook), FALSE);
-       gtk_container_set_border_width (GTK_CONTAINER (self->stylus_notebook), 0);
        gtk_widget_set_vexpand (self->stylus_notebook, TRUE);
 
        gtk_stack_add_titled (GTK_STACK (self->stack),
diff --git a/panels/wacom/cc-wacom-stylus-page.c b/panels/wacom/cc-wacom-stylus-page.c
index 2fc6c5adb..5d60357a8 100644
--- a/panels/wacom/cc-wacom-stylus-page.c
+++ b/panels/wacom/cc-wacom-stylus-page.c
@@ -30,7 +30,6 @@
 #include <string.h>
 
 #define WID(x) (GtkWidget *) gtk_builder_get_object (page->builder, x)
-#define CWID(x) (GtkContainer *) gtk_builder_get_object (page->builder, x)
 
 struct _CcWacomStylusPage
 {
@@ -290,7 +289,7 @@ cc_wacom_stylus_page_init (CcWacomStylusPage *page)
        }
 
        box = WID ("stylus-grid");
-       gtk_container_add (GTK_CONTAINER (page), box);
+       gtk_box_append (GTK_BOX (page), box);
        gtk_widget_set_vexpand (GTK_WIDGET (box), TRUE);
 
        add_marks (GTK_SCALE (WID ("scale-tip-feel")));
@@ -319,8 +318,7 @@ cc_wacom_stylus_page_init (CcWacomStylusPage *page)
        page->nav = cc_wacom_nav_button_new ();
         gtk_widget_set_halign (page->nav, GTK_ALIGN_END);
         gtk_widget_set_margin_start (page->nav, 10);
-       gtk_widget_show (page->nav);
-       gtk_container_add (CWID ("navigation-placeholder"), page->nav);
+       gtk_revealer_set_child (GTK_REVEALER (WID ("navigation-placeholder")), page->nav);
 }
 
 static void
@@ -331,7 +329,7 @@ set_icon_name (CcWacomStylusPage *page,
        g_autofree gchar *resource = NULL;
 
        resource = g_strdup_printf ("/org/gnome/control-center/wacom/%s.svg", icon_name);
-       gtk_image_set_from_resource (GTK_IMAGE (WID (widget_name)), resource);
+       gtk_picture_set_resource (GTK_PICTURE (WID (widget_name)), resource);
 }
 
 /* Different types of layout for the stylus config */
@@ -348,25 +346,36 @@ static void
 remove_buttons (CcWacomStylusPage *page, int n)
 {
        if (n < 3) {
-               gtk_widget_destroy (WID ("combo-thirdbutton"));
-               gtk_widget_destroy (WID ("label-third-button"));
+               gtk_grid_remove (GTK_GRID (WID ("stylus-controls-grid")), WID ("combo-thirdbutton"));
+               gtk_grid_remove (GTK_GRID (WID ("stylus-controls-grid")), WID ("label-third-button"));
        }
        if (n < 2) {
-               gtk_widget_destroy (WID ("combo-topbutton"));
-               gtk_widget_destroy (WID ("label-top-button"));
+               gtk_grid_remove (GTK_GRID (WID ("stylus-controls-grid")), WID ("combo-topbutton"));
+               gtk_grid_remove (GTK_GRID (WID ("stylus-controls-grid")), WID ("label-top-button"));
                gtk_label_set_text (GTK_LABEL (WID ("label-lower-button")), _("Button"));
        }
        if (n < 1) {
-               gtk_widget_destroy (WID ("combo-bottombutton"));
-               gtk_widget_destroy (WID ("label-lower-button"));
+               gtk_grid_remove (GTK_GRID (WID ("stylus-controls-grid")), WID ("combo-bottombutton"));
+               gtk_grid_remove (GTK_GRID (WID ("stylus-controls-grid")), WID ("label-lower-button"));
        }
 }
 
 static void
 remove_eraser (CcWacomStylusPage *page)
 {
-       gtk_widget_destroy (WID ("eraser-box"));
-       gtk_widget_destroy (WID ("label-eraser-feel"));
+       gtk_grid_remove (GTK_GRID (WID ("stylus-controls-grid")), WID ("eraser-box"));
+       gtk_grid_remove (GTK_GRID (WID ("stylus-controls-grid")), WID ("label-eraser-feel"));
+}
+
+static void
+set_grid_row (CcWacomStylusPage *page,
+             const gchar       *grid_name,
+             const gchar       *widget_name,
+             gint               row)
+{
+  GtkLayoutManager *layout_manager = gtk_widget_get_layout_manager (WID (grid_name));
+  GtkLayoutChild *layout_child = gtk_layout_manager_get_layout_child (layout_manager, WID (widget_name));
+  gtk_grid_layout_child_set_row (GTK_GRID_LAYOUT_CHILD (layout_child), row);
 }
 
 static void
@@ -380,27 +389,15 @@ update_stylus_ui (CcWacomStylusPage *page,
        case LAYOUT_INKING:
                remove_buttons (page, 0);
                remove_eraser (page);
-               gtk_container_child_set (CWID ("stylus-controls-grid"),
-                                        WID ("label-tip-feel"),
-                                        "top_attach", 0, NULL);
-               gtk_container_child_set (CWID ("stylus-controls-grid"),
-                                        WID ("box-tip-feel"),
-                                        "top_attach", 0, NULL);
+               set_grid_row (page, "stylus-controls-grid", "label-tip-feel", 0);
+               set_grid_row (page, "stylus-controls-grid", "box-tip-feel", 0);
                break;
        case LAYOUT_AIRBRUSH:
                remove_buttons (page, 1);
-               gtk_container_child_set (CWID ("stylus-controls-grid"),
-                                        WID ("label-lower-button"),
-                                        "top_attach", 1, NULL);
-               gtk_container_child_set (CWID ("stylus-controls-grid"),
-                                        WID ("combo-bottombutton"),
-                                        "top_attach", 1, NULL);
-               gtk_container_child_set (CWID ("stylus-controls-grid"),
-                                        WID ("label-tip-feel"),
-                                        "top_attach", 2, NULL);
-               gtk_container_child_set (CWID ("stylus-controls-grid"),
-                                        WID ("box-tip-feel"),
-                                        "top_attach", 2, NULL);
+               set_grid_row (page, "stylus-controls-grid", "label-lower-button", 1);
+               set_grid_row (page, "stylus-controls-grid", "combo-bottombutton", 1);
+               set_grid_row (page, "stylus-controls-grid", "label-tip-feel", 2);
+               set_grid_row (page, "stylus-controls-grid", "box-tip-feel", 2);
                break;
        case LAYOUT_GENERIC_2_BUTTONS_NO_ERASER:
                remove_buttons (page, 2);
diff --git a/panels/wacom/gnome-wacom-properties.ui b/panels/wacom/gnome-wacom-properties.ui
index 8679bd26e..2527adb07 100644
--- a/panels/wacom/gnome-wacom-properties.ui
+++ b/panels/wacom/gnome-wacom-properties.ui
@@ -21,87 +21,57 @@
     </data>
   </object>
   <object class="GtkDialog" id="wacom_properties_dialog">
-    <property name="can_focus">False</property>
     <property name="vexpand">True</property>
-    <property name="border_width">5</property>
     <property name="title" translatable="yes">Tablet Preferences</property>
     <property name="resizable">False</property>
     <property name="default_width">675</property>
     <property name="default_height">460</property>
     <property name="icon_name">input-tablet</property>
-    <property name="type_hint">dialog</property>
-    <child internal-child="vbox">
+    <child>
       <object class="GtkBox" id="dialog-vbox1">
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <property name="spacing">2</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="dialog-action_area1">
-            <property name="can_focus">False</property>
-            <property name="layout_style">end</property>
+        <child>
+          <object class="GtkBox" id="dialog-action_area1">
             <child>
               <object class="GtkButton" id="helpbutton1">
                 <property name="label" translatable="yes">_Help</property>
                 <property name="use_action_appearance">False</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
                 <property name="can_default">True</property>
                 <property name="receives_default">False</property>
                 <property name="use_underline">True</property>
               </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">0</property>
-              </packing>
             </child>
             <child>
               <object class="GtkButton" id="closebutton1">
                 <property name="label" translatable="yes">_Close</property>
-                <property name="use_action_appearance">False</property>
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="can_default">True</property>
-                <property name="receives_default">False</property>
                 <property name="use_underline">True</property>
               </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="position">1</property>
-              </packing>
             </child>
           </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
         </child>
         <child>
           <object class="GtkNotebook" id="main-notebook">
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
+            <property name="hexpand">True</property>
             <property name="vexpand">True</property>
             <property name="show_tabs">False</property>
             <property name="show_border">False</property>
             <child>
               <object class="GtkGrid" id="main-box">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <child>
                   <object class="GtkBox">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="hexpand">True</property>
                     <property name="vexpand">True</property>
                     <property name="orientation">vertical</property>
+                    <layout>
+                      <property name="column">0</property>
+                      <property name="row">0</property>
+                      <property name="column-span">3</property>
+                      <property name="row-span">3</property>
+                    </layout>
                     <child>
                       <object class="GtkImage">
-                        <property name="visible">True</property>
                         <property name="sensitive">False</property>
-                        <property name="can_focus">False</property>
                         <property name="valign">end</property>
                         <property name="vexpand">True</property>
                         <property name="pixel_size">96</property>
@@ -111,349 +81,238 @@
                           <class name="dim-label"/>
                         </style>
                       </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">0</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkLabel" id="advice-label1">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="vexpand">False</property>
                         <property name="label" translatable="yes">No tablet detected</property>
                         <property name="justify">center</property>
                         <property name="yalign">1</property>
                       </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">False</property>
-                        <property name="position">1</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkLabel" id="advice-label2">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="valign">start</property>
                         <property name="vexpand">True</property>
                         <property name="label" translatable="yes">Please plug in or turn on your Wacom 
tablet</property>
                         <property name="justify">center</property>
                         <property name="yalign">0</property>
                       </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">2</property>
-                      </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">0</property>
-                    <property name="width">3</property>
-                    <property name="height">3</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkLinkButton" id="linkbutton">
                     <property name="label" translatable="yes">Bluetooth Settings</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
                     <property name="halign">end</property>
                     <property name="valign">end</property>
                     <property name="vexpand">True</property>
-                    <property name="relief">none</property>
+                    <layout>
+                      <property name="column">2</property>
+                      <property name="row">2</property>
+                    </layout>
                   </object>
-                  <packing>
-                    <property name="left_attach">2</property>
-                    <property name="top_attach">2</property>
-                  </packing>
                 </child>
               </object>
             </child>
             <child type="tab">
               <object class="GtkLabel" id="label4">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="label">Plugin</property>
               </object>
-              <packing>
-                <property name="tab_fill">False</property>
-              </packing>
             </child>
             <child>
               <object class="GtkGrid" id="main-grid">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="row_spacing">10</property>
                 <property name="column_spacing">10</property>
                 <child>
                   <object class="GtkLabel" id="label-tabletmodel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="halign">start</property>
                     <property name="valign">center</property>
                     <property name="label" translatable="yes">Wacom Tablet</property>
+                    <layout>
+                      <property name="column">0</property>
+                      <property name="row">0</property>
+                      <property name="column-span">2</property>
+                    </layout>
                     <attributes>
                       <attribute name="weight" value="bold"/>
                     </attributes>
                   </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">0</property>
-                    <property name="width">2</property>
-                  </packing>
                 </child>
                 <child>
-                  <object class="GtkImage" id="image-tablet">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
+                  <object class="GtkPicture" id="image-tablet">
                     <property name="halign">center</property>
                     <property name="valign">start</property>
-                    <property name="pixbuf">wacom-tablet.svg</property>
+                    <property name="can-shrink">False</property>
+                    <property 
name="file">resource:///org/gnome/control-center/wacom/wacom-tablet.svg</property>
+                    <layout>
+                      <property name="column">0</property>
+                      <property name="row">1</property>
+                    </layout>
                   </object>
-                  <packing>
-                    <property name="left_attach">0</property>
-                    <property name="top_attach">1</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkGrid" id="main-controls-grid">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="margin_start">16</property>
                     <property name="orientation">vertical</property>
                     <property name="row_spacing">10</property>
                     <property name="column_spacing">10</property>
+                    <layout>
+                      <property name="column">1</property>
+                      <property name="row">1</property>
+                    </layout>
                     <child>
                       <object class="GtkLabel" id="label-trackingmode">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="halign">end</property>
                         <property name="valign">center</property>
                         <property name="label" translatable="yes">Tracking Mode</property>
+                        <layout>
+                          <property name="column">0</property>
+                          <property name="row">0</property>
+                        </layout>
                         <style>
                           <class name="dim-label"/>
                         </style>
                       </object>
-                      <packing>
-                        <property name="left_attach">0</property>
-                        <property name="top_attach">0</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkComboBox" id="combo-tabletmode">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="hexpand">True</property>
                         <property name="model">liststore-tabletmode</property>
+                        <layout>
+                          <property name="column">1</property>
+                          <property name="row">0</property>
+                        </layout>
                       </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">0</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkLabel" id="label-left-handed">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="halign">end</property>
                         <property name="valign">center</property>
                         <property name="label" translatable="yes">Left-Handed Orientation</property>
+                        <layout>
+                          <property name="column">0</property>
+                          <property name="row">1</property>
+                        </layout>
                         <style>
                           <class name="dim-label"/>
                         </style>
                       </object>
-                      <packing>
-                        <property name="left_attach">0</property>
-                        <property name="top_attach">1</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkSwitch" id="switch-left-handed">
-                        <property name="use_action_appearance">False</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
                         <property name="halign">start</property>
                         <property name="valign">center</property>
+                        <layout>
+                          <property name="column">1</property>
+                          <property name="row">1</property>
+                        </layout>
                       </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">1</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkBox" id="tablet-buttons-box">
-                        <property name="visible">True</property>
                         <property name="halign">start</property>
                         <property name="spacing">10</property>
+                        <layout>
+                          <property name="column">1</property>
+                          <property name="row">2</property>
+                        </layout>
                         <child>
                           <object class="GtkButton" id="display-mapping-button">
                             <property name="label" translatable="yes">Map to Monitor…</property>
-                            <property name="use_action_appearance">False</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
                           </object>
-                          <packing>
-                            <property name="pack_type">end</property>
-                            <property name="position">0</property>
-                          </packing>
                         </child>
                         <child>
                           <object class="GtkButton" id="map-buttons-button">
                             <property name="label" translatable="yes">Map Buttons…</property>
-                            <property name="use_action_appearance">False</property>
                             <property name="visible">False</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
                           </object>
-                          <packing>
-                            <property name="pack_type">end</property>
-                            <property name="position">1</property>
-                          </packing>
                         </child>
                         <child>
                           <object class="GtkButton" id="button-calibrate">
                             <property name="label" translatable="yes">Calibrate…</property>
-                            <property name="use_action_appearance">False</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
                           </object>
-                          <packing>
-                            <property name="pack_type">end</property>
-                            <property name="position">2</property>
-                          </packing>
                         </child>
                       </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">2</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkLinkButton" id="mouse-link">
                         <property name="label" translatable="yes">Adjust mouse settings</property>
-                        <property name="use_action_appearance">False</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
                         <property name="halign">start</property>
                         <property name="valign">start</property>
-                        <property name="relief">none</property>
+                        <layout>
+                          <property name="column">1</property>
+                          <property name="row">3</property>
+                        </layout>
                       </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">3</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkLinkButton" id="display-link">
                         <property name="label" translatable="yes">Adjust display resolution</property>
-                        <property name="use_action_appearance">False</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
                         <property name="halign">start</property>
                         <property name="valign">start</property>
-                        <property name="relief">none</property>
+                        <layout>
+                          <property name="column">1</property>
+                          <property name="row">3</property>
+                        </layout>
                       </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">3</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkLabel" id="label-decouple-display">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
                         <property name="halign">end</property>
                         <property name="valign">center</property>
                         <property name="label" translatable="yes">Decouple Display</property>
+                        <layout>
+                          <property name="column">0</property>
+                          <property name="row">4</property>
+                        </layout>
                         <style>
                           <class name="dim-label"/>
                         </style>
                       </object>
-                      <packing>
-                        <property name="left_attach">0</property>
-                        <property name="top_attach">4</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkSwitch" id="switch-decouple-display">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
                         <property name="halign">start</property>
                         <property name="valign">center</property>
                         <property name="active">True</property>
+                        <layout>
+                          <property name="column">1</property>
+                          <property name="row">4</property>
+                        </layout>
                       </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">4</property>
-                      </packing>
                     </child>
                     <child>
                       <object class="GtkButton" id="display-mapping-button-2">
                         <property name="label" translatable="yes">Map to Monitor…</property>
-                        <property name="use_action_appearance">False</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
                         <property name="halign">start</property>
+                        <layout>
+                          <property name="column">1</property>
+                          <property name="row">6</property>
+                        </layout>
                       </object>
-                      <packing>
-                        <property name="left_attach">1</property>
-                        <property name="top_attach">6</property>
-                      </packing>
                     </child>
                   </object>
-                  <packing>
-                    <property name="left_attach">1</property>
-                    <property name="top_attach">1</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkRevealer" id="navigation-placeholder">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="halign">end</property>
                     <property name="transition_type">crossfade</property>
                     <property name="transition_duration">100</property>
-                    <child>
-                      <placeholder/>
-                    </child>
+                    <layout>
+                      <property name="column">1</property>
+                      <property name="row">0</property>
+                    </layout>
                   </object>
-                  <packing>
-                    <property name="left_attach">1</property>
-                    <property name="top_attach">0</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="position">1</property>
-              </packing>
             </child>
             <child type="tab">
               <object class="GtkLabel" id="label1">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="label">Wacom</property>
               </object>
-              <packing>
-                <property name="position">1</property>
-                <property name="tab_fill">False</property>
-              </packing>
             </child>
           </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
         </child>
       </object>
     </child>
diff --git a/panels/wacom/gsd-wacom-key-shortcut-button.c b/panels/wacom/gsd-wacom-key-shortcut-button.c
index fcc531372..aa15b0f84 100644
--- a/panels/wacom/gsd-wacom-key-shortcut-button.c
+++ b/panels/wacom/gsd-wacom-key-shortcut-button.c
@@ -60,8 +60,6 @@ struct _GsdWacomKeyShortcutButton
 
   gboolean editing_mode;
 
-  GdkSeat *grab_seat;
-
   guint keyval;
   guint keycode;
   GdkModifierType mods;
@@ -168,40 +166,15 @@ static void
 gsd_wacom_key_shortcut_set_editing_mode (GsdWacomKeyShortcutButton *self,
                                          GdkEvent                  *event)
 {
-  GdkWindow *window;
-  GdkSeat *seat;
-
   self->editing_mode = TRUE;
   gsd_wacom_key_shortcut_button_changed (self);
-
-  window = gtk_widget_get_window (GTK_WIDGET (self));
-
-  g_return_if_fail (window != NULL);
-
-  seat = gdk_event_get_seat (event);
-
-  if (gdk_seat_grab (seat, window, GDK_SEAT_CAPABILITY_ALL,
-                    FALSE, NULL, event, NULL, NULL) != GDK_GRAB_SUCCESS)
-    return;
-
   gtk_widget_grab_focus (GTK_WIDGET (self));
-
-  self->grab_seat = seat;
 }
 
 static void
 gsd_wacom_key_shortcut_remove_editing_mode (GsdWacomKeyShortcutButton *self)
 {
   self->editing_mode = FALSE;
-
-  self->editing_mode = FALSE;
-
-  if (self->grab_seat)
-    {
-      gdk_seat_ungrab (self->grab_seat);
-      self->grab_seat = NULL;
-    }
-
   self->tmp_shortcut_keyval = 0;
   self->tmp_shortcut_mods = 0;
   self->tmp_shortcut_time = 0;
@@ -241,22 +214,10 @@ gsd_wacom_key_shortcut_button_activate (GtkButton *self)
   GTK_BUTTON_CLASS (gsd_wacom_key_shortcut_button_parent_class)->activate (self);
 }
 
-static void
-gsd_wacom_key_shortcut_button_init (GsdWacomKeyShortcutButton *self)
-{
-  gtk_button_set_relief (GTK_BUTTON (self), GTK_RELIEF_NONE);
-
-  self->cancel_keyval = DEFAULT_CANCEL_KEY;
-  self->clear_keyval = DEFAULT_CLEAR_KEY;
-}
-
 static void
 key_shortcut_finished_editing (GsdWacomKeyShortcutButton *self,
                                guint32                    time)
 {
-  gdk_seat_ungrab (self->grab_seat);
-  self->grab_seat = NULL;
-
   self->editing_mode = FALSE;
 
   gsd_wacom_key_shortcut_remove_editing_mode (self);
@@ -265,17 +226,14 @@ key_shortcut_finished_editing (GsdWacomKeyShortcutButton *self,
 }
 
 static gboolean
-gsd_wacom_key_shortcut_button_key_release (GtkWidget            *widget,
-                                           GdkEventKey          *event)
+gsd_wacom_key_shortcut_button_key_released_cb (GtkEventController        *controller,
+                                               guint                      keyval,
+                                               guint                      keycode,
+                                               GdkModifierType            state,
+                                               GsdWacomKeyShortcutButton *self)
 {
-  GsdWacomKeyShortcutButton *self = GSD_WACOM_KEY_SHORTCUT_BUTTON (widget);
-
   if (self->tmp_shortcut_keyval == 0)
-    {
-      GTK_WIDGET_CLASS (gsd_wacom_key_shortcut_button_parent_class)->key_release_event (widget, event);
-
-      return FALSE;
-    }
+    return FALSE;
 
   self->keyval = self->tmp_shortcut_keyval;
   self->mods = self->tmp_shortcut_mods;
@@ -288,36 +246,34 @@ gsd_wacom_key_shortcut_button_key_release (GtkWidget            *widget,
 }
 
 static gboolean
-gsd_wacom_key_shortcut_button_key_press (GtkWidget   *widget,
-                                         GdkEventKey *event)
+gsd_wacom_key_shortcut_button_key_pressed_cb (GtkEventController        *controller,
+                                              guint                      keyval,
+                                              guint                      keycode,
+                                              GdkModifierType            state,
+                                              GsdWacomKeyShortcutButton *self)
 {
   /* This code is based on the gtk_cell_renderer_accel_start_editing */
-  GsdWacomKeyShortcutButton *self = GSD_WACOM_KEY_SHORTCUT_BUTTON (widget);
   GdkModifierType mods = 0;
+  GdkEvent *event;
   guint shortcut_keyval;
-  guint keyval;
   gboolean edited;
   gboolean cleared;
 
+  event = gtk_event_controller_get_current_event (controller);
+
   /* GTK and OTHER modes don't allow modifier keyvals */
-  if (event->is_modifier && self->mode != GSD_WACOM_KEY_SHORTCUT_BUTTON_MODE_ALL)
+  if (gdk_key_event_is_modifier (event) && self->mode != GSD_WACOM_KEY_SHORTCUT_BUTTON_MODE_ALL)
     return TRUE;
 
   if (!self->editing_mode)
-    {
-      GTK_WIDGET_CLASS (gsd_wacom_key_shortcut_button_parent_class)->key_press_event (widget, event);
-
-      return FALSE;
-    }
+    return FALSE;
 
   edited = FALSE;
   cleared = FALSE;
 
-  mods = event->state;
+  mods = state;
 
-  keyval = event->keyval;
-  if (keyval == GDK_KEY_Sys_Req &&
-      (mods & GDK_MOD1_MASK) != 0)
+  if (keyval == GDK_KEY_Sys_Req && (mods & GDK_ALT_MASK) != 0)
     {
       /* HACK: we don't want to use SysRq as a keybinding (but we do
        * want Alt+Print), so we avoid translation from Alt+Print to SysRq
@@ -356,7 +312,7 @@ gsd_wacom_key_shortcut_button_key_press (GtkWidget   *widget,
   self->tmp_shortcut_mods = 0;
   self->tmp_shortcut_time = 0;
 
-  if (event->is_modifier)
+  if (gdk_key_event_is_modifier (event))
     {
       /* when the user presses a non-modifier key, it readily assigns the
        * shortcut but since we also support modifiers-only shortcuts, we
@@ -366,7 +322,7 @@ gsd_wacom_key_shortcut_button_key_press (GtkWidget   *widget,
        * it is a modifier shortcut and assign them when a key-release happens */
       self->tmp_shortcut_keyval = shortcut_keyval;
       self->tmp_shortcut_mods = mods;
-      self->tmp_shortcut_time = event->time;
+      self->tmp_shortcut_time = gtk_event_controller_get_current_event_time (controller);
 
       return TRUE;
     }
@@ -387,7 +343,7 @@ gsd_wacom_key_shortcut_button_key_press (GtkWidget   *widget,
       self->mods = 0;
     }
 
-  key_shortcut_finished_editing (GSD_WACOM_KEY_SHORTCUT_BUTTON (widget), event->time);
+  key_shortcut_finished_editing (self, gtk_event_controller_get_current_event_time (controller));
 
   if (edited)
     g_signal_emit (self, signals[KEY_SHORTCUT_EDITED], 0);
@@ -397,23 +353,15 @@ gsd_wacom_key_shortcut_button_key_press (GtkWidget   *widget,
   return TRUE;
 }
 
-static gboolean
-gsd_wacom_key_shortcut_button_button_press (GtkWidget      *widget,
-                                            GdkEventButton *event)
+static void
+gsd_wacom_key_shortcut_button_button_pressed_cb (GtkGestureClick           *gesture,
+                                                 gint                       n_press,
+                                                 gdouble                    x,
+                                                 gdouble                    y,
+                                                 GsdWacomKeyShortcutButton *self)
 {
-  GsdWacomKeyShortcutButton *self;
-
-  self = GSD_WACOM_KEY_SHORTCUT_BUTTON (widget);
-
-  if (self->editing_mode)
-    return TRUE;
-
-  gsd_wacom_key_shortcut_set_editing_mode (self, NULL);
-
-  GTK_WIDGET_CLASS (gsd_wacom_key_shortcut_button_parent_class)->button_press_event (widget,
-                                                                              event);
-
-  return TRUE;
+  if (!self->editing_mode)
+    gsd_wacom_key_shortcut_set_editing_mode (self, NULL);
 }
 
 static void
@@ -499,9 +447,6 @@ gsd_wacom_key_shortcut_button_class_init (GsdWacomKeyShortcutButtonClass *klass)
                                      N_PROPERTIES,
                                      obj_properties);
 
-  widget_class->key_press_event = gsd_wacom_key_shortcut_button_key_press;
-  widget_class->button_press_event = gsd_wacom_key_shortcut_button_button_press;
-  widget_class->key_release_event = gsd_wacom_key_shortcut_button_key_release;
   widget_class->unrealize = gsd_wacom_key_shortcut_button_unrealize;
 
   button_class->activate = gsd_wacom_key_shortcut_button_activate;
@@ -538,6 +483,25 @@ gsd_wacom_key_shortcut_button_class_init (GsdWacomKeyShortcutButtonClass *klass)
                                                 G_TYPE_NONE, 0);
 }
 
+static void
+gsd_wacom_key_shortcut_button_init (GsdWacomKeyShortcutButton *self)
+{
+  GtkEventController *controller;
+  GtkGesture *gesture;
+
+  self->cancel_keyval = DEFAULT_CANCEL_KEY;
+  self->clear_keyval = DEFAULT_CLEAR_KEY;
+
+  controller = gtk_event_controller_key_new ();
+  g_signal_connect (controller, "key-pressed", G_CALLBACK (gsd_wacom_key_shortcut_button_key_pressed_cb), 
self);
+  g_signal_connect (controller, "key-released", G_CALLBACK (gsd_wacom_key_shortcut_button_key_released_cb), 
self);
+  gtk_widget_add_controller (GTK_WIDGET (self), controller);
+
+  gesture = gtk_gesture_click_new ();
+  g_signal_connect (gesture, "pressed", G_CALLBACK (gsd_wacom_key_shortcut_button_button_pressed_cb), self);
+  gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (gesture));
+}
+
 /**
  * gsd_wacom_key_shortcut_button_new:
  *
diff --git a/panels/wacom/meson.build b/panels/wacom/meson.build
index 5f6222071..30bbb6b04 100644
--- a/panels/wacom/meson.build
+++ b/panels/wacom/meson.build
@@ -1,5 +1,5 @@
-deps = wacom_deps + [
-  gnome_desktop_dep,
+deps = common_deps + wacom_deps + [
+  gnome_rr_dep,
   gnome_settings_dep,
   x11_dep,
   xi_dep
diff --git a/panels/wacom/test-wacom.c b/panels/wacom/test-wacom.c
index a8d4f6948..97803a12f 100644
--- a/panels/wacom/test-wacom.c
+++ b/panels/wacom/test-wacom.c
@@ -43,16 +43,6 @@ add_page (GList *devices,
        gtk_widget_show (widget);
 }
 
-static gboolean
-delete_event_cb (GtkWidget *widget,
-                GdkEvent  *event,
-                gpointer   user_data)
-{
-       gtk_main_quit ();
-
-       return FALSE;
-}
-
 static GList *
 create_fake_cintiq (void)
 {
@@ -122,19 +112,16 @@ int main (int argc, char **argv)
        bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
        textdomain (GETTEXT_PACKAGE);
 
-       gtk_init (&argc, &argv);
+       gtk_init ();
 
-       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+       window = gtk_window_new ();
        gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
        gtk_window_set_default_size (GTK_WINDOW (window), FIXED_WIDTH, -1);
-       g_signal_connect (G_OBJECT (window), "delete-event",
-                         G_CALLBACK (delete_event_cb), NULL);
        notebook = gtk_notebook_new ();
        gtk_notebook_set_show_tabs (GTK_NOTEBOOK (notebook), FALSE);
        gtk_notebook_set_show_border (GTK_NOTEBOOK (notebook), FALSE);
        gtk_widget_set_vexpand (notebook, TRUE);
-       gtk_container_set_border_width (GTK_CONTAINER (notebook), 24);
-       gtk_container_add (GTK_CONTAINER (window), notebook);
+       gtk_window_set_child (GTK_WINDOW (window), notebook);
        gtk_widget_show (notebook);
 
        devices = create_fake_intuos4 ();
@@ -154,7 +141,8 @@ int main (int argc, char **argv)
 
        gtk_widget_show (window);
 
-       gtk_main ();
+  while (g_list_model_get_n_items (gtk_window_get_toplevels ()) > 0)
+    g_main_context_iteration (NULL, TRUE);
 
        return 0;
 }
diff --git a/panels/wacom/wacom-stylus-page.ui b/panels/wacom/wacom-stylus-page.ui
index 133f3c8fb..91d3e70c9 100644
--- a/panels/wacom/wacom-stylus-page.ui
+++ b/panels/wacom/wacom-stylus-page.ui
@@ -44,19 +44,13 @@
   </object>
   <object class="GtkNotebook" id="stylus-notebook">
     <property name="name">stylus-notebook</property>
-    <property name="visible">True</property>
-    <property name="can_focus">True</property>
     <property name="show_tabs">False</property>
     <property name="show_border">False</property>
     <child>
       <object class="GtkBox" id="no-stylus-page">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="orientation">vertical</property>
         <child>
           <object class="GtkImage">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="valign">end</property>
             <property name="vexpand">True</property>
             <property name="pixel_size">96</property>
@@ -66,28 +60,14 @@
               <class name="dim-label"/>
             </style>
           </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">0</property>
-          </packing>
         </child>
         <child>
           <object class="GtkLabel" id="no-stylus-label1">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="label" translatable="yes">No stylus found</property>
           </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">1</property>
-          </packing>
         </child>
         <child>
           <object class="GtkLabel">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="valign">start</property>
             <property name="vexpand">True</property>
             <property name="label" translatable="yes">Please move your stylus to the proximity of the tablet 
to configure it</property>
@@ -95,323 +75,242 @@
             <property name="wrap">True</property>
             <property name="width_chars">30</property>
           </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">2</property>
-          </packing>
         </child>
       </object>
     </child>
     <child>
       <object class="GtkGrid" id="stylus-grid">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="hexpand">True</property>
         <property name="row_spacing">10</property>
         <property name="column_spacing">10</property>
         <child>
           <object class="GtkLabel" id="label-stylus">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="halign">start</property>
             <property name="valign">center</property>
             <property name="label" translatable="yes">Stylus</property>
+            <layout>
+              <property name="column">0</property>
+              <property name="row">0</property>
+              <property name="column-span">2</property>
+            </layout>
             <attributes>
               <attribute name="weight" value="bold"/>
             </attributes>
           </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-            <property name="width">2</property>
-          </packing>
         </child>
         <child>
-          <object class="GtkImage" id="image-stylus">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
+          <object class="GtkPicture" id="image-stylus">
             <property name="halign">end</property>
             <property name="valign">start</property>
-            <property name="pixbuf">wacom-stylus.svg</property>
+            <property name="can-shrink">False</property>
+            <property name="file">resource:///org/gnome/control-center/wacom/wacom-stylus.svg</property>
+            <layout>
+              <property name="column">0</property>
+              <property name="row">1</property>
+            </layout>
           </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
-          </packing>
         </child>
         <child>
           <object class="GtkGrid" id="stylus-controls-grid">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="margin_start">16</property>
             <property name="margin_top">12</property>
             <property name="hexpand">True</property>
             <property name="orientation">vertical</property>
             <property name="row_spacing">6</property>
             <property name="column_spacing">10</property>
+            <layout>
+              <property name="column">1</property>
+              <property name="row">1</property>
+            </layout>
             <child>
               <object class="GtkLabel" id="label-eraser-feel">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="halign">end</property>
                 <property name="valign">center</property>
                 <property name="label" translatable="yes">Eraser Pressure Feel</property>
                 <property name="justify">right</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">0</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">0</property>
-              </packing>
             </child>
             <child>
               <object class="GtkBox" id="eraser-box">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="hexpand">True</property>
                 <property name="spacing">10</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">0</property>
+                </layout>
                 <child>
                   <object class="GtkLabel" id="label-eraser-soft">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="label" translatable="yes">Soft</property>
                     <attributes>
                       <attribute name="scale" value="0.82999999999999996"/>
                     </attributes>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkScale" id="scale-eraser-feel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
                     <property name="valign">center</property>
+                    <property name="hexpand">True</property>
                     <property name="adjustment">adjustment-eraser-feel</property>
                     <property name="digits">0</property>
                     <property name="draw_value">False</property>
                     <property name="round_digits">0</property>
                   </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkLabel" id="label-eraser-firm">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="label" translatable="yes">Firm</property>
                     <attributes>
                       <attribute name="scale" value="0.82999999999999996"/>
                     </attributes>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">0</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="label-top-button">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="halign">end</property>
                 <property name="valign">center</property>
                 <property name="label" translatable="yes">Top Button</property>
                 <property name="justify">right</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">1</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkComboBox" id="combo-topbutton">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="valign">center</property>
                 <property name="model">liststore-buttons</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">1</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="label-lower-button">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="halign">end</property>
                 <property name="valign">center</property>
                 <property name="label" translatable="yes">Lower Button</property>
                 <property name="justify">right</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">2</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">2</property>
-              </packing>
             </child>
             <child>
               <object class="GtkComboBox" id="combo-bottombutton">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="valign">center</property>
                 <property name="model">liststore-buttons</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">2</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">2</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="label-third-button">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="halign">end</property>
                 <property name="valign">center</property>
                 <property name="label" translatable="yes">Lowest Button</property>
                 <property name="justify">right</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">3</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">3</property>
-              </packing>
             </child>
             <child>
               <object class="GtkComboBox" id="combo-thirdbutton">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="valign">center</property>
                 <property name="model">liststore-buttons</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">3</property>
+                </layout>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">3</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="label-tip-feel">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="halign">end</property>
                 <property name="valign">center</property>
                 <property name="label" translatable="yes">Tip Pressure Feel</property>
                 <property name="justify">right</property>
+                <layout>
+                  <property name="column">0</property>
+                  <property name="row">4</property>
+                </layout>
                 <style>
                   <class name="dim-label"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">4</property>
-              </packing>
             </child>
             <child>
               <object class="GtkBox" id="box-tip-feel">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="spacing">10</property>
+                <layout>
+                  <property name="column">1</property>
+                  <property name="row">4</property>
+                </layout>
                 <child>
                   <object class="GtkLabel" id="label-tip-soft">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="label" translatable="yes">Soft</property>
                     <attributes>
                       <attribute name="scale" value="0.82999999999999996"/>
                     </attributes>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkScale" id="scale-tip-feel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
                     <property name="hexpand">True</property>
                     <property name="adjustment">adjustment-tip-feel</property>
                     <property name="digits">0</property>
                     <property name="draw_value">False</property>
                     <property name="round_digits">0</property>
                   </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
                 </child>
                 <child>
                   <object class="GtkLabel" id="label-tip-firm">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="label" translatable="yes">Firm</property>
                     <attributes>
                       <attribute name="scale" value="0.82999999999999996"/>
                     </attributes>
                   </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
                 </child>
               </object>
-              <packing>
-                <property name="left_attach">1</property>
-                <property name="top_attach">4</property>
-              </packing>
             </child>
           </object>
-          <packing>
-            <property name="left_attach">1</property>
-            <property name="top_attach">1</property>
-          </packing>
         </child>
         <child>
           <object class="GtkRevealer" id="navigation-placeholder">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="halign">end</property>
             <property name="transition_type">crossfade</property>
             <property name="transition_duration">100</property>
-            <child>
-              <placeholder/>
-            </child>
+            <layout>
+              <property name="column">1</property>
+              <property name="row">0</property>
+            </layout>
           </object>
-          <packing>
-            <property name="left_attach">1</property>
-            <property name="top_attach">0</property>
-          </packing>
         </child>
       </object>
-      <packing>
-        <property name="position">1</property>
-      </packing>
     </child>
   </object>
 </interface>
diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c
index a3622ef86..31db92748 100644
--- a/shell/cc-panel-loader.c
+++ b/shell/cc-panel-loader.c
@@ -63,7 +63,7 @@ extern GType cc_bolt_panel_get_type (void);
 extern GType cc_ua_panel_get_type (void);
 //extern GType cc_user_panel_get_type (void);
 #ifdef BUILD_WACOM
-//extern GType cc_wacom_panel_get_type (void);
+extern GType cc_wacom_panel_get_type (void);
 #endif /* BUILD_WACOM */
 #ifdef BUILD_WWAN
 //extern GType cc_wwan_panel_get_type (void);
@@ -81,7 +81,7 @@ extern void cc_diagnostics_panel_static_init_func (void);
 //extern void cc_wifi_panel_static_init_func (void);
 #endif /* BUILD_NETWORK */
 #ifdef BUILD_WACOM
-//extern void cc_wacom_panel_static_init_func (void);
+extern void cc_wacom_panel_static_init_func (void);
 #endif /* BUILD_WACOM */
 #ifdef BUILD_WWAN
 //extern void cc_wwan_panel_static_init_func (void);
@@ -135,7 +135,7 @@ static CcPanelLoaderVtable default_panels[] =
   PANEL_TYPE("usage",            cc_usage_panel_get_type,                NULL),
   //PANEL_TYPE("user-accounts",    cc_user_panel_get_type,                 NULL),
 #ifdef BUILD_WACOM
-  //PANEL_TYPE("wacom",            cc_wacom_panel_get_type,                cc_wacom_panel_static_init_func),
+  PANEL_TYPE("wacom",            cc_wacom_panel_get_type,                cc_wacom_panel_static_init_func),
 #endif
 #ifdef BUILD_WWAN
   //PANEL_TYPE("wwan",             cc_wwan_panel_get_type,                 cc_wwan_panel_static_init_func),


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]