[gnome-break-timer/gtk-4] Migrate to gtk4




commit 4a67812cae0c949d83e2e9f1e631f7713b6aabe9
Author: Dylan McCall <dylan dylanmccall ca>
Date:   Thu Feb 4 14:54:47 2021 -0800

    Migrate to gtk4

 meson.build                                        |   2 +-
 src/daemon/Application.vala                        |   8 +-
 src/daemon/UIManager.vala                          |   6 +-
 src/settings/Application.vala                      |  32 ++-
 src/settings/BreakSettingsDialog.vala              |  27 +-
 src/settings/MainWindow.vala                       |  52 ++--
 src/settings/break/BreakInfoWidget.vala            |  15 +-
 src/settings/break/BreakSettingsWidget.vala        |  33 +--
 src/settings/meson.build                           |   1 -
 src/settings/panels/StatusPanel.vala               |  31 ++-
 src/settings/panels/WelcomePanel.vala              |  48 ++--
 .../timerbreak/TimerBreakSettingsWidget.vala       |   4 +-
 .../timerbreak/TimerBreakStatusWidget.vala         |   8 +-
 src/settings/widgets/CircleCounter.vala            |  45 ++-
 src/settings/widgets/OverlayArrow.vala             |  39 ++-
 ui/settings-panels.ui                              | 309 ++++++++-------------
 16 files changed, 295 insertions(+), 365 deletions(-)
---
diff --git a/meson.build b/meson.build
index f2ba6dc..7ffd66f 100644
--- a/meson.build
+++ b/meson.build
@@ -15,7 +15,7 @@ gio_unix_dep = dependency('gio-unix-2.0')
 glib_dep = dependency('glib-2.0')
 gobject_dep = dependency('gobject-2.0')
 gsound_dep = dependency('gsound')
-gtk_dep = dependency('gtk+-3.0')
+gtk_dep = dependency('gtk4')
 json_glib_dep = dependency('json-glib-1.0')
 libcanberra_dep = dependency('libcanberra')
 libnotify_dep = dependency('libnotify')
diff --git a/src/daemon/Application.vala b/src/daemon/Application.vala
index 0fb9432..993480d 100644
--- a/src/daemon/Application.vala
+++ b/src/daemon/Application.vala
@@ -1,6 +1,6 @@
 /* Application.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -71,11 +71,11 @@ public class Application : Gtk.Application {
         Notify.init (app_name);
 
         /* set up custom gtk style for application */
-        Gdk.Screen screen = Gdk.Screen.get_default ();
         Gtk.CssProvider style_provider = new Gtk.CssProvider ();
 
-        Gtk.StyleContext.add_provider_for_screen (
-            screen,
+        // FIXME:
+        Gtk.StyleContext.add_provider_for_display (
+            Gdk.Display.get_default (),
             style_provider,
             Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
         );
diff --git a/src/daemon/UIManager.vala b/src/daemon/UIManager.vala
index 9c10ece..0d6276f 100644
--- a/src/daemon/UIManager.vala
+++ b/src/daemon/UIManager.vala
@@ -1,6 +1,6 @@
 /* UIManager.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -141,7 +141,9 @@ public class UIManager : SimpleFocusManager, GLib.Initable {
     }
 
     public bool can_lock_screen () {
-        return ! this.application.is_inhibited (Gtk.ApplicationInhibitFlags.IDLE);
+        // FIXME: CHECK FOR THIS SOMEHOW
+        return true;
+        // return ! this.application.is_inhibited (Gtk.ApplicationInhibitFlags.IDLE);
     }
 
     public void lock_screen () {
diff --git a/src/settings/Application.vala b/src/settings/Application.vala
index dfe5c11..13da188 100644
--- a/src/settings/Application.vala
+++ b/src/settings/Application.vala
@@ -1,6 +1,6 @@
 /* Application.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -77,17 +77,17 @@ public class Application : Gtk.Application {
         base.startup ();
 
         /* set up custom gtk style for application */
-        Gdk.Screen screen = Gdk.Screen.get_default ();
         Gtk.CssProvider style_provider = new Gtk.CssProvider ();
 
-        try {
-            style_provider.load_from_data (STYLE_DATA, -1);
-        } catch (GLib.Error error) {
-            GLib.warning ("Error loading style data: %s", error.message);
-        }
+        // FIXME
+        // try {
+        //     style_provider.load_from_data (STYLE_DATA, -1);
+        // } catch (GLib.Error error) {
+        //     GLib.warning ("Error loading style data: %s", error.message);
+        // }
 
-        Gtk.StyleContext.add_provider_for_screen (
-            screen,
+        Gtk.StyleContext.add_provider_for_display (
+            Gdk.Display.get_default (),
             style_provider,
             Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
         );
@@ -120,14 +120,16 @@ public class Application : Gtk.Application {
             this.main_window.get_style_context ().add_class ("devel");
         }
 
-        this.main_window.window_state_event.connect (this.on_main_window_window_state_event);
+        this.main_window.get_surface ().event.connect (this.on_main_window_event);
     }
 
-    private bool on_main_window_window_state_event (Gdk.EventWindowState event) {
-        bool focused = (
-            Gdk.WindowState.FOCUSED in event.changed_mask &&
-            Gdk.WindowState.FOCUSED in event.new_window_state
-        );
+    private bool on_main_window_event (Gdk.Event event) {
+        if (event.get_event_type () != Gdk.EventType.FOCUS_CHANGE) {
+            return false;
+        }
+
+        Gdk.FocusEvent focus_event = (Gdk.FocusEvent) event;
+        bool focused = focus_event.get_in ();
 
         if (focused && this.initial_focus && this.break_manager.master_enabled) {
             // We should always refresh permissions at startup if enabled. Wait
diff --git a/src/settings/BreakSettingsDialog.vala b/src/settings/BreakSettingsDialog.vala
index e43a0f7..9c79f23 100644
--- a/src/settings/BreakSettingsDialog.vala
+++ b/src/settings/BreakSettingsDialog.vala
@@ -1,6 +1,6 @@
 /* BreakSettingsDialog.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -27,7 +27,7 @@ public class BreakSettingsDialog : Gtk.Dialog {
     private BreakManager break_manager;
 
     private BreakConfigurationChooser configuration_chooser;
-    private Gtk.Grid breaks_grid;
+    private Gtk.Box breaks_grid;
 
     private const int ABOUT_BUTTON_RESPONSE = 5;
 
@@ -42,22 +42,21 @@ public class BreakSettingsDialog : Gtk.Dialog {
         this.set_deletable (true);
         this.set_resizable (false);
 
-        this.delete_event.connect (this.hide_on_delete);
+        // this.delete_event.connect (this.hide_on_delete);
 
         this.response.connect (this.response_cb);
 
-        Gtk.Container content_area = (Gtk.Container)this.get_content_area ();
+        Gtk.Box content_area = this.get_content_area ();
 
-        Gtk.Grid content = new Gtk.Grid ();
-        content_area.add (content);
-        content.set_orientation (Gtk.Orientation.VERTICAL);
+        Gtk.Box content = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
+        content_area.append (content);
         content.set_margin_top (10);
         content.set_margin_start (10);
         content.set_margin_bottom (10);
         content.set_margin_end (10);
 
         this.configuration_chooser = new BreakConfigurationChooser ();
-        content.add (this.configuration_chooser);
+        content.append (this.configuration_chooser);
         this.configuration_chooser.add_configuration (
             { "microbreak", "restbreak" },
             _("A mix of short breaks and long breaks")
@@ -72,11 +71,10 @@ public class BreakSettingsDialog : Gtk.Dialog {
         );
         settings.bind ("selected-breaks", this.configuration_chooser, "selected-break-ids", 
SettingsBindFlags.DEFAULT);
 
-        this.breaks_grid = new FixedSizeGrid ();
-        content.add (this.breaks_grid);
-        this.breaks_grid.set_orientation (Gtk.Orientation.VERTICAL);
+        this.breaks_grid = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
+        content.append (this.breaks_grid);
 
-        content.show_all ();
+        content.show ();
 
         this.configuration_chooser.notify["selected-break-ids"].connect (this.update_break_configuration);
     }
@@ -84,7 +82,7 @@ public class BreakSettingsDialog : Gtk.Dialog {
     public bool init (GLib.Cancellable? cancellable) throws GLib.Error {
         foreach (BreakType break_type in this.break_manager.all_breaks ()) {
             var settings_widget = break_type.settings_widget;
-            this.breaks_grid.add (settings_widget);
+            this.breaks_grid.append (settings_widget);
             settings_widget.realize ();
             settings_widget.set_valign (Gtk.Align.CENTER);
             settings_widget.set_vexpand (true);
@@ -110,6 +108,9 @@ public class BreakSettingsDialog : Gtk.Dialog {
     private void response_cb (int response_id) {
         if (response_id == Gtk.ResponseType.CLOSE) {
             this.hide ();
+        } else if (response_id == Gtk.ResponseType.DELETE_EVENT) {
+            // FIXME: DO WE NEED THIS
+            this.hide ();
         }
     }
 }
diff --git a/src/settings/MainWindow.vala b/src/settings/MainWindow.vala
index 061a8be..e018c1c 100644
--- a/src/settings/MainWindow.vala
+++ b/src/settings/MainWindow.vala
@@ -1,6 +1,6 @@
 /* MainWindow.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -46,13 +46,19 @@ public class MainWindow : Gtk.ApplicationWindow, GLib.Initable {
     private WelcomePanel welcome_panel;
     private StatusPanel status_panel;
 
-    private class MessageBar : Gtk.InfoBar {
+    private class MessageBar : Gtk.Box {
         protected weak MainWindow main_window;
 
         public signal void close_message_bar ();
 
+        protected Gtk.InfoBar info_bar;
+
         protected MessageBar (MainWindow main_window) {
-            GLib.Object ();
+            GLib.Object (orientation: Gtk.Orientation.VERTICAL, spacing: 0);
+
+            this.info_bar = new Gtk.InfoBar ();
+            this.append (info_bar);
+            this.info_bar.show ();
 
             this.main_window = main_window;
         }
@@ -69,16 +75,13 @@ public class MainWindow : Gtk.ApplicationWindow, GLib.Initable {
             this.error_type = error_type;
 
             /* Label for a button that opens GNOME Settings to change permissions */
-            this.add_button (_("Open Settings"), RESPONSE_OPEN_SETTINGS);
+            this.info_bar.add_button (_("Open Settings"), RESPONSE_OPEN_SETTINGS);
 
-            Gtk.Container content_area = this.get_content_area ();
             Gtk.Label label = new Gtk.Label (_("Break Timer needs permission to start automatically and run 
in the background"));
-            content_area.add (label);
-
-            content_area.show_all ();
+            this.info_bar.add_child (label);
 
-            this.response.connect (this.on_response);
-            this.close.connect (this.on_close);
+            this.info_bar.response.connect (this.on_response);
+            this.info_bar.close.connect (this.on_close);
         }
 
         private void on_response (int response_id) {
@@ -126,13 +129,13 @@ public class MainWindow : Gtk.ApplicationWindow, GLib.Initable {
         this.break_settings_dialog.set_transient_for (this);
 
         Gtk.Box content = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
-        this.add (content);
+        this.set_child (content);
         content.set_orientation (Gtk.Orientation.VERTICAL);
         content.set_vexpand (true);
 
         this.header = new Gtk.HeaderBar ();
         this.set_titlebar (this.header);
-        this.header.set_show_close_button (true);
+        this.header.set_show_title_buttons (true);
         this.header.set_hexpand (true);
 
         this.master_switch = new Gtk.Switch ();
@@ -147,19 +150,20 @@ public class MainWindow : Gtk.ApplicationWindow, GLib.Initable {
 
         this.settings_button = new Gtk.Button ();
         settings_button.clicked.connect (this.settings_clicked_cb);
-        settings_button.set_image (new Gtk.Image.from_icon_name (
-            "alarm-symbolic",
-            Gtk.IconSize.MENU)
+        // FIXME: Verify, especially IconSize
+        settings_button.set_child (
+            new Gtk.Image.from_icon_name ("alarm-symbolic")
         );
         settings_button.valign = Gtk.Align.CENTER;
-        settings_button.set_always_show_image (true);
+        // FIXME: Verify
+        // settings_button.set_always_show_image (true);
         header.pack_end (this.settings_button);
 
         this.messages_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
-        content.pack_end (this.messages_box);
+        content.append (this.messages_box);
 
         this.main_stack = new Gtk.Stack ();
-        content.pack_end (this.main_stack);
+        content.append (this.main_stack);
         main_stack.set_margin_top (6);
         main_stack.set_margin_bottom (6);
         main_stack.set_transition_duration (250);
@@ -171,8 +175,8 @@ public class MainWindow : Gtk.ApplicationWindow, GLib.Initable {
         this.main_stack.add_named (this.welcome_panel, "welcome_panel");
         this.welcome_panel.tour_finished.connect (this.on_tour_finished);
 
-        this.header.show_all ();
-        content.show_all ();
+        this.header.show ();
+        content.show ();
 
         break_manager.notify["permissions-error"].connect (this.on_break_manager_permissions_error_change);
         break_manager.notify["foreground-break"].connect (this.update_visible_panel);
@@ -215,7 +219,7 @@ public class MainWindow : Gtk.ApplicationWindow, GLib.Initable {
 
         this.message_bars.set (message_id, message_bar);
 
-        this.messages_box.pack_end (message_bar);
+        this.messages_box.append (message_bar);
         message_bar.show ();
         message_bar.close_message_bar.connect (() => {
             this.hide_message_bar (message_id);
@@ -255,13 +259,13 @@ public class MainWindow : Gtk.ApplicationWindow, GLib.Initable {
         BreakType? foreground_break = this.break_manager.foreground_break;
         if (this.welcome_panel.is_active ()) {
             this.main_stack.set_visible_child_full ("welcome_panel", transition);
-            this.header.set_title (_("Welcome Tour"));
+            this.set_title (_("Welcome Tour"));
         } else if (foreground_break != null) {
             this.main_stack.set_visible_child_full (foreground_break.id, transition);
-            this.header.set_title (foreground_break.info_widget.title);
+            this.set_title (foreground_break.info_widget.title);
         } else {
             this.main_stack.set_visible_child_full ("status_panel", transition);
-            this.header.set_title (_("Break Timer"));
+            this.set_title (_("Break Timer"));
         }
     }
 
diff --git a/src/settings/break/BreakInfoWidget.vala b/src/settings/break/BreakInfoWidget.vala
index 37cdadd..335e101 100644
--- a/src/settings/break/BreakInfoWidget.vala
+++ b/src/settings/break/BreakInfoWidget.vala
@@ -1,6 +1,6 @@
 /* BreakInfoWidget.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,7 +20,7 @@
 
 namespace BreakTimer.Settings.Break {
 
-public abstract class BreakInfoWidget : Gtk.Grid {
+public abstract class BreakInfoWidget : Gtk.Box {
     public BreakType break_type { public get; private set; }
     public string title { public get; private set; }
 
@@ -36,23 +36,22 @@ public abstract class BreakInfoWidget : Gtk.Grid {
 
         this.set_orientation (Gtk.Orientation.VERTICAL);
         this.set_hexpand (true);
-        this.set_row_spacing (24);
+        this.set_spacing (24);
         this.get_style_context ().add_class ("_break-info");
 
         this.heading_label = new Gtk.Label (null);
-        this.add (this.heading_label);
+        this.append (this.heading_label);
         this.heading_label.get_style_context ().add_class ("_break-info-heading");
 
         this.description_label = new Gtk.Label (null);
-        this.add (this.description_label);
-        this.description_label.set_line_wrap (true);
+        this.append (this.description_label);
         this.description_label.set_justify (Gtk.Justification.CENTER);
         this.description_label.set_max_width_chars (60);
 
         this.detail_label = new Gtk.Label (null);
-        this.add (this.detail_label);
+        this.append (this.detail_label);
 
-        this.show_all ();
+        this.show ();
     }
 
     protected void set_heading (string heading) {
diff --git a/src/settings/break/BreakSettingsWidget.vala b/src/settings/break/BreakSettingsWidget.vala
index 25ca960..8aa122b 100644
--- a/src/settings/break/BreakSettingsWidget.vala
+++ b/src/settings/break/BreakSettingsWidget.vala
@@ -1,6 +1,6 @@
 /* BreakSettingsWidget.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,27 +20,24 @@
 
 namespace BreakTimer.Settings.Break {
 
-public abstract class BreakSettingsWidget : Gtk.Grid {
-    private Gtk.Grid header;
-    private Gtk.Grid details;
+public abstract class BreakSettingsWidget : Gtk.Box {
+    private Gtk.Box header;
+    private Gtk.Box details;
 
     protected BreakSettingsWidget (BreakType break_type, string title, string? description) {
         GLib.Object ();
 
         this.set_orientation (Gtk.Orientation.VERTICAL);
-        this.set_row_spacing (10);
+        this.set_spacing (10);
 
-        this.header = new Gtk.Grid ();
-        this.add (this.header);
-        this.header.set_column_spacing (12);
+        this.header = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 12);
+        this.append (this.header);
 
-        var title_grid = new Gtk.Grid ();
+        var title_grid = new Gtk.Box (Gtk.Orientation.VERTICAL, 4);
         this.set_header (title_grid);
-        title_grid.set_orientation (Gtk.Orientation.VERTICAL);
-        title_grid.set_row_spacing (4);
 
         var title_label = new Gtk.Label (title);
-        title_grid.add (title_label);
+        title_grid.append (title_label);
         title_label.get_style_context ().add_class ("_settings-title");
         title_label.set_halign (Gtk.Align.FILL);
         title_label.set_hexpand (true);
@@ -54,27 +51,27 @@ public abstract class BreakSettingsWidget : Gtk.Grid {
         // description_label.set_hexpand (true);
         // description_label.set_justify (Gtk.Justification.CENTER);
 
-        this.details = new Gtk.Grid ();
-        this.add (this.details);
+        this.details = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
+        this.append (this.details);
         this.details.set_margin_start (12);
         this.details.set_halign (Gtk.Align.CENTER);
         this.details.set_hexpand (true);
 
-        this.show_all ();
+        this.show ();
     }
 
     protected void set_header (Gtk.Widget content) {
-        this.header.attach (content, 0, 0, 1, 1);
+        this.header.append (content);
     }
 
     protected void set_header_action (Gtk.Widget content) {
-        this.header.attach (content, 1, 0, 1, 1);
+        this.header.append (content);
         content.set_halign (Gtk.Align.END);
         content.set_valign (Gtk.Align.CENTER);
     }
 
     protected void set_details (Gtk.Widget content) {
-        this.details.add (content);
+        this.details.append (content);
     }
 }
 
diff --git a/src/settings/meson.build b/src/settings/meson.build
index f4c5f3f..55ca366 100644
--- a/src/settings/meson.build
+++ b/src/settings/meson.build
@@ -22,7 +22,6 @@ settings_lib_sources = files(
     'timerbreak/TimerBreakType.vala',
     'widgets/BreakConfigurationChooser.vala',
     'widgets/CircleCounter.vala',
-    'widgets/FixedSizeGrid.vala',
     'widgets/OverlayArrow.vala',
     'widgets/TimeChooser.vala',
     'widgets/Transition.vala'
diff --git a/src/settings/panels/StatusPanel.vala b/src/settings/panels/StatusPanel.vala
index 12784e0..8f34bfc 100644
--- a/src/settings/panels/StatusPanel.vala
+++ b/src/settings/panels/StatusPanel.vala
@@ -1,6 +1,6 @@
 /* StatusPanel.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -22,15 +22,16 @@ using BreakTimer.Settings.Break;
 
 namespace BreakTimer.Settings.Panels {
 
-private class StatusPanel : Gtk.Stack, GLib.Initable {
+private class StatusPanel : Gtk.Box, GLib.Initable {
     private BreakManager break_manager;
 
-    private Gtk.Grid breaks_list;
+    private Gtk.Stack stack;
+    private Gtk.Box breaks_list;
     private Gtk.Widget no_breaks_message;
     private Gtk.Widget error_message;
 
     public StatusPanel (BreakManager break_manager, Gtk.Builder builder) {
-        GLib.Object ();
+        GLib.Object (orientation: Gtk.Orientation.VERTICAL, spacing: 0);
 
         this.break_manager = break_manager;
 
@@ -41,14 +42,17 @@ private class StatusPanel : Gtk.Stack, GLib.Initable {
         this.set_hexpand (true);
         this.set_vexpand (true);
 
+        this.stack = new Gtk.Stack ();
+        this.append (this.stack);
+
         this.breaks_list = this.build_breaks_list (break_manager);
-        this.add (this.breaks_list);
+        this.stack.add_child (this.breaks_list);
 
         this.no_breaks_message = builder.get_object ("status_stopped") as Gtk.Widget;
-        this.add (this.no_breaks_message);
+        this.stack.add_child (this.no_breaks_message);
 
         this.error_message = builder.get_object ("status_error") as Gtk.Widget;
-        this.add (this.error_message);
+        this.stack.add_child (this.error_message);
 
         break_manager.status_changed.connect (this.status_changed_cb);
     }
@@ -56,7 +60,7 @@ private class StatusPanel : Gtk.Stack, GLib.Initable {
     public bool init (GLib.Cancellable? cancellable) throws GLib.Error {
         foreach (BreakType break_type in this.break_manager.all_breaks ()) {
             var status_widget = break_type.status_widget;
-            this.breaks_list.add (status_widget);
+            this.breaks_list.append (status_widget);
             status_widget.set_margin_top (18);
             status_widget.set_margin_end (20);
             status_widget.set_margin_bottom (18);
@@ -66,9 +70,8 @@ private class StatusPanel : Gtk.Stack, GLib.Initable {
         return true;
     }
 
-    private Gtk.Grid build_breaks_list (BreakManager break_manager) {
-        var breaks_list = new Gtk.Grid ();
-        breaks_list.set_orientation (Gtk.Orientation.VERTICAL);
+    private Gtk.Box build_breaks_list (BreakManager break_manager) {
+        var breaks_list = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
         breaks_list.set_halign (Gtk.Align.CENTER);
         breaks_list.set_valign (Gtk.Align.CENTER);
 
@@ -92,11 +95,11 @@ private class StatusPanel : Gtk.Stack, GLib.Initable {
         }
 
         if (any_breaks_enabled) {
-            this.set_visible_child (this.breaks_list);
+            this.stack.set_visible_child (this.breaks_list);
         } else if (this.break_manager.is_working ()) {
-            this.set_visible_child (this.no_breaks_message);
+            this.stack.set_visible_child (this.no_breaks_message);
         } else {
-            this.set_visible_child (this.error_message);
+            this.stack.set_visible_child (this.error_message);
         }
     }
 }
diff --git a/src/settings/panels/WelcomePanel.vala b/src/settings/panels/WelcomePanel.vala
index 9598a55..0eba10d 100644
--- a/src/settings/panels/WelcomePanel.vala
+++ b/src/settings/panels/WelcomePanel.vala
@@ -1,6 +1,6 @@
 /* WelcomePanel.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,7 +24,7 @@ namespace BreakTimer.Settings.Panels {
 
 /* TODO: It would be nice to move some of this code to a UI file built with
  *       Glade. Especially anything involving long strings. */
-private class WelcomePanel : Gtk.Stack {
+private class WelcomePanel : Gtk.Box {
     private BreakManager break_manager;
     private MainWindow main_window;
 
@@ -35,49 +35,55 @@ private class WelcomePanel : Gtk.Stack {
     }
     private Step current_step;
 
-    private Gtk.Container start_page;
-    private Gtk.Container breaks_page;
-    private Gtk.Container ready_page;
+    private Gtk.Stack stack;
+
+    private Gtk.Box start_page;
+    private Gtk.Box breaks_page;
+    private Gtk.Box ready_page;
 
     public signal void tour_finished ();
 
     public WelcomePanel (BreakManager break_manager, Gtk.Builder builder, MainWindow main_window) {
-        GLib.Object ();
+        GLib.Object (orientation: Gtk.Orientation.VERTICAL, spacing: 0);
 
         this.break_manager = break_manager;
         this.main_window = main_window;
 
+        this.stack = new Gtk.Stack ();
+        this.append (this.stack);
+        this.stack.show ();
+
         if (this.break_manager.master_enabled) {
             this.current_step = Step.READY;
         } else {
             this.current_step = Step.WELCOME;
         }
 
-        this.set_transition_type (Gtk.StackTransitionType.SLIDE_LEFT);
-        this.set_transition_duration (250);
+        this.stack.set_transition_type (Gtk.StackTransitionType.SLIDE_LEFT);
+        this.stack.set_transition_duration (250);
 
         this.start_page = this.build_page_with_arrow (
             builder, "welcome_start", "switch_on_label", main_window.get_master_switch ());
-        this.add (this.start_page);
+        this.stack.add_child (this.start_page);
 
         this.breaks_page = this.build_page_with_arrow (
             builder, "welcome_breaks", "settings_label", main_window.get_settings_button ());
-        this.add (this.breaks_page);
+        this.stack.add_child (this.breaks_page);
 
         this.ready_page = this.build_page_with_arrow (
             builder, "welcome_ready", "keeps_running_label", main_window.get_close_button ());
-        this.add (this.ready_page);
+        this.stack.add_child (this.ready_page);
 
         var breaks_ok_button = new Gtk.Button.with_label (_("OK, got it!"));
         breaks_ok_button.get_style_context ().add_class ("suggested-action");
         breaks_ok_button.set_halign (Gtk.Align.CENTER);
-        this.breaks_page.add (breaks_ok_button);
+        this.breaks_page.append (breaks_ok_button);
         breaks_ok_button.clicked.connect (this.on_breaks_confirmed);
 
         var ready_ok_button = new Gtk.Button.with_label (_("Ready to go"));
         ready_ok_button.get_style_context ().add_class ("suggested-action");
         ready_ok_button.set_halign (Gtk.Align.CENTER);
-        this.ready_page.add (ready_ok_button);
+        this.ready_page.append (ready_ok_button);
         ready_ok_button.clicked.connect (this.on_ready_confirmed);
 
         break_manager.notify["master-enabled"].connect (this.on_master_switch_toggled);
@@ -101,16 +107,14 @@ private class WelcomePanel : Gtk.Stack {
         }
     }
 
-    private Gtk.Container build_page_with_arrow (Gtk.Builder builder, string page_name, string? 
arrow_source_name, Gtk.Widget? arrow_target) {
-        Gtk.Grid page_wrapper = new Gtk.Grid ();
-        page_wrapper.set_orientation (Gtk.Orientation.VERTICAL);
-        page_wrapper.set_row_spacing (16);
+    private Gtk.Box build_page_with_arrow (Gtk.Builder builder, string page_name, string? arrow_source_name, 
Gtk.Widget? arrow_target) {
+        Gtk.Box page_wrapper = new Gtk.Box (Gtk.Orientation.VERTICAL, 16);
         page_wrapper.set_margin_bottom (30);
 
         Gtk.Overlay page_overlay = new Gtk.Overlay ();
-        page_wrapper.add (page_overlay);
+        page_wrapper.append (page_overlay);
 
-        page_overlay.add (builder.get_object (page_name) as Gtk.Widget);
+        page_overlay.set_child (builder.get_object (page_name) as Gtk.Widget);
         Gtk.Widget arrow_source = builder.get_object (arrow_source_name) as Gtk.Widget;
         if (arrow_source != null && arrow_target != null) {
             var arrow = new OverlayArrow (arrow_source, arrow_target);
@@ -132,11 +136,11 @@ private class WelcomePanel : Gtk.Stack {
         if (next_step > this.current_step) this.current_step = next_step;
 
         if (this.current_step == Step.WELCOME) {
-            this.set_visible_child (this.start_page);
+            this.stack.set_visible_child (this.start_page);
         } else if (this.current_step == Step.BREAKS) {
-            this.set_visible_child (this.breaks_page);
+            this.stack.set_visible_child (this.breaks_page);
         } else {
-            this.set_visible_child (this.ready_page);
+            this.stack.set_visible_child (this.ready_page);
         }
     }
 }
diff --git a/src/settings/timerbreak/TimerBreakSettingsWidget.vala 
b/src/settings/timerbreak/TimerBreakSettingsWidget.vala
index 47080e0..652621e 100644
--- a/src/settings/timerbreak/TimerBreakSettingsWidget.vala
+++ b/src/settings/timerbreak/TimerBreakSettingsWidget.vala
@@ -1,6 +1,6 @@
 /* TimerBreakSettingsWidget.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -51,7 +51,7 @@ public abstract class TimerBreakSettingsWidget : BreakSettingsWidget {
         details_grid.attach_next_to (duration_chooser, duration_label, Gtk.PositionType.RIGHT, 1, 1);
         break_type.settings.bind ("duration-seconds", duration_chooser, "time-seconds", 
SettingsBindFlags.DEFAULT);
 
-        details_grid.show_all ();
+        details_grid.show ();
     }
 }
 
diff --git a/src/settings/timerbreak/TimerBreakStatusWidget.vala 
b/src/settings/timerbreak/TimerBreakStatusWidget.vala
index 191f56d..28ff22e 100644
--- a/src/settings/timerbreak/TimerBreakStatusWidget.vala
+++ b/src/settings/timerbreak/TimerBreakStatusWidget.vala
@@ -1,6 +1,6 @@
 /* TimerBreakStatusWidget.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -51,16 +51,16 @@ public abstract class TimerBreakStatusWidget : BreakStatusWidget {
         labels_grid.set_valign (Gtk.Align.CENTER);
 
         this.status_label = new Gtk.Label (null);
-        labels_grid.add (this.status_label);
+        labels_grid.attach (this.status_label, 0, 0, 1, 1);
         this.status_label.set_width_chars (25);
         this.status_label.get_style_context ().add_class ("_break-status-heading");
 
         this.time_label = new Gtk.Label (null);
-        labels_grid.add (this.time_label);
+        labels_grid.attach_next_to (this.time_label, this.status_label, Gtk.PositionType.RIGHT, 1, 1);
         this.time_label.set_width_chars (25);
         this.time_label.get_style_context ().add_class ("_break-status-body");
 
-        this.show_all ();
+        this.show ();
 
         break_type.timer_status_changed.connect (this.timer_status_changed_cb);
     }
diff --git a/src/settings/widgets/CircleCounter.vala b/src/settings/widgets/CircleCounter.vala
index a8b603b..0d4a5f1 100644
--- a/src/settings/widgets/CircleCounter.vala
+++ b/src/settings/widgets/CircleCounter.vala
@@ -1,6 +1,6 @@
 /* CircleCounter.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -69,7 +69,7 @@ public class CircleCounter : Gtk.Widget {
     public CircleCounter () {
         GLib.Object ();
 
-        this.set_has_window (false);
+        // this.set_has_window (false);
 
         this.get_style_context ().add_class ("_circle-counter");
 
@@ -78,7 +78,6 @@ public class CircleCounter : Gtk.Widget {
         );
 
         this.map.connect (this.on_map_cb);
-        this.draw.connect (this.on_draw_cb);
         this.notify["direction"].connect (this.on_direction_notify_cb);
         this.notify["progress"].connect (this.on_progress_notify_cb);
         this.notify["draw-angle"].connect (this.on_draw_angle_notify_cb);
@@ -131,13 +130,15 @@ public class CircleCounter : Gtk.Widget {
         this.first_frame = true;
     }
 
-    private bool on_draw_cb (Cairo.Context cr) {
+    public override void snapshot (Gtk.Snapshot snapshot) {
+        // FIXME: THIS LOOKS WRONG
+        Graphene.Rect bounds = snapshot.to_node ().get_bounds ();
+        Cairo.Context cr = snapshot.append_cairo (bounds);
         Gtk.StyleContext style_context = this.get_style_context ();
-        Gtk.StateFlags state = this.get_state_flags ();
         Gtk.Allocation allocation;
         this.get_allocation (out allocation);
 
-        Gdk.RGBA foreground_color = style_context.get_color (state);
+        Gdk.RGBA foreground_color = style_context.get_color ();
 
         int center_x = allocation.width / 2;
         int center_y = allocation.height / 2;
@@ -174,25 +175,23 @@ public class CircleCounter : Gtk.Widget {
         cr.stroke ();
         cr.pop_group_to_source ();
         cr.paint_with_alpha (0.7);
-
-        return true;
-    }
-
-    public override void get_preferred_width (out int minimum_width, out int natural_width) {
-        var diameter = calculate_diameter ();
-        minimum_width = diameter;
-        natural_width = diameter;
     }
 
-    public override void get_preferred_height (out int minimum_height, out int natural_height) {
-        var diameter = calculate_diameter ();
-        minimum_height = diameter;
-        natural_height = diameter;
-    }
-
-    public override void size_allocate (Gtk.Allocation allocation) {
-        base.size_allocate (allocation);
-    }
+    // FIXME: DO THIS
+    // public override void measure (Orientation orientation, int for_size, out int minimum, out int 
natural, out int minimum_baseline, out int natural_baseline) {
+    // }
+
+    // public override void get_preferred_width (out int minimum_width, out int natural_width) {
+    //     var diameter = calculate_diameter ();
+    //     minimum_width = diameter;
+    //     natural_width = diameter;
+    // }
+
+    // public override void get_preferred_height (out int minimum_height, out int natural_height) {
+    //     var diameter = calculate_diameter ();
+    //     minimum_height = diameter;
+    //     natural_height = diameter;
+    // }
 
     private int calculate_diameter () {
         return 2 * DEFAULT_RADIUS;
diff --git a/src/settings/widgets/OverlayArrow.vala b/src/settings/widgets/OverlayArrow.vala
index 81df367..1f84f95 100644
--- a/src/settings/widgets/OverlayArrow.vala
+++ b/src/settings/widgets/OverlayArrow.vala
@@ -1,6 +1,6 @@
 /* OverlayArrow.vala
  *
- * Copyright 2020 Dylan McCall <dylan dylanmccall ca>
+ * Copyright 2020-2021 Dylan McCall <dylan dylanmccall ca>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,39 +21,42 @@
 namespace BreakTimer.Settings.Widgets {
 
 /* FIXME: This widget is stealing clicks when it is used in an overlay */
-public class OverlayArrow : Gtk.Widget {
+
+public class OverlayArrow : Gtk.DrawingArea {
     private Gtk.Widget from_widget;
     private Gtk.Widget to_widget;
 
     public OverlayArrow (Gtk.Widget from_widget, Gtk.Widget to_widget) {
         GLib.Object ();
 
-        this.set_has_window (false);
+        // this.set_has_window (false);
 
         this.set_halign (Gtk.Align.FILL);
         this.set_valign (Gtk.Align.FILL);
 
         this.from_widget = from_widget;
         this.to_widget = to_widget;
+
+        this.set_draw_func (this.on_draw_cb);
     }
 
-    public override bool draw (Cairo.Context cr) {
+    private void on_draw_cb (Gtk.DrawingArea widget, Cairo.Context cr, int width, int height) {
+        // FIXME: ARE THESE THE SAME AS GIVEN WIDTH AND HEIGHT?
         int max_width = this.get_allocated_width ();
         int max_height = this.get_allocated_height ();
 
-        int from_x, from_y;
+        double from_x, from_y;
         this.get_from_coordinates (out from_x, out from_y);
         from_x = from_x.clamp (0, max_width);
         from_y = from_y.clamp (0, max_height);
 
-        int to_x, to_y;
+        double to_x, to_y;
         this.get_to_coordinates (out to_x, out to_y);
         to_x = to_x.clamp (0, max_width);
         to_y = to_y.clamp (0, max_height);
 
-        Gtk.StateFlags state = this.get_state_flags ();
         Gtk.StyleContext style_context = this.get_style_context ();
-        Gdk.RGBA color = style_context.get_color (state);
+        Gdk.RGBA color = style_context.get_color ();
         Gdk.cairo_set_source_rgba (cr, color);
         cr.set_line_width (1.0);
 
@@ -70,29 +73,23 @@ public class OverlayArrow : Gtk.Widget {
         cr.close_path ();
         cr.fill_preserve ();
         cr.stroke ();
-
-        return true;
-    }
-
-    public override void size_allocate (Gtk.Allocation allocation) {
-        base.size_allocate (allocation);
     }
 
-    private void get_points_offset (out int offset_x, out int offset_y) {
+    private void get_points_offset (out double offset_x, out double offset_y) {
         Gtk.Allocation to_allocation;
         this.to_widget.get_allocation (out to_allocation);
         this.from_widget.translate_coordinates (this.to_widget, to_allocation.width/2, 
to_allocation.width/2, out offset_x, out offset_y);
     }
 
-    private void get_from_coordinates (out int from_x, out int from_y) {
+    private void get_from_coordinates (out double from_x, out double from_y) {
         // Is to_widget to the right or to the left?
         Gtk.Allocation from_allocation;
         this.from_widget.get_allocation (out from_allocation);
 
-        int offset_x, offset_y;
+        double offset_x, offset_y;
         this.get_points_offset (out offset_x, out offset_y);
 
-        int from_local_x, from_local_y;
+        double from_local_x, from_local_y;
         if (offset_x > 0) {
             from_local_x = 0;
             from_local_y = from_allocation.height / 2;
@@ -103,15 +100,15 @@ public class OverlayArrow : Gtk.Widget {
         this.from_widget.translate_coordinates (this, from_local_x, from_local_y, out from_x, out from_y);
     }
 
-    private void get_to_coordinates (out int to_x, out int to_y) {
+    private void get_to_coordinates (out double to_x, out double to_y) {
         // Is to_widget to the right or to the left?
         Gtk.Allocation to_allocation;
         this.to_widget.get_allocation (out to_allocation);
 
-        int offset_x, offset_y;
+        double offset_x, offset_y;
         this.get_points_offset (out offset_x, out offset_y);
 
-        int to_local_x, to_local_y;
+        double to_local_x, to_local_y;
         if (offset_y > 0) {
             to_local_x = to_allocation.width / 2;
             to_local_y = to_allocation.height;
diff --git a/ui/settings-panels.ui b/ui/settings-panels.ui
index 1848855..41fb2a3 100644
--- a/ui/settings-panels.ui
+++ b/ui/settings-panels.ui
@@ -1,402 +1,325 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
 <interface>
-  <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkGrid" id="status_error">
+  <requires lib="gtk+" version="3.0"/>
+  <object class="GtkBox" id="status_error">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
+    <property name="can-focus">False</property>
     <property name="valign">center</property>
-    <property name="margin_left">30</property>
-    <property name="margin_right">30</property>
-    <property name="margin_top">10</property>
-    <property name="margin_bottom">20</property>
+    <property name="margin-start">30</property>
+    <property name="margin-end">30</property>
+    <property name="margin-top">10</property>
+    <property name="margin-bottom">20</property>
     <property name="vexpand">True</property>
-    <property name="row_spacing">12</property>
+    <property name="orientation">vertical</property>
     <child>
       <object class="GtkImage" id="image2">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="hexpand">True</property>
-        <property name="pixel_size">120</property>
-        <property name="icon_name">face-sick-symbolic</property>
+        <property name="pixel-size">120</property>
+        <property name="icon-name">face-sick-symbolic</property>
         <style>
           <class name="_break-status-icon"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="label13">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="hexpand">True</property>
         <property name="label" translatable="yes">Break Timer isn’t responding</property>
         <style>
           <class name="_break-status-heading"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="label14">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="hexpand">True</property>
         <property name="label" translatable="yes">If this continues the next time you log in, please &lt;a 
href="https://gitlab.gnome.org/GNOME/gnome-break-timer/issues"&gt;open a bug report&lt;/a&gt;.      
</property>
-        <property name="use_markup">True</property>
+        <property name="use-markup">True</property>
         <style>
           <class name="_break-status-body"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
   </object>
-  <object class="GtkGrid" id="status_stopped">
+  <object class="GtkBox" id="status_stopped">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
+    <property name="can-focus">False</property>
     <property name="valign">center</property>
-    <property name="margin_left">30</property>
-    <property name="margin_right">30</property>
-    <property name="margin_top">10</property>
-    <property name="margin_bottom">20</property>
+    <property name="margin-start">30</property>
+    <property name="margin-end">30</property>
+    <property name="margin-top">10</property>
+    <property name="margin-bottom">20</property>
     <property name="vexpand">True</property>
-    <property name="row_spacing">12</property>
+    <property name="orientation">vertical</property>
+    <property name="spacing">12</property>
     <child>
       <object class="GtkImage" id="image1">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="hexpand">True</property>
-        <property name="pixel_size">120</property>
-        <property name="icon_name">face-sad-symbolic</property>
+        <property name="pixel-size">120</property>
+        <property name="icon-name">face-sad-symbolic</property>
         <style>
           <class name="_break-status-icon"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">0</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="label11">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="hexpand">True</property>
         <property name="label" translatable="yes">Break Timer is taking a break</property>
         <style>
           <class name="_break-status-heading"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">1</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
     <child>
       <object class="GtkLabel" id="label12">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
+        <property name="can-focus">False</property>
         <property name="hexpand">True</property>
         <property name="label" translatable="yes">Turn me on to get those breaks going</property>
         <style>
           <class name="_break-status-body"/>
         </style>
       </object>
-      <packing>
-        <property name="left_attach">0</property>
-        <property name="top_attach">2</property>
-        <property name="width">1</property>
-        <property name="height">1</property>
-      </packing>
     </child>
   </object>
-  <object class="GtkAlignment" id="welcome_breaks">
+  <object class="GtkBox" id="welcome_breaks">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
+    <property name="can-focus">False</property>
     <child>
-      <object class="GtkGrid" id="welcome_breaks_inner">
+      <object class="GtkBox" id="welcome_breaks_inner">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="margin_left">85</property>
-        <property name="margin_right">85</property>
-        <property name="margin_top">30</property>
-        <property name="row_spacing">50</property>
+        <property name="can-focus">False</property>
+        <property name="margin-start">85</property>
+        <property name="margin-end">85</property>
+        <property name="margin-top">30</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">50</property>
         <child>
           <object class="GtkLabel" id="settings_label">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <property name="halign">center</property>
             <property name="valign">end</property>
-            <property name="xpad">20</property>
+            <property name="margin-start">20</property>
+            <property name="margin-end">20</property>
             <property name="label" translatable="yes">You can change the types of breaks and their timings 
from the settings</property>
             <style>
               <class name="_break-status-hint"/>
             </style>
           </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">1</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
         </child>
         <child>
-          <object class="GtkGrid" id="grid2">
+          <object class="GtkBox" id="grid2">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <property name="valign">center</property>
             <property name="hexpand">True</property>
             <property name="vexpand">True</property>
-            <property name="row_spacing">16</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">16</property>
             <child>
               <object class="GtkLabel" id="label2">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="hexpand">True</property>
-                <property name="ypad">4</property>
+                <property name="margin-top">4</property>
+                <property name="margin-bottom">4</property>
                 <property name="label" translatable="yes">Break Timer lets you take small microbreaks as 
well as longer breaks.</property>
                 <style>
                   <class name="_break-status-body"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">1</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="label3">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="hexpand">True</property>
-                <property name="ypad">4</property>
+                <property name="margin-top">4</property>
+                <property name="margin-bottom">4</property>
                 <property name="label" translatable="yes">Microbreaks are a chance to look away from the 
screen and rest your hands.</property>
                 <style>
                   <class name="_break-status-body"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">2</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="label4">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="hexpand">True</property>
-                <property name="ypad">4</property>
+                <property name="margin-top">4</property>
+                <property name="margin-bottom">4</property>
                 <property name="label" translatable="yes">Full breaks are time to get away from the computer 
and move around.</property>
                 <style>
                   <class name="_break-status-body"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">3</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="label1">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="hexpand">True</property>
                 <property name="label" translatable="yes">Breaks and Microbreaks</property>
                 <style>
                   <class name="_break-status-heading"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">0</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
+            </child>
+            <child>
+              <placeholder/>
             </child>
           </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
         </child>
       </object>
     </child>
   </object>
-  <object class="GtkAlignment" id="welcome_ready">
+  <object class="GtkBox" id="welcome_ready">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
+    <property name="can-focus">False</property>
     <child>
-      <object class="GtkGrid" id="welcome_ready_inner">
+      <object class="GtkBox" id="welcome_ready_inner">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="margin_left">85</property>
-        <property name="margin_right">85</property>
-        <property name="margin_top">30</property>
-        <property name="row_spacing">16</property>
+        <property name="can-focus">False</property>
+        <property name="margin-start">85</property>
+        <property name="margin-end">85</property>
+        <property name="margin-top">30</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">16</property>
         <child>
-          <object class="GtkGrid" id="grid8">
+          <object class="GtkBox" id="grid8">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <property name="valign">center</property>
             <property name="vexpand">True</property>
-            <property name="row_spacing">16</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">16</property>
             <child>
               <object class="GtkLabel" id="label6">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="hexpand">True</property>
                 <property name="label" translatable="yes">You can leave me to it</property>
                 <style>
                   <class name="_break-status-heading"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">0</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="keeps_running_label">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="halign">center</property>
-                <property name="xpad">20</property>
+                <property name="margin-start">20</property>
+                <property name="margin-end">20</property>
                 <property name="label" translatable="yes">Break Timer will carry on working in the 
background, even if you close it.</property>
                 <style>
                   <class name="_break-status-body"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">1</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
           </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
         </child>
       </object>
     </child>
   </object>
-  <object class="GtkAlignment" id="welcome_start">
+  <object class="GtkBox" id="welcome_start">
     <property name="visible">True</property>
-    <property name="can_focus">False</property>
+    <property name="can-focus">False</property>
     <child>
-      <object class="GtkGrid" id="welcome_start_inner">
+      <object class="GtkBox" id="welcome_start_inner">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="margin_left">85</property>
-        <property name="margin_right">85</property>
-        <property name="margin_top">30</property>
-        <property name="row_spacing">16</property>
+        <property name="can-focus">False</property>
+        <property name="margin-start">85</property>
+        <property name="margin-end">85</property>
+        <property name="margin-top">30</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">16</property>
         <child>
-          <object class="GtkGrid" id="grid7">
+          <object class="GtkBox" id="grid7">
             <property name="visible">True</property>
-            <property name="can_focus">False</property>
+            <property name="can-focus">False</property>
             <property name="valign">center</property>
-            <property name="margin_left">85</property>
-            <property name="margin_right">85</property>
+            <property name="margin-start">85</property>
+            <property name="margin-end">85</property>
             <property name="vexpand">True</property>
-            <property name="row_spacing">16</property>
+            <property name="orientation">vertical</property>
+            <property name="spacing">16</property>
             <child>
               <object class="GtkLabel" id="label8">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="hexpand">True</property>
                 <property name="label" translatable="yes">Welcome to Break Timer!</property>
                 <style>
                   <class name="_break-status-heading"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">0</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="label9">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="hexpand">True</property>
                 <property name="label" translatable="yes">Breaks are good for you. We'll help you to take 
them.</property>
                 <style>
                   <class name="_break-status-body"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">1</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
             <child>
               <object class="GtkLabel" id="switch_on_label">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
+                <property name="can-focus">False</property>
                 <property name="halign">center</property>
                 <property name="valign">center</property>
-                <property name="margin_top">50</property>
+                <property name="margin-top">50</property>
                 <property name="vexpand">True</property>
-                <property name="xpad">20</property>
+                <property name="margin-start">20</property>
+                <property name="margin-end">20</property>
                 <property name="label" translatable="yes">Just switch me on to get started</property>
                 <style>
                   <class name="_break-status-hint"/>
                 </style>
               </object>
-              <packing>
-                <property name="left_attach">0</property>
-                <property name="top_attach">2</property>
-                <property name="width">1</property>
-                <property name="height">1</property>
-              </packing>
             </child>
           </object>
-          <packing>
-            <property name="left_attach">0</property>
-            <property name="top_attach">0</property>
-            <property name="width">1</property>
-            <property name="height">1</property>
-          </packing>
         </child>
       </object>
     </child>
   </object>
 </interface>
-


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