[gnome-control-center] network: Convert CEPage widgets to GtkTemplate



commit eb0bac874c5b1289bec127279738f424bcf8925c
Author: Robert Ancell <robert ancell canonical com>
Date:   Wed Nov 6 17:16:54 2019 +1300

    network: Convert CEPage widgets to GtkTemplate

 .../connection-editor/8021x-security-page.ui       |   4 +-
 .../connection-editor/ce-page-8021x-security.c     |  49 +++------
 .../connection-editor/ce-page-8021x-security.h     |   8 +-
 panels/network/connection-editor/ce-page-details.c |  83 ++++++---------
 panels/network/connection-editor/ce-page-details.h |  12 +--
 .../network/connection-editor/ce-page-ethernet.c   | 115 ++++++++-------------
 .../network/connection-editor/ce-page-ethernet.h   |   9 +-
 panels/network/connection-editor/ce-page-ip4.c     |  79 +++++---------
 panels/network/connection-editor/ce-page-ip4.h     |   9 +-
 panels/network/connection-editor/ce-page-ip6.c     |  81 +++++----------
 panels/network/connection-editor/ce-page-ip6.h     |   9 +-
 .../network/connection-editor/ce-page-security.c   |  47 +++------
 .../network/connection-editor/ce-page-security.h   |   7 +-
 panels/network/connection-editor/ce-page-vpn.c     |  41 +++-----
 panels/network/connection-editor/ce-page-vpn.h     |   7 +-
 panels/network/connection-editor/ce-page-wifi.c    |  57 +++-------
 panels/network/connection-editor/ce-page-wifi.h    |   9 +-
 panels/network/connection-editor/ce-page.c         |   8 --
 panels/network/connection-editor/ce-page.h         |   2 -
 panels/network/connection-editor/details-page.ui   |   4 +-
 panels/network/connection-editor/ethernet-page.ui  |   4 +-
 panels/network/connection-editor/ip4-page.ui       |   4 +-
 panels/network/connection-editor/ip6-page.ui       |   4 +-
 .../connection-editor/net-connection-editor.c      |  30 +++---
 panels/network/connection-editor/security-page.ui  |   4 +-
 panels/network/connection-editor/vpn-page.ui       |   4 +-
 panels/network/connection-editor/wifi-page.ui      |   4 +-
 27 files changed, 247 insertions(+), 447 deletions(-)
---
diff --git a/panels/network/connection-editor/8021x-security-page.ui 
b/panels/network/connection-editor/8021x-security-page.ui
index 91823c502..cde5d85ee 100644
--- a/panels/network/connection-editor/8021x-security-page.ui
+++ b/panels/network/connection-editor/8021x-security-page.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkGrid" id="grid">
+  <template class="CEPage8021xSecurity" parent="GtkGrid">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="margin_start">50</property>
@@ -58,5 +58,5 @@
         <property name="height">1</property>
       </packing>
     </child>
-  </object>
+  </template>
 </interface>
diff --git a/panels/network/connection-editor/ce-page-8021x-security.c 
b/panels/network/connection-editor/ce-page-8021x-security.c
index 043d97e03..e38e2a71e 100644
--- a/panels/network/connection-editor/ce-page-8021x-security.c
+++ b/panels/network/connection-editor/ce-page-8021x-security.c
@@ -22,25 +22,21 @@
 
 #include "config.h"
 
-#include <string.h>
-
-#include <gtk/gtk.h>
 #include <glib/gi18n.h>
-
 #include <NetworkManager.h>
+#include <string.h>
 
 #include "ws-wpa-eap.h"
 #include "wireless-security.h"
+#include "ce-page.h"
 #include "ce-page-ethernet.h"
 #include "ce-page-8021x-security.h"
 
 struct _CEPage8021xSecurity {
-       GObject parent;
+       GtkGrid parent;
 
-        GtkBuilder  *builder;
         GtkBox      *box;
         GtkSwitch   *enable_8021x_switch;
-        GtkGrid     *grid;
         GtkLabel    *security_label;
 
         NMConnection *connection;
@@ -52,7 +48,7 @@ struct _CEPage8021xSecurity {
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPage8021xSecurity, ce_page_8021x_security, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (CEPage8021xSecurity, ce_page_8021x_security, GTK_TYPE_GRID,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 static void
@@ -112,13 +108,6 @@ ce_page_8021x_security_get_security_setting (CEPage *page)
         return NULL;
 }
 
-static GtkWidget *
-ce_page_8021x_security_get_widget (CEPage *page)
-{
-        CEPage8021xSecurity *self = CE_PAGE_8021X_SECURITY (page);
-        return GTK_WIDGET (self->grid);
-}
-
 static const gchar *
 ce_page_8021x_security_get_title (CEPage *page)
 {
@@ -166,6 +155,7 @@ ce_page_8021x_security_validate (CEPage *cepage, NMConnection *connection, GErro
 static void
 ce_page_8021x_security_init (CEPage8021xSecurity *self)
 {
+        gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 static void
@@ -173,7 +163,6 @@ ce_page_8021x_security_dispose (GObject *object)
 {
        CEPage8021xSecurity *self = CE_PAGE_8021X_SECURITY (object);
 
-        g_clear_object (&self->builder);
         g_clear_object (&self->connection);
         g_clear_pointer (&self->security, wireless_security_unref);
         g_clear_object (&self->group);
@@ -182,41 +171,35 @@ ce_page_8021x_security_dispose (GObject *object)
 }
 
 static void
-ce_page_8021x_security_class_init (CEPage8021xSecurityClass *security_class)
+ce_page_8021x_security_class_init (CEPage8021xSecurityClass *klass)
 {
-       GObjectClass *object_class = G_OBJECT_CLASS (security_class);
+       GObjectClass *object_class = G_OBJECT_CLASS (klass);
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
        object_class->dispose = ce_page_8021x_security_dispose;
+
+        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/network/8021x-security-page.ui");
+
+        gtk_widget_class_bind_template_child (widget_class, CEPage8021xSecurity, box);
+        gtk_widget_class_bind_template_child (widget_class, CEPage8021xSecurity, enable_8021x_switch);
+        gtk_widget_class_bind_template_child (widget_class, CEPage8021xSecurity, security_label);
 }
 
 static void
 ce_page_iface_init (CEPageInterface *iface)
 {
         iface->get_security_setting = ce_page_8021x_security_get_security_setting;
-        iface->get_widget = ce_page_8021x_security_get_widget;
         iface->get_title = ce_page_8021x_security_get_title;
        iface->validate = ce_page_8021x_security_validate;
 }
 
-CEPage *
+CEPage8021xSecurity *
 ce_page_8021x_security_new (NMConnection *connection)
 {
        CEPage8021xSecurity *self;
-        g_autoptr(GError) error = NULL;
 
         self = CE_PAGE_8021X_SECURITY (g_object_new (ce_page_8021x_security_get_type (), NULL));
 
-        self->builder = gtk_builder_new ();
-        if (!gtk_builder_add_from_resource (self->builder, 
"/org/gnome/control-center/network/8021x-security-page.ui", &error)) {
-                g_warning ("Couldn't load builder file: %s", error->message);
-                return NULL;
-        }
-
-        self->box = GTK_BOX (gtk_builder_get_object (self->builder, "box"));
-        self->enable_8021x_switch = GTK_SWITCH (gtk_builder_get_object (self->builder, 
"enable_8021x_switch"));
-        self->grid = GTK_GRID (gtk_builder_get_object (self->builder, "grid"));
-        self->security_label = GTK_LABEL (gtk_builder_get_object (self->builder, "security_label"));
-
         self->connection = g_object_ref (connection);
 
        if (nm_connection_get_setting_802_1x (connection))
@@ -224,5 +207,5 @@ ce_page_8021x_security_new (NMConnection *connection)
 
        g_signal_connect (self, "initialized", G_CALLBACK (finish_setup), NULL);
 
-       return CE_PAGE (self);
+       return self;
 }
diff --git a/panels/network/connection-editor/ce-page-8021x-security.h 
b/panels/network/connection-editor/ce-page-8021x-security.h
index 446e891a3..e783587fd 100644
--- a/panels/network/connection-editor/ce-page-8021x-security.h
+++ b/panels/network/connection-editor/ce-page-8021x-security.h
@@ -22,15 +22,13 @@
 
 #pragma once
 
+#include <gtk/gtk.h>
 #include <NetworkManager.h>
 
-#include "ce-page.h"
-#include "wireless-security.h"
-
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (CEPage8021xSecurity, ce_page_8021x_security, CE, PAGE_8021X_SECURITY, GObject)
+G_DECLARE_FINAL_TYPE (CEPage8021xSecurity, ce_page_8021x_security, CE, PAGE_8021X_SECURITY, GtkGrid)
 
-CEPage *ce_page_8021x_security_new (NMConnection *connection);
+CEPage8021xSecurity *ce_page_8021x_security_new (NMConnection *connection);
 
 G_END_DECLS
diff --git a/panels/network/connection-editor/ce-page-details.c 
b/panels/network/connection-editor/ce-page-details.c
index 5f6d91bd9..18de6a5d4 100644
--- a/panels/network/connection-editor/ce-page-details.c
+++ b/panels/network/connection-editor/ce-page-details.c
@@ -21,24 +21,22 @@
 
 #include "config.h"
 
-#include <glib-object.h>
 #include <glib/gi18n.h>
 
 #include <NetworkManager.h>
 
+#include "ce-page.h"
 #include "ce-page-details.h"
 
 struct _CEPageDetails
 {
-        GObject parent;
+        GtkGrid parent;
 
-        GtkBuilder *builder;
         GtkCheckButton *all_user_check;
         GtkCheckButton *auto_connect_check;
         GtkLabel *dns_heading_label;
         GtkLabel *dns_label;
         GtkButton *forget_button;
-        GtkGrid *grid;
         GtkLabel *ipv4_heading_label;
         GtkLabel *ipv4_label;
         GtkLabel *ipv6_heading_label;
@@ -65,7 +63,7 @@ struct _CEPageDetails
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPageDetails, ce_page_details, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (CEPageDetails, ce_page_details, GTK_TYPE_GRID,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 static void
@@ -404,19 +402,11 @@ ce_page_details_dispose (GObject *object)
 {
         CEPageDetails *self = CE_PAGE_DETAILS (object);
 
-        g_clear_object (&self->builder);
         g_clear_object (&self->connection);
 
         G_OBJECT_CLASS (ce_page_details_parent_class)->dispose (object);
 }
 
-static GtkWidget *
-ce_page_details_get_widget (CEPage *page)
-{
-        CEPageDetails *self = CE_PAGE_DETAILS (page);
-        return GTK_WIDGET (self->grid);
-}
-
 static const gchar *
 ce_page_details_get_title (CEPage *page)
 {
@@ -426,64 +416,59 @@ ce_page_details_get_title (CEPage *page)
 static void
 ce_page_details_init (CEPageDetails *self)
 {
+        gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 static void
-ce_page_details_class_init (CEPageDetailsClass *class)
+ce_page_details_class_init (CEPageDetailsClass *klass)
 {
-        GObjectClass *object_class = G_OBJECT_CLASS (class);
+        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
         object_class->dispose = ce_page_details_dispose;
+
+        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/network/details-page.ui");
+
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, all_user_check);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, auto_connect_check);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns_heading_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, dns_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, forget_button);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv4_heading_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv4_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv6_heading_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, ipv6_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, last_used_heading_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, last_used_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, mac_heading_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, mac_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, restrict_data_check);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, route_heading_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, route_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, security_heading_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, security_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, speed_heading_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, speed_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, strength_heading_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageDetails, strength_label);
 }
 
 static void
 ce_page_iface_init (CEPageInterface *iface)
 {
-        iface->get_widget = ce_page_details_get_widget;
         iface->get_title = ce_page_details_get_title;
 }
 
-CEPage *
+CEPageDetails *
 ce_page_details_new (NMConnection        *connection,
                      NMDevice            *device,
                      NMAccessPoint       *ap,
                      NetConnectionEditor *editor)
 {
         CEPageDetails *self;
-        g_autoptr(GError) error = NULL;
 
         self = CE_PAGE_DETAILS (g_object_new (ce_page_details_get_type (), NULL));
 
-        self->builder = gtk_builder_new ();
-        if (!gtk_builder_add_from_resource (self->builder, 
"/org/gnome/control-center/network/details-page.ui", &error)) {
-                g_warning ("Couldn't load builder file: %s", error->message);
-                return NULL;
-        }
-
-        self->all_user_check = GTK_CHECK_BUTTON (gtk_builder_get_object (self->builder, "all_user_check"));
-        self->auto_connect_check = GTK_CHECK_BUTTON (gtk_builder_get_object (self->builder, 
"auto_connect_check"));
-        self->dns_heading_label = GTK_LABEL (gtk_builder_get_object (self->builder, "dns_heading_label"));
-        self->dns_label = GTK_LABEL (gtk_builder_get_object (self->builder, "dns_label"));
-        self->forget_button = GTK_BUTTON (gtk_builder_get_object (self->builder, "forget_button"));
-        self->grid = GTK_GRID (gtk_builder_get_object (self->builder, "grid"));
-        self->ipv4_heading_label = GTK_LABEL (gtk_builder_get_object (self->builder, "ipv4_heading_label"));
-        self->ipv4_label = GTK_LABEL (gtk_builder_get_object (self->builder, "ipv4_label"));
-        self->ipv6_heading_label = GTK_LABEL (gtk_builder_get_object (self->builder, "ipv6_heading_label"));
-        self->ipv6_label = GTK_LABEL (gtk_builder_get_object (self->builder, "ipv6_label"));
-        self->last_used_heading_label = GTK_LABEL (gtk_builder_get_object (self->builder, 
"last_used_heading_label"));
-        self->last_used_label = GTK_LABEL (gtk_builder_get_object (self->builder, "last_used_label"));
-        self->mac_heading_label = GTK_LABEL (gtk_builder_get_object (self->builder, "mac_heading_label"));
-        self->mac_label = GTK_LABEL (gtk_builder_get_object (self->builder, "mac_label"));
-        self->restrict_data_check = GTK_CHECK_BUTTON (gtk_builder_get_object (self->builder, 
"restrict_data_check"));
-        self->route_heading_label = GTK_LABEL (gtk_builder_get_object (self->builder, 
"route_heading_label"));
-        self->route_label = GTK_LABEL (gtk_builder_get_object (self->builder, "route_label"));
-        self->security_heading_label = GTK_LABEL (gtk_builder_get_object (self->builder, 
"security_heading_label"));
-        self->security_label = GTK_LABEL (gtk_builder_get_object (self->builder, "security_label"));
-        self->speed_heading_label = GTK_LABEL (gtk_builder_get_object (self->builder, 
"speed_heading_label"));
-        self->speed_label = GTK_LABEL (gtk_builder_get_object (self->builder, "speed_label"));
-        self->strength_heading_label = GTK_LABEL (gtk_builder_get_object (self->builder, 
"strength_heading_label"));
-        self->strength_label = GTK_LABEL (gtk_builder_get_object (self->builder, "strength_label"));
-
         self->connection = g_object_ref (connection);
         self->editor = editor;
         self->device = device;
@@ -491,5 +476,5 @@ ce_page_details_new (NMConnection        *connection,
 
         connect_details_page (self);
 
-        return CE_PAGE (self);
+        return self;
 }
diff --git a/panels/network/connection-editor/ce-page-details.h 
b/panels/network/connection-editor/ce-page-details.h
index d57f312af..4fd660c16 100644
--- a/panels/network/connection-editor/ce-page-details.h
+++ b/panels/network/connection-editor/ce-page-details.h
@@ -21,18 +21,18 @@
 
 #pragma once
 
+#include <gtk/gtk.h>
 #include <NetworkManager.h>
 
-#include "ce-page.h"
 #include "net-connection-editor.h"
 
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (CEPageDetails, ce_page_details, CE, PAGE_DETAILS, GObject)
+G_DECLARE_FINAL_TYPE (CEPageDetails, ce_page_details, CE, PAGE_DETAILS, GtkGrid)
 
-CEPage *ce_page_details_new (NMConnection        *connection,
-                             NMDevice            *device,
-                             NMAccessPoint       *ap,
-                             NetConnectionEditor *editor);
+CEPageDetails *ce_page_details_new (NMConnection        *connection,
+                                    NMDevice            *device,
+                                    NMAccessPoint       *ap,
+                                    NetConnectionEditor *editor);
 
 G_END_DECLS
diff --git a/panels/network/connection-editor/ce-page-ethernet.c 
b/panels/network/connection-editor/ce-page-ethernet.c
index ecab9fdf3..68cce0163 100644
--- a/panels/network/connection-editor/ce-page-ethernet.c
+++ b/panels/network/connection-editor/ce-page-ethernet.c
@@ -21,27 +21,23 @@
 
 #include "config.h"
 
-#include <glib-object.h>
 #include <glib/gi18n.h>
 #include <net/if_arp.h>
-
 #include <NetworkManager.h>
 
-
+#include "ce-page.h"
 #include "ce-page-ethernet.h"
 #include "ui-helpers.h"
 
 struct _CEPageEthernet
 {
-        GObject parent;
+        GtkGrid parent;
 
-        GtkBuilder      *builder;
-        GtkComboBoxText *cloned_mac;
-        GtkComboBoxText *device_mac;
-        GtkGrid         *grid;
-        GtkSpinButton   *mtu;
+        GtkComboBoxText *cloned_mac_combo;
+        GtkComboBoxText *mac_combo;
+        GtkSpinButton   *mtu_spin;
         GtkWidget       *mtu_label;
-        GtkEntry        *name;
+        GtkEntry        *name_entry;
 
         NMClient *client;
         NMSettingConnection *setting_connection;
@@ -50,13 +46,13 @@ struct _CEPageEthernet
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPageEthernet, ce_page_ethernet, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (CEPageEthernet, ce_page_ethernet, GTK_TYPE_GRID,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 static void
 mtu_changed (CEPageEthernet *self)
 {
-        if (gtk_spin_button_get_value_as_int (self->mtu) == 0)
+        if (gtk_spin_button_get_value_as_int (self->mtu_spin) == 0)
                 gtk_widget_hide (self->mtu_label);
         else
                 gtk_widget_show (self->mtu_label);
@@ -69,15 +65,15 @@ mtu_output_cb (CEPageEthernet *self)
         gint val;
         g_autofree gchar *buf = NULL;
 
-        val = gtk_spin_button_get_value_as_int (self->mtu);
+        val = gtk_spin_button_get_value_as_int (self->mtu_spin);
         defvalue = ce_get_property_default (NM_SETTING (self->setting_wired), NM_SETTING_WIRED_MTU);
         if (val == defvalue)
                 buf = g_strdup (_("automatic"));
         else
                 buf = g_strdup_printf ("%d", val);
 
-        if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (self->mtu))))
-                gtk_entry_set_text (GTK_ENTRY (self->mtu), buf);
+        if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (self->mtu_spin))))
+                gtk_entry_set_text (GTK_ENTRY (self->mtu_spin), buf);
 }
 
 static void
@@ -90,29 +86,29 @@ connect_ethernet_page (CEPageEthernet *self)
         const gchar *cloned_mac;
 
         name = nm_setting_connection_get_id (self->setting_connection);
-        gtk_entry_set_text (self->name, name);
+        gtk_entry_set_text (self->name_entry, name);
 
         /* Device MAC address */
         mac_list = ce_page_get_mac_list (self->client, NM_TYPE_DEVICE_ETHERNET,
                                          NM_DEVICE_ETHERNET_PERMANENT_HW_ADDRESS);
         s_mac_str = nm_setting_wired_get_mac_address (setting);
-        ce_page_setup_mac_combo (self->device_mac, s_mac_str, mac_list);
+        ce_page_setup_mac_combo (self->mac_combo, s_mac_str, mac_list);
         g_strfreev (mac_list);
-        g_signal_connect_swapped (self->device_mac, "changed", G_CALLBACK (ce_page_changed), self);
+        g_signal_connect_swapped (self->mac_combo, "changed", G_CALLBACK (ce_page_changed), self);
 
         /* Cloned MAC address */
         cloned_mac = nm_setting_wired_get_cloned_mac_address (setting);
-        ce_page_setup_cloned_mac_combo (self->cloned_mac, cloned_mac);
-        g_signal_connect_swapped (self->cloned_mac, "changed", G_CALLBACK (ce_page_changed), self);
+        ce_page_setup_cloned_mac_combo (self->cloned_mac_combo, cloned_mac);
+        g_signal_connect_swapped (self->cloned_mac_combo, "changed", G_CALLBACK (ce_page_changed), self);
 
         /* MTU */
-        g_signal_connect_swapped (self->mtu, "output", G_CALLBACK (mtu_output_cb), self);
-        gtk_spin_button_set_value (self->mtu, (gdouble) nm_setting_wired_get_mtu (setting));
-        g_signal_connect_swapped (self->mtu, "value-changed", G_CALLBACK (mtu_changed), self);
+        g_signal_connect_swapped (self->mtu_spin, "output", G_CALLBACK (mtu_output_cb), self);
+        gtk_spin_button_set_value (self->mtu_spin, (gdouble) nm_setting_wired_get_mtu (setting));
+        g_signal_connect_swapped (self->mtu_spin, "value-changed", G_CALLBACK (mtu_changed), self);
         mtu_changed (self);
 
-        g_signal_connect_swapped (self->name, "changed", G_CALLBACK (ce_page_changed), self);
-        g_signal_connect_swapped (self->mtu, "value-changed", G_CALLBACK (ce_page_changed), self);
+        g_signal_connect_swapped (self->name_entry, "changed", G_CALLBACK (ce_page_changed), self);
+        g_signal_connect_swapped (self->mtu_spin, "value-changed", G_CALLBACK (ce_page_changed), self);
 }
 
 static void
@@ -122,45 +118,26 @@ ui_to_setting (CEPageEthernet *self)
         g_autofree gchar *cloned_mac = NULL;
         const gchar *text;
         GtkWidget *entry;
-        GtkComboBoxText *combo;
 
-        entry = gtk_bin_get_child (GTK_BIN (self->device_mac));
+        entry = gtk_bin_get_child (GTK_BIN (self->mac_combo));
         if (entry) {
                 text = gtk_entry_get_text (GTK_ENTRY (entry));
                 device_mac = ce_page_trim_address (text);
         }
 
-        combo = self->cloned_mac;
-        cloned_mac = ce_page_cloned_mac_get (combo);
+        cloned_mac = ce_page_cloned_mac_get (self->cloned_mac_combo);
 
         g_object_set (self->setting_wired,
                       NM_SETTING_WIRED_MAC_ADDRESS, device_mac,
                       NM_SETTING_WIRED_CLONED_MAC_ADDRESS, cloned_mac,
-                      NM_SETTING_WIRED_MTU, (guint32) gtk_spin_button_get_value_as_int (self->mtu),
+                      NM_SETTING_WIRED_MTU, (guint32) gtk_spin_button_get_value_as_int (self->mtu_spin),
                       NULL);
 
         g_object_set (self->setting_connection,
-                      NM_SETTING_CONNECTION_ID, gtk_entry_get_text (self->name),
+                      NM_SETTING_CONNECTION_ID, gtk_entry_get_text (self->name_entry),
                       NULL);
 }
 
-static void
-ce_page_ethernet_dispose (GObject *object)
-{
-        CEPageEthernet *self = CE_PAGE_ETHERNET (object);
-
-        g_clear_object (&self->builder);
-
-        G_OBJECT_CLASS (ce_page_ethernet_parent_class)->dispose (object);
-}
-
-static GtkWidget *
-ce_page_ethernet_get_widget (CEPage *page)
-{
-        CEPageEthernet *self = CE_PAGE_ETHERNET (page);
-        return GTK_WIDGET (self->grid);
-}
-
 static const gchar *
 ce_page_ethernet_get_title (CEPage *page)
 {
@@ -174,10 +151,9 @@ ce_page_ethernet_validate (CEPage        *page,
 {
         CEPageEthernet *self = CE_PAGE_ETHERNET (page);
         GtkWidget *entry;
-        GtkComboBoxText *combo;
         gboolean ret = TRUE;
 
-        entry = gtk_bin_get_child (GTK_BIN (self->device_mac));
+        entry = gtk_bin_get_child (GTK_BIN (self->mac_combo));
         if (entry) {
                 if (!ce_page_address_is_valid (gtk_entry_get_text (GTK_ENTRY (entry)))) {
                         widget_set_error (entry);
@@ -187,12 +163,11 @@ ce_page_ethernet_validate (CEPage        *page,
                 }
         }
 
-        combo = self->cloned_mac;
-        if (!ce_page_cloned_mac_combo_valid (combo)) {
-                widget_set_error (gtk_bin_get_child (GTK_BIN (combo)));
+        if (!ce_page_cloned_mac_combo_valid (self->cloned_mac_combo)) {
+                widget_set_error (gtk_bin_get_child (GTK_BIN (self->cloned_mac_combo)));
                 ret = FALSE;
         } else {
-                widget_unset_error (gtk_bin_get_child (GTK_BIN (combo)));
+                widget_unset_error (gtk_bin_get_child (GTK_BIN (self->cloned_mac_combo)));
         }
 
         if (!ret)
@@ -207,51 +182,43 @@ ce_page_ethernet_validate (CEPage        *page,
 static void
 ce_page_ethernet_init (CEPageEthernet *self)
 {
+        gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 static void
-ce_page_ethernet_class_init (CEPageEthernetClass *class)
+ce_page_ethernet_class_init (CEPageEthernetClass *klass)
 {
-        GObjectClass *object_class = G_OBJECT_CLASS (class);
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-        object_class->dispose = ce_page_ethernet_dispose;
+        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/network/ethernet-page.ui");
+
+        gtk_widget_class_bind_template_child (widget_class, CEPageEthernet, cloned_mac_combo);
+        gtk_widget_class_bind_template_child (widget_class, CEPageEthernet, mac_combo);
+        gtk_widget_class_bind_template_child (widget_class, CEPageEthernet, mtu_spin);
+        gtk_widget_class_bind_template_child (widget_class, CEPageEthernet, mtu_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageEthernet, name_entry);
 }
 
 static void
 ce_page_iface_init (CEPageInterface *iface)
 {
-        iface->get_widget = ce_page_ethernet_get_widget;
         iface->get_title = ce_page_ethernet_get_title;
         iface->validate = ce_page_ethernet_validate;
 }
 
-CEPage *
+CEPageEthernet *
 ce_page_ethernet_new (NMConnection     *connection,
                       NMClient         *client)
 {
         CEPageEthernet *self;
-        g_autoptr(GError) error = NULL;
 
         self = CE_PAGE_ETHERNET (g_object_new (ce_page_ethernet_get_type (), NULL));
 
-        self->builder = gtk_builder_new ();
-        if (!gtk_builder_add_from_resource (self->builder, 
"/org/gnome/control-center/network/ethernet-page.ui", &error)) {
-                g_warning ("Couldn't load builder file: %s", error->message);
-                return NULL;
-        }
-
-        self->cloned_mac = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (self->builder, "cloned_mac_combo"));
-        self->device_mac = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (self->builder, "mac_combo"));
-        self->grid = GTK_GRID (gtk_builder_get_object (self->builder, "grid"));
-        self->mtu = GTK_SPIN_BUTTON (gtk_builder_get_object (self->builder, "mtu_spin"));
-        self->mtu_label = GTK_WIDGET (gtk_builder_get_object (self->builder, "mtu_label"));
-        self->name = GTK_ENTRY (gtk_builder_get_object (self->builder, "name_entry"));
-
         self->client = client;
         self->setting_connection = nm_connection_get_setting_connection (connection);
         self->setting_wired = nm_connection_get_setting_wired (connection);
 
         connect_ethernet_page (self);
 
-        return CE_PAGE (self);
+        return self;
 }
diff --git a/panels/network/connection-editor/ce-page-ethernet.h 
b/panels/network/connection-editor/ce-page-ethernet.h
index 3b4f6681d..446363778 100644
--- a/panels/network/connection-editor/ce-page-ethernet.h
+++ b/panels/network/connection-editor/ce-page-ethernet.h
@@ -21,15 +21,14 @@
 
 #pragma once
 
+#include <gtk/gtk.h>
 #include <NetworkManager.h>
 
-#include "ce-page.h"
-
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (CEPageEthernet, ce_page_ethernet, CE, PAGE_ETHERNET, GObject)
+G_DECLARE_FINAL_TYPE (CEPageEthernet, ce_page_ethernet, CE, PAGE_ETHERNET, GtkGrid)
 
-CEPage *ce_page_ethernet_new (NMConnection     *connection,
-                              NMClient         *client);
+CEPageEthernet *ce_page_ethernet_new (NMConnection     *connection,
+                                      NMClient         *client);
 
 G_END_DECLS
diff --git a/panels/network/connection-editor/ce-page-ip4.c b/panels/network/connection-editor/ce-page-ip4.c
index b8f4a4af4..21ae4c777 100644
--- a/panels/network/connection-editor/ce-page-ip4.c
+++ b/panels/network/connection-editor/ce-page-ip4.c
@@ -24,11 +24,11 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <arpa/inet.h>
-#include <glib-object.h>
 #include <glib/gi18n.h>
 #include <NetworkManager.h>
 
 #include "list-box-helper.h"
+#include "ce-page.h"
 #include "ce-page-ip4.h"
 #include "ui-helpers.h"
 
@@ -37,9 +37,8 @@ static void ensure_empty_routes_row (CEPageIP4 *self);
 
 struct _CEPageIP4
 {
-        GObject parent;
+        GtkScrolledWindow parent;
 
-        GtkBuilder        *builder;
         GtkBox            *address_box;
         GtkSizeGroup      *address_sizegroup;
         GtkSwitch         *auto_dns_switch;
@@ -54,7 +53,6 @@ struct _CEPageIP4
         GtkBox            *routes_box;
         GtkSizeGroup      *routes_metric_sizegroup;
         GtkSizeGroup      *routes_sizegroup;
-        GtkScrolledWindow *scrolled_window;
 
         NMSettingIPConfig *setting;
 
@@ -64,7 +62,7 @@ struct _CEPageIP4
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPageIP4, ce_page_ip4, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (CEPageIP4, ce_page_ip4, GTK_TYPE_SCROLLED_WINDOW,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 enum {
@@ -158,7 +156,7 @@ remove_row (CEPageIP4 *self)
         GtkWidget *row;
         GtkWidget *row_box;
 
-        row_box = gtk_widget_get_parent (GTK_WIDGET (self->scrolled_window));
+        row_box = gtk_widget_get_parent (GTK_WIDGET (self));
         row = gtk_widget_get_parent (row_box);
         list = gtk_widget_get_parent (row);
 
@@ -850,23 +848,6 @@ out:
         return ret;
 }
 
-static void
-ce_page_ip4_dispose (GObject *object)
-{
-        CEPageIP4 *self = CE_PAGE_IP4 (object);
-
-        g_clear_object (&self->builder);
-
-        G_OBJECT_CLASS (ce_page_ip4_parent_class)->dispose (object);
-}
-
-static GtkWidget *
-ce_page_ip4_get_widget (CEPage *page)
-{
-        CEPageIP4 *self = CE_PAGE_IP4 (page);
-        return GTK_WIDGET (self->scrolled_window);
-}
-
 static const gchar *
 ce_page_ip4_get_title (CEPage *page)
 {
@@ -887,55 +868,47 @@ ce_page_ip4_validate (CEPage        *self,
 static void
 ce_page_ip4_init (CEPageIP4 *self)
 {
+        gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 static void
-ce_page_ip4_class_init (CEPageIP4Class *class)
+ce_page_ip4_class_init (CEPageIP4Class *klass)
 {
-        GObjectClass *object_class = G_OBJECT_CLASS (class);
-
-        object_class->dispose = ce_page_ip4_dispose;
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/network/ip4-page.ui");
+
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, address_box);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, address_sizegroup);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, auto_dns_switch);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, auto_routes_switch);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, automatic_radio);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, content_box);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, disabled_radio);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, dns_entry);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, local_radio);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, manual_radio);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, never_default_check);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, routes_box);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, routes_metric_sizegroup);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP4, routes_sizegroup);
 }
 
 static void
 ce_page_iface_init (CEPageInterface *iface)
 {
-        iface->get_widget = ce_page_ip4_get_widget;
         iface->get_title = ce_page_ip4_get_title;
         iface->validate = ce_page_ip4_validate;
 }
 
-CEPage *
+CEPageIP4 *
 ce_page_ip4_new (NMConnection     *connection,
                  NMClient         *client)
 {
         CEPageIP4 *self;
-        g_autoptr(GError) error = NULL;
 
         self = CE_PAGE_IP4 (g_object_new (ce_page_ip4_get_type (), NULL));
 
-        self->builder = gtk_builder_new ();
-        if (!gtk_builder_add_from_resource (self->builder, "/org/gnome/control-center/network/ip4-page.ui", 
&error)) {
-                g_warning ("Couldn't load builder file: %s", error->message);
-                return NULL;
-        }
-
-        self->address_box = GTK_BOX (gtk_builder_get_object (self->builder, "address_box"));
-        self->address_sizegroup = GTK_SIZE_GROUP (gtk_builder_get_object (self->builder, 
"address_sizegroup"));
-        self->auto_dns_switch = GTK_SWITCH (gtk_builder_get_object (self->builder, "auto_dns_switch"));
-        self->auto_routes_switch = GTK_SWITCH (gtk_builder_get_object (self->builder, "auto_routes_switch"));
-        self->automatic_radio = GTK_RADIO_BUTTON (gtk_builder_get_object (self->builder, "automatic_radio"));
-        self->content_box = GTK_BOX (gtk_builder_get_object (self->builder, "content_box"));
-        self->disabled_radio = GTK_RADIO_BUTTON (gtk_builder_get_object (self->builder, "disabled_radio"));
-        self->dns_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "dns_entry"));
-        self->local_radio = GTK_RADIO_BUTTON (gtk_builder_get_object (self->builder, "local_radio"));
-        self->manual_radio = GTK_RADIO_BUTTON (gtk_builder_get_object (self->builder, "manual_radio"));
-        self->never_default_check = GTK_CHECK_BUTTON (gtk_builder_get_object (self->builder, 
"never_default_check"));
-        self->routes_box = GTK_BOX (gtk_builder_get_object (self->builder, "routes_box"));
-        self->routes_metric_sizegroup = GTK_SIZE_GROUP (gtk_builder_get_object (self->builder, 
"routes_metric_sizegroup"));
-        self->routes_sizegroup = GTK_SIZE_GROUP (gtk_builder_get_object (self->builder, "routes_sizegroup"));
-        self->scrolled_window = GTK_SCROLLED_WINDOW (gtk_builder_get_object (self->builder, 
"scrolled_window"));
-
         self->setting = nm_connection_get_setting_ip4_config (connection);
         if (!self->setting) {
                 self->setting = NM_SETTING_IP_CONFIG (nm_setting_ip4_config_new ());
@@ -944,5 +917,5 @@ ce_page_ip4_new (NMConnection     *connection,
 
         connect_ip4_page (self);
 
-        return CE_PAGE (self);
+        return self;
 }
diff --git a/panels/network/connection-editor/ce-page-ip4.h b/panels/network/connection-editor/ce-page-ip4.h
index e6713c924..807681f0c 100644
--- a/panels/network/connection-editor/ce-page-ip4.h
+++ b/panels/network/connection-editor/ce-page-ip4.h
@@ -21,15 +21,14 @@
 
 #pragma once
 
+#include <gtk/gtk.h>
 #include <NetworkManager.h>
 
-#include "ce-page.h"
-
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (CEPageIP4, ce_page_ip4, CE, PAGE_IP4, GObject)
+G_DECLARE_FINAL_TYPE (CEPageIP4, ce_page_ip4, CE, PAGE_IP4, GtkScrolledWindow)
 
-CEPage *ce_page_ip4_new (NMConnection     *connection,
-                         NMClient         *client);
+CEPageIP4 *ce_page_ip4_new (NMConnection     *connection,
+                            NMClient         *client);
 
 G_END_DECLS
diff --git a/panels/network/connection-editor/ce-page-ip6.c b/panels/network/connection-editor/ce-page-ip6.c
index f654d705b..49d411f62 100644
--- a/panels/network/connection-editor/ce-page-ip6.c
+++ b/panels/network/connection-editor/ce-page-ip6.c
@@ -24,11 +24,11 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <arpa/inet.h>
-#include <glib-object.h>
 #include <glib/gi18n.h>
 #include <NetworkManager.h>
 
 #include "list-box-helper.h"
+#include "ce-page.h"
 #include "ce-page-ip6.h"
 #include "ui-helpers.h"
 
@@ -38,9 +38,8 @@ static void ensure_empty_routes_row (CEPageIP6 *self);
 
 struct _CEPageIP6
 {
-        GObject parent;
+        GtkScrolledWindow parent;
 
-        GtkBuilder        *builder;
         GtkBox            *address_box;
         GtkSizeGroup      *address_sizegroup;
         GtkSwitch         *auto_dns_switch;
@@ -56,7 +55,6 @@ struct _CEPageIP6
         GtkBox            *routes_box;
         GtkSizeGroup      *routes_metric_sizegroup;
         GtkSizeGroup      *routes_sizegroup;
-        GtkScrolledWindow *scrolled_window;
 
         NMSettingIPConfig *setting;
 
@@ -66,7 +64,7 @@ struct _CEPageIP6
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPageIP6, ce_page_ip6, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (CEPageIP6, ce_page_ip6, GTK_TYPE_SCROLLED_WINDOW,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 enum {
@@ -141,7 +139,7 @@ remove_row (CEPageIP6 *self)
         GtkWidget *row_box;
         GtkWidget *list;
 
-        row_box = gtk_widget_get_parent (GTK_WIDGET (self->scrolled_window));
+        row_box = gtk_widget_get_parent (GTK_WIDGET (self));
         row = gtk_widget_get_parent (row_box);
         list = gtk_widget_get_parent (row);
 
@@ -773,23 +771,6 @@ out:
         return ret;
 }
 
-static void
-ce_page_ip6_dispose (GObject *object)
-{
-        CEPageIP6 *self = CE_PAGE_IP6 (object);
-
-        g_clear_object (&self->builder);
-
-        G_OBJECT_CLASS (ce_page_ip6_parent_class)->dispose (object);
-}
-
-static GtkWidget *
-ce_page_ip6_get_widget (CEPage *page)
-{
-        CEPageIP6 *self = CE_PAGE_IP6 (page);
-        return GTK_WIDGET (self->scrolled_window);
-}
-
 static const gchar *
 ce_page_ip6_get_title (CEPage *page)
 {
@@ -810,56 +791,48 @@ ce_page_ip6_validate (CEPage        *self,
 static void
 ce_page_ip6_init (CEPageIP6 *self)
 {
+        gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 static void
-ce_page_ip6_class_init (CEPageIP6Class *class)
+ce_page_ip6_class_init (CEPageIP6Class *klass)
 {
-        GObjectClass *object_class = G_OBJECT_CLASS (class);
-
-        object_class->dispose = ce_page_ip6_dispose;
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/network/ip6-page.ui");
+
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, address_box);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, address_sizegroup);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, auto_dns_switch);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, auto_routes_switch);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, automatic_radio);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, content_box);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, dhcp_radio);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, disabled_radio);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, dns_entry);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, local_radio);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, manual_radio);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, never_default_check);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, routes_box);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, routes_metric_sizegroup);
+        gtk_widget_class_bind_template_child (widget_class, CEPageIP6, routes_sizegroup);
 }
 
 static void
 ce_page_iface_init (CEPageInterface *iface)
 {
-        iface->get_widget = ce_page_ip6_get_widget;
         iface->get_title = ce_page_ip6_get_title;
         iface->validate = ce_page_ip6_validate;
 }
 
-CEPage *
+CEPageIP6 *
 ce_page_ip6_new (NMConnection     *connection,
                  NMClient         *client)
 {
         CEPageIP6 *self;
-        g_autoptr(GError) error = NULL;
 
         self = CE_PAGE_IP6 (g_object_new (ce_page_ip6_get_type (), NULL));
 
-        self->builder = gtk_builder_new ();
-        if (!gtk_builder_add_from_resource (self->builder, "/org/gnome/control-center/network/ip6-page.ui", 
&error)) {
-                g_warning ("Couldn't load builder file: %s", error->message);
-                return NULL;
-        }
-
-        self->address_box = GTK_BOX (gtk_builder_get_object (self->builder, "address_box"));
-        self->address_sizegroup = GTK_SIZE_GROUP (gtk_builder_get_object (self->builder, 
"address_sizegroup"));
-        self->auto_dns_switch = GTK_SWITCH (gtk_builder_get_object (self->builder, "auto_dns_switch"));
-        self->auto_routes_switch = GTK_SWITCH (gtk_builder_get_object (self->builder, "auto_routes_switch"));
-        self->automatic_radio = GTK_RADIO_BUTTON (gtk_builder_get_object (self->builder, "automatic_radio"));
-        self->content_box = GTK_BOX (gtk_builder_get_object (self->builder, "content_box"));
-        self->dhcp_radio = GTK_RADIO_BUTTON (gtk_builder_get_object (self->builder, "dhcp_radio"));
-        self->disabled_radio = GTK_RADIO_BUTTON (gtk_builder_get_object (self->builder, "disabled_radio"));
-        self->dns_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "dns_entry"));
-        self->local_radio = GTK_RADIO_BUTTON (gtk_builder_get_object (self->builder, "local_radio"));
-        self->manual_radio = GTK_RADIO_BUTTON (gtk_builder_get_object (self->builder, "manual_radio"));
-        self->never_default_check = GTK_CHECK_BUTTON (gtk_builder_get_object (self->builder, 
"never_default_check"));
-        self->routes_box = GTK_BOX (gtk_builder_get_object (self->builder, "routes_box"));
-        self->routes_metric_sizegroup = GTK_SIZE_GROUP (gtk_builder_get_object (self->builder, 
"routes_metric_sizegroup"));
-        self->routes_sizegroup = GTK_SIZE_GROUP (gtk_builder_get_object (self->builder, "routes_sizegroup"));
-        self->scrolled_window = GTK_SCROLLED_WINDOW (gtk_builder_get_object (self->builder, 
"scrolled_window"));
-
         self->setting = nm_connection_get_setting_ip6_config (connection);
         if (!self->setting) {
                 self->setting = NM_SETTING_IP_CONFIG (nm_setting_ip6_config_new ());
@@ -868,5 +841,5 @@ ce_page_ip6_new (NMConnection     *connection,
 
         connect_ip6_page (self);
 
-        return CE_PAGE (self);
+        return self;
 }
diff --git a/panels/network/connection-editor/ce-page-ip6.h b/panels/network/connection-editor/ce-page-ip6.h
index 60e847080..d7f7af5ec 100644
--- a/panels/network/connection-editor/ce-page-ip6.h
+++ b/panels/network/connection-editor/ce-page-ip6.h
@@ -21,15 +21,14 @@
 
 #pragma once
 
+#include <gtk/gtk.h>
 #include <NetworkManager.h>
 
-#include "ce-page.h"
-
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (CEPageIP6, ce_page_ip6, CE, PAGE_IP6, GObject)
+G_DECLARE_FINAL_TYPE (CEPageIP6, ce_page_ip6, CE, PAGE_IP6, GtkScrolledWindow)
 
-CEPage *ce_page_ip6_new (NMConnection     *connection,
-                         NMClient         *client);
+CEPageIP6 *ce_page_ip6_new (NMConnection     *connection,
+                            NMClient         *client);
 
 G_END_DECLS
diff --git a/panels/network/connection-editor/ce-page-security.c 
b/panels/network/connection-editor/ce-page-security.c
index 00da42324..f716d7ef4 100644
--- a/panels/network/connection-editor/ce-page-security.c
+++ b/panels/network/connection-editor/ce-page-security.c
@@ -21,13 +21,13 @@
 
 #include "config.h"
 
-#include <glib-object.h>
 #include <glib/gi18n.h>
 
 #include <NetworkManager.h>
 
-#include "wireless-security.h"
+#include "ce-page.h"
 #include "ce-page-security.h"
+#include "wireless-security.h"
 #include "ws-dynamic-wep.h"
 #include "ws-leap.h"
 #include "ws-wep-key.h"
@@ -36,11 +36,9 @@
 
 struct _CEPageSecurity
 {
-        GObject parent;
+        GtkGrid parent;
 
-        GtkBuilder  *builder;
         GtkBox      *box;
-        GtkGrid     *grid;
         GtkComboBox *security_combo;
         GtkLabel    *security_label;
 
@@ -52,7 +50,7 @@ struct _CEPageSecurity
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPageSecurity, ce_page_security, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (CEPageSecurity, ce_page_security, GTK_TYPE_GRID,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 enum {
@@ -370,7 +368,6 @@ ce_page_security_dispose (GObject *object)
 {
         CEPageSecurity *self = CE_PAGE_SECURITY (object);
 
-        g_clear_object (&self->builder);
         g_clear_object (&self->connection);
         g_clear_object (&self->group);
 
@@ -383,13 +380,6 @@ ce_page_security_get_security_setting (CEPage *page)
         return CE_PAGE_SECURITY (page)->security_setting;
 }
 
-static GtkWidget *
-ce_page_security_get_widget (CEPage *page)
-{
-        CEPageSecurity *self = CE_PAGE_SECURITY (page);
-        return GTK_WIDGET (self->grid);
-}
-
 static const gchar *
 ce_page_security_get_title (CEPage *page)
 {
@@ -449,46 +439,41 @@ ce_page_security_validate (CEPage        *page,
 static void
 ce_page_security_init (CEPageSecurity *self)
 {
+        gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 static void
-ce_page_security_class_init (CEPageSecurityClass *class)
+ce_page_security_class_init (CEPageSecurityClass *klass)
 {
-        GObjectClass *object_class = G_OBJECT_CLASS (class);
+        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
         object_class->dispose = ce_page_security_dispose;
+
+        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/network/security-page.ui");
+
+        gtk_widget_class_bind_template_child (widget_class, CEPageSecurity, box);
+        gtk_widget_class_bind_template_child (widget_class, CEPageSecurity, security_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageSecurity, security_combo);
 }
 
 static void
 ce_page_iface_init (CEPageInterface *iface)
 {
         iface->get_security_setting = ce_page_security_get_security_setting;
-        iface->get_widget = ce_page_security_get_widget;
         iface->get_title = ce_page_security_get_title;
         iface->validate = ce_page_security_validate;
 }
 
-CEPage *
+CEPageSecurity *
 ce_page_security_new (NMConnection *connection)
 {
         CEPageSecurity *self;
         NMUtilsSecurityType default_type = NMU_SEC_NONE;
         NMSettingWirelessSecurity *sws;
-        g_autoptr(GError) error = NULL;
 
         self = CE_PAGE_SECURITY (g_object_new (ce_page_security_get_type (), NULL));
 
-        self->builder = gtk_builder_new ();
-        if (!gtk_builder_add_from_resource (self->builder, 
"/org/gnome/control-center/network/security-page.ui", &error)) {
-                g_warning ("Couldn't load builder file: %s", error->message);
-                return NULL;
-        }
-
-        self->box = GTK_BOX (gtk_builder_get_object (self->builder, "box"));
-        self->grid = GTK_GRID (gtk_builder_get_object (self->builder, "grid"));
-        self->security_label = GTK_LABEL (gtk_builder_get_object (self->builder, "security_label"));
-        self->security_combo = GTK_COMBO_BOX (gtk_builder_get_object (self->builder, "security_combo"));
-
         self->connection = g_object_ref (connection);
 
         sws = nm_connection_get_setting_wireless_security (connection);
@@ -510,5 +495,5 @@ ce_page_security_new (NMConnection *connection)
 
         g_signal_connect (self, "initialized", G_CALLBACK (finish_setup), NULL);
 
-        return CE_PAGE (self);
+        return self;
 }
diff --git a/panels/network/connection-editor/ce-page-security.h 
b/panels/network/connection-editor/ce-page-security.h
index b585bdeb6..4e4486f82 100644
--- a/panels/network/connection-editor/ce-page-security.h
+++ b/panels/network/connection-editor/ce-page-security.h
@@ -21,14 +21,13 @@
 
 #pragma once
 
+#include <gtk/gtk.h>
 #include <NetworkManager.h>
 
-#include "ce-page.h"
-
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (CEPageSecurity, ce_page_security, CE, PAGE_SECURITY, GObject)
+G_DECLARE_FINAL_TYPE (CEPageSecurity, ce_page_security, CE, PAGE_SECURITY, GtkGrid)
 
-CEPage *ce_page_security_new (NMConnection *connection);
+CEPageSecurity *ce_page_security_new (NMConnection *connection);
 
 G_END_DECLS
diff --git a/panels/network/connection-editor/ce-page-vpn.c b/panels/network/connection-editor/ce-page-vpn.c
index 136a25abf..c1acce503 100644
--- a/panels/network/connection-editor/ce-page-vpn.c
+++ b/panels/network/connection-editor/ce-page-vpn.c
@@ -21,20 +21,18 @@
 
 #include "config.h"
 
-#include <glib-object.h>
 #include <glib/gi18n.h>
 
 #include <NetworkManager.h>
 
+#include "ce-page.h"
 #include "ce-page-vpn.h"
 #include "vpn-helpers.h"
 
 struct _CEPageVpn
 {
-        GObject parent;
+        GtkBox parent;
 
-        GtkBuilder *builder;
-        GtkBox     *box;
         GtkLabel   *failure_label;
         GtkEntry   *name_entry;
 
@@ -48,7 +46,7 @@ struct _CEPageVpn
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPageVpn, ce_page_vpn, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (CEPageVpn, ce_page_vpn, GTK_TYPE_BOX,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 /* Hack to make the plugin-provided editor widget fit in better with
@@ -113,7 +111,7 @@ load_vpn_plugin (CEPageVpn *self)
 
         gtk_widget_destroy (GTK_WIDGET (self->failure_label));
 
-        gtk_box_pack_start (self->box, ui_widget, TRUE, TRUE, 0);
+        gtk_box_pack_start (GTK_BOX (self), ui_widget, TRUE, TRUE, 0);
        gtk_widget_show_all (ui_widget);
 
         g_signal_connect_swapped (self->editor, "changed", G_CALLBACK (ce_page_changed), self);
@@ -134,7 +132,6 @@ ce_page_vpn_dispose (GObject *object)
 {
         CEPageVpn *self = CE_PAGE_VPN (object);
 
-        g_clear_object (&self->builder);
         g_clear_object (&self->connection);
         g_clear_object (&self->editor);
 
@@ -147,13 +144,6 @@ ce_page_vpn_get_security_setting (CEPage *page)
         return NM_SETTING_VPN_SETTING_NAME;
 }
 
-static GtkWidget *
-ce_page_vpn_get_widget (CEPage *page)
-{
-        CEPageVpn *self = CE_PAGE_VPN (page);
-        return GTK_WIDGET (self->box);
-}
-
 static const gchar *
 ce_page_vpn_get_title (CEPage *page)
 {
@@ -183,21 +173,27 @@ ce_page_vpn_validate (CEPage        *page,
 static void
 ce_page_vpn_init (CEPageVpn *self)
 {
+        gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 static void
 ce_page_vpn_class_init (CEPageVpnClass *class)
 {
         GObjectClass *object_class = G_OBJECT_CLASS (class);
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
 
         object_class->dispose = ce_page_vpn_dispose;
+
+        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/network/vpn-page.ui");
+
+        gtk_widget_class_bind_template_child (widget_class, CEPageVpn, failure_label);
+        gtk_widget_class_bind_template_child (widget_class, CEPageVpn, name_entry);
 }
 
 static void
 ce_page_iface_init (CEPageInterface *iface)
 {
         iface->get_security_setting = ce_page_vpn_get_security_setting;
-        iface->get_widget = ce_page_vpn_get_widget;
         iface->get_title = ce_page_vpn_get_title;
         iface->validate = ce_page_vpn_validate;
 }
@@ -218,27 +214,16 @@ finish_setup (CEPageVpn *self, gpointer unused, GError *error, gpointer user_dat
         connect_vpn_page (self);
 }
 
-CEPage *
+CEPageVpn *
 ce_page_vpn_new (NMConnection *connection)
 {
         CEPageVpn *self;
-        g_autoptr(GError) error = NULL;
 
         self = CE_PAGE_VPN (g_object_new (ce_page_vpn_get_type (), NULL));
 
-        self->builder = gtk_builder_new ();
-        if (!gtk_builder_add_from_resource (self->builder, "/org/gnome/control-center/network/vpn-page.ui", 
&error)) {
-                g_warning ("Couldn't load builder file: %s", error->message);
-                return NULL;
-        }
-
-        self->box = GTK_BOX (gtk_builder_get_object (self->builder, "box"));
-        self->failure_label = GTK_LABEL (gtk_builder_get_object (self->builder, "failure_label"));
-        self->name_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "name_entry"));
-
         self->connection = g_object_ref (connection);
 
         g_signal_connect (self, "initialized", G_CALLBACK (finish_setup), NULL);
 
-        return CE_PAGE (self);
+        return self;
 }
diff --git a/panels/network/connection-editor/ce-page-vpn.h b/panels/network/connection-editor/ce-page-vpn.h
index 339e39281..fd310d870 100644
--- a/panels/network/connection-editor/ce-page-vpn.h
+++ b/panels/network/connection-editor/ce-page-vpn.h
@@ -21,14 +21,13 @@
 
 #pragma once
 
+#include <gtk/gtk.h>
 #include <NetworkManager.h>
 
-#include "ce-page.h"
-
 G_BEGIN_DECLS
 
-G_DECLARE_FINAL_TYPE (CEPageVpn, ce_page_vpn, CE, PAGE_VPN, GObject)
+G_DECLARE_FINAL_TYPE (CEPageVpn, ce_page_vpn, CE, PAGE_VPN, GtkBox)
 
-CEPage *ce_page_vpn_new (NMConnection *connection);
+CEPageVpn *ce_page_vpn_new (NMConnection *connection);
 
 G_END_DECLS
diff --git a/panels/network/connection-editor/ce-page-wifi.c b/panels/network/connection-editor/ce-page-wifi.c
index 727d58dd3..784c7b8d3 100644
--- a/panels/network/connection-editor/ce-page-wifi.c
+++ b/panels/network/connection-editor/ce-page-wifi.c
@@ -21,24 +21,20 @@
 
 #include "config.h"
 
-#include <glib-object.h>
 #include <glib/gi18n.h>
-
 #include <NetworkManager.h>
-
 #include <net/if_arp.h>
 
+#include "ce-page.h"
 #include "ce-page-wifi.h"
 #include "ui-helpers.h"
 
 struct _CEPageWifi
 {
-        GObject parent;
+        GtkGrid parent;
 
-        GtkBuilder      *builder;
         GtkComboBoxText *bssid_combo;
         GtkComboBoxText *cloned_mac_combo;
-        GtkGrid         *grid;
         GtkComboBoxText *mac_combo;
         GtkEntry        *ssid_entry;
 
@@ -48,7 +44,7 @@ struct _CEPageWifi
 
 static void ce_page_iface_init (CEPageInterface *);
 
-G_DEFINE_TYPE_WITH_CODE (CEPageWifi, ce_page_wifi, G_TYPE_OBJECT,
+G_DEFINE_TYPE_WITH_CODE (CEPageWifi, ce_page_wifi, GTK_TYPE_GRID,
                          G_IMPLEMENT_INTERFACE (ce_page_get_type (), ce_page_iface_init))
 
 static void
@@ -127,23 +123,6 @@ ui_to_setting (CEPageWifi *self)
                       NULL);
 }
 
-static void
-ce_page_wifi_dispose (GObject *object)
-{
-        CEPageWifi *self = CE_PAGE_WIFI (object);
-
-        g_clear_object (&self->builder);
-
-        G_OBJECT_CLASS (ce_page_wifi_parent_class)->dispose (object);
-}
-
-static GtkWidget *
-ce_page_wifi_get_widget (CEPage *page)
-{
-        CEPageWifi *self = CE_PAGE_WIFI (page);
-        return GTK_WIDGET (self->grid);
-}
-
 static const gchar *
 ce_page_wifi_get_title (CEPage *page)
 {
@@ -193,49 +172,41 @@ ce_page_wifi_class_validate (CEPage        *parent,
 static void
 ce_page_wifi_init (CEPageWifi *self)
 {
+        gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 static void
-ce_page_wifi_class_init (CEPageWifiClass *class)
+ce_page_wifi_class_init (CEPageWifiClass *klass)
 {
-        GObjectClass *object_class = G_OBJECT_CLASS (class);
+        GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+        gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/network/wifi-page.ui");
 
-        object_class->dispose = ce_page_wifi_dispose;
+        gtk_widget_class_bind_template_child (widget_class, CEPageWifi, bssid_combo);
+        gtk_widget_class_bind_template_child (widget_class, CEPageWifi, cloned_mac_combo);
+        gtk_widget_class_bind_template_child (widget_class, CEPageWifi, mac_combo);
+        gtk_widget_class_bind_template_child (widget_class, CEPageWifi, ssid_entry);
 }
 
 static void
 ce_page_iface_init (CEPageInterface *iface)
 {
-        iface->get_widget = ce_page_wifi_get_widget;
         iface->get_title = ce_page_wifi_get_title;
         iface->validate = ce_page_wifi_class_validate;
 }
 
-CEPage *
+CEPageWifi *
 ce_page_wifi_new (NMConnection     *connection,
                   NMClient         *client)
 {
         CEPageWifi *self;
-        g_autoptr(GError) error = NULL;
 
         self = CE_PAGE_WIFI (g_object_new (ce_page_wifi_get_type (), NULL));
 
-        self->builder = gtk_builder_new ();
-        if (!gtk_builder_add_from_resource (self->builder, "/org/gnome/control-center/network/wifi-page.ui", 
&error)) {
-                g_warning ("Couldn't load builder file: %s", error->message);
-                return NULL;
-        }
-
-        self->bssid_combo = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (self->builder, "bssid_combo"));
-        self->cloned_mac_combo = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (self->builder, 
"cloned_mac_combo"));
-        self->grid = GTK_GRID (gtk_builder_get_object (self->builder, "grid"));
-        self->mac_combo = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (self->builder, "mac_combo"));
-        self->ssid_entry = GTK_ENTRY (gtk_builder_get_object (self->builder, "ssid_entry"));
-
         self->client = client;
         self->setting = nm_connection_get_setting_wireless (connection);
 
         connect_wifi_page (self);
 
-        return CE_PAGE (self);
+        return self;
 }
diff --git a/panels/network/connection-editor/ce-page-wifi.h b/panels/network/connection-editor/ce-page-wifi.h
index 5e790ead9..1802d1b2d 100644
--- a/panels/network/connection-editor/ce-page-wifi.h
+++ b/panels/network/connection-editor/ce-page-wifi.h
@@ -21,13 +21,12 @@
 
 #pragma once
 
+#include <gtk/gtk.h>
 #include <NetworkManager.h>
 
-#include "ce-page.h"
+G_DECLARE_FINAL_TYPE (CEPageWifi, ce_page_wifi, CE, PAGE_WIFI, GtkGrid)
 
-G_DECLARE_FINAL_TYPE (CEPageWifi, ce_page_wifi, CE, PAGE_WIFI, GObject)
-
-CEPage *ce_page_wifi_new (NMConnection     *connection,
-                          NMClient         *client);
+CEPageWifi *ce_page_wifi_new (NMConnection *connection,
+                              NMClient     *client);
 
 G_END_DECLS
diff --git a/panels/network/connection-editor/ce-page.c b/panels/network/connection-editor/ce-page.c
index ae3b99eb2..fb5d3993f 100644
--- a/panels/network/connection-editor/ce-page.c
+++ b/panels/network/connection-editor/ce-page.c
@@ -55,14 +55,6 @@ ce_page_validate (CEPage *self, NMConnection *connection, GError **error)
         return TRUE;
 }
 
-GtkWidget *
-ce_page_get_widget (CEPage *self)
-{
-        g_return_val_if_fail (CE_IS_PAGE (self), NULL);
-
-        return CE_PAGE_GET_IFACE (self)->get_widget (self);
-}
-
 const char *
 ce_page_get_title (CEPage *self)
 {
diff --git a/panels/network/connection-editor/ce-page.h b/panels/network/connection-editor/ce-page.h
index a3375de9f..a180afb9f 100644
--- a/panels/network/connection-editor/ce-page.h
+++ b/panels/network/connection-editor/ce-page.h
@@ -36,12 +36,10 @@ struct _CEPageInterface
         GTypeInterface g_iface;
 
         gboolean     (*validate)             (CEPage *page, NMConnection *connection, GError **error);
-        GtkWidget   *(*get_widget)           (CEPage *page);
         const gchar *(*get_title)            (CEPage *page);
         const gchar *(*get_security_setting) (CEPage *page);
 };
 
-GtkWidget   *ce_page_get_widget      (CEPage           *page);
 const gchar *ce_page_get_title       (CEPage           *page);
 const gchar *ce_page_get_security_setting (CEPage           *page);
 gboolean     ce_page_validate        (CEPage           *page,
diff --git a/panels/network/connection-editor/details-page.ui 
b/panels/network/connection-editor/details-page.ui
index 7f71da808..c66b7ee56 100644
--- a/panels/network/connection-editor/details-page.ui
+++ b/panels/network/connection-editor/details-page.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkGrid" id="grid">
+  <template class="CEPageDetails" parent="GtkGrid">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="margin_start">24</property>
@@ -445,5 +445,5 @@
         <property name="height">1</property>
       </packing>
     </child>
-  </object>
+  </template>
 </interface>
diff --git a/panels/network/connection-editor/ethernet-page.ui 
b/panels/network/connection-editor/ethernet-page.ui
index e172c8dda..4f7331b31 100644
--- a/panels/network/connection-editor/ethernet-page.ui
+++ b/panels/network/connection-editor/ethernet-page.ui
@@ -6,7 +6,7 @@
     <property name="step_increment">1</property>
     <property name="page_increment">10</property>
   </object>
-  <object class="GtkGrid" id="grid">
+  <template class="CEPageEthernet" parent="GtkGrid">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="margin_start">50</property>
@@ -173,5 +173,5 @@
     <child>
       <placeholder/>
     </child>
-  </object>
+  </template>
 </interface>
diff --git a/panels/network/connection-editor/ip4-page.ui b/panels/network/connection-editor/ip4-page.ui
index 81ef05d05..fe75410f3 100644
--- a/panels/network/connection-editor/ip4-page.ui
+++ b/panels/network/connection-editor/ip4-page.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkScrolledWindow" id="scrolled_window">
+  <template class="CEPageIP4" parent="GtkScrolledWindow">
     <property name="visible">True</property>
     <property name="can_focus">True</property>
     <property name="hscrollbar_policy">never</property>
@@ -406,7 +406,7 @@
         </child>
       </object>
     </child>
-  </object>
+  </template>
   <object class="GtkSizeGroup" id="routes_metric_sizegroup">
     <property name="mode">horizontal</property>
     <widgets>
diff --git a/panels/network/connection-editor/ip6-page.ui b/panels/network/connection-editor/ip6-page.ui
index 96f5dfb97..fcee0c7d6 100644
--- a/panels/network/connection-editor/ip6-page.ui
+++ b/panels/network/connection-editor/ip6-page.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkScrolledWindow" id="scrolled_window">
+  <template class="CEPageIP6" parent="GtkScrolledWindow">
     <property name="visible">True</property>
     <property name="can_focus">True</property>
     <property name="hscrollbar_policy">never</property>
@@ -420,7 +420,7 @@
         </child>
       </object>
     </child>
-  </object>
+  </template>
   <object class="GtkSizeGroup" id="routes_metric_sizegroup">
     <property name="mode">horizontal</property>
     <widgets>
diff --git a/panels/network/connection-editor/net-connection-editor.c 
b/panels/network/connection-editor/net-connection-editor.c
index 0f76513c5..20905f797 100644
--- a/panels/network/connection-editor/net-connection-editor.c
+++ b/panels/network/connection-editor/net-connection-editor.c
@@ -29,6 +29,7 @@
 #include "list-box-helper.h"
 #include "net-connection-editor.h"
 #include "net-connection-editor-resources.h"
+#include "ce-page.h"
 #include "ce-page-details.h"
 #include "ce-page-wifi.h"
 #include "ce-page-ip4.h"
@@ -333,7 +334,6 @@ update_sensitivity (NetConnectionEditor *self)
 {
         NMSettingConnection *sc;
         gboolean sensitive;
-        GtkWidget *widget;
         GSList *l;
 
         if (!editor_is_initialized (self))
@@ -347,10 +347,8 @@ update_sensitivity (NetConnectionEditor *self)
                 sensitive = self->can_modify;
         }
 
-        for (l = self->pages; l; l = l->next) {
-                widget = ce_page_get_widget (CE_PAGE (l->data));
-                gtk_widget_set_sensitive (widget, sensitive);
-        }
+        for (l = self->pages; l; l = l->next)
+                gtk_widget_set_sensitive (GTK_WIDGET (l->data), sensitive);
 }
 
 static void
@@ -414,15 +412,13 @@ recheck_initialization (NetConnectionEditor *self)
 static void
 page_initialized (NetConnectionEditor *self, GError *error, CEPage *page)
 {
-        GtkWidget *widget;
         GtkWidget *label;
         gint position;
         GList *children, *l;
         gint i;
 
-        widget = ce_page_get_widget (page);
         position = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (page), "position"));
-        g_object_set_data (G_OBJECT (widget), "position", GINT_TO_POINTER (position));
+        g_object_set_data (G_OBJECT (page), "position", GINT_TO_POINTER (position));
         children = gtk_container_get_children (GTK_CONTAINER (self->notebook));
         for (l = children, i = 0; l; l = l->next, i++) {
                 gint pos = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (l->data), "position"));
@@ -433,7 +429,7 @@ page_initialized (NetConnectionEditor *self, GError *error, CEPage *page)
 
         label = gtk_label_new (ce_page_get_title (page));
 
-        gtk_notebook_insert_page (self->notebook, widget, label, i);
+        gtk_notebook_insert_page (self->notebook, GTK_WIDGET (page), label, i);
 
         self->initializing_pages = g_slist_remove (self->initializing_pages, page);
         self->pages = g_slist_append (self->pages, page);
@@ -533,27 +529,27 @@ net_connection_editor_set_connection (NetConnectionEditor *self,
         is_vpn = g_str_equal (type, NM_SETTING_VPN_SETTING_NAME);
 
         if (!self->is_new_connection)
-                add_page (self, ce_page_details_new (self->connection, self->device, self->ap, self));
+                add_page (self, CE_PAGE (ce_page_details_new (self->connection, self->device, self->ap, 
self)));
 
         if (is_wifi)
-                add_page (self, ce_page_wifi_new (self->connection, self->client));
+                add_page (self, CE_PAGE (ce_page_wifi_new (self->connection, self->client)));
         else if (is_wired)
-                add_page (self, ce_page_ethernet_new (self->connection, self->client));
+                add_page (self, CE_PAGE (ce_page_ethernet_new (self->connection, self->client)));
         else if (is_vpn)
-                add_page (self, ce_page_vpn_new (self->connection));
+                add_page (self, CE_PAGE (ce_page_vpn_new (self->connection)));
         else {
                 /* Unsupported type */
                 net_connection_editor_do_fallback (self, type);
                 return;
         }
 
-        add_page (self, ce_page_ip4_new (self->connection, self->client));
-        add_page (self, ce_page_ip6_new (self->connection, self->client));
+        add_page (self, CE_PAGE (ce_page_ip4_new (self->connection, self->client)));
+        add_page (self, CE_PAGE (ce_page_ip6_new (self->connection, self->client)));
 
         if (is_wifi)
-                add_page (self, ce_page_security_new (self->connection));
+                add_page (self, CE_PAGE (ce_page_security_new (self->connection)));
         else if (is_wired)
-                add_page (self, ce_page_8021x_security_new (self->connection));
+                add_page (self, CE_PAGE (ce_page_8021x_security_new (self->connection)));
 
         pages = g_slist_copy (self->initializing_pages);
         for (l = pages; l; l = l->next) {
diff --git a/panels/network/connection-editor/security-page.ui 
b/panels/network/connection-editor/security-page.ui
index 9cfbc0ac6..f35c2502d 100644
--- a/panels/network/connection-editor/security-page.ui
+++ b/panels/network/connection-editor/security-page.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkGrid" id="grid">
+  <template class="CEPageSecurity" parent="GtkGrid">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="margin_start">50</property>
@@ -57,5 +57,5 @@
         <property name="height">1</property>
       </packing>
     </child>
-  </object>
+  </template>
 </interface>
diff --git a/panels/network/connection-editor/vpn-page.ui b/panels/network/connection-editor/vpn-page.ui
index a35801564..682e7a707 100644
--- a/panels/network/connection-editor/vpn-page.ui
+++ b/panels/network/connection-editor/vpn-page.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkBox" id="box">
+  <template class="CEPageVpn" parent="GtkBox">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="margin_start">50</property>
@@ -66,5 +66,5 @@
         <property name="position">3</property>
       </packing>
     </child>
-  </object>
+  </template>
 </interface>
diff --git a/panels/network/connection-editor/wifi-page.ui b/panels/network/connection-editor/wifi-page.ui
index c32fd28df..e15678040 100644
--- a/panels/network/connection-editor/wifi-page.ui
+++ b/panels/network/connection-editor/wifi-page.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkGrid" id="grid">
+  <template class="CEPageWifi" parent="GtkGrid">
     <property name="visible">True</property>
     <property name="can_focus">False</property>
     <property name="margin_start">50</property>
@@ -140,5 +140,5 @@
         <property name="height">1</property>
       </packing>
     </child>
-  </object>
+  </template>
 </interface>


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