[gnome-control-center/gbsneto/gtk4: 3/3] display: Port to GTK4




commit 67233d2c1f0cf8a9a05181083dd60a589b63ec34
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Nov 11 15:31:41 2021 -0300

    display: Port to GTK4

 panels/display/cc-display-arrangement.c | 137 ++++-----
 panels/display/cc-display-panel.c       | 177 +++++------
 panels/display/cc-display-panel.ui      | 499 +++++++++++---------------------
 panels/display/cc-display-settings.c    | 147 ++++++----
 panels/display/cc-display-settings.h    |   4 +-
 panels/display/cc-display-settings.ui   | 124 ++++----
 panels/display/cc-night-light-page.c    |  17 +-
 panels/display/cc-night-light-page.h    |   4 +-
 panels/display/cc-night-light-page.ui   | 499 ++++++++++++++------------------
 panels/display/meson.build              |   2 +-
 panels/display/night-light.css          |   2 +-
 panels/meson.build                      |   2 +-
 shell/cc-panel-loader.c                 |   4 +-
 13 files changed, 689 insertions(+), 929 deletions(-)
---
diff --git a/panels/display/cc-display-arrangement.c b/panels/display/cc-display-arrangement.c
index adbbcbc28..efe8d5718 100644
--- a/panels/display/cc-display-arrangement.c
+++ b/panels/display/cc-display-arrangement.c
@@ -494,24 +494,6 @@ cc_display_arrangement_find_monitor_at (CcDisplayArrangement *self,
   return NULL;
 }
 
-static void
-cc_display_arrangement_update_cursor (CcDisplayArrangement *self,
-                                      gboolean              dragable)
-{
-  g_autoptr(GdkCursor) cursor = NULL;
-  GdkWindow *window;
-
-  if (dragable)
-    cursor = gdk_cursor_new_for_display (gtk_widget_get_display (GTK_WIDGET (self)), GDK_FLEUR);
-  else
-    cursor = NULL;
-
-  window = gtk_widget_get_window (GTK_WIDGET (self));
-
-  if (window)
-    gdk_window_set_cursor (window, cursor);
-}
-
 static void
 on_output_changed_cb (CcDisplayArrangement *self,
                       CcDisplayMonitor     *output)
@@ -524,17 +506,20 @@ on_output_changed_cb (CcDisplayArrangement *self,
   gtk_widget_queue_draw (GTK_WIDGET (self));
 }
 
-static gboolean
-cc_display_arrangement_draw (GtkWidget *widget,
-                             cairo_t   *cr)
+static void
+cc_display_arrangement_draw (GtkDrawingArea *drawing_area,
+                             cairo_t        *cr,
+                             gint            width,
+                             gint            height,
+                             gpointer        user_data)
 {
-  CcDisplayArrangement *self = CC_DISPLAY_ARRANGEMENT (widget);
-  GtkStyleContext *context = gtk_widget_get_style_context (widget);
+  CcDisplayArrangement *self = CC_DISPLAY_ARRANGEMENT (drawing_area);
+  GtkStyleContext *context = gtk_widget_get_style_context (GTK_WIDGET (self));
   g_autoptr(GList) outputs = NULL;
   GList *l;
 
   if (!self->config)
-    return FALSE;
+    return;
 
   cc_display_arrangement_update_matrices (self);
 
@@ -584,7 +569,7 @@ cc_display_arrangement_draw (GtkWidget *widget,
 
       cairo_translate (cr, x1, y1);
 
-      gtk_style_context_get_margin (context, state, &margin);
+      gtk_style_context_get_margin (context, &margin);
 
       cairo_translate (cr, margin.left, margin.top);
 
@@ -594,8 +579,8 @@ cc_display_arrangement_draw (GtkWidget *widget,
       gtk_render_background (context, cr, 0, 0, w, h);
       gtk_render_frame (context, cr, 0, 0, w, h);
 
-      gtk_style_context_get_border (context, state, &border);
-      gtk_style_context_get_padding (context, state, &padding);
+      gtk_style_context_get_border (context, &border);
+      gtk_style_context_get_padding (context, &padding);
 
       w -= border.left + border.right + padding.left + padding.right;
       h -= border.top + border.bottom + padding.top + padding.bottom;
@@ -605,7 +590,7 @@ cc_display_arrangement_draw (GtkWidget *widget,
       if (num > 0)
         {
           PangoLayout *layout;
-          PangoFontDescription *font = NULL;
+          //PangoFontDescription *font = NULL;
           g_autofree gchar *number_str = NULL;
           PangoRectangle extents;
           GdkRGBA color;
@@ -614,16 +599,16 @@ cc_display_arrangement_draw (GtkWidget *widget,
           gtk_style_context_add_class (context, "monitor-label");
           gtk_style_context_remove_class (context, "monitor");
 
-          gtk_style_context_get_border (context, state, &border);
-          gtk_style_context_get_padding (context, state, &padding);
-          gtk_style_context_get_margin (context, state, &margin);
+          gtk_style_context_get_border (context, &border);
+          gtk_style_context_get_padding (context, &padding);
+          gtk_style_context_get_margin (context, &margin);
 
           cairo_translate (cr, margin.left, margin.top);
 
           number_str = g_strdup_printf ("%d", num);
-          gtk_style_context_get (context, state, "font", &font, NULL);
+          //gtk_style_context_get (context, state, "font", &font, NULL);
           layout = gtk_widget_create_pango_layout (GTK_WIDGET (self), number_str);
-          pango_layout_set_font_description (layout, font);
+          //pango_layout_set_font_description (layout, font);
           pango_layout_get_extents (layout, NULL, &extents);
 
           h = (extents.height - extents.y) / PANGO_SCALE;
@@ -640,7 +625,7 @@ cc_display_arrangement_draw (GtkWidget *widget,
           cairo_translate (cr, border.left + padding.left, border.top + padding.top);
           cairo_translate (cr, extents.x + text_padding / 2, 0);
 
-          gtk_style_context_get_color (context, state, &color);
+          gtk_style_context_get_color (context, &color);
           gdk_cairo_set_source_rgba (cr, &color);
 
           gtk_render_layout (context, cr, 0, 0, layout);
@@ -652,15 +637,15 @@ cc_display_arrangement_draw (GtkWidget *widget,
     }
 
   gtk_style_context_restore (context);
-
-  return TRUE;
 }
 
 static gboolean
-cc_display_arrangement_button_press_event (GtkWidget      *widget,
-                                           GdkEventButton *event)
+on_click_gesture_pressed_cb (GtkGestureClick      *click_gesture,
+                             gint                  n_press,
+                             gdouble               x,
+                             gdouble               y,
+                             CcDisplayArrangement *self)
 {
-  CcDisplayArrangement *self = CC_DISPLAY_ARRANGEMENT (widget);
   CcDisplayMonitor *output;
   gdouble event_x, event_y;
   gint mon_x, mon_y;
@@ -668,18 +653,14 @@ cc_display_arrangement_button_press_event (GtkWidget      *widget,
   if (!self->config)
     return FALSE;
 
-  /* Only handle normal presses of the left mouse button. */
-  if (event->button != 1 || event->type != GDK_BUTTON_PRESS)
-    return FALSE;
-
   g_return_val_if_fail (self->drag_active == FALSE, FALSE);
 
-  output = cc_display_arrangement_find_monitor_at (self, event->x, event->y);
+  output = cc_display_arrangement_find_monitor_at (self, x, y);
   if (!output)
     return FALSE;
 
-  event_x = event->x;
-  event_y = event->y;
+  event_x = x;
+  event_y = y;
 
   cairo_matrix_transform_point (&self->to_actual, &event_x, &event_y);
   cc_display_monitor_get_geometry (output, &mon_x, &mon_y, NULL, NULL);
@@ -697,40 +678,40 @@ cc_display_arrangement_button_press_event (GtkWidget      *widget,
 }
 
 static gboolean
-cc_display_arrangement_button_release_event (GtkWidget      *widget,
-                                             GdkEventButton *event)
+on_click_gesture_released_cb (GtkGestureClick      *click_gesture,
+                              gint                  n_press,
+                              gdouble               x,
+                              gdouble               y,
+                              CcDisplayArrangement *self)
 {
-  CcDisplayArrangement *self = CC_DISPLAY_ARRANGEMENT (widget);
   CcDisplayMonitor *output;
 
   if (!self->config)
     return FALSE;
 
-  /* Only handle left mouse button */
-  if (event->button != 1)
-    return FALSE;
-
   if (!self->drag_active)
     return FALSE;
 
   self->drag_active = FALSE;
 
-  output = cc_display_arrangement_find_monitor_at (self, event->x, event->y);
-  cc_display_arrangement_update_cursor (self, output != NULL);
+  output = cc_display_arrangement_find_monitor_at (self, x, y);
+  gtk_widget_set_cursor_from_name (GTK_WIDGET (self),
+                                   output != NULL ? "fleur" : NULL);
 
   /* And queue a redraw to recenter everything */
-  gtk_widget_queue_draw (widget);
+  gtk_widget_queue_draw (GTK_WIDGET (self));
 
-  g_signal_emit_by_name (G_OBJECT (widget), "updated");
+  g_signal_emit_by_name (G_OBJECT (self), "updated");
 
   return TRUE;
 }
 
 static gboolean
-cc_display_arrangement_motion_notify_event (GtkWidget      *widget,
-                                            GdkEventMotion *event)
+on_motion_controller_motion_cb (GtkEventControllerMotion *motion_controller,
+                                gdouble                   x,
+                                gdouble                   y,
+                                CcDisplayArrangement     *self)
 {
-  CcDisplayArrangement *self = CC_DISPLAY_ARRANGEMENT (widget);
   gdouble event_x, event_y;
   gint mon_x, mon_y;
   SnapData snap_data;
@@ -744,11 +725,12 @@ cc_display_arrangement_motion_notify_event (GtkWidget      *widget,
   if (!self->drag_active)
     {
       CcDisplayMonitor *output;
-      output = cc_display_arrangement_find_monitor_at (self, event->x, event->y);
+      output = cc_display_arrangement_find_monitor_at (self, x, y);
 
-      cc_display_arrangement_update_cursor (self, output != NULL);
+      gtk_widget_set_cursor_from_name (GTK_WIDGET (self),
+                                       output != NULL ? "fleur" : NULL);
       if (self->prelit_output != output)
-        gtk_widget_queue_draw (widget);
+        gtk_widget_queue_draw (GTK_WIDGET (self));
 
       self->prelit_output = output;
 
@@ -757,8 +739,8 @@ cc_display_arrangement_motion_notify_event (GtkWidget      *widget,
 
   g_assert (self->selected_output);
 
-  event_x = event->x;
-  event_y = event->y;
+  event_x = x;
+  event_y = y;
 
   cairo_matrix_transform_point (&self->to_actual, &event_x, &event_y);
 
@@ -843,17 +825,11 @@ static void
 cc_display_arrangement_class_init (CcDisplayArrangementClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   gobject_class->finalize = cc_display_arrangement_finalize;
   gobject_class->get_property = cc_display_arrangement_get_property;
   gobject_class->set_property = cc_display_arrangement_set_property;
 
-  widget_class->draw = cc_display_arrangement_draw;
-  widget_class->button_press_event = cc_display_arrangement_button_press_event;
-  widget_class->button_release_event = cc_display_arrangement_button_release_event;
-  widget_class->motion_notify_event = cc_display_arrangement_motion_notify_event;
-
   props[PROP_CONFIG] = g_param_spec_object ("config", "Display Config",
                                             "The display configuration to work with",
                                             CC_TYPE_DISPLAY_CONFIG,
@@ -878,9 +854,22 @@ cc_display_arrangement_class_init (CcDisplayArrangementClass *klass)
 static void
 cc_display_arrangement_init (CcDisplayArrangement *self)
 {
-  /* XXX: Do we need to listen to touch events here? */
-  gtk_widget_add_events (GTK_WIDGET (self),
-                         GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);
+  GtkEventController *motion_controller;
+  GtkGesture *click_gesture;
+
+  click_gesture = gtk_gesture_click_new ();
+  g_signal_connect (click_gesture, "pressed", G_CALLBACK (on_click_gesture_pressed_cb), self);
+  g_signal_connect (click_gesture, "released", G_CALLBACK (on_click_gesture_released_cb), self);
+  gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (click_gesture));
+
+  motion_controller = gtk_event_controller_motion_new ();
+  g_signal_connect (motion_controller, "motion", G_CALLBACK (on_motion_controller_motion_cb), self);
+  gtk_widget_add_controller (GTK_WIDGET (self), motion_controller);
+
+  gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (self),
+                                  cc_display_arrangement_draw,
+                                  self,
+                                  NULL);
 
   self->major_snap_distance = MAJOR_SNAP_DISTANCE;
 }
diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c
index 91b3f3387..4f082aaa0 100644
--- a/panels/display/cc-display-panel.c
+++ b/panels/display/cc-display-panel.c
@@ -25,10 +25,8 @@
 #include <stdlib.h>
 #include <gdesktop-enums.h>
 #include <math.h>
-#include <handy.h>
 
 #include "shell/cc-object-storage.h"
-#include "list-box-helper.h"
 #include <libupower-glib/upower.h>
 
 #include "cc-display-config-manager-dbus.h"
@@ -83,31 +81,34 @@ struct _CcDisplayPanel
   GDBusProxy *shell_proxy;
 
   gchar     *main_title;
-  GtkWidget *main_titlebar;
   GtkWidget *apply_titlebar;
   GtkWidget *apply_titlebar_apply;
+  GtkWidget *apply_titlebar_cancel;
   GtkWidget *apply_titlebar_warning;
 
   GListStore     *primary_display_list;
   GtkListStore   *output_selection_list;
 
-  GtkWidget      *arrangement_frame;
-  GtkAlignment   *arrangement_bin;
-  GtkRadioButton *config_type_join;
-  GtkRadioButton *config_type_mirror;
-  GtkRadioButton *config_type_single;
-  GtkWidget      *config_type_switcher_frame;
+  GtkWidget      *arrangement_group;
+  AdwBin         *arrangement_bin;
+  GtkToggleButton *config_type_join;
+  GtkToggleButton *config_type_mirror;
+  GtkToggleButton *config_type_single;
+  GtkWidget      *config_type_switcher_group;
   GtkLabel       *current_output_label;
-  GtkWidget      *display_settings_frame;
+  AdwBin         *display_settings_bin;
   GtkBox         *multi_selection_box;
   GtkSwitch      *output_enabled_switch;
   GtkComboBox    *output_selection_combo;
   GtkStack       *output_selection_stack;
-  GtkButtonBox   *output_selection_two_buttonbox;
-  GtkRadioButton *output_selection_two_first;
-  GtkRadioButton *output_selection_two_second;
-  HdyComboRow    *primary_display_row;
+  GtkBox         *output_selection_two_buttonbox;
+  GtkToggleButton *output_selection_two_first;
+  GtkToggleButton *output_selection_two_second;
+  AdwComboRow    *primary_display_row;
   GtkWidget      *stack_switcher;
+
+  GtkShortcutController *toplevel_shortcuts;
+  GtkShortcut *escape_shortcut;
 };
 
 CC_PANEL_REGISTER (CcDisplayPanel, cc_display_panel)
@@ -404,7 +405,7 @@ ensure_monitor_labels (CcDisplayPanel *self)
 
   for (w = windows; w; w = w->next)
     {
-      if (gtk_window_has_toplevel_focus (GTK_WINDOW (w->data)))
+      if (gtk_widget_has_focus (GTK_WIDGET (w->data)))
         {
           monitor_labeler_show (self);
           break;
@@ -424,20 +425,16 @@ dialog_toplevel_focus_changed (CcDisplayPanel *self)
 static void
 reset_titlebar (CcDisplayPanel *self)
 {
-  GtkWidget *toplevel = cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (self)));
+  CcShell *shell = cc_panel_get_shell (CC_PANEL (self));
 
-  if (self->main_titlebar)
-    {
-      gtk_window_set_titlebar (GTK_WINDOW (toplevel), self->main_titlebar);
-      g_clear_object (&self->main_titlebar);
+  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (self->toplevel_shortcuts),
+                                              GTK_PHASE_NONE);
 
-      /* The split header bar will not reset the window title, so do that here. */
-      gtk_window_set_title (GTK_WINDOW (toplevel), self->main_title);
-      g_clear_pointer (&self->main_title, g_free);
-    }
+  cc_shell_set_custom_titlebar (shell, NULL);
 
   g_clear_object (&self->apply_titlebar);
   g_clear_object (&self->apply_titlebar_apply);
+  g_clear_object (&self->apply_titlebar_cancel);
   g_clear_object (&self->apply_titlebar_warning);
 }
 
@@ -473,7 +470,7 @@ cc_display_panel_dispose (GObject *object)
 
   g_clear_object (&self->shell_proxy);
 
-  g_clear_pointer ((GtkWidget **) &self->night_light_dialog, gtk_widget_destroy);
+  g_clear_pointer ((GtkWindow **) &self->night_light_dialog, gtk_window_destroy);
 
   g_signal_handlers_disconnect_by_data (toplevel, self);
 
@@ -498,7 +495,7 @@ on_monitor_settings_updated_cb (CcDisplayPanel    *panel,
 
 static void
 on_config_type_toggled_cb (CcDisplayPanel *panel,
-                           GtkRadioButton *btn)
+                           GtkCheckButton *btn)
 {
   CcDisplayConfigType type;
 
@@ -528,8 +525,7 @@ on_night_light_list_box_row_activated_cb (CcDisplayPanel *panel)
       panel->night_light_dialog = (GtkDialog *)gtk_dialog_new ();
 
       content_area = gtk_dialog_get_content_area (panel->night_light_dialog);
-      gtk_container_add (GTK_CONTAINER (content_area),
-                         GTK_WIDGET (panel->night_light_page));
+      gtk_box_append (GTK_BOX (content_area), GTK_WIDGET (panel->night_light_page));
       gtk_widget_show (GTK_WIDGET (panel->night_light_page));
     }
 
@@ -599,7 +595,7 @@ on_output_selection_combo_changed_cb (CcDisplayPanel *panel)
 }
 
 static void
-on_output_selection_two_toggled_cb (CcDisplayPanel *panel, GtkRadioButton *btn)
+on_output_selection_two_toggled_cb (CcDisplayPanel *panel, GtkCheckButton *btn)
 {
   CcDisplayMonitor *output;
 
@@ -633,7 +629,7 @@ on_output_selection_two_toggled_cb (CcDisplayPanel *panel, GtkRadioButton *btn)
 static void
 on_primary_display_selected_index_changed_cb (CcDisplayPanel *panel)
 {
-  gint idx = hdy_combo_row_get_selected_index (panel->primary_display_row);
+  gint idx = adw_combo_row_get_selected (panel->primary_display_row);
   g_autoptr(CcDisplayMonitor) output = NULL;
 
   if (idx < 0 || panel->rebuilding_counter > 0)
@@ -657,6 +653,20 @@ on_toplevel_folded (CcDisplayPanel *panel, GParamSpec *pspec, GtkWidget *topleve
   cc_display_settings_refresh_layout (panel->settings, folded);
 }
 
+static gboolean
+on_toplevel_escape_pressed_cb (GtkWidget      *widget,
+                               GVariant       *args,
+                               CcDisplayPanel *self)
+{
+  if (self->apply_titlebar_cancel)
+    {
+      g_signal_emit_by_name (self->apply_titlebar_cancel, "activate");
+      return GDK_EVENT_STOP;
+    }
+
+  return GDK_EVENT_PROPAGATE;
+}
+
 static void
 cc_display_panel_constructed (GObject *object)
 {
@@ -702,14 +712,15 @@ cc_display_panel_class_init (CcDisplayPanelClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/display/cc-display-panel.ui");
 
-  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, arrangement_frame);
+  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, arrangement_group);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, arrangement_bin);
-  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, config_type_switcher_frame);
+  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, config_type_switcher_group);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, config_type_join);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, config_type_mirror);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, config_type_single);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, current_output_label);
-  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, display_settings_frame);
+  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, display_settings_bin);
+  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, escape_shortcut);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, multi_selection_box);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, night_light_page);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, output_enabled_switch);
@@ -720,6 +731,7 @@ cc_display_panel_class_init (CcDisplayPanelClass *klass)
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, output_selection_two_second);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, primary_display_row);
   gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, stack_switcher);
+  gtk_widget_class_bind_template_child (widget_class, CcDisplayPanel, toplevel_shortcuts);
 
   gtk_widget_class_bind_template_callback (widget_class, on_config_type_toggled_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_night_light_list_box_row_activated_cb);
@@ -727,6 +739,7 @@ cc_display_panel_class_init (CcDisplayPanelClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, on_output_selection_combo_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_output_selection_two_toggled_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_primary_display_selected_index_changed_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_toplevel_escape_pressed_cb);
 }
 
 static void
@@ -853,8 +866,8 @@ rebuild_ui (CcDisplayPanel *panel)
 
           g_list_store_append (panel->primary_display_list, output);
           if (cc_display_monitor_is_primary (output))
-            hdy_combo_row_set_selected_index (panel->primary_display_row,
-                                              g_list_model_get_n_items (G_LIST_MODEL 
(panel->primary_display_list)) - 1);
+            adw_combo_row_set_selected (panel->primary_display_row,
+                                        g_list_model_get_n_items (G_LIST_MODEL 
(panel->primary_display_list)) - 1);
 
           /* Ensure that an output is selected; note that this doesn't ensure
            * the selected output is any useful (i.e. when switching types).
@@ -879,8 +892,8 @@ rebuild_ui (CcDisplayPanel *panel)
       if (type > CC_DISPLAY_CONFIG_LAST_VALID)
         type = CC_DISPLAY_CONFIG_JOIN;
 
-      gtk_widget_set_visible (panel->config_type_switcher_frame, TRUE);
-      gtk_widget_set_visible (panel->arrangement_frame, type == CC_DISPLAY_CONFIG_JOIN);
+      gtk_widget_set_visible (panel->config_type_switcher_group, TRUE);
+      gtk_widget_set_visible (panel->arrangement_group, type == CC_DISPLAY_CONFIG_JOIN);
 
       /* We need a switcher except in CLONE mode */
       if (type == CC_DISPLAY_CONFIG_CLONE)
@@ -893,8 +906,8 @@ rebuild_ui (CcDisplayPanel *panel)
       /* We have more than one usable monitor. In this case there is no chooser,
        * and we always show the arrangement widget even if we are in SINGLE mode.
        */
-      gtk_widget_set_visible (panel->config_type_switcher_frame, FALSE);
-      gtk_widget_set_visible (panel->arrangement_frame, TRUE);
+      gtk_widget_set_visible (panel->config_type_switcher_group, FALSE);
+      gtk_widget_set_visible (panel->arrangement_group, TRUE);
 
       /* Mirror is also invalid as it cannot be configured using this UI. */
       if (type == CC_DISPLAY_CONFIG_CLONE || type > CC_DISPLAY_CONFIG_LAST_VALID)
@@ -909,8 +922,8 @@ rebuild_ui (CcDisplayPanel *panel)
        * mode (and not e.g. mirroring across one display) */
       type = CC_DISPLAY_CONFIG_SINGLE;
 
-      gtk_widget_set_visible (panel->config_type_switcher_frame, FALSE);
-      gtk_widget_set_visible (panel->arrangement_frame, FALSE);
+      gtk_widget_set_visible (panel->config_type_switcher_group, FALSE);
+      gtk_widget_set_visible (panel->arrangement_group, FALSE);
 
       gtk_stack_set_visible_child (panel->output_selection_stack, GTK_WIDGET (panel->current_output_label));
     }
@@ -997,70 +1010,57 @@ on_screen_changed (CcDisplayPanel *panel)
   ensure_monitor_labels (panel);
 }
 
-static gboolean
-on_toplevel_key_press (GtkWidget   *button,
-                       GdkEventKey *event)
-{
-  if (event->keyval != GDK_KEY_Escape)
-    return GDK_EVENT_PROPAGATE;
-
-  g_signal_emit_by_name (button, "activate");
-  return GDK_EVENT_STOP;
-}
-
 static void
 show_apply_titlebar (CcDisplayPanel *panel, gboolean is_applicable)
 {
+  GtkWidget *title;
+
   if (!panel->apply_titlebar)
     {
       g_autoptr(GtkSizeGroup) size_group = NULL;
-      GtkWidget *header, *button, *toplevel;
+      GtkWidget *header, *button;
+      CcShell *shell;
+
+      shell = cc_panel_get_shell (CC_PANEL (panel));
+
       panel->apply_titlebar = header = gtk_header_bar_new ();
-      gtk_widget_show (header);
+      gtk_header_bar_set_show_title_buttons (GTK_HEADER_BAR (header), FALSE);
 
       size_group = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
 
-      button = gtk_button_new_with_mnemonic (_("_Cancel"));
-      gtk_widget_show (button);
+      panel->apply_titlebar_cancel = button = gtk_button_new_with_mnemonic (_("_Cancel"));
       gtk_header_bar_pack_start (GTK_HEADER_BAR (header), button);
       gtk_size_group_add_widget (size_group, button);
       g_signal_connect_object (button, "clicked", G_CALLBACK (on_screen_changed),
                                panel, G_CONNECT_SWAPPED);
 
-      toplevel = cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (panel)));
-      g_signal_connect_object (toplevel, "key-press-event", G_CALLBACK (on_toplevel_key_press),
-                               button, G_CONNECT_SWAPPED);
-
       panel->apply_titlebar_apply = button = gtk_button_new_with_mnemonic (_("_Apply"));
-      gtk_widget_show (button);
       gtk_header_bar_pack_end (GTK_HEADER_BAR (header), button);
       gtk_size_group_add_widget (size_group, button);
       g_signal_connect_object (button, "clicked", G_CALLBACK (apply_current_configuration),
                                panel, G_CONNECT_SWAPPED);
-      gtk_style_context_add_class (gtk_widget_get_style_context (button),
-                                   GTK_STYLE_CLASS_SUGGESTED_ACTION);
-
-      header = gtk_window_get_titlebar (GTK_WINDOW (toplevel));
-      if (header)
-        panel->main_titlebar = g_object_ref (header);
-      panel->main_title = g_strdup (gtk_window_get_title (GTK_WINDOW (toplevel)));
+      gtk_widget_add_css_class (button, "suggested-action");
 
-      gtk_window_set_titlebar (GTK_WINDOW (toplevel), panel->apply_titlebar);
+      cc_shell_set_custom_titlebar (shell, panel->apply_titlebar);
       g_object_ref (panel->apply_titlebar);
       g_object_ref (panel->apply_titlebar_apply);
+      g_object_ref (panel->apply_titlebar_cancel);
     }
 
   if (is_applicable)
     {
-      gtk_header_bar_set_title (GTK_HEADER_BAR (panel->apply_titlebar), _("Apply Changes?"));
-      gtk_header_bar_set_subtitle (GTK_HEADER_BAR (panel->apply_titlebar), NULL);
+      title = adw_window_title_new (_("Apply Changes?"), NULL);
     }
   else
     {
-      gtk_header_bar_set_title (GTK_HEADER_BAR (panel->apply_titlebar), _("Changes Cannot be Applied"));
-      gtk_header_bar_set_subtitle (GTK_HEADER_BAR (panel->apply_titlebar), _("This could be due to hardware 
limitations."));
+      title = adw_window_title_new (_("Changes Cannot be Applied"),
+                                    _("This could be due to hardware limitations."));
     }
+  gtk_header_bar_set_title_widget (GTK_HEADER_BAR (panel->apply_titlebar), title);
   gtk_widget_set_sensitive (panel->apply_titlebar_apply, is_applicable);
+
+  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (panel->toplevel_shortcuts),
+                                              GTK_PHASE_BUBBLE);
 }
 
 static void
@@ -1179,16 +1179,15 @@ cc_display_panel_init (CcDisplayPanel *self)
 {
   g_autoptr(GtkCssProvider) provider = NULL;
   GtkCellRenderer *renderer;
+  GtkExpression *expression;
 
   g_resources_register (cc_display_get_resource ());
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
   self->arrangement = cc_display_arrangement_new (NULL);
-
-  gtk_widget_show (GTK_WIDGET (self->arrangement));
   gtk_widget_set_size_request (GTK_WIDGET (self->arrangement), 400, 175);
-  gtk_container_add (GTK_CONTAINER (self->arrangement_bin), GTK_WIDGET (self->arrangement));
+  adw_bin_set_child (self->arrangement_bin, GTK_WIDGET (self->arrangement));
 
   g_signal_connect_object (self->arrangement, "updated",
                           G_CALLBACK (update_apply_button), self,
@@ -1198,17 +1197,20 @@ cc_display_panel_init (CcDisplayPanel *self)
                           G_CONNECT_SWAPPED);
 
   self->settings = cc_display_settings_new ();
-  gtk_widget_show (GTK_WIDGET (self->settings));
-  gtk_container_add (GTK_CONTAINER (self->display_settings_frame), GTK_WIDGET (self->settings));
+  adw_bin_set_child (self->display_settings_bin, GTK_WIDGET (self->settings));
   g_signal_connect_object (self->settings, "updated",
                            G_CALLBACK (on_monitor_settings_updated_cb), self,
                            G_CONNECT_SWAPPED);
 
   self->primary_display_list = g_list_store_new (CC_TYPE_DISPLAY_MONITOR);
-  hdy_combo_row_bind_name_model (self->primary_display_row,
-                                 G_LIST_MODEL (self->primary_display_list),
-                                 (HdyComboRowGetNameFunc) cc_display_monitor_dup_ui_number_name,
-                                 NULL, NULL);
+
+  expression = gtk_cclosure_expression_new (G_TYPE_STRING,
+                                            NULL, 0, NULL,
+                                            G_CALLBACK (cc_display_monitor_dup_ui_number_name),
+                                            self, NULL);
+  adw_combo_row_set_expression (self->primary_display_row, expression);
+  adw_combo_row_set_model (self->primary_display_row,
+                           G_LIST_MODEL (self->primary_display_list));
 
   self->output_selection_list = gtk_list_store_new (2, G_TYPE_STRING, CC_TYPE_DISPLAY_MONITOR);
   gtk_combo_box_set_model (self->output_selection_combo, GTK_TREE_MODEL (self->output_selection_list));
@@ -1253,7 +1255,12 @@ cc_display_panel_init (CcDisplayPanel *self)
 
   provider = gtk_css_provider_new ();
   gtk_css_provider_load_from_resource (provider, 
"/org/gnome/control-center/display/display-arrangement.css");
-  gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
-                                             GTK_STYLE_PROVIDER (provider),
-                                             GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+  gtk_style_context_add_provider_for_display (gdk_display_get_default (),
+                                              GTK_STYLE_PROVIDER (provider),
+                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
+  gtk_shortcut_set_action (self->escape_shortcut,
+                           gtk_callback_action_new ((GtkShortcutFunc) on_toplevel_escape_pressed_cb,
+                                                    self,
+                                                    NULL));
 }
diff --git a/panels/display/cc-display-panel.ui b/panels/display/cc-display-panel.ui
index 855b34814..96064c864 100644
--- a/panels/display/cc-display-panel.ui
+++ b/panels/display/cc-display-panel.ui
@@ -1,284 +1,197 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.22.0 -->
 <interface>
-  <requires lib="gtk+" version="3.20"/>
-  <requires lib="libhandy" version="0.0"/>
-  <object class="GtkImage" id="image-join-displays">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="margin_start">12</property>
-    <property name="margin_end">12</property>
-    <property name="margin_top">12</property>
-    <property name="margin_bottom">12</property>
-    <property name="icon_name">video-joined-displays-symbolic</property>
-    <property name="icon_size">3</property>
-  </object>
-  <object class="GtkImage" id="image-mirror">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="margin_start">12</property>
-    <property name="margin_end">12</property>
-    <property name="margin_top">12</property>
-    <property name="margin_bottom">12</property>
-    <property name="icon_name">view-mirror-symbolic</property>
-    <property name="icon_size">3</property>
-  </object>
-  <object class="GtkImage" id="image-single-display">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
-    <property name="margin_start">12</property>
-    <property name="margin_end">12</property>
-    <property name="margin_top">12</property>
-    <property name="margin_bottom">12</property>
-    <property name="icon_name">video-single-display-symbolic</property>
-    <property name="icon_size">3</property>
-  </object>
   <object class="GtkStackSwitcher" id="stack_switcher">
-    <property name="visible">True</property>
     <property name="stack">stack</property>
   </object>
   <template class="CcDisplayPanel" parent="CcPanel">
-    <property name="visible">True</property>
-    <property name="can_focus">False</property>
+
+    <child>
+      <object class="GtkShortcutController" id="toplevel_shortcuts">
+        <property name="scope">global</property>
+        <property name="name">Display Panel Globals Shortcuts</property>
+        <child>
+          <object class="GtkShortcut" id="escape_shortcut">
+            <property name="trigger">Escape</property>
+            <property name="action">callback(on_toplevel_escape_pressed_cb)</property>
+          </object>
+        </child>
+      </object>
+    </child>
+
     <child>
       <object class="GtkStack" id="stack">
-        <property name="visible">True</property>
         <property name="transition-type">crossfade</property>
 
         <!-- Displays page -->
         <child>
-          <object class="GtkScrolledWindow">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="hscrollbar_policy">never</property>
-            <child>
-              <object class="GtkViewport">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="shadow_type">none</property>
+          <object class="GtkStackPage">
+            <property name="name">displays</property>
+            <property name="title" translatable="yes">Displays</property>
+            <property name="child">
+              <object class="GtkScrolledWindow">
+                <property name="hscrollbar_policy">never</property>
                 <child>
-                  <object class="HdyClamp">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="valign">start</property>
-                    <property name="margin_top">32</property>
-                    <property name="margin_bottom">32</property>
-                    <property name="margin_start">12</property>
-                    <property name="margin_end">12</property>
+                  <object class="GtkViewport">
                     <child>
-                      <object class="GtkBox">
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="hexpand">True</property>
-                        <property name="orientation">vertical</property>
-                        <property name="spacing">32</property>
+                      <object class="AdwClamp">
+                        <property name="valign">start</property>
+                        <property name="margin_top">32</property>
+                        <property name="margin_bottom">32</property>
+                        <property name="margin_start">12</property>
+                        <property name="margin_end">12</property>
                         <child>
-                          <object class="GtkFrame" id="config_type_switcher_frame">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">none</property>
+                          <object class="GtkBox">
+                            <property name="hexpand">True</property>
+                            <property name="orientation">vertical</property>
+                            <property name="spacing">32</property>
                             <child>
-                              <object class="GtkButtonBox">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="homogeneous">True</property>
-                                <property name="layout_style">expand</property>
+                              <object class="AdwPreferencesGroup" id="config_type_switcher_group">
+                                <property name="title" translatable="yes">Display Mode</property>
                                 <child>
-                                  <object class="GtkRadioButton" id="config_type_single">
-                                    <property name="label" translatable="yes">Single Display</property>
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="receives_default">False</property>
-                                    <property name="image">image-single-display</property>
-                                    <property name="always_show_image">True</property>
-                                    <property name="active">True</property>
-                                    <property name="draw_indicator">False</property>
-                                    <property name="group">config_type_join</property>
-                                    <signal name="toggled" handler="on_config_type_toggled_cb" 
swapped="yes"/>
-                                 </object>
-                                  <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">2</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkRadioButton" id="config_type_join">
-                                    <property name="label" translatable="yes">Join Displays</property>
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="receives_default">False</property>
-                                    <property name="image">image-join-displays</property>
-                                    <property name="always_show_image">True</property>
-                                    <property name="active">True</property>
-                                    <property name="draw_indicator">False</property>
-                                    <signal name="toggled" handler="on_config_type_toggled_cb" 
swapped="yes"/>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkRadioButton" id="config_type_mirror">
-                                    <property name="label" translatable="yes">Mirror</property>
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">True</property>
-                                    <property name="receives_default">False</property>
-                                    <property name="image">image-mirror</property>
-                                    <property name="always_show_image">True</property>
-                                    <property name="active">True</property>
-                                    <property name="draw_indicator">False</property>
-                                    <property name="group">config_type_join</property>
-                                    <signal name="toggled" handler="on_config_type_toggled_cb" 
swapped="yes"/>
+                                  <object class="GtkBox">
+                                    <property name="homogeneous">True</property>
+                                    <style>
+                                      <class name="linked" />
+                                    </style>
+                                    <child>
+                                      <object class="GtkToggleButton" id="config_type_join">
+                                        <property name="hexpand">True</property>
+                                        <property name="active">True</property>
+                                        <signal name="toggled" handler="on_config_type_toggled_cb" 
swapped="yes"/>
+                                        <child>
+                                          <object class="GtkBox">
+                                            <property name="halign">center</property>
+                                            <property name="spacing">6</property>
+                                            <child>
+                                              <object class="GtkImage">
+                                                <property name="margin_start">12</property>
+                                                <property name="margin_end">12</property>
+                                                <property name="margin_top">12</property>
+                                                <property name="margin_bottom">12</property>
+                                                <property 
name="icon_name">video-joined-displays-symbolic</property>
+                                                <property name="icon_size">large</property>
+                                              </object>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel">
+                                                <property name="label" translatable="yes">Join 
Displays</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkToggleButton" id="config_type_mirror">
+                                        <property name="hexpand">True</property>
+                                        <property name="group">config_type_join</property>
+                                        <signal name="toggled" handler="on_config_type_toggled_cb" 
swapped="yes"/>
+                                        <child>
+                                          <object class="GtkBox">
+                                            <property name="halign">center</property>
+                                            <property name="spacing">6</property>
+                                            <child>
+                                              <object class="GtkImage">
+                                                <property name="margin_start">12</property>
+                                                <property name="margin_end">12</property>
+                                                <property name="margin_top">12</property>
+                                                <property name="margin_bottom">12</property>
+                                                <property name="icon_name">view-mirror-symbolic</property>
+                                                <property name="icon_size">large</property>
+                                              </object>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel">
+                                                <property name="label" translatable="yes">Mirror</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                        </child>
+                                      </object>
+                                    </child>
+                                    <child>
+                                      <object class="GtkToggleButton" id="config_type_single">
+                                        <property name="hexpand">True</property>
+                                        <property name="group">config_type_join</property>
+                                        <signal name="toggled" handler="on_config_type_toggled_cb" 
swapped="yes"/>
+                                        <child>
+                                          <object class="GtkBox">
+                                            <property name="halign">center</property>
+                                            <property name="spacing">6</property>
+                                            <child>
+                                              <object class="GtkImage">
+                                                <property name="margin_start">12</property>
+                                                <property name="margin_end">12</property>
+                                                <property name="margin_top">12</property>
+                                                <property name="margin_bottom">12</property>
+                                                <property 
name="icon_name">video-single-display-symbolic</property>
+                                                <property name="icon_size">large</property>
+                                              </object>
+                                            </child>
+                                            <child>
+                                              <object class="GtkLabel">
+                                                <property name="label" translatable="yes">Single 
Display</property>
+                                              </object>
+                                            </child>
+                                          </object>
+                                        </child>
+                                     </object>
+                                    </child>
                                   </object>
-                                  <packing>
-                                    <property name="expand">True</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">1</property>
-                                  </packing>
                                 </child>
                               </object>
                             </child>
-                            <child type="label">
-                              <object class="GtkLabel">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="halign">start</property>
-                                <property name="margin_bottom">12</property>
-                                <property name="label" translatable="yes">Display Mode</property>
-                                <attributes>
-                                  <attribute name="weight" value="bold"/>
-                                </attributes>
-                              </object>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkFrame" id="arrangement_frame">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label_xalign">0</property>
-                            <property name="label_yalign">1</property>
-                            <property name="shadow_type">none</property>
                             <child>
-                              <object class="GtkBox">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="orientation">vertical</property>
-                                <property name="spacing">12</property>
+                              <object class="AdwPreferencesGroup" id="arrangement_group">
+                                <property name="description" translatable="yes">Drag displays to match your 
physical display setup. Select a display to change its settings.</property>
                                 <child>
-                                  <object class="GtkFrame">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="label_xalign">0</property>
-                                    <property name="shadow_type">in</property>
+                                  <object class="GtkBox">
+                                    <property name="orientation">vertical</property>
+                                    <property name="spacing">12</property>
                                     <child>
-                                      <object class="GtkAlignment" id="arrangement_bin">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
+                                      <object class="GtkFrame">
                                         <child>
-                                          <placeholder/>
+                                          <object class="AdwBin" id="arrangement_bin" />
                                         </child>
+                                        <style>
+                                          <class name="view"/>
+                                        </style>
                                       </object>
                                     </child>
-                                    <child type="label_item">
-                                      <placeholder/>
-                                    </child>
-                                    <style>
-                                      <class name="view"/>
-                                    </style>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
-                                </child>
-                                <child>
-                                  <object class="GtkFrame">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="label_xalign">0</property>
-                                    <property name="shadow_type">in</property>
                                     <child>
-                                      <object class="GtkListBox">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                        <property name="selection_mode">none</property>
+                                      <object class="GtkFrame">
                                         <child>
-                                          <object class="HdyComboRow" id="primary_display_row">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="subtitle" translatable="yes">Contains top bar 
and Activities</property>
-                                            <property name="title" translatable="yes">Primary 
Display</property>
-                                            <signal name="notify::selected-index" 
handler="on_primary_display_selected_index_changed_cb" swapped="yes"/>
+                                          <object class="GtkListBox">
+                                            <property name="selection_mode">none</property>
+                                            <child>
+                                              <object class="AdwComboRow" id="primary_display_row">
+                                                <property name="subtitle" translatable="yes">Contains top 
bar and Activities</property>
+                                                <property name="title" translatable="yes">Primary 
Display</property>
+                                                <signal name="notify::selected-index" 
handler="on_primary_display_selected_index_changed_cb" swapped="yes"/>
+                                              </object>
+                                            </child>
                                           </object>
                                         </child>
                                       </object>
                                     </child>
-                                    <child type="label_item">
-                                      <placeholder/>
-                                    </child>
                                   </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">1</property>
-                                  </packing>
                                 </child>
+                                <accessibility>
+                                  <property name="label" translatable="yes">Display Arrangement</property>
+                                </accessibility>
                               </object>
                             </child>
-                            <child type="label">
-                              <object class="GtkLabel">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">Drag displays to match your 
physical display setup. Select a display to change its settings.</property>
-                                <property name="wrap">True</property>
-                                <property name="margin_bottom">12</property>
-                              </object>
-                            </child>
-                            <child internal-child="accessible">
-                              <object class="AtkObject" id="frame_arrangement-atkobject">
-                                <property name="AtkObject::accessible-name" translatable="yes">Display 
Arrangement</property>
-                              </object>
-                            </child>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkFrame">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="label_xalign">0</property>
-                            <property name="shadow_type">none</property>
                             <child>
                               <object class="GtkBox">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
                                 <property name="orientation">vertical</property>
                                 <property name="spacing">12</property>
                                 <child>
                                   <object class="GtkStack" id="output_selection_stack">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
                                     <property name="hhomogeneous">False</property>
                                     <property name="vhomogeneous">False</property>
                                     <child>
                                       <object class="GtkLabel" id="current_output_label">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
                                         <property name="halign">start</property>
                                         <attributes>
                                           <attribute name="weight" value="bold"/>
@@ -286,170 +199,88 @@
                                       </object>
                                     </child>
                                     <child>
-                                      <object class="GtkButtonBox" id="output_selection_two_buttonbox">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                        <property name="layout_style">expand</property>
+                                      <object class="GtkBox" id="output_selection_two_buttonbox">
+                                        <style>
+                                          <class name="linked" />
+                                        </style>
                                         <child>
-                                          <object class="GtkRadioButton" id="output_selection_two_first">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="receives_default">False</property>
-                                            <property name="draw_indicator">False</property>
+                                          <object class="GtkToggleButton" id="output_selection_two_first">
+                                            <property name="hexpand">True</property>
                                             <property name="group">output_selection_two_second</property>
                                             <signal name="toggled" 
handler="on_output_selection_two_toggled_cb" swapped="yes"/>
                                          </object>
-                                          <packing>
-                                            <property name="expand">True</property>
-                                            <property name="fill">True</property>
-                                            <property name="position">0</property>
-                                          </packing>
                                         </child>
                                         <child>
-                                          <object class="GtkRadioButton" id="output_selection_two_second">
+                                          <object class="GtkToggleButton" id="output_selection_two_second">
+                                            <property name="hexpand">True</property>
                                             <property name="label" translatable="yes">Join 
Displays</property>
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
-                                            <property name="receives_default">False</property>
-                                            <property name="draw_indicator">False</property>
                                             <signal name="toggled" 
handler="on_output_selection_two_toggled_cb" swapped="yes"/>
                                           </object>
-                                          <packing>
-                                            <property name="expand">True</property>
-                                            <property name="fill">True</property>
-                                            <property name="position">1</property>
-                                          </packing>
                                         </child>
                                       </object>
                                     </child>
                                     <child>
                                       <object class="GtkBox" id="multi_selection_box">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
                                         <child>
                                           <object class="GtkComboBox" id="output_selection_combo">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">False</property>
                                             <property name="halign">start</property>
                                             <property name="hexpand">True</property>
                                             <signal name="changed" 
handler="on_output_selection_combo_changed_cb" swapped="yes"/>
                                           </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="fill">True</property>
-                                            <property name="position">0</property>
-                                          </packing>
                                         </child>
                                         <child>
                                           <object class="GtkSwitch" id="output_enabled_switch">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">True</property>
                                             <property name="halign">end</property>
                                             <property name="valign">center</property>
                                             <signal name="notify::active" 
handler="on_output_enabled_active_changed_cb" swapped="yes"/>
-                                          </object>
-                                          <packing>
-                                            <property name="expand">False</property>
-                                            <property name="fill">True</property>
-                                            <property name="position">1</property>
-                                          </packing>
+                                          </object>>
                                         </child>
                                       </object>
                                     </child>
                                     <child>
                                       <object class="GtkFrame">
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">False</property>
-                                        <property name="label_xalign">0</property>
-                                        <property name="shadow_type">in</property>
                                         <child>
                                           <object class="GtkListBox">
-                                            <property name="visible">True</property>
-                                            <property name="can_focus">False</property>
                                             <property name="selection_mode">none</property>
                                             <child>
-                                              <object class="HdyComboRow">
-                                                <property name="visible">True</property>
-                                                <property name="can_focus">True</property>
+                                              <object class="AdwComboRow">
                                                 <property name="title" translatable="yes">Active 
Display</property>
                                               </object>
                                             </child>
                                           </object>
                                         </child>
-                                        <child type="label_item">
-                                          <placeholder/>
-                                        </child>
                                       </object>
-                                      <packing>
-                                        <property name="name">single-select</property>
-                                        <property name="position">3</property>
-                                      </packing>
                                     </child>
                                   </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">0</property>
-                                  </packing>
                                 </child>
                                 <child>
-                                  <object class="GtkFrame" id="display_settings_frame">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="label_xalign">0</property>
-                                    <property name="shadow_type">in</property>
-                                    <child>
-                                      <placeholder/>
-                                    </child>
-                                    <child type="label_item">
-                                      <placeholder/>
-                                    </child>
-                                  </object>
-                                  <packing>
-                                    <property name="expand">False</property>
-                                    <property name="fill">True</property>
-                                    <property name="position">1</property>
-                                  </packing>
+                                  <object class="AdwBin" id="display_settings_bin" />
                                 </child>
-                              </object>
-                            </child>
-                            <child type="label_item">
-                              <placeholder/>
-                            </child>
-                            <child internal-child="accessible">
-                              <object class="AtkObject">
-                                <property name="AtkObject::accessible-name" translatable="yes">Display 
Configuration</property>
+                                <accessibility>
+                                  <property name="label" translatable="yes">Display Configuration</property>
+                                </accessibility>
                               </object>
                             </child>
                           </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">True</property>
-                            <property name="position">2</property>
-                          </packing>
                         </child>
                       </object>
                     </child>
                   </object>
                 </child>
               </object>
-            </child>
+            </property>
           </object>
-          <packing>
-            <property name="name">displays</property>
-            <property name="title" translatable="yes">Displays</property>
-          </packing>
         </child>
 
         <!-- Night Light page -->
         <child>
-          <object class="CcNightLightPage" id="night_light_page">
-            <property name="visible">True</property>
-          </object>
-          <packing>
+          <object class="GtkStackPage">
             <property name="name">night-light</property>
             <property name="title" translatable="yes" comments="This is the redshift functionality where we 
suppress blue light when the sun has gone down">Night Light</property>
-          </packing>
+            <property name="child">
+              <object class="CcNightLightPage" id="night_light_page" />
+            </property>
+          </object>
         </child>
 
       </object>
diff --git a/panels/display/cc-display-settings.c b/panels/display/cc-display-settings.c
index efda19473..2d83972f2 100644
--- a/panels/display/cc-display-settings.c
+++ b/panels/display/cc-display-settings.c
@@ -20,11 +20,9 @@
  */
 
 #include <float.h>
-#include <handy.h>
 #include <glib/gi18n.h>
 #include <float.h>
 #include <math.h>
-#include "list-box-helper.h"
 #include "cc-display-settings.h"
 #include "cc-display-config.h"
 
@@ -32,7 +30,7 @@
 
 struct _CcDisplaySettings
 {
-  GtkDrawingArea    object;
+  AdwBin            object;
 
   gboolean          updating;
   gboolean          num_scales;
@@ -43,10 +41,10 @@ struct _CcDisplaySettings
   CcDisplayConfig  *config;
   CcDisplayMonitor *selected_output;
 
-  GListStore       *orientation_list;
+  GListModel       *orientation_list;
   GListStore       *refresh_rate_list;
   GListStore       *resolution_list;
-  GListStore       *scale_list;
+  GListModel       *scale_list;
 
   GtkWidget        *orientation_row;
   GtkWidget        *refresh_rate_row;
@@ -68,7 +66,7 @@ enum {
   PROP_LAST
 };
 
-G_DEFINE_TYPE (CcDisplaySettings, cc_display_settings, GTK_TYPE_LIST_BOX)
+G_DEFINE_TYPE (CcDisplaySettings, cc_display_settings, ADW_TYPE_BIN)
 
 static GParamSpec *props[PROP_LAST];
 
@@ -170,15 +168,22 @@ make_aspect_string (gint width,
   return aspect;
 }
 
-static char *
+static gchar *
+make_refresh_rate_string (CcDisplayMode *mode)
+{
+  return g_strdup_printf (_("%.2lf Hz"), cc_display_mode_get_freq_f (mode));
+}
+
+static gchar *
 make_resolution_string (CcDisplayMode *mode)
 {
-  const char *interlaced = cc_display_mode_is_interlaced (mode) ? "i" : "";
+  const char *interlaced;
   const char *aspect;
   int width, height;
 
   cc_display_mode_get_resolution (mode, &width, &height);
   aspect = make_aspect_string (width, height);
+  interlaced = cc_display_mode_is_interlaced (mode) ? "i" : "";
 
   if (aspect != NULL)
     return g_strdup_printf ("%d × %d%s (%s)", width, height, interlaced, aspect);
@@ -186,12 +191,6 @@ make_resolution_string (CcDisplayMode *mode)
     return g_strdup_printf ("%d × %d%s", width, height, interlaced);
 }
 
-static gchar *
-get_frequency_string (CcDisplayMode *mode)
-{
-  return g_strdup_printf (_("%.2lf Hz"), cc_display_mode_get_freq_f (mode));
-}
-
 static double
 round_scale_for_ui (double scale)
 {
@@ -232,11 +231,12 @@ sort_modes_by_freq_desc (CcDisplayMode *a, CcDisplayMode *b)
 static gboolean
 cc_display_settings_rebuild_ui (CcDisplaySettings *self)
 {
+  GtkWidget *child;
   GList *modes;
   GList *item;
   gint width, height;
   CcDisplayMode *current_mode;
-  GtkRadioButton *group = NULL;
+  GtkToggleButton *group = NULL;
   g_autoptr(GArray) scales = NULL;
   gint i;
 
@@ -283,21 +283,25 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
 
       gtk_widget_set_visible (self->orientation_row, TRUE);
 
-      g_list_store_remove_all (self->orientation_list);
+      gtk_string_list_splice (GTK_STRING_LIST (self->orientation_list),
+                              0,
+                              g_list_model_get_n_items (self->orientation_list),
+                              NULL);
       for (i = 0; i < G_N_ELEMENTS (rotations); i++)
         {
-          g_autoptr(HdyValueObject) obj = NULL;
+          g_autoptr(GObject) obj = NULL;
 
           if (!cc_display_monitor_supports_rotation (self->selected_output, rotations[i]))
             continue;
 
-          obj = hdy_value_object_new_collect (G_TYPE_STRING, string_for_rotation (rotations[i]));
-          g_list_store_append (self->orientation_list, obj);
+          gtk_string_list_append (GTK_STRING_LIST (self->orientation_list),
+                                  string_for_rotation (rotations[i]));
+          obj = g_list_model_get_item (self->orientation_list, i);
           g_object_set_data (G_OBJECT (obj), "rotation-value", GINT_TO_POINTER (rotations[i]));
 
           if (cc_display_monitor_get_rotation (self->selected_output) == rotations[i])
-            hdy_combo_row_set_selected_index (HDY_COMBO_ROW (self->orientation_row),
-                                              g_list_model_get_n_items (G_LIST_MODEL 
(self->orientation_list)) - 1);
+            adw_combo_row_set_selected (ADW_COMBO_ROW (self->orientation_row),
+                                        g_list_model_get_n_items (G_LIST_MODEL (self->orientation_list)) - 
1);
         }
     }
   else
@@ -335,7 +339,7 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
                                             (GCompareDataFunc) sort_modes_by_freq_desc,
                                             NULL);
           if (freq == cc_display_mode_get_freq_f (mode))
-            hdy_combo_row_set_selected_index (HDY_COMBO_ROW (self->refresh_rate_row), new);
+            adw_combo_row_set_selected (ADW_COMBO_ROW (self->refresh_rate_row), new);
         }
 
       /* Show if we have more than one frequency to choose from. */
@@ -357,7 +361,7 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
 
   g_list_store_remove_all (self->resolution_list);
   g_list_store_append (self->resolution_list, current_mode);
-  hdy_combo_row_set_selected_index (HDY_COMBO_ROW (self->resolution_row), 0);
+  adw_combo_row_set_selected (ADW_COMBO_ROW (self->resolution_row), 0);
   for (item = modes; item != NULL; item = item->next)
     {
       gint ins;
@@ -393,14 +397,19 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
 
 
   /* Scale row is usually shown. */
-  gtk_container_foreach (GTK_CONTAINER (self->scale_bbox), (GtkCallback) gtk_widget_destroy, NULL);
-  g_list_store_remove_all (self->scale_list);
+  while ((child = gtk_widget_get_first_child (self->scale_bbox)) != NULL)
+    gtk_box_remove (GTK_BOX (self->scale_bbox), child);
+
+  gtk_string_list_splice (GTK_STRING_LIST (self->scale_list),
+                          0,
+                          g_list_model_get_n_items (self->scale_list),
+                          NULL);
   scales = cc_display_mode_get_supported_scales (current_mode);
   self->num_scales = scales->len;
   for (i = 0; i < scales->len; i++)
     {
       g_autofree gchar *scale_str = NULL;
-      g_autoptr(HdyValueObject) value_object = NULL;
+      g_autoptr(GObject) value_object = NULL;
       double scale = g_array_index (scales, double, i);
       GtkWidget *scale_btn;
       gboolean is_selected;
@@ -410,24 +419,23 @@ cc_display_settings_rebuild_ui (CcDisplaySettings *self)
       is_selected = G_APPROX_VALUE (cc_display_monitor_get_scale (self->selected_output),
                                     scale, DBL_EPSILON);
 
-      value_object = hdy_value_object_new_collect (G_TYPE_STRING, scale_str);
-      g_list_store_append (self->scale_list, value_object);
+      gtk_string_list_append (GTK_STRING_LIST (self->scale_list), scale_str);
+      value_object = g_list_model_get_item (self->scale_list, i);
       g_object_set_data_full (G_OBJECT (value_object), "scale",
                               g_memdup2 (&scale, sizeof (double)), g_free);
       if (is_selected)
-        hdy_combo_row_set_selected_index (HDY_COMBO_ROW (self->scale_combo_row),
-                                          g_list_model_get_n_items (G_LIST_MODEL (self->scale_list)) - 1);
+        adw_combo_row_set_selected (ADW_COMBO_ROW (self->scale_combo_row),
+                                    g_list_model_get_n_items (G_LIST_MODEL (self->scale_list)) - 1);
 
       /* ButtonBox */
-      scale_btn = gtk_radio_button_new_with_label_from_widget (group, scale_str);
+      scale_btn = gtk_toggle_button_new_with_label (scale_str);
+      gtk_toggle_button_set_group (GTK_TOGGLE_BUTTON (scale_btn), group);
       g_object_set_data_full (G_OBJECT (scale_btn), "scale",
                               g_memdup2 (&scale, sizeof (double)), g_free);
 
       if (!group)
-        group = GTK_RADIO_BUTTON (scale_btn);
-      gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (scale_btn), FALSE);
-      gtk_widget_show (scale_btn);
-      gtk_container_add (GTK_CONTAINER (self->scale_bbox), scale_btn);
+        group = GTK_TOGGLE_BUTTON (scale_btn);
+      gtk_box_append (GTK_BOX (self->scale_bbox), scale_btn);
       /* Set active before connecting the signal */
       if (is_selected)
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (scale_btn), TRUE);
@@ -476,14 +484,17 @@ on_orientation_selection_changed_cb (GtkWidget         *widget,
                                      CcDisplaySettings *self)
 {
   gint idx;
-  g_autoptr(HdyValueObject) obj = NULL;
+  g_autoptr(GObject) obj = NULL;
 
   if (self->updating)
     return;
 
-  idx = hdy_combo_row_get_selected_index (HDY_COMBO_ROW (self->orientation_row));
+  idx = adw_combo_row_get_selected (ADW_COMBO_ROW (self->orientation_row));
   obj = g_list_model_get_item (G_LIST_MODEL (self->orientation_list), idx);
 
+  if (!obj)
+    return;
+
   cc_display_monitor_set_rotation (self->selected_output,
                                    GPOINTER_TO_INT (g_object_get_data (G_OBJECT (obj), "rotation-value")));
 
@@ -501,9 +512,12 @@ on_refresh_rate_selection_changed_cb (GtkWidget         *widget,
   if (self->updating)
     return;
 
-  idx = hdy_combo_row_get_selected_index (HDY_COMBO_ROW (self->refresh_rate_row));
+  idx = adw_combo_row_get_selected (ADW_COMBO_ROW (self->refresh_rate_row));
   mode = g_list_model_get_item (G_LIST_MODEL (self->refresh_rate_list), idx);
 
+  if (!mode)
+    return;
+
   cc_display_monitor_set_mode (self->selected_output, mode);
 
   g_signal_emit_by_name (G_OBJECT (self), "updated", self->selected_output);
@@ -520,9 +534,12 @@ on_resolution_selection_changed_cb (GtkWidget         *widget,
   if (self->updating)
     return;
 
-  idx = hdy_combo_row_get_selected_index (HDY_COMBO_ROW (self->resolution_row));
+  idx = adw_combo_row_get_selected (ADW_COMBO_ROW (self->resolution_row));
   mode = g_list_model_get_item (G_LIST_MODEL (self->resolution_list), idx);
 
+  if (!mode)
+    return;
+
   /* This is the only row that can be changed when in cloning mode. */
   if (!cc_display_config_is_cloning (self->config))
     cc_display_monitor_set_mode (self->selected_output, mode);
@@ -558,13 +575,15 @@ on_scale_selection_changed_cb (GtkWidget         *widget,
 {
   int idx;
   double scale;
-  g_autoptr(HdyValueObject) obj = NULL;
+  g_autoptr(GObject) obj = NULL;
 
   if (self->updating)
     return;
 
-  idx = hdy_combo_row_get_selected_index (HDY_COMBO_ROW (self->scale_combo_row));
+  idx = adw_combo_row_get_selected (ADW_COMBO_ROW (self->scale_combo_row));
   obj = g_list_model_get_item (G_LIST_MODEL (self->scale_list), idx);
+  if (!obj)
+    return;
   scale = *(gdouble*) g_object_get_data (G_OBJECT (obj), "scale");
 
   cc_display_monitor_set_scale (self->selected_output, scale);
@@ -718,35 +737,37 @@ cc_display_settings_class_init (CcDisplaySettingsClass *klass)
 static void
 cc_display_settings_init (CcDisplaySettings *self)
 {
-  gtk_widget_init_template (GTK_WIDGET (self));
+  GtkExpression *expression;
 
-  gtk_list_box_set_header_func (GTK_LIST_BOX (self),
-                                cc_list_box_update_header_func,
-                                NULL, NULL);
+  gtk_widget_init_template (GTK_WIDGET (self));
 
-  self->orientation_list = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
+  self->orientation_list = G_LIST_MODEL (gtk_string_list_new (NULL));
   self->refresh_rate_list = g_list_store_new (CC_TYPE_DISPLAY_MODE);
   self->resolution_list = g_list_store_new (CC_TYPE_DISPLAY_MODE);
-  self->scale_list = g_list_store_new (HDY_TYPE_VALUE_OBJECT);
+  self->scale_list = G_LIST_MODEL (gtk_string_list_new (NULL));
 
   self->updating = TRUE;
 
-  hdy_combo_row_bind_name_model (HDY_COMBO_ROW (self->orientation_row),
-                                 G_LIST_MODEL (self->orientation_list),
-                                 (HdyComboRowGetNameFunc) hdy_value_object_dup_string,
-                                 NULL, NULL);
-  hdy_combo_row_bind_name_model (HDY_COMBO_ROW (self->refresh_rate_row),
-                                 G_LIST_MODEL (self->refresh_rate_list),
-                                 (HdyComboRowGetNameFunc) get_frequency_string,
-                                 NULL, NULL);
-  hdy_combo_row_bind_name_model (HDY_COMBO_ROW (self->resolution_row),
-                                 G_LIST_MODEL (self->resolution_list),
-                                 (HdyComboRowGetNameFunc) make_resolution_string,
-                                 NULL, NULL);
-  hdy_combo_row_bind_name_model (HDY_COMBO_ROW (self->scale_combo_row),
-                                 G_LIST_MODEL (self->scale_list),
-                                 (HdyComboRowGetNameFunc) hdy_value_object_dup_string,
-                                 NULL, NULL);
+  adw_combo_row_set_model (ADW_COMBO_ROW (self->orientation_row),
+                           G_LIST_MODEL (self->orientation_list));
+  adw_combo_row_set_model (ADW_COMBO_ROW (self->scale_combo_row),
+                           G_LIST_MODEL (self->scale_list));
+
+  expression = gtk_cclosure_expression_new (G_TYPE_STRING,
+                                            NULL, 0, NULL,
+                                            G_CALLBACK (make_refresh_rate_string),
+                                            self, NULL);
+  adw_combo_row_set_expression (ADW_COMBO_ROW (self->refresh_rate_row), expression);
+  adw_combo_row_set_model (ADW_COMBO_ROW (self->refresh_rate_row),
+                           G_LIST_MODEL (self->refresh_rate_list));
+
+  expression = gtk_cclosure_expression_new (G_TYPE_STRING,
+                                            NULL, 0, NULL,
+                                            G_CALLBACK (make_resolution_string),
+                                            self, NULL);
+  adw_combo_row_set_expression (ADW_COMBO_ROW (self->resolution_row), expression);
+  adw_combo_row_set_model (ADW_COMBO_ROW (self->resolution_row),
+                           G_LIST_MODEL (self->resolution_list));
 
   self->updating = FALSE;
 }
diff --git a/panels/display/cc-display-settings.h b/panels/display/cc-display-settings.h
index de3c88d48..2ed074861 100644
--- a/panels/display/cc-display-settings.h
+++ b/panels/display/cc-display-settings.h
@@ -20,13 +20,13 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 #include "cc-display-config.h"
 
 G_BEGIN_DECLS
 
 #define CC_TYPE_DISPLAY_SETTINGS cc_display_settings_get_type ()
-G_DECLARE_FINAL_TYPE (CcDisplaySettings, cc_display_settings, CC, DISPLAY_SETTINGS, GtkListBox);
+G_DECLARE_FINAL_TYPE (CcDisplaySettings, cc_display_settings, CC, DISPLAY_SETTINGS, AdwBin);
 
 CcDisplaySettings*  cc_display_settings_new                 (void);
 
diff --git a/panels/display/cc-display-settings.ui b/panels/display/cc-display-settings.ui
index 647e6838f..6bd157620 100644
--- a/panels/display/cc-display-settings.ui
+++ b/panels/display/cc-display-settings.ui
@@ -1,80 +1,70 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- Generated with glade 3.22.0 -->
 <interface>
-  <requires lib="gtk+" version="3.20"/>
-  <requires lib="libhandy" version="0.0"/>
-  <template class="CcDisplaySettings" parent="GtkListBox">
-    <property name="visible">True</property>
-    <property name="can_focus">True</property>
-    <property name="selection_mode">none</property>
+  <template class="CcDisplaySettings" parent="AdwBin">
     <child>
-      <object class="HdyComboRow" id="orientation_row">
-        <property name="width_request">100</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="title" translatable="yes" context="display setting">Orientation</property>
-        <signal name="notify::selected-index" handler="on_orientation_selection_changed_cb" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="HdyComboRow" id="resolution_row">
-        <property name="width_request">100</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="title" translatable="yes" context="display setting">Resolution</property>
-        <signal name="notify::selected-index" handler="on_resolution_selection_changed_cb" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="HdyComboRow" id="refresh_rate_row">
-        <property name="width_request">100</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="title" translatable="yes">Refresh Rate</property>
-        <signal name="notify::selected-index" handler="on_refresh_rate_selection_changed_cb" swapped="no"/>
-      </object>
-    </child>
-    <child>
-      <object class="HdyActionRow" id="underscanning_row">
-        <property name="width_request">100</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="title" translatable="yes">Adjust for TV</property>
+      <object class="GtkListBox" id="listbox">
+        <property name="selection_mode">none</property>
+        <style>
+          <class name="content" />
+        </style>
         <child>
-          <object class="GtkSwitch" id="underscanning_switch">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="halign">end</property>
-            <property name="valign">center</property>
-            <signal name="notify::active" handler="on_underscanning_switch_active_changed_cb" swapped="no"/>
+          <object class="AdwComboRow" id="orientation_row">
+            <property name="width_request">100</property>
+            <property name="title" translatable="yes" context="display setting">Orientation</property>
+            <signal name="notify::selected-item" handler="on_orientation_selection_changed_cb" swapped="no"/>
           </object>
         </child>
-      </object>
-    </child>
-    <child>
-      <object class="HdyActionRow" id="scale_buttons_row">
-        <property name="width_request">100</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="title" translatable="yes" context="display setting">Scale</property>
         <child>
-          <object class="GtkButtonBox" id="scale_bbox">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="halign">end</property>
-            <property name="valign">center</property>
-            <property name="layout_style">expand</property>
+          <object class="AdwComboRow" id="resolution_row">
+            <property name="width_request">100</property>
+            <property name="title" translatable="yes" context="display setting">Resolution</property>
+            <signal name="notify::selected-item" handler="on_resolution_selection_changed_cb" swapped="no"/>
+          </object>
+        </child>
+        <child>
+          <object class="AdwComboRow" id="refresh_rate_row">
+            <property name="width_request">100</property>
+            <property name="title" translatable="yes">Refresh Rate</property>
+            <signal name="notify::selected-item" handler="on_refresh_rate_selection_changed_cb" 
swapped="no"/>
+          </object>
+        </child>
+        <child>
+          <object class="AdwActionRow" id="underscanning_row">
+            <property name="width_request">100</property>
+            <property name="title" translatable="yes">Adjust for TV</property>
+            <child>
+              <object class="GtkSwitch" id="underscanning_switch">
+                <property name="can_focus">False</property>
+                <property name="halign">end</property>
+                <property name="valign">center</property>
+                <signal name="notify::active" handler="on_underscanning_switch_active_changed_cb" 
swapped="no"/>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="AdwActionRow" id="scale_buttons_row">
+            <property name="width_request">100</property>
+            <property name="title" translatable="yes" context="display setting">Scale</property>
+            <child>
+              <object class="GtkBox" id="scale_bbox">
+                <property name="halign">end</property>
+                <property name="valign">center</property>
+                <style>
+                  <class name="linked" />
+                </style>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="AdwComboRow" id="scale_combo_row">
+            <property name="width_request">100</property>
+            <property name="title" translatable="yes" context="display setting">Scale</property>
+            <signal name="notify::selected-item" handler="on_scale_selection_changed_cb" swapped="no"/>
           </object>
         </child>
-      </object>
-    </child>
-    <child>
-      <object class="HdyComboRow" id="scale_combo_row">
-        <property name="width_request">100</property>
-        <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="title" translatable="yes" context="display setting">Scale</property>
-        <signal name="notify::selected-index" handler="on_scale_selection_changed_cb" swapped="no"/>
       </object>
     </child>
   </template>
diff --git a/panels/display/cc-night-light-page.c b/panels/display/cc-night-light-page.c
index f51b0ba69..d1a992f65 100644
--- a/panels/display/cc-night-light-page.c
+++ b/panels/display/cc-night-light-page.c
@@ -26,12 +26,11 @@
 #include <math.h>
 
 #include "cc-night-light-page.h"
-#include "list-box-helper.h"
 
 #include "shell/cc-object-storage.h"
 
 struct _CcNightLightPage {
-  GtkBin               parent;
+  AdwBin               parent;
 
   GtkWidget           *box_manual;
   GtkButton           *button_from_am;
@@ -66,7 +65,7 @@ struct _CcNightLightPage {
   GDesktopClockFormat  clock_format;
 };
 
-G_DEFINE_TYPE (CcNightLightPage, cc_night_light_page, GTK_TYPE_BIN);
+G_DEFINE_TYPE (CcNightLightPage, cc_night_light_page, ADW_TYPE_BIN);
 
 #define CLOCK_SCHEMA     "org.gnome.desktop.interface"
 #define DISPLAY_SCHEMA   "org.gnome.settings-daemon.plugins.color"
@@ -438,7 +437,7 @@ dialog_format_minutes_combobox (GtkSpinButton    *spin,
   g_autofree gchar *text = NULL;
   adjustment = gtk_spin_button_get_adjustment (spin);
   text = g_strdup_printf ("%02.0f", gtk_adjustment_get_value (adjustment));
-  gtk_entry_set_text (GTK_ENTRY (spin), text);
+  gtk_editable_set_text (GTK_EDITABLE (spin), text);
   return TRUE;
 }
 
@@ -453,7 +452,7 @@ dialog_format_hours_combobox (GtkSpinButton      *spin,
     text = g_strdup_printf ("%.0f", gtk_adjustment_get_value (adjustment));
   else
     text = g_strdup_printf ("%02.0f", gtk_adjustment_get_value (adjustment));
-  gtk_entry_set_text (GTK_ENTRY (spin), text);
+  gtk_editable_set_text (GTK_EDITABLE (spin), text);
   return TRUE;
 }
 
@@ -620,8 +619,6 @@ cc_night_light_page_init (CcNightLightPage *self)
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  gtk_list_box_set_header_func (self->listbox, cc_list_box_update_header_func, NULL, NULL);
-
   gtk_scale_add_mark (GTK_SCALE (self->scale_color_temperature),
                       1700, GTK_POS_BOTTOM,
                       _("More Warm"));
@@ -669,9 +666,9 @@ cc_night_light_page_init (CcNightLightPage *self)
   /* use custom CSS */
   provider = gtk_css_provider_new ();
   gtk_css_provider_load_from_resource (provider, "/org/gnome/control-center/display/night-light.css");
-  gtk_style_context_add_provider_for_screen (gdk_screen_get_default (),
-                                             GTK_STYLE_PROVIDER (provider),
-                                             GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+  gtk_style_context_add_provider_for_display (gdk_display_get_default (),
+                                              GTK_STYLE_PROVIDER (provider),
+                                              GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
 
   cc_object_storage_create_dbus_proxy (G_BUS_TYPE_SESSION,
                                        G_DBUS_PROXY_FLAGS_NONE,
diff --git a/panels/display/cc-night-light-page.h b/panels/display/cc-night-light-page.h
index 79422bbcb..7e7be4bc1 100644
--- a/panels/display/cc-night-light-page.h
+++ b/panels/display/cc-night-light-page.h
@@ -20,12 +20,12 @@
 
 #pragma once
 
-#include <gtk/gtk.h>
+#include <adwaita.h>
 
 G_BEGIN_DECLS
 
 #define CC_TYPE_NIGHT_LIGHT_PAGE (cc_night_light_page_get_type ())
-G_DECLARE_FINAL_TYPE (CcNightLightPage, cc_night_light_page, CC, NIGHT_LIGHT_PAGE, GtkBin)
+G_DECLARE_FINAL_TYPE (CcNightLightPage, cc_night_light_page, CC, NIGHT_LIGHT_PAGE, AdwBin)
 
 CcNightLightPage* cc_night_light_page_new (void);
 
diff --git a/panels/display/cc-night-light-page.ui b/panels/display/cc-night-light-page.ui
index 02b14f731..9e69c3438 100644
--- a/panels/display/cc-night-light-page.ui
+++ b/panels/display/cc-night-light-page.ui
@@ -1,62 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="CcNightLightPage" parent="GtkBin">
-    <property name="can_focus">False</property>
+  <template class="CcNightLightPage" parent="AdwBin">
     <child>
       <object class="GtkBox">
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
         <property name="halign">center</property>
         <property name="valign">start</property>
         <property name="orientation">vertical</property>
         <child>
           <object class="GtkInfoBar" id="infobar_disabled">
             <property name="name">infobar_disabled</property>
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="border_width">0</property>
-            <property name="orientation">vertical</property>
-            <property name="spacing">12</property>
-            <child internal-child="action_area">
-              <object class="GtkButtonBox">
-                <property name="can_focus">False</property>
-                <property name="border_width">12</property>
-                <property name="spacing">6</property>
-                <property name="layout_style">end</property>
-                <child>
-                  <object class="GtkButton" id="button_undisable">
-                    <property name="label" translatable="yes" comments="This cancels the redshift 
inhibit.">Restart Filter</property>
-                    <property name="name">button_undisable</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">True</property>
-                    <signal name="clicked" handler="dialog_undisable_clicked_cb" object="CcNightLightPage" 
swapped="no" />
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">False</property>
-                    <property name="pack_type">end</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">False</property>
-                <property name="pack_type">end</property>
-                <property name="position">0</property>
-              </packing>
-            </child>
-            <child internal-child="content_area">
+            <child>
               <object class="GtkBox">
-                <property name="can_focus">False</property>
+                <property name="hexpand">True</property>
                 <property name="spacing">16</property>
                 <child>
                   <object class="GtkLabel">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
                     <property name="halign">start</property>
-                    <property name="margin_left">12</property>
+                    <property name="margin-start">12</property>
                     <property name="hexpand">False</property>
                     <property name="label" translatable="yes" comments="Inhibit the redshift functionality 
until the next day starts">Temporarily Disabled Until Tomorrow</property>
                     <attributes>
@@ -66,13 +26,24 @@
                 </child>
               </object>
             </child>
+            <child>
+              <object class="GtkButton" id="button_undisable">
+                <property name="margin-top">12</property>
+                <property name="margin-bottom">12</property>
+                <property name="margin-start">12</property>
+                <property name="margin-end">12</property>
+                <property name="label" translatable="yes" comments="This cancels the redshift 
inhibit.">Restart Filter</property>
+                <property name="name">button_undisable</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="clicked" handler="dialog_undisable_clicked_cb" object="CcNightLightPage" 
swapped="no" />
+              </object>
+            </child>
           </object>
         </child>
 
         <child>
           <object class="GtkBox">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
             <property name="margin_top">30</property>
             <property name="margin_end">12</property>
             <property name="margin_start">12</property>
@@ -81,8 +52,6 @@
             <property name="spacing">26</property>
             <child>
               <object class="GtkLabel">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
                 <property name="halign">start</property>
                 <property name="valign">start</property>
                 <property name="label" translatable="yes">Night light makes the screen color warmer. This 
can help to prevent eye strain and sleeplessness.</property>
@@ -95,269 +64,227 @@
               </object>
             </child>
             <child>
-              <object class="GtkFrame">
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
+              <object class="GtkListBox" id="listbox">
+                <property name="selection-mode">none</property>
+
+                <style>
+                  <class name="content" />
+                </style>
+
+                <!-- Night Light -->
                 <child>
-                  <object class="GtkListBox" id="listbox">
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="selection-mode">none</property>
+                  <object class="AdwActionRow">
+                    <property name="title" translatable="yes">Night Light</property>
+                    <property name="activatable-widget">night_light_toggle_switch</property>
 
-                    <!-- Night Light -->
                     <child>
-                      <object class="HdyActionRow">
-                        <property name="visible">True</property>
-                        <property name="title" translatable="yes">Night Light</property>
-                        <property name="activatable-widget">night_light_toggle_switch</property>
-
-                        <child>
-                          <object class="GtkSwitch" id="night_light_toggle_switch">
-                            <property name="visible">True</property>
-                            <property name="valign">center</property>
-                          </object>
-                        </child>
+                      <object class="GtkSwitch" id="night_light_toggle_switch">
+                        <property name="valign">center</property>
                       </object>
                     </child>
+                  </object>
+                </child>
 
-                    <!-- Schedule -->
-                    <child>
-                      <object class="HdyActionRow">
-                        <property name="visible">True</property>
-                        <property name="title" translatable="yes">Schedule</property>
-                        <property name="sensitive" bind-source="night_light_toggle_switch" 
bind-property="active" bind-flags="default|sync-create" />
+                <!-- Schedule -->
+                <child>
+                  <object class="AdwActionRow">
+                    <property name="title" translatable="yes">Schedule</property>
+                    <property name="sensitive" bind-source="night_light_toggle_switch" 
bind-property="active" bind-flags="default|sync-create" />
 
-                        <child>
-                          <object class="GtkComboBoxText" id="schedule_type_combo">
-                            <property name="visible">True</property>
-                            <property name="valign">center</property>
-                            <signal name="notify::active" handler="on_schedule_type_combo_active_changed_cb" 
object="CcNightLightPage" swapped="no" />
-                            <items>
-                              <item translatable="yes" id="automatic">Sunset to Sunrise</item>
-                              <item translatable="yes" id="manual">Manual Schedule</item>
-                            </items>
-                          </object>
-                        </child>
+                    <child>
+                      <object class="GtkComboBoxText" id="schedule_type_combo">
+                        <property name="valign">center</property>
+                        <signal name="notify::active" handler="on_schedule_type_combo_active_changed_cb" 
object="CcNightLightPage" swapped="no" />
+                        <items>
+                          <item translatable="yes" id="automatic">Sunset to Sunrise</item>
+                          <item translatable="yes" id="manual">Manual Schedule</item>
+                        </items>
                       </object>
                     </child>
+                  </object>
+                </child>
 
-                    <!-- Time -->
-                    <child>
-                      <object class="HdyActionRow">
-                        <property name="visible">True</property>
-                        <property name="title" translatable="yes">Times</property>
-                        <property name="sensitive" bind-source="night_light_toggle_switch" 
bind-property="active" bind-flags="default|sync-create" />
+                <!-- Time -->
+                <child>
+                  <object class="AdwActionRow">
+                    <property name="title" translatable="yes">Times</property>
+                    <property name="sensitive" bind-source="night_light_toggle_switch" 
bind-property="active" bind-flags="default|sync-create" />
 
+                    <child>
+                      <object class="GtkBox" id="box_manual">
+                        <property name="spacing">6</property>
+                        <property name="margin-top">12</property>
+                        <property name="margin-bottom">12</property>
+                        <style>
+                          <class name="time-widget" />
+                        </style>
                         <child>
-                          <object class="GtkBox" id="box_manual">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="spacing">6</property>
-                            <property name="margin-top">12</property>
-                            <property name="margin-bottom">12</property>
+                          <object class="GtkLabel">
+                            <property name="label" translatable="yes">From</property>
+                            <property name="mnemonic_widget">spinbutton_from_hours</property>
                             <style>
-                              <class name="time-widget" />
+                              <class name="dim-label"/>
                             </style>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkBox">
+                            <property name="spacing">4</property>
+                            <child>
+                              <object class="GtkSpinButton" id="spinbutton_from_hours">
+                                <property name="can_focus">True</property>
+                                <property name="max_width_chars">2</property>
+                                <property name="text">4</property>
+                                <property name="orientation">vertical</property>
+                                <property name="adjustment">adjustment_from_hours</property>
+                                <property name="numeric">True</property>
+                                <property name="wrap">True</property>
+                                <property name="value">4</property>
+                                <signal name="output" handler="dialog_format_hours_combobox" 
object="CcNightLightPage" swapped="no" />
+                                <style>
+                                  <class name="padded-spinbutton"/>
+                                </style>
+                                <accessibility>
+                                  <property name="description" translatable="yes">Hour</property>
+                                </accessibility>
+                              </object>
+                            </child>
                             <child>
                               <object class="GtkLabel">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="label" translatable="yes">From</property>
-                                <property name="mnemonic_widget">spinbutton_from_hours</property>
+                                <property name="label" translatable="yes">:</property>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkSpinButton" id="spinbutton_from_minutes">
+                                <property name="can_focus">True</property>
+                                <property name="max_width_chars">2</property>
+                                <property name="text">0</property>
+                                <property name="orientation">vertical</property>
+                                <property name="adjustment">adjustment_from_minutes</property>
+                                <property name="numeric">True</property>
+                                <property name="wrap">True</property>
+                                <signal name="output" handler="dialog_format_minutes_combobox" 
object="CcNightLightPage" swapped="no" />
                                 <style>
-                                  <class name="dim-label"/>
+                                  <class name="padded-spinbutton"/>
                                 </style>
+                                <accessibility>
+                                  <property name="description" translatable="yes">Minute</property>
+                                </accessibility>
                               </object>
                             </child>
                             <child>
-                              <object class="GtkBox">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="spacing">4</property>
+                              <object class="GtkStack" id="stack_from">
+                                <property name="hhomogeneous">False</property>
+                                <property name="vhomogeneous">False</property>
                                 <child>
-                                  <object class="GtkSpinButton" id="spinbutton_from_hours">
-                                    <property name="visible">True</property>
+                                  <object class="GtkButton" id="button_from_am">
+                                    <property name="label" translatable="yes" comments="This is the short 
form for the time period in the morning">AM</property>
                                     <property name="can_focus">True</property>
-                                    <property name="max_width_chars">2</property>
-                                    <property name="text">4</property>
-                                    <property name="orientation">vertical</property>
-                                    <property name="adjustment">adjustment_from_hours</property>
-                                    <property name="numeric">True</property>
-                                    <property name="wrap">True</property>
-                                    <property name="value">4</property>
-                                    <signal name="output" handler="dialog_format_hours_combobox" 
object="CcNightLightPage" swapped="no" />
+                                    <property name="receives_default">True</property>
+                                    <property name="valign">center</property>
+                                    <signal name="clicked" handler="dialog_am_pm_from_button_clicked_cb" 
object="CcNightLightPage" swapped="no" />
                                     <style>
-                                      <class name="padded-spinbutton"/>
+                                      <class name="unpadded-button"/>
                                     </style>
-                                    <child internal-child="accessible">
-                                      <object class="AtkObject" id="from_h_spinbutton-atkobject">
-                                        <property name="AtkObject::accessible-description" 
translatable="yes">Hour</property>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="label" translatable="yes">:</property>
                                   </object>
                                 </child>
                                 <child>
-                                  <object class="GtkSpinButton" id="spinbutton_from_minutes">
-                                    <property name="visible">True</property>
+                                  <object class="GtkButton" id="button_from_pm">
+                                    <property name="label" translatable="yes" comments="This is the short 
form for the time period in the afternoon">PM</property>
                                     <property name="can_focus">True</property>
-                                    <property name="max_width_chars">2</property>
-                                    <property name="text">0</property>
-                                    <property name="orientation">vertical</property>
-                                    <property name="adjustment">adjustment_from_minutes</property>
-                                    <property name="numeric">True</property>
-                                    <property name="wrap">True</property>
-                                    <signal name="output" handler="dialog_format_minutes_combobox" 
object="CcNightLightPage" swapped="no" />
+                                    <property name="receives_default">True</property>
+                                    <property name="valign">center</property>
+                                    <signal name="clicked" handler="dialog_am_pm_from_button_clicked_cb" 
object="CcNightLightPage" swapped="no" />
                                     <style>
-                                      <class name="padded-spinbutton"/>
+                                      <class name="unpadded-button"/>
                                     </style>
-                                    <child internal-child="accessible">
-                                      <object class="AtkObject" id="from_m_spinbutton-atkobject">
-                                        <property name="AtkObject::accessible-description" 
translatable="yes">Minute</property>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkStack" id="stack_from">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="homogeneous">False</property>
-                                    <child>
-                                      <object class="GtkButton" id="button_from_am">
-                                        <property name="label" translatable="yes" comments="This is the 
short form for the time period in the morning">AM</property>
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="receives_default">True</property>
-                                        <property name="valign">center</property>
-                                        <signal name="clicked" handler="dialog_am_pm_from_button_clicked_cb" 
object="CcNightLightPage" swapped="no" />
-                                        <style>
-                                          <class name="unpadded-button"/>
-                                        </style>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkButton" id="button_from_pm">
-                                        <property name="label" translatable="yes" comments="This is the 
short form for the time period in the afternoon">PM</property>
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="receives_default">True</property>
-                                        <property name="valign">center</property>
-                                        <signal name="clicked" handler="dialog_am_pm_from_button_clicked_cb" 
object="CcNightLightPage" swapped="no" />
-                                        <style>
-                                          <class name="unpadded-button"/>
-                                        </style>
-                                      </object>
-                                    </child>
                                   </object>
                                 </child>
                               </object>
                             </child>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkLabel">
+                            <property name="margin-start">6</property>
+                            <property name="label" translatable="yes">To</property>
+                            <property name="mnemonic_widget">spinbutton_to_hours</property>
+                            <style>
+                              <class name="dim-label"/>
+                            </style>
+                          </object>
+                        </child>
+                        <child>
+                          <object class="GtkBox">
+                            <property name="spacing">4</property>
+                            <child>
+                              <object class="GtkSpinButton" id="spinbutton_to_hours">
+                                <property name="can_focus">True</property>
+                                <property name="max_width_chars">2</property>
+                                <property name="text">4</property>
+                                <property name="orientation">vertical</property>
+                                <property name="adjustment">adjustment_to_hours</property>
+                                <property name="numeric">True</property>
+                                <property name="wrap">True</property>
+                                <property name="value">4</property>
+                                <signal name="output" handler="dialog_format_hours_combobox" 
object="CcNightLightPage" swapped="no" />
+                                <style>
+                                  <class name="padded-spinbutton"/>
+                                </style>
+                                <accessibility>
+                                  <property name="description" translatable="yes">Hour</property>
+                                </accessibility>
+                              </object>
+                            </child>
                             <child>
                               <object class="GtkLabel">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="margin-start">6</property>
-                                <property name="label" translatable="yes">To</property>
-                                <property name="mnemonic_widget">spinbutton_to_hours</property>
+                                <property name="label" translatable="yes">:</property>
+                              </object>
+                            </child>
+                            <child>
+                              <object class="GtkSpinButton" id="spinbutton_to_minutes">
+                                <property name="can_focus">True</property>
+                                <property name="max_width_chars">2</property>
+                                <property name="text">0</property>
+                                <property name="orientation">vertical</property>
+                                <property name="adjustment">adjustment_to_minutes</property>
+                                <property name="numeric">True</property>
+                                <property name="wrap">True</property>
+                                <signal name="output" handler="dialog_format_minutes_combobox" 
object="CcNightLightPage" swapped="no" />
                                 <style>
-                                  <class name="dim-label"/>
+                                  <class name="padded-spinbutton"/>
                                 </style>
+                                <accessibility>
+                                  <property name="description" translatable="yes">Minute</property>
+                                </accessibility>
                               </object>
                             </child>
                             <child>
-                              <object class="GtkBox">
-                                <property name="visible">True</property>
-                                <property name="can_focus">False</property>
-                                <property name="spacing">4</property>
+                              <object class="GtkStack" id="stack_to">
+                                <property name="hhomogeneous">False</property>
+                                <property name="vhomogeneous">False</property>
                                 <child>
-                                  <object class="GtkSpinButton" id="spinbutton_to_hours">
-                                    <property name="visible">True</property>
+                                  <object class="GtkButton" id="button_to_am">
+                                    <property name="label" translatable="yes">AM</property>
                                     <property name="can_focus">True</property>
-                                    <property name="max_width_chars">2</property>
-                                    <property name="text">4</property>
-                                    <property name="input_purpose">number</property>
-                                    <property name="orientation">vertical</property>
-                                    <property name="adjustment">adjustment_to_hours</property>
-                                    <property name="numeric">True</property>
-                                    <property name="wrap">True</property>
-                                    <property name="value">4</property>
-                                    <signal name="output" handler="dialog_format_hours_combobox" 
object="CcNightLightPage" swapped="no" />
+                                    <property name="receives_default">True</property>
+                                    <property name="valign">center</property>
+                                    <signal name="clicked" handler="dialog_am_pm_to_button_clicked_cb" 
object="CcNightLightPage" swapped="no" />
                                     <style>
-                                      <class name="padded-spinbutton"/>
+                                      <class name="unpadded-button"/>
                                     </style>
-                                    <child internal-child="accessible">
-                                      <object class="AtkObject" id="to_h_spinbutton-atkobject">
-                                        <property name="AtkObject::accessible-description" 
translatable="yes">Hour</property>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkLabel">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="label" translatable="yes">:</property>
                                   </object>
                                 </child>
                                 <child>
-                                  <object class="GtkSpinButton" id="spinbutton_to_minutes">
-                                    <property name="visible">True</property>
+                                  <object class="GtkButton" id="button_to_pm">
+                                    <property name="label" translatable="yes">PM</property>
                                     <property name="can_focus">True</property>
-                                    <property name="max_width_chars">2</property>
-                                    <property name="text">0</property>
-                                    <property name="orientation">vertical</property>
-                                    <property name="adjustment">adjustment_to_minutes</property>
-                                    <property name="numeric">True</property>
-                                    <property name="wrap">True</property>
-                                    <signal name="output" handler="dialog_format_minutes_combobox" 
object="CcNightLightPage" swapped="no" />
+                                    <property name="receives_default">True</property>
+                                    <property name="valign">center</property>
+                                    <signal name="clicked" handler="dialog_am_pm_to_button_clicked_cb" 
object="CcNightLightPage" swapped="no" />
                                     <style>
-                                      <class name="padded-spinbutton"/>
+                                      <class name="unpadded-button"/>
                                     </style>
-                                    <child internal-child="accessible">
-                                      <object class="AtkObject" id="to_m_spinbutton-atkobject">
-                                        <property name="AtkObject::accessible-description" 
translatable="yes">Minute</property>
-                                      </object>
-                                    </child>
-                                  </object>
-                                </child>
-                                <child>
-                                  <object class="GtkStack" id="stack_to">
-                                    <property name="visible">True</property>
-                                    <property name="can_focus">False</property>
-                                    <property name="homogeneous">False</property>
-                                    <child>
-                                      <object class="GtkButton" id="button_to_am">
-                                        <property name="label" translatable="yes">AM</property>
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="receives_default">True</property>
-                                        <property name="valign">center</property>
-                                        <signal name="clicked" handler="dialog_am_pm_to_button_clicked_cb" 
object="CcNightLightPage" swapped="no" />
-                                        <style>
-                                          <class name="unpadded-button"/>
-                                        </style>
-                                      </object>
-                                    </child>
-                                    <child>
-                                      <object class="GtkButton" id="button_to_pm">
-                                        <property name="label" translatable="yes">PM</property>
-                                        <property name="visible">True</property>
-                                        <property name="can_focus">True</property>
-                                        <property name="receives_default">True</property>
-                                        <property name="valign">center</property>
-                                        <signal name="clicked" handler="dialog_am_pm_to_button_clicked_cb" 
object="CcNightLightPage" swapped="no" />
-                                        <style>
-                                          <class name="unpadded-button"/>
-                                        </style>
-                                      </object>
-                                    </child>
                                   </object>
                                 </child>
                               </object>
@@ -366,40 +293,38 @@
                         </child>
                       </object>
                     </child>
+                  </object>
+                </child>
 
-                    <!-- Color Temperature -->
-                    <child>
-                      <object class="HdyActionRow">
-                        <property name="visible">True</property>
-                        <property name="title" translatable="yes">Color Temperature</property>
-                        <property name="sensitive" bind-source="night_light_toggle_switch" 
bind-property="active" bind-flags="default|sync-create" />
+                <!-- Color Temperature -->
+                <child>
+                  <object class="AdwActionRow">
+                    <property name="title" translatable="yes">Color Temperature</property>
+                    <property name="sensitive" bind-source="night_light_toggle_switch" 
bind-property="active" bind-flags="default|sync-create" />
 
-                        <child>
-                          <object class="GtkScale" id="scale_color_temperature">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="hexpand">True</property>
-                            <property name="margin-top">12</property>
-                            <property name="margin-bottom">12</property>
-                            <property name="width-request">280</property>
-                            <property name="adjustment">adjustment_color_temperature</property>
-                            <property name="inverted">True</property>
-                            <property name="restrict_to_fill_level">False</property>
-                            <property name="fill_level">1</property>
-                            <property name="digits">0</property>
-                            <property name="draw_value">False</property>
-                            <property name="has_origin">False</property>
-                            <property name="value_pos">bottom</property>
-                            <style>
-                              <class name="night-light-temperature"/>
-                            </style>
-                          </object>
-                        </child>
+                    <child>
+                      <object class="GtkScale" id="scale_color_temperature">
+                        <property name="can_focus">True</property>
+                        <property name="hexpand">True</property>
+                        <property name="margin-top">12</property>
+                        <property name="margin-bottom">12</property>
+                        <property name="width-request">280</property>
+                        <property name="adjustment">adjustment_color_temperature</property>
+                        <property name="inverted">True</property>
+                        <property name="restrict_to_fill_level">False</property>
+                        <property name="fill_level">1</property>
+                        <property name="digits">0</property>
+                        <property name="draw_value">False</property>
+                        <property name="has_origin">False</property>
+                        <property name="value_pos">bottom</property>
+                        <style>
+                          <class name="night-light-temperature"/>
+                        </style>
                       </object>
                     </child>
-
                   </object>
                 </child>
+
               </object>
             </child>
 
diff --git a/panels/display/meson.build b/panels/display/meson.build
index 12f35cc25..97db0ebdc 100644
--- a/panels/display/meson.build
+++ b/panels/display/meson.build
@@ -45,7 +45,7 @@ sources += gnome.compile_resources(
 
 deps = common_deps + [
   colord_dep,
-  gnome_desktop_dep,
+  gnome_rr_dep,
   m_dep,
   upower_glib_dep
 ]
diff --git a/panels/display/night-light.css b/panels/display/night-light.css
index b73f51080..02c0a09fd 100644
--- a/panels/display/night-light.css
+++ b/panels/display/night-light.css
@@ -2,7 +2,7 @@
 @define-color ORANGE_100 #ffc27d;
 @define-color ORANGE_500 #f37329;
 @define-color base_color white;
-@define-color bg_color shade (@base_color, 0.96);
+@define-color bg_color shade(@base_color, 0.96);
 
 /* Hide the marks at the beginning and the end */
 .night-light-temperature mark indicator:nth-child(even) {
diff --git a/panels/meson.build b/panels/meson.build
index 52760cb1e..29b96450c 100644
--- a/panels/meson.build
+++ b/panels/meson.build
@@ -8,7 +8,7 @@ panels = [
   'datetime',
   'default-apps',
   'diagnostics',
-#  'display',
+  'display',
   'info-overview',
   'keyboard',
   'location',
diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c
index de804ff9a..a3622ef86 100644
--- a/shell/cc-panel-loader.c
+++ b/shell/cc-panel-loader.c
@@ -39,7 +39,7 @@ extern GType cc_bluetooth_panel_get_type (void);
 extern GType cc_color_panel_get_type (void);
 extern GType cc_date_time_panel_get_type (void);
 extern GType cc_default_apps_panel_get_type (void);
-//extern GType cc_display_panel_get_type (void);
+extern GType cc_display_panel_get_type (void);
 extern GType cc_info_overview_panel_get_type (void);
 extern GType cc_keyboard_panel_get_type (void);
 extern GType cc_mouse_panel_get_type (void);
@@ -107,7 +107,7 @@ static CcPanelLoaderVtable default_panels[] =
   PANEL_TYPE("datetime",         cc_date_time_panel_get_type,            NULL),
   PANEL_TYPE("default-apps",     cc_default_apps_panel_get_type,         NULL),
   PANEL_TYPE("diagnostics",      cc_diagnostics_panel_get_type,          
cc_diagnostics_panel_static_init_func),
-  //PANEL_TYPE("display",          cc_display_panel_get_type,              NULL),
+  PANEL_TYPE("display",          cc_display_panel_get_type,              NULL),
   PANEL_TYPE("info-overview",    cc_info_overview_panel_get_type,        NULL),
   PANEL_TYPE("keyboard",         cc_keyboard_panel_get_type,             NULL),
   PANEL_TYPE("location",         cc_location_panel_get_type,             NULL),


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