[gnome-panel/wip/applets/clock] clock: move preferences to ClockPreferences



commit c32cee12266378f5eb282387e33b228348ad0a55
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Tue Nov 18 01:50:57 2014 +0200

    clock: move preferences to ClockPreferences

 applets/clock/Makefile.am            |   38 +--
 applets/clock/calendar-window.c      |    1 -
 applets/clock/clock-common.h         |    8 +
 applets/clock/clock-location-edit.c  |  118 +----
 applets/clock/clock-location-edit.ui |    1 +
 applets/clock/clock-location.c       |   25 +-
 applets/clock/clock-preferences.c    |  774 ++++++++++++++++++++++++++--
 applets/clock/clock-preferences.h    |   11 +-
 applets/clock/clock-preferences.ui   |  189 ++++----
 applets/clock/clock-utils.c          |   68 ---
 applets/clock/clock-utils.h          |    4 -
 applets/clock/clock.c                |  521 ++-----------------
 applets/clock/clock.gresource.xml    |    1 -
 applets/clock/clock.ui               |  932 ----------------------------------
 applets/clock/gdesktop-enum-types.c  |   40 ++
 applets/clock/gdesktop-enum-types.h  |   33 ++
 16 files changed, 980 insertions(+), 1784 deletions(-)
---
diff --git a/applets/clock/Makefile.am b/applets/clock/Makefile.am
index 26ae8b9..a278ead 100644
--- a/applets/clock/Makefile.am
+++ b/applets/clock/Makefile.am
@@ -46,6 +46,8 @@ CLOCK_SOURCES =               \
        clock-time.h \
        clock-utils.c           \
        clock-utils.h           \
+       gdesktop-enum-types.c \
+       gdesktop-enum-types.h \
        set-timezone.c          \
        set-timezone.h          \
        $(BUILT_SOURCES)        \
@@ -94,46 +96,13 @@ clock-marshallers.c: clock-marshallers.list
 clock-marshallers.h: clock-marshallers.list
        $(AM_V_GEN)glib-genmarshal --prefix _clock_marshal --header --internal $< > $@
 
-clock_enum_headers =                                   \
-       $(top_srcdir)/applets/clock/clock-utils.h
-
-clock-typebuiltins.c: $(clock_enum_headers)
-       $(AM_V_GEN)glib-mkenums \
-                       --fhead "#include <glib-object.h>\n" \
-                       --fhead "#include \"clock-typebuiltins.h\"\n\n" \
-                       --fprod "\n/* enumerations from \"@filename \" */" \
-                       --fprod "\n#include \"@filename \"\n" \
-                       --vhead "static const GEnumValue _ enum_name@_values[] = {" \
-                       --vprod "  { @VALUENAME@, \"@VALUENAME \", \"@valuenick \" }," \
-                       --vtail "  { 0, NULL, NULL }\n};\n\n" \
-                       --vtail "GType\n enum_name@_get_type (void)\n{\n" \
-                       --vtail "  static GType type = 0;\n\n" \
-                       --vtail "  if (!type)\n" \
-                       --vtail "    type = g_enum_register_static (\"@EnumName \", _ 
enum_name@_values);\n\n" \
-                       --vtail "  return type;\n}\n\n" \
-               $(clock_enum_headers) > $@
-
-clock-typebuiltins.h: $(clock_enum_headers)
-       $(AM_V_GEN)glib-mkenums \
-                       --fhead "#ifndef __CLOCK_TYPEBUILTINS_H__\n" \
-                       --fhead "#define __CLOCK_TYPEBUILTINS_H__ 1\n\n" \
-                       --fhead "G_BEGIN_DECLS\n\n" \
-                       --ftail "G_END_DECLS\n\n" \
-                       --ftail "#endif /* __CLOCK_TYPEBUILTINS_H__ */\n" \
-                       --fprod "\n/* --- @filename@ --- */" \
-                       --eprod "#define CLOCK_TYPE_ ENUMSHORT@ @enum_name _get_type()\n" \
-                       --eprod "GType @enum_name _get_type (void);\n" \
-               $(clock_enum_headers) > $@
-
 BUILT_SOURCES =                                        \
        timedate1.c \
        timedate1.h \
        clock-marshallers.c                     \
        clock-marshallers.h                     \
        clock-resources.c                       \
-       clock-resources.h                       \
-       clock-typebuiltins.c                    \
-       clock-typebuiltins.h
+       clock-resources.h
 
 appletdir       = $(appletsdir)
 applet_in_files = org.gnome.panel.ClockApplet.panel-applet.in
@@ -148,7 +117,6 @@ $(applet_in_files): $(applet_in_files).in Makefile
 @PANEL_INTLTOOL_PANEL_APPLET_RULE@
 
 ui_FILES =             \
-       clock.ui        \
        clock-location-edit.ui \
        clock-preferences.ui \
        clock-menu.xml
diff --git a/applets/clock/calendar-window.c b/applets/clock/calendar-window.c
index 7ea82c4..28dffbb 100644
--- a/applets/clock/calendar-window.c
+++ b/applets/clock/calendar-window.c
@@ -44,7 +44,6 @@
 
 #include "clock-common.h"
 #include "clock-utils.h"
-#include "clock-typebuiltins.h"
 #ifdef HAVE_EDS
 #include "calendar-client.h"
 #endif
diff --git a/applets/clock/clock-common.h b/applets/clock/clock-common.h
index ac9cae0..1a4a1f0 100644
--- a/applets/clock/clock-common.h
+++ b/applets/clock/clock-common.h
@@ -50,6 +50,14 @@ G_BEGIN_DECLS
 #define KEY_TEMPERATURE_UNIT    "temperature-unit"
 #define KEY_SPEED_UNIT          "speed-unit"
 
+enum
+{
+       COLUMN_NAME,
+       COLUMN_TIMEZONE,
+       COLUMN_LOCATION,
+       COLUMN_LAST
+};
+
 G_END_DECLS
 
 #endif
diff --git a/applets/clock/clock-location-edit.c b/applets/clock/clock-location-edit.c
index a1e8cdd..5d6b89b 100644
--- a/applets/clock/clock-location-edit.c
+++ b/applets/clock/clock-location-edit.c
@@ -34,6 +34,7 @@
 
 #include "clock-common.h"
 #include "clock-location-edit.h"
+#include "clock-preferences.h"
 
 struct _ClockLocationEditPrivate
 {
@@ -41,7 +42,6 @@ struct _ClockLocationEditPrivate
        ClockLocation         *clock_location;
 
        GtkWidget             *ok_button;
-       GtkWidget             *cancel_button;
 
        GtkWidget             *location_label;
        GtkWidget             *location_box;
@@ -69,87 +69,6 @@ enum
 
 static GParamSpec *object_properties[N_PROPERTIES] = { NULL, };
 
-static gint
-sort_locations_by_name (gconstpointer a,
-                        gconstpointer b)
-{
-       ClockLocation *location1;
-       ClockLocation *location2;
-       const gchar   *name1;
-       const gchar   *name2;
-
-       location1 = CLOCK_LOCATION (a);
-       location2 = CLOCK_LOCATION (a);
-
-       name1 = clock_location_get_name (location1);
-       name2 = clock_location_get_name (location2);
-
-       return g_strcmp0 (name1, name2);
-}
-
-static void
-update_cities (ClockLocationEdit *edit,
-               ClockLocation     *clock_location)
-{
-       ClockLocationEditPrivate *priv;
-       GVariantIter             *iter;
-       GList                    *locations;
-       const gchar              *name;
-       const gchar              *code;
-       gboolean                  latlon_override;
-       gdouble                   latitude;
-       gdouble                   longitude;
-       GList                    *l;
-       GVariantBuilder           builder;
-
-       priv = edit->priv;
-
-       g_settings_get (priv->settings, KEY_CITIES, "a(ssm(dd))", &iter);
-       locations = NULL;
-
-       while (g_variant_iter_loop (iter, "(&s&sm(dd))",
-                                   &name, &code,
-                                   &latlon_override,
-                                   &latitude, &longitude)) {
-               ClockLocation *location;
-
-               location = clock_location_new (name, code,
-                                              latlon_override,
-                                              latitude, longitude);
-
-               if (priv->clock_location) {
-                       if (clock_location_equal (priv->clock_location, location)) {
-                               g_clear_object (&priv->clock_location);
-                               continue;
-                       }
-               }
-
-               locations = g_list_append (locations, location);
-       }
-
-       locations = g_list_append (locations, clock_location);
-       locations = g_list_sort (locations, sort_locations_by_name);
-
-       g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ssm(dd))"));
-
-       for (l = locations; l; l = l->next) {
-               ClockLocation *tmp;
-
-               tmp = CLOCK_LOCATION (l->data);
-               g_variant_builder_add_value (&builder,
-                                            clock_location_serialize (tmp));
-               g_object_unref (tmp);
-       }
-
-       g_settings_set_value (priv->settings, KEY_CITIES,
-                             g_variant_builder_end (&builder));
-
-       g_object_unref (clock_location);
-       g_list_free (locations);
-
-       gtk_widget_destroy (GTK_WIDGET (edit));
-}
-
 static void
 ok_button_clicked (GtkButton *button,
                    gpointer   user_data)
@@ -213,7 +132,11 @@ ok_button_clicked (GtkButton *button,
                                             longitude);
        g_free (name);
 
-       update_cities (edit, clock_location);
+       clock_preferences_update_locations (edit->priv->settings,
+                                           edit->priv->clock_location,
+                                           clock_location);
+
+       gtk_widget_destroy (GTK_WIDGET (edit));
 }
 
 static void
@@ -326,9 +249,6 @@ clock_location_edit_connect_signals (ClockLocationEdit *edit)
 
        priv = edit->priv;
 
-       g_signal_connect_swapped (priv->cancel_button, "clicked",
-                                 G_CALLBACK (gtk_widget_destroy), GTK_WIDGET (edit));
-
        g_signal_connect (priv->ok_button, "clicked",
                          G_CALLBACK (ok_button_clicked), edit);
 
@@ -430,14 +350,19 @@ clock_location_edit_constructor (GType                  type,
 {
        GObject           *object;
        ClockLocationEdit *edit;
+       GtkWidget         *entry;
 
        object = G_OBJECT_CLASS (clock_location_edit_parent_class)->constructor (type,
                                                                                 n_properties,
                                                                                 properties);
        edit = CLOCK_LOCATION_EDIT (object);
+       entry = GTK_WIDGET (edit->priv->location_entry);
 
        clock_location_edit_connect_signals (edit);
 
+       gtk_widget_grab_focus (entry);
+       gtk_editable_set_position (GTK_EDITABLE (entry), -1);
+
        return object;
 }
 
@@ -553,9 +478,6 @@ clock_location_edit_class_init (ClockLocationEditClass *class)
        gtk_widget_class_bind_template_child_private (widget_class,
                                                      ClockLocationEdit,
                                                      ok_button);
-       gtk_widget_class_bind_template_child_private (widget_class,
-                                                     ClockLocationEdit,
-                                                     cancel_button);
 
        gtk_widget_class_bind_template_child_private (widget_class,
                                                      ClockLocationEdit,
@@ -598,15 +520,17 @@ clock_location_edit_new (GSettings     *settings,
                          GtkWindow     *parent,
                          ClockLocation *clock_location)
 {
-        GObject *object;
+       GObject   *object;
+       GtkWindow *window;
 
-        object = g_object_new (CLOCK_TYPE_LOCATION_EDIT,
-                               "settings", settings,
-                               "clock-location", clock_location,
-                               NULL);
+       object = g_object_new (CLOCK_TYPE_LOCATION_EDIT,
+                              "settings", settings,
+                              "clock-location", clock_location,
+                              NULL);
+       window = GTK_WINDOW (object);
 
-        gtk_window_set_transient_for (GTK_WINDOW (object),
-                                      parent);
+       gtk_window_set_modal (window, TRUE);
+       gtk_window_set_transient_for (window, parent);
 
-        return GTK_WIDGET (object);
+       return GTK_WIDGET (object);
 }
diff --git a/applets/clock/clock-location-edit.ui b/applets/clock/clock-location-edit.ui
index d384ea1..6c20c84 100644
--- a/applets/clock/clock-location-edit.ui
+++ b/applets/clock/clock-location-edit.ui
@@ -53,6 +53,7 @@
                 <property name="can_default">True</property>
                 <property name="receives_default">False</property>
                 <property name="use_underline">True</property>
+                <signal name="clicked" handler="gtk_widget_destroy" object="ClockLocationEdit" 
swapped="yes"/>
               </object>
               <packing>
                 <property name="expand">False</property>
diff --git a/applets/clock/clock-location.c b/applets/clock/clock-location.c
index 5b696c4..2cbbb38 100644
--- a/applets/clock/clock-location.c
+++ b/applets/clock/clock-location.c
@@ -47,6 +47,7 @@
 
 #include "clock-location.h"
 #include "clock-marshallers.h"
+#include "gdesktop-enum-types.h"
 #include "set-timezone.h"
 #include "system-timezone.h"
 
@@ -95,28 +96,6 @@ static void clock_location_finalize (GObject *);
 static gboolean update_weather_info (gpointer user_data);
 static void setup_weather_updates (ClockLocation *loc);
 
-/*
- * Should match enum values in gdesktop-enums.h:
- * https://git.gnome.org/browse/gsettings-desktop-schemas/tree/headers/gdesktop-enums.h
- */
-static GType
-g_desktop_clock_format_get_type (void)
-{
-       static GType etype = 0;
-
-       if (etype == 0) {
-               static const GEnumValue values[] = {
-                       { G_DESKTOP_CLOCK_FORMAT_24H, "G_DESKTOP_CLOCK_FORMAT_24H", "24h" },
-                       { G_DESKTOP_CLOCK_FORMAT_12H, "G_DESKTOP_CLOCK_FORMAT_12H", "12h" },
-                       { 0, NULL, NULL }
-               };
-
-               etype = g_enum_register_static ("GDesktopClockFormat", values);
-       }
-
-       return etype;
-}
-
 ClockLocation *
 clock_location_new (const gchar *name,
                     const gchar *metar_code,
@@ -245,7 +224,7 @@ clock_location_class_init (ClockLocationClass *class)
                g_param_spec_enum ("clock-format",
                                   "clock-format",
                                   "clock-format",
-                                  g_desktop_clock_format_get_type (),
+                                  G_DESKTOP_TYPE_CLOCK_FORMAT,
                                   G_DESKTOP_CLOCK_FORMAT_24H,
                                   G_PARAM_READWRITE);
 
diff --git a/applets/clock/clock-preferences.c b/applets/clock/clock-preferences.c
index 9bdf1b4..b9bb615 100644
--- a/applets/clock/clock-preferences.c
+++ b/applets/clock/clock-preferences.c
@@ -1,5 +1,6 @@
 /*
- * Copyright (C) 2014 Alberts Muktupāvels
+ * Copyright (C) 1997-2003 Free Software Foundation, Inc.
+ * Copyright (C) 2014      Alberts Muktupāvels
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -16,40 +17,60 @@
  *
  * Authors:
  *    Alberts Muktupāvels <alberts muktupavels gmail com>
+ *    Alexander Larsson
+ *    Frederico Mena
+ *    Gediminas Paulauskas
+ *    George Lebl
+ *    Mark McLoughlin
+ *    Miguel de Icaza
+ *    Stuart Parmenter
  */
 
+#include <glib/gi18n.h>
+#include <gio/gdesktopappinfo.h>
 #include <gtk/gtk.h>
+#include <libgweather/gweather-enum-types.h>
 
 #include "clock-common.h"
+#include "clock-location-edit.h"
 #include "clock-preferences.h"
+#include "clock-utils.h"
+#include "gdesktop-enum-types.h"
 
 struct _ClockPreferencesPrivate
 {
-       GSettings *settings;
+       GSettings       *applet_settings;
+       GSettings       *interface_settings;
+       GSettings       *gweather_settings;
 
-       GtkWidget *help_button;
-       GtkWidget *time_settings_button;
-       GtkWidget *close_button;
+       GtkWidget       *help_button;
+       GtkWidget       *time_settings_button;
+
+       GDesktopAppInfo *app_info;
+
+       GtkListStore    *cities_store;
+       GtkTreeView     *tree_view;
+       GList           *locations;
+
+       GtkWidget       *notebook;
 
        /* General */
-       GtkWidget *clock_format_12hr;
-       GtkWidget *clock_format_24hr;
-       GtkWidget *show_date;
-       GtkWidget *show_seconds;
-       GtkWidget *show_weather;
-       GtkWidget *show_temperature;
+       GtkWidget       *clock_options;
+       GtkWidget       *clock_format_combo;
+       GtkWidget       *show_date;
+       GtkWidget       *show_seconds;
+       GtkWidget       *show_weather;
+       GtkWidget       *show_temperature;
 
        /* Locations */
-       GtkWidget *cities_list;
-       GtkWidget *add_button;
-       GtkWidget *edit_button;
-       GtkWidget *remove_button;
+       GtkWidget       *cities_list;
+       GtkWidget       *add_button;
+       GtkWidget       *edit_button;
+       GtkWidget       *remove_button;
 
        /* Weather */
-       GtkWidget *temperature_combo;
-       GtkWidget *wind_speed_combo;
-       GtkWidget *pressure_combo;
-       GtkWidget *visibility_combo;
+       GtkWidget       *temperature_combo;
+       GtkWidget       *wind_speed_combo;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (ClockPreferences,
@@ -59,20 +80,610 @@ G_DEFINE_TYPE_WITH_PRIVATE (ClockPreferences,
 enum
 {
        PROP_0,
-       PROP_SETTINGS,
+       PROP_APPLET_SETTINGS,
        N_PROPERTIES
 };
 
 static GParamSpec *object_properties[N_PROPERTIES] = { NULL, };
 
 static void
+free_locations (ClockPreferences *preferences)
+{
+       ClockPreferencesPrivate *priv;
+       GList                   *l;
+
+       priv = preferences->priv;
+
+       for (l = priv->locations; l; l = l->next)
+               g_object_unref (l->data);
+
+       g_list_free (priv->locations);
+       priv->locations = NULL;
+}
+
+static void
+cities_changed (GSettings   *settings,
+                const gchar *key,
+                gpointer     user_data)
+{
+       ClockPreferences        *preferences;
+       ClockPreferencesPrivate *priv;
+       GVariantIter            *variant_iter;
+       const gchar             *name;
+       const gchar             *code;
+       gboolean                 has_custom_coords;
+       gdouble                  latitude;
+       gdouble                  longitude;
+       GtkTreeIter              tree_iter;
+
+       preferences = CLOCK_PREFERENCES (user_data);
+       priv = preferences->priv;
+
+       gtk_list_store_clear (priv->cities_store);
+       free_locations (preferences);
+
+       g_settings_get (priv->applet_settings,
+                       KEY_CITIES,
+                       "a(ssm(dd))",
+                       &variant_iter);
+
+       while (g_variant_iter_loop (variant_iter,
+                                   "(&s&sm(dd))",
+                                   &name,
+                                   &code,
+                                   &has_custom_coords,
+                                   &latitude,
+                                   &longitude)) {
+               ClockLocation *location;
+
+               location = clock_location_new (name,
+                                              code,
+                                              has_custom_coords,
+                                              latitude,
+                                              longitude);
+
+               gtk_list_store_append (priv->cities_store,
+                                      &tree_iter);
+               gtk_list_store_set (priv->cities_store,
+                                   &tree_iter,
+                                   COLUMN_NAME,
+                                   clock_location_get_name (location),
+                                   COLUMN_TIMEZONE,
+                                   clock_location_get_timezone (location),
+                                   COLUMN_LOCATION,
+                                   location,
+                                   -1);
+
+               priv->locations = g_list_append (priv->locations, location);
+       }
+}
+
+static gint
+sort_locations_by_name (gconstpointer a,
+                        gconstpointer b)
+{
+       ClockLocation *location1;
+       ClockLocation *location2;
+       const gchar   *name1;
+       const gchar   *name2;
+
+       location1 = CLOCK_LOCATION (a);
+       location2 = CLOCK_LOCATION (a);
+
+       name1 = clock_location_get_name (location1);
+       name2 = clock_location_get_name (location2);
+
+       return g_strcmp0 (name1, name2);
+}
+
+static void
+edit_tree_row (GtkTreeModel *model,
+               GtkTreePath  *path,
+               GtkTreeIter  *iter,
+               gpointer      user_data)
+{
+       ClockPreferences *preferences;
+       ClockLocation    *edit_location;
+       GtkWidget        *edit;
+
+       preferences = CLOCK_PREFERENCES (user_data);
+
+       gtk_tree_model_get (model,
+                           iter,
+                           COLUMN_LOCATION,
+                           &edit_location,
+                           -1);
+
+       edit = clock_location_edit_new (preferences->priv->applet_settings,
+                                       GTK_WINDOW (preferences),
+                                       edit_location);
+
+       gtk_window_present (GTK_WINDOW (edit));
+}
+
+static void
+remove_tree_row (GtkTreeModel *model,
+                 GtkTreePath  *path,
+                 GtkTreeIter  *iter,
+                 gpointer      user_data)
+{
+       ClockPreferences        *preferences;
+       ClockPreferencesPrivate *priv;
+       ClockLocation           *remove_location;
+
+       preferences = CLOCK_PREFERENCES (user_data);
+       priv = preferences->priv;
+
+       gtk_tree_model_get (model,
+                           iter,
+                           COLUMN_LOCATION,
+                           &remove_location,
+                           -1);
+
+       clock_preferences_update_locations (priv->applet_settings,
+                                           remove_location,
+                                           NULL);
+}
+
+static void
+locations_selection_changed (GtkTreeSelection *selection,
+                             gpointer          user_data)
+{
+       ClockPreferences *preferences;
+       gint              n;
+
+       preferences = CLOCK_PREFERENCES (user_data);
+       n = gtk_tree_selection_count_selected_rows (selection);
+
+       gtk_widget_set_sensitive (preferences->priv->edit_button, n > 0);
+       gtk_widget_set_sensitive (preferences->priv->remove_button, n > 0);
+}
+
+static void
+add_clicked (ClockPreferences *preferences)
+{
+       GtkWidget *edit;
+
+       edit = clock_location_edit_new (preferences->priv->applet_settings,
+                                       GTK_WINDOW (preferences),
+                                       NULL);
+
+       gtk_window_present (GTK_WINDOW (edit));
+}
+
+static void
+edit_clicked (ClockPreferences *preferences)
+{
+       ClockPreferencesPrivate *priv;
+       GtkTreeSelection        *selection;
+
+       priv = preferences->priv;
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+
+       gtk_tree_selection_selected_foreach (selection,
+                                            edit_tree_row,
+                                            preferences);
+}
+
+static void
+remove_clicked (ClockPreferences *preferences)
+{
+       ClockPreferencesPrivate *priv;
+       GtkTreeSelection        *selection;
+
+       priv = preferences->priv;
+       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree_view));
+
+       gtk_tree_selection_selected_foreach (selection,
+                                            remove_tree_row,
+                                            preferences);
+}
+
+static void
+help_clicked (ClockPreferences *preferences)
+{
+       GdkScreen   *screen;
+       GError      *error;
+       GtkWidget   *dialog;
+       const gchar *primary;
+
+       screen = gtk_widget_get_screen (GTK_WIDGET (preferences));
+
+       error = NULL;
+       gtk_show_uri (screen,
+                     "help:clock/clock-settings",
+                     GDK_CURRENT_TIME,
+                     &error);
+
+       if (error && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+               g_error_free (error);
+               return;
+       }
+
+       if (!error)
+               return;
+
+       primary = _("Could not display help document 'clock'");
+       dialog = gtk_message_dialog_new (GTK_WINDOW (preferences),
+                                        GTK_DIALOG_DESTROY_WITH_PARENT,
+                                        GTK_MESSAGE_ERROR,
+                                        GTK_BUTTONS_CLOSE,
+                                        "%s",
+                                        primary);
+
+       gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                                 "%s",
+                                                 error->message);
+
+       g_error_free (error);
+
+       g_signal_connect (dialog, "response",
+                         G_CALLBACK (gtk_widget_destroy), NULL);
+
+       gtk_window_set_icon_name (GTK_WINDOW (dialog),
+                                 CLOCK_ICON);
+       gtk_window_present (GTK_WINDOW (dialog));
+}
+
+static void
+time_settings_clicked (ClockPreferences *preferences)
+{
+       ClockPreferencesPrivate *priv;
+       GdkDisplay              *display;
+       GdkAppLaunchContext     *context;
+       GError                  *error;
+       GtkWidget               *dialog;
+
+       priv = preferences->priv;
+
+       if (!priv->app_info)
+               return;
+
+       display = gdk_display_get_default ();
+       context = gdk_display_get_app_launch_context (display);
+       error = NULL;
+
+       g_app_info_launch (G_APP_INFO (priv->app_info),
+                          NULL,
+                          (GAppLaunchContext *) context,
+                          &error);
+       g_object_unref (context);
+
+       if (!error)
+               return;
+
+       dialog = gtk_message_dialog_new (GTK_WINDOW (preferences),
+                                        GTK_DIALOG_DESTROY_WITH_PARENT,
+                                        GTK_MESSAGE_ERROR,
+                                        GTK_BUTTONS_CLOSE,
+                                        "%s",
+                                        _("Failed to open the time settings"));
+
+       gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                                 "%s",
+                                                 error->message);
+
+       g_signal_connect (dialog, "response",
+                         G_CALLBACK (gtk_widget_destroy), NULL);
+
+       gtk_window_present (GTK_WINDOW (dialog));
+
+       g_error_free (error);
+}
+
+static void
+clock_preferences_connect_signals (ClockPreferences *preferences)
+{
+       ClockPreferencesPrivate *priv;
+
+       priv = preferences->priv;
+
+       g_signal_connect_swapped (priv->add_button,
+                                 "clicked",
+                                 G_CALLBACK (add_clicked),
+                                 preferences);
+       g_signal_connect_swapped (priv->edit_button,
+                                 "clicked",
+                                 G_CALLBACK (edit_clicked),
+                                 preferences);
+       g_signal_connect_swapped (priv->remove_button,
+                                 "clicked",
+                                 G_CALLBACK (remove_clicked),
+                                 preferences);
+
+       g_signal_connect_swapped (priv->help_button,
+                                 "clicked",
+                                 G_CALLBACK (help_clicked),
+                                 preferences);
+       g_signal_connect_swapped (priv->time_settings_button,
+                                 "clicked",
+                                 G_CALLBACK (time_settings_clicked),
+                                 preferences);
+}
+
+static gboolean
+get_mapping1 (GValue *value,
+              GVariant *variant,
+              gpointer user_data)
+{
+       GType (* get_type) (void) = user_data;
+       GEnumClass *klass;
+       GEnumValue *eval = NULL;
+       const char *s;
+       guint i;
+
+       g_variant_get (variant, "&s", &s);
+
+       klass = g_type_class_ref (get_type ());
+       for (i = 0; i < klass->n_values; ++i) {
+               if (g_strcmp0 (klass->values[i].value_nick, s) != 0)
+                       continue;
+
+               eval = &klass->values[i];
+               break;
+       }
+
+       if (eval)
+               g_value_set_int (value, eval->value);
+
+       g_type_class_unref (klass);
+
+       return eval != NULL;
+}
+
+static GVariant *
+set_mapping1 (const GValue *value,
+              const GVariantType *expected_type,
+              gpointer user_data)
+{
+       GType (* get_type) (void) = user_data;
+       GEnumClass *klass;
+       GEnumValue *eval = NULL;
+       int val;
+       guint i;
+       GVariant *variant = NULL;
+
+       val = g_value_get_int (value);
+
+       klass = g_type_class_ref (get_type ());
+       for (i = 0; i < klass->n_values; ++i) {
+               if (klass->values[i].value != val)
+                       continue;
+
+               eval = &klass->values[i];
+               break;
+       }
+
+       if (eval)
+               variant = g_variant_new_string (eval->value_nick);
+
+       g_type_class_unref (klass);
+
+       return variant;
+}
+
+
+static gboolean
+get_mapping2 (GValue *value,
+              GVariant *variant,
+              gpointer user_data)
+{
+       GType (* get_type) (void) = user_data;
+       GEnumClass *klass;
+       GEnumValue *eval = NULL;
+       const char *s;
+       guint i;
+
+       g_variant_get (variant, "&s", &s);
+
+       klass = g_type_class_ref (get_type ());
+       for (i = 0; i < klass->n_values; ++i) {
+               if (g_strcmp0 (klass->values[i].value_nick, s) != 0)
+                       continue;
+
+               eval = &klass->values[i];
+               break;
+       }
+
+       if (eval)
+               g_value_set_int (value, eval->value - 1);
+
+       g_type_class_unref (klass);
+
+       return eval != NULL;
+}
+
+static GVariant *
+set_mapping2 (const GValue *value,
+              const GVariantType *expected_type,
+              gpointer user_data)
+{
+       GType (* get_type) (void) = user_data;
+       GEnumClass *klass;
+       GEnumValue *eval = NULL;
+       int val;
+       guint i;
+       GVariant *variant = NULL;
+
+       val = g_value_get_int (value) + 1;
+
+       klass = g_type_class_ref (get_type ());
+       for (i = 0; i < klass->n_values; ++i) {
+               if (klass->values[i].value != val)
+                       continue;
+
+               eval = &klass->values[i];
+               break;
+       }
+
+       if (eval)
+               variant = g_variant_new_string (eval->value_nick);
+
+       g_type_class_unref (klass);
+
+       return variant;
+}
+
+static void
+clock_preferences_setup_general (ClockPreferences *preferences)
+{
+       ClockPreferencesPrivate *priv;
+
+       priv = preferences->priv;
+
+       g_settings_bind_with_mapping (priv->interface_settings,
+                                     KEY_CLOCK_FORMAT,
+                                     priv->clock_format_combo,
+                                     "active",
+                                     G_SETTINGS_BIND_DEFAULT,
+                                     get_mapping1,
+                                     set_mapping1,
+                                     g_desktop_clock_format_get_type,
+                                     NULL);
+
+       g_settings_bind (priv->interface_settings,
+                        KEY_CLOCK_SHOW_DATE,
+                        priv->show_date,
+                        "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->interface_settings,
+                        KEY_CLOCK_SHOW_SECONDS,
+                        priv->show_seconds,
+                        "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->applet_settings,
+                        KEY_SHOW_WEATHER,
+                        priv->show_weather,
+                        "active",
+                        G_SETTINGS_BIND_DEFAULT);
+       g_settings_bind (priv->applet_settings,
+                        KEY_SHOW_TEMPERATURE,
+                        priv->show_temperature,
+                        "active",
+                        G_SETTINGS_BIND_DEFAULT);
+
+       if (!clock_locale_supports_am_pm ())
+               gtk_widget_hide (priv->clock_options);
+}
+
+static void
+clock_preferences_setup_locations (ClockPreferences *preferences)
+{
+       ClockPreferencesPrivate *priv;
+       GtkTreeSelection        *selection;
+       GtkCellRenderer         *renderer;
+       GtkTreeViewColumn       *col;
+
+       priv = preferences->priv;
+
+       priv->tree_view = GTK_TREE_VIEW (priv->cities_list);
+       selection = gtk_tree_view_get_selection (priv->tree_view);
+
+       g_signal_connect (selection, "changed",
+                         G_CALLBACK (locations_selection_changed), preferences);
+
+       renderer = gtk_cell_renderer_text_new ();
+       col = gtk_tree_view_column_new_with_attributes (_("City Name"),
+                                                       renderer,
+                                                       "text",
+                                                       COLUMN_NAME,
+                                                       NULL);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (priv->cities_list),
+                                    col,
+                                    -1);
+
+       renderer = gtk_cell_renderer_text_new ();
+       col = gtk_tree_view_column_new_with_attributes (_("City Time Zone"),
+                                                       renderer,
+                                                       "text",
+                                                       COLUMN_TIMEZONE,
+                                                       NULL);
+       gtk_tree_view_insert_column (GTK_TREE_VIEW (priv->cities_list),
+                                    col,
+                                    -1);
+
+       priv->cities_store = gtk_list_store_new (COLUMN_LAST,
+                                                G_TYPE_STRING,
+                                                G_TYPE_STRING,
+                                                CLOCK_TYPE_LOCATION);
+
+       gtk_tree_view_set_model (GTK_TREE_VIEW (priv->cities_list),
+                                GTK_TREE_MODEL (priv->cities_store));
+
+       g_signal_connect (priv->applet_settings,
+                         "changed::" KEY_CITIES,
+                         G_CALLBACK (cities_changed),
+                         preferences);
+       cities_changed (priv->applet_settings,
+                       KEY_CITIES,
+                       preferences);
+}
+
+static void
+clock_preferences_setup_weather (ClockPreferences *preferences)
+{
+       g_settings_bind_with_mapping (preferences->priv->gweather_settings,
+                                     KEY_TEMPERATURE_UNIT,
+                                     preferences->priv->temperature_combo,
+                                     "active",
+                                     G_SETTINGS_BIND_DEFAULT,
+                                     get_mapping2,
+                                     set_mapping2,
+                                     gweather_temperature_unit_get_type,
+                                     NULL);
+       g_settings_bind_with_mapping (preferences->priv->gweather_settings,
+                                     KEY_SPEED_UNIT,
+                                     preferences->priv->wind_speed_combo,
+                                     "active",
+                                     G_SETTINGS_BIND_DEFAULT,
+                                     get_mapping2,
+                                     set_mapping2,
+                                     gweather_speed_unit_get_type,
+                                     NULL);
+}
+
+static GObject *
+clock_preferences_constructor (GType                  type,
+                               guint                  n_properties,
+                               GObjectConstructParam *properties)
+{
+       GObject                 *object;
+       ClockPreferences        *preferences;
+       ClockPreferencesPrivate *priv;
+
+       object = G_OBJECT_CLASS (clock_preferences_parent_class)->constructor (type,
+                                                                              n_properties,
+                                                                              properties);
+       preferences = CLOCK_PREFERENCES (object);
+       priv = preferences->priv;
+
+       clock_preferences_setup_general (preferences);
+       clock_preferences_setup_locations (preferences);
+       clock_preferences_setup_weather (preferences);
+
+       gtk_widget_set_sensitive (priv->time_settings_button,
+                                 priv->app_info != NULL);
+
+       clock_preferences_connect_signals (preferences);
+
+       return object;
+}
+
+static void
 clock_preferences_finalize (GObject *object)
 {
        ClockPreferences *preferences;
 
        preferences = CLOCK_PREFERENCES (object);
 
-       g_clear_object (&preferences->priv->settings);
+       g_clear_object (&preferences->priv->cities_store);
+       g_clear_object (&preferences->priv->app_info);
+
+       g_clear_object (&preferences->priv->applet_settings);
+       g_clear_object (&preferences->priv->interface_settings);
+       g_clear_object (&preferences->priv->gweather_settings);
+
+       free_locations (preferences);
 
        G_OBJECT_CLASS (clock_preferences_parent_class)->finalize (object);
 }
@@ -90,9 +701,9 @@ clock_preferences_set_property (GObject      *object,
 
        switch (property_id)
        {
-               case PROP_SETTINGS:
-                       settings = g_value_get_object (value);
-                       preferences->priv->settings = g_object_ref (settings);
+               case PROP_APPLET_SETTINGS:
+                       settings = g_value_get_object (value);
+                       preferences->priv->applet_settings = g_object_ref (settings);
                        break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
@@ -114,8 +725,8 @@ clock_preferences_get_property (GObject    *object,
 
        switch (property_id)
        {
-               case PROP_SETTINGS:
-                       g_value_set_object (value, preferences->priv->settings);
+               case PROP_APPLET_SETTINGS:
+                       g_value_set_object (value, preferences->priv->applet_settings);
                        break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object,
@@ -134,14 +745,15 @@ clock_preferences_class_init (ClockPreferencesClass *class)
        object_class = G_OBJECT_CLASS (class);
        widget_class = GTK_WIDGET_CLASS (class);
 
+       object_class->constructor = clock_preferences_constructor;
        object_class->finalize = clock_preferences_finalize;
        object_class->set_property = clock_preferences_set_property;
        object_class->get_property = clock_preferences_get_property;
 
-       object_properties[PROP_SETTINGS] =
-               g_param_spec_object ("settings",
-                                    "settings",
-                                    "settings",
+       object_properties[PROP_APPLET_SETTINGS] =
+               g_param_spec_object ("applet-settings",
+                                    "applet-settings",
+                                    "applet-settings",
                                     G_TYPE_SETTINGS,
                                     G_PARAM_CONSTRUCT_ONLY |
                                     G_PARAM_WRITABLE);
@@ -159,16 +771,17 @@ clock_preferences_class_init (ClockPreferencesClass *class)
        gtk_widget_class_bind_template_child_private (widget_class,
                                                      ClockPreferences,
                                                      time_settings_button);
+
        gtk_widget_class_bind_template_child_private (widget_class,
                                                      ClockPreferences,
-                                                     close_button);
+                                                     notebook);
 
        gtk_widget_class_bind_template_child_private (widget_class,
                                                      ClockPreferences,
-                                                     clock_format_12hr);
+                                                     clock_options);
        gtk_widget_class_bind_template_child_private (widget_class,
                                                      ClockPreferences,
-                                                     clock_format_24hr);
+                                                     clock_format_combo);
        gtk_widget_class_bind_template_child_private (widget_class,
                                                      ClockPreferences,
                                                      show_date);
@@ -201,34 +814,101 @@ clock_preferences_class_init (ClockPreferencesClass *class)
        gtk_widget_class_bind_template_child_private (widget_class,
                                                      ClockPreferences,
                                                      wind_speed_combo);
-       gtk_widget_class_bind_template_child_private (widget_class,
-                                                     ClockPreferences,
-                                                     pressure_combo);
-       gtk_widget_class_bind_template_child_private (widget_class,
-                                                     ClockPreferences,
-                                                     visibility_combo);
 }
 
 static void
 clock_preferences_init (ClockPreferences *preferences)
 {
+       ClockPreferencesPrivate *priv;
+
        preferences->priv = clock_preferences_get_instance_private (preferences);
+       priv = preferences->priv;
+
+       priv->interface_settings = g_settings_new (DESKTOP_INTERFACE_SCHEMA);
+       priv->gweather_settings = g_settings_new (GWEATHER_SCHEMA);
+
+       priv->app_info = g_desktop_app_info_new ("gnome-datetime-panel.desktop");
 
        gtk_widget_init_template (GTK_WIDGET (preferences));
 }
 
 GtkWidget *
-clock_preferences_new (GSettings *settings,
-                       GtkWindow *parent)
+clock_preferences_new (GSettings *applet_settings,
+                       GtkWindow *parent,
+                       gint       page_number)
 {
-        GObject *object;
+       GObject          *object;
+       ClockPreferences *preferences;
+       GtkWindow        *window;
 
-        object = g_object_new (CLOCK_TYPE_PREFERENCES,
-                               "settings", settings,
+       object = g_object_new (CLOCK_TYPE_PREFERENCES,
+                               "applet-settings", applet_settings,
                                NULL);
+       preferences = CLOCK_PREFERENCES (object);
+       window = GTK_WINDOW (object);
+
+       gtk_window_set_transient_for (window, parent);
+       gtk_window_set_icon_name (window, CLOCK_ICON);
+
+       if (page_number > -1)
+               gtk_notebook_set_current_page (GTK_NOTEBOOK (preferences->priv->notebook),
+                                              page_number);
+
+       return GTK_WIDGET (object);
+}
+
+void
+clock_preferences_update_locations (GSettings     *settings,
+                                    ClockLocation *edit_or_remove_location,
+                                    ClockLocation *new_or_edited_location)
+{
+       GVariantIter             *iter;
+       GList                    *locations;
+       const gchar              *name;
+       const gchar              *code;
+       gboolean                  latlon_override;
+       gdouble                   latitude;
+       gdouble                   longitude;
+       GList                    *l;
+       GVariantBuilder           builder;
+
+       g_settings_get (settings, KEY_CITIES, "a(ssm(dd))", &iter);
+       locations = NULL;
+
+       while (g_variant_iter_loop (iter, "(&s&sm(dd))",
+                                   &name, &code,
+                                   &latlon_override,
+                                   &latitude, &longitude)) {
+               ClockLocation *location;
+
+               location = clock_location_new (name, code,
+                                              latlon_override,
+                                              latitude, longitude);
+
+               if (edit_or_remove_location)
+                       if (clock_location_equal (edit_or_remove_location, location))
+                               continue;
+
+               locations = g_list_append (locations, location);
+       }
+
+       if (new_or_edited_location)
+               locations = g_list_append (locations, new_or_edited_location);
+       locations = g_list_sort (locations, sort_locations_by_name);
+
+       g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ssm(dd))"));
+
+       for (l = locations; l; l = l->next) {
+               ClockLocation *tmp;
+
+               tmp = CLOCK_LOCATION (l->data);
+               g_variant_builder_add_value (&builder,
+                                            clock_location_serialize (tmp));
+               g_object_unref (tmp);
+       }
 
-        gtk_window_set_transient_for (GTK_WINDOW (object),
-                                      parent);
+       g_settings_set_value (settings, KEY_CITIES,
+                             g_variant_builder_end (&builder));
 
-        return GTK_WIDGET (object);
+       g_list_free (locations);
 }
diff --git a/applets/clock/clock-preferences.h b/applets/clock/clock-preferences.h
index 959a4f4..abefcbc 100644
--- a/applets/clock/clock-preferences.h
+++ b/applets/clock/clock-preferences.h
@@ -55,10 +55,15 @@ struct _ClockPreferencesClass
        GtkDialogClass parent_class;
 };
 
-GType      clock_preferences_get_type (void);
+GType      clock_preferences_get_type         (void);
 
-GtkWidget *clock_preferences_new      (GSettings *settings,
-                                       GtkWindow *parent);
+GtkWidget *clock_preferences_new              (GSettings     *applet_settings,
+                                               GtkWindow     *parent,
+                                               gint           page_number);
+
+void       clock_preferences_update_locations (GSettings     *settings,
+                                               ClockLocation *edit_or_remove_location,
+                                               ClockLocation *new_or_edited_location);
 
 G_END_DECLS
 
diff --git a/applets/clock/clock-preferences.ui b/applets/clock/clock-preferences.ui
index 16f90f0..600c9e4 100644
--- a/applets/clock/clock-preferences.ui
+++ b/applets/clock/clock-preferences.ui
@@ -2,6 +2,66 @@
 <!-- Generated with glade 3.18.3 -->
 <interface>
   <requires lib="gtk+" version="3.12"/>
+  <object class="GtkListStore" id="liststore1">
+    <columns>
+      <!-- column-name name -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">Default</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Kelvin</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Celsius</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Fahrenheit</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkListStore" id="liststore2">
+    <columns>
+      <!-- column-name name -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">Default</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">m/s</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">km/h</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">mph</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">knots</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">Beaufort scale</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkListStore" id="liststore3">
+    <columns>
+      <!-- column-name name -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes">24 hour format</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes">12 hour format</col>
+      </row>
+    </data>
+  </object>
   <template class="ClockPreferences" parent="GtkDialog">
     <property name="can_focus">False</property>
     <property name="border_width">5</property>
@@ -59,6 +119,7 @@
                 <property name="has_default">True</property>
                 <property name="receives_default">False</property>
                 <property name="use_underline">True</property>
+                <signal name="clicked" handler="gtk_widget_destroy" object="ClockPreferences" swapped="yes"/>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -109,53 +170,21 @@
                       </packing>
                     </child>
                     <child>
-                      <object class="GtkBox" id="hbox49">
+                      <object class="GtkComboBox" id="clock_format_combo">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="margin_left">12</property>
-                        <property name="margin_start">12</property>
-                        <property name="spacing">13</property>
+                        <property name="model">liststore3</property>
                         <child>
-                          <object class="GtkRadioButton" id="clock_format_12hr">
-                            <property name="label" translatable="yes">_12 hour format</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="halign">start</property>
-                            <property name="use_underline">True</property>
-                            <property name="xalign">0</property>
-                            <property name="active">True</property>
-                            <property name="draw_indicator">True</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">0</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkRadioButton" id="clock_format_24hr">
-                            <property name="label" translatable="yes">_24 hour format</property>
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">False</property>
-                            <property name="halign">start</property>
-                            <property name="use_underline">True</property>
-                            <property name="xalign">0</property>
-                            <property name="draw_indicator">True</property>
-                            <property name="group">clock_format_12hr</property>
-                          </object>
-                          <packing>
-                            <property name="expand">False</property>
-                            <property name="fill">False</property>
-                            <property name="position">1</property>
-                          </packing>
+                          <object class="GtkCellRendererText" id="cellrenderertext3"/>
+                          <attributes>
+                            <attribute name="text">0</attribute>
+                          </attributes>
                         </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
                         <property name="fill">True</property>
-                        <property name="position">1</property>
+                        <property name="position">2</property>
                       </packing>
                     </child>
                   </object>
@@ -447,67 +476,17 @@
                         <property name="row_spacing">6</property>
                         <property name="column_spacing">12</property>
                         <child>
-                          <object class="GtkComboBox" id="visibility_combo">
-                            <property name="can_focus">False</property>
-                            <property name="hexpand">True</property>
-                          </object>
-                          <packing>
-                            <property name="left_attach">1</property>
-                            <property name="top_attach">3</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkLabel" id="visibility_label">
-                            <property name="can_focus">False</property>
-                            <property name="xalign">0</property>
-                            <property name="label" translatable="yes">_Visibility unit:</property>
-                            <property name="use_underline">True</property>
-                            <property name="mnemonic_widget">visibility_combo</property>
-                          </object>
-                          <packing>
-                            <property name="left_attach">0</property>
-                            <property name="top_attach">3</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkComboBox" id="pressure_combo">
-                            <property name="can_focus">False</property>
-                            <property name="hexpand">True</property>
-                          </object>
-                          <packing>
-                            <property name="left_attach">1</property>
-                            <property name="top_attach">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkLabel" id="pressure_label">
-                            <property name="can_focus">False</property>
-                            <property name="xalign">0</property>
-                            <property name="label" translatable="yes">_Pressure unit:</property>
-                            <property name="use_underline">True</property>
-                            <property name="mnemonic_widget">pressure_combo</property>
-                          </object>
-                          <packing>
-                            <property name="left_attach">0</property>
-                            <property name="top_attach">2</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <object class="GtkComboBox" id="wind_speed_combo">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="hexpand">True</property>
-                          </object>
-                          <packing>
-                            <property name="left_attach">1</property>
-                            <property name="top_attach">1</property>
-                          </packing>
-                        </child>
-                        <child>
                           <object class="GtkComboBox" id="temperature_combo">
                             <property name="visible">True</property>
                             <property name="can_focus">False</property>
                             <property name="hexpand">True</property>
+                            <property name="model">liststore1</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="cellrenderertext1"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
                           </object>
                           <packing>
                             <property name="left_attach">1</property>
@@ -542,6 +521,24 @@
                             <property name="top_attach">1</property>
                           </packing>
                         </child>
+                        <child>
+                          <object class="GtkComboBox" id="wind_speed_combo">
+                            <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="hexpand">True</property>
+                            <property name="model">liststore2</property>
+                            <child>
+                              <object class="GtkCellRendererText" id="cellrenderertext2"/>
+                              <attributes>
+                                <attribute name="text">0</attribute>
+                              </attributes>
+                            </child>
+                          </object>
+                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="top_attach">1</property>
+                          </packing>
+                        </child>
                       </object>
                       <packing>
                         <property name="expand">False</property>
diff --git a/applets/clock/clock-utils.c b/applets/clock/clock-utils.c
index f147705..c42b356 100644
--- a/applets/clock/clock-utils.c
+++ b/applets/clock/clock-utils.c
@@ -54,71 +54,3 @@ clock_locale_format (void)
                G_DESKTOP_CLOCK_FORMAT_12H :
                G_DESKTOP_CLOCK_FORMAT_24H;
 }
-
-void
-clock_utils_display_help (GtkWidget  *widget,
-                         const char *doc_id,
-                         const char *link_id)
-{
-       GError *error = NULL;
-       char   *uri;
-
-       if (link_id)
-               uri = g_strdup_printf ("help:%s/%s", doc_id, link_id);
-       else
-               uri = g_strdup_printf ("help:%s", doc_id);
-
-       gtk_show_uri (gtk_widget_get_screen (widget), uri,
-                     gtk_get_current_event_time (), &error);
-
-       g_free (uri);
-
-       if (error &&
-           g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
-               g_error_free (error);
-       else if (error) {
-               GtkWidget *parent;
-               GtkWidget *dialog;
-               char      *primary;
-
-               if (GTK_IS_WINDOW (widget))
-                       parent = widget;
-               else
-                       parent = NULL;
-
-               primary = g_markup_printf_escaped (
-                               _("Could not display help document '%s'"),
-                               doc_id);
-               dialog = gtk_message_dialog_new (
-                               parent ? GTK_WINDOW (parent) : NULL,
-                               GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
-                               GTK_MESSAGE_ERROR,
-                               GTK_BUTTONS_CLOSE,
-                               "%s", primary);
-
-               gtk_message_dialog_format_secondary_text (
-                                       GTK_MESSAGE_DIALOG (dialog),
-                                       "%s", error->message);
-
-               g_error_free (error);
-               g_free (primary);
-
-               g_signal_connect (dialog, "response",
-                                 G_CALLBACK (gtk_widget_destroy),
-                                 NULL);
-
-               gtk_window_set_icon_name (GTK_WINDOW (dialog), CLOCK_ICON);
-               gtk_window_set_screen (GTK_WINDOW (dialog),
-                                      gtk_widget_get_screen (widget));
-
-               if (parent == NULL) {
-                       /* we have no parent window */
-                       gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dialog),
-                                                         FALSE);
-                       gtk_window_set_title (GTK_WINDOW (dialog),
-                                             _("Error displaying help document"));
-               }
-
-               gtk_widget_show (dialog);
-       }
-}
diff --git a/applets/clock/clock-utils.h b/applets/clock/clock-utils.h
index c008d51..b0c17c6 100644
--- a/applets/clock/clock-utils.h
+++ b/applets/clock/clock-utils.h
@@ -33,10 +33,6 @@ G_BEGIN_DECLS
 gboolean clock_locale_supports_am_pm (void);
 GDesktopClockFormat clock_locale_format (void);
 
-void clock_utils_display_help (GtkWidget  *widget,
-                              const char *doc_id,
-                              const char *link_id);
-
 G_END_DECLS
 
 #endif /* __CLOCK_UTILS_H__ */
diff --git a/applets/clock/clock.c b/applets/clock/clock.c
index 3f03966..d3aa185 100644
--- a/applets/clock/clock.c
+++ b/applets/clock/clock.c
@@ -60,19 +60,13 @@
 #include "calendar-window.h"
 #include "clock-location.h"
 #include "clock-location-edit.h"
+#include "clock-preferences.h"
 #include "clock-location-tile.h"
 #include "clock-map.h"
 #include "clock-utils.h"
 #include "timedate1.h"
 #include "system-timezone.h"
 
-enum {
-       COL_CITY_NAME = 0,
-       COL_CITY_TZ,
-        COL_CITY_LOC,
-       COL_CITY_LAST
-};
-
 typedef struct _ClockData ClockData;
 
 struct _ClockData {
@@ -98,20 +92,9 @@ struct _ClockData {
        GtkBuilder *builder;
 
         /* Preferences dialog */
-        GtkWidget *prefs_window;
-        GtkTreeView *prefs_locations;
-
-       GtkWidget *prefs_location_add_button;
-       GtkWidget *prefs_location_edit_button;
-       GtkWidget *prefs_location_remove_button;
-
        GWeatherLocationEntry *location_entry;
         GWeatherTimezoneMenu *zone_combo;
 
-       GtkWidget *time_settings_button;
-       GAppInfo *datetime_appinfo;
-
-       GtkListStore *cities_store;
         GtkWidget *cities_section;
         GtkWidget *map_widget;
 
@@ -163,7 +146,6 @@ static void update_orient (ClockData *cd);
 static void applet_change_orient (PanelApplet       *applet,
                                  PanelAppletOrient  orient,
                                  ClockData         *cd);
-static void save_cities_store (ClockData *cd);
 
 /* ClockBox, an instantiable GtkBox */
 
@@ -337,20 +319,11 @@ destroy_clock (GtkWidget * widget, ClockData *cd)
                gtk_widget_destroy (cd->calendar_popup);
        cd->calendar_popup = NULL;
 
-       if (cd->datetime_appinfo)
-               g_object_unref (cd->datetime_appinfo);
-       cd->datetime_appinfo = NULL;
-
         free_locations (cd);
 
         g_list_free (cd->location_tiles);
         cd->location_tiles = NULL;
 
-        if (cd->cities_store) {
-                g_object_unref (cd->cities_store);
-                cd->cities_store = NULL;
-        }
-
        if (cd->builder) {
                g_object_unref (cd->builder);
                cd->builder = NULL;
@@ -548,61 +521,6 @@ create_clock_window (ClockData *cd)
 }
 
 static gint
-sort_locations_by_name (gconstpointer a, gconstpointer b)
-{
-        ClockLocation *loc_a = (ClockLocation *) a;
-        ClockLocation *loc_b = (ClockLocation *) b;
-
-        const char *name_a = clock_location_get_name (loc_a);
-        const char *name_b = clock_location_get_name (loc_b);
-
-        return strcmp (name_a, name_b);
-}
-
-static void
-create_cities_store (ClockData *cd)
-{
-       GtkTreeIter iter;
-        GList *cities = cd->locations;
-        GList *list = NULL;
-
-        if (cd->cities_store) {
-                g_object_unref (G_OBJECT (cd->cities_store));
-                cd->cities_store = NULL;
-        }
-
-       /* City name, Timezone name, Coordinates in lat/long */
-       cd->cities_store = g_object_ref (gtk_list_store_new (COL_CITY_LAST,
-                                                             G_TYPE_STRING,            /* COL_CITY_NAME */
-                                                             G_TYPE_STRING,            /* COL_CITY_TZ */
-                                                             CLOCK_TYPE_LOCATION));    /* COL_CITY_LOC */
-
-        list = g_list_copy (cities);
-        list = g_list_sort (list, sort_locations_by_name);
-
-       while (list) {
-               ClockLocation *loc = CLOCK_LOCATION (list->data);
-
-               gtk_list_store_append (cd->cities_store, &iter);
-               gtk_list_store_set (cd->cities_store, &iter,
-                                   COL_CITY_NAME, clock_location_get_name (loc),
-                                   /* FIXME: translate the timezone */
-                                   COL_CITY_TZ, clock_location_get_timezone (loc),
-                                    COL_CITY_LOC, loc,
-                                   -1);
-
-                list = list->next;
-       }
-
-        
-       if (cd->prefs_window) {          
-               GtkWidget *widget = _clock_get_widget (cd, "cities_list");       
-               gtk_tree_view_set_model (GTK_TREE_VIEW (widget),         
-               GTK_TREE_MODEL (cd->cities_store));      
-       }
-}
-
-static gint
 sort_locations_by_time (gconstpointer a, gconstpointer b)
 {
         ClockLocation *loc_a = (ClockLocation *) a;
@@ -746,7 +664,6 @@ update_calendar_popup (ClockData *cd)
                update_tooltip (cd);
 
                 create_clock_window (cd);
-                create_cities_store (cd);
                 create_cities_section (cd);
                 create_map_section (cd);
         }
@@ -1038,74 +955,55 @@ copy_time (GSimpleAction *action,
 }
 
 static void
-ensure_datetime_appinfo (ClockData *cd)
-{
-       if (!cd->datetime_appinfo)
-               cd->datetime_appinfo = (GAppInfo *) g_desktop_app_info_new ("gnome-datetime-panel.desktop");
-}
-
-static void
-update_set_time_button (ClockData *cd)
-{
-       if (!cd->time_settings_button)
-               return;
-
-       ensure_datetime_appinfo (cd);
-
-       gtk_widget_set_sensitive (cd->time_settings_button,
-                                 cd->datetime_appinfo != NULL);
-}
-
-static void
-run_time_settings (GtkWidget *unused, ClockData *cd)
+config_date (GSimpleAction *action,
+             GVariant      *parameter,
+             gpointer       user_data)
 {
-       GdkScreen           *screen;
+       GDesktopAppInfo     *app_info;
        GdkDisplay          *display;
        GdkAppLaunchContext *context;
        GError              *error;
+       ClockData           *cd;
+       GtkWidget           *dialog;
 
-       update_set_time_button (cd);
-       ensure_datetime_appinfo (cd);
-
-       if (!cd->datetime_appinfo)
+       app_info = g_desktop_app_info_new ("gnome-datetime-panel.desktop");
+       if (!app_info)
                return;
 
-       screen = gtk_widget_get_screen (cd->applet);
-        display = gdk_screen_get_display (screen);
-        context = gdk_display_get_app_launch_context (display);
-        gdk_app_launch_context_set_screen (context, screen);
-
+       display = gdk_display_get_default ();
+       context = gdk_display_get_app_launch_context (display);
        error = NULL;
-       g_app_info_launch (cd->datetime_appinfo, NULL,
-                          (GAppLaunchContext *) context, &error);
 
+       g_app_info_launch (G_APP_INFO (app_info),
+                          NULL,
+                          (GAppLaunchContext *) context,
+                          &error);
+
+       g_object_unref (app_info);
        g_object_unref (context);
 
-       if (error) {
-               GtkWidget *dialog;
+       if (!error)
+               return;
 
-               dialog = gtk_message_dialog_new (NULL,
-                                                0,
-                                                GTK_MESSAGE_ERROR,
-                                                GTK_BUTTONS_CLOSE,
-                                                 _("Failed to open the time settings"));
+        cd = user_data;
 
-               gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", error->message);
-               g_signal_connect (dialog, "response",
-                                 G_CALLBACK (gtk_widget_destroy), NULL);
-               gtk_window_present (GTK_WINDOW (dialog));
+       dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (cd->applet)),
+                                        GTK_DIALOG_DESTROY_WITH_PARENT,
+                                        GTK_MESSAGE_ERROR,
+                                        GTK_BUTTONS_CLOSE,
+                                        "%s",
+                                        _("Failed to open the time settings"));
 
-               g_error_free (error);
-       }
-}
+       gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+                                                 "%s",
+                                                 error->message);
 
-static void
-config_date (GSimpleAction *action,
-             GVariant      *parameter,
-             gpointer       user_data)
-{
-        ClockData *cd = (ClockData *) user_data;
-       run_time_settings (NULL, cd);
+       g_signal_connect (dialog, "response",
+                         G_CALLBACK (gtk_widget_destroy), NULL);
+
+       gtk_window_present (GTK_WINDOW (dialog));
+
+       g_error_free (error);
 }
 
 static const GActionEntry clock_menu_actions [] = {
@@ -1391,351 +1289,20 @@ fill_clock_applet (PanelApplet *applet)
 }
 
 static void
-prefs_locations_changed (GtkTreeSelection *selection, ClockData *cd)
-{
-        gint n;
-
-        n = gtk_tree_selection_count_selected_rows (selection);
-        gtk_widget_set_sensitive (cd->prefs_location_edit_button, n > 0);
-        gtk_widget_set_sensitive (cd->prefs_location_remove_button, n > 0);
-}
-
-static void
-save_cities_store (ClockData *cd)
-{
-        ClockLocation *loc;
-        GVariantBuilder builder;
-        GList *list;
-
-        g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ssm(dd))"));
-
-        list = cd->locations;
-        while (list) {
-                loc = CLOCK_LOCATION (list->data);
-                g_variant_builder_add_value (&builder,
-                                             clock_location_serialize (loc));
-
-                list = list->next;
-        }
-
-        g_settings_set_value (cd->applet_settings, KEY_CITIES,
-                              g_variant_builder_end (&builder));
-
-        create_cities_store (cd);
-}
-
-static void
-prefs_hide (GtkWidget *widget, ClockData *cd)
-{
-        GtkWidget *tree;
-
-       gtk_widget_hide (cd->prefs_window);
-
-       tree = _clock_get_widget (cd, "cities_list");
-
-        gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree)));
-}
-
-static gboolean
-prefs_hide_event (GtkWidget *widget, GdkEvent *event, ClockData *cd)
-{
-        prefs_hide (widget, cd);
-
-        return TRUE;
-}
-
-static void
-prefs_help (GtkWidget *widget, ClockData *cd)
-{
-       clock_utils_display_help (cd->prefs_window,
-                                 "clock", "clock-settings");
-}
-
-static void
-remove_tree_row (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
-        ClockData *cd = data;
-        ClockLocation *loc = NULL;
-
-        gtk_tree_model_get (model, iter, COL_CITY_LOC, &loc, -1);
-       cd->locations = g_list_remove (cd->locations, loc);
-       g_object_unref (loc);
-
-       /* This will update everything related to locations to take into
-        * account the removed location (via the gconf notification) */
-        save_cities_store (cd);
-}
-
-static void
-run_prefs_locations_remove (GtkButton *button, ClockData *cd)
-{
-        GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (cd->prefs_locations));
-
-        gtk_tree_selection_selected_foreach (sel, remove_tree_row, cd);
-}
-
-static void
-run_prefs_locations_add (GtkButton *button, ClockData *cd)
-{
-        GtkWidget *edit_window;
-
-        edit_window = clock_location_edit_new (cd->applet_settings,
-                                               GTK_WINDOW (cd->prefs_window),
-                                               NULL);
-
-       /*gtk_widget_grab_focus (GTK_WIDGET (cd->location_entry));
-       gtk_editable_set_position (GTK_EDITABLE (cd->location_entry), -1);*/
-
-        gtk_window_present_with_time (GTK_WINDOW (edit_window), gtk_get_current_event_time ());
-}
-
-static void
-edit_tree_row (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data)
-{
-        ClockData     *cd;
-       GtkWidget     *edit_window;
-       ClockLocation *clock_location;
-
-        cd = data;
-
-        gtk_tree_model_get (model, iter, COL_CITY_LOC, &clock_location, -1);
-
-       edit_window = clock_location_edit_new (cd->applet_settings,
-                                              GTK_WINDOW (cd->prefs_window),
-                                              clock_location);
-
-        /*gtk_widget_grab_focus (GTK_WIDGET (cd->location_entry));
-       gtk_editable_set_position (GTK_EDITABLE (cd->location_entry), -1);*/
-
-        gtk_window_present (GTK_WINDOW (edit_window));
-}
-
-static void
-run_prefs_locations_edit (GtkButton *unused, ClockData *cd)
-{
-        GtkTreeSelection *sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (cd->prefs_locations));
-
-        gtk_tree_selection_selected_foreach (sel, edit_tree_row, cd);
-}
-
-static void
-set_12hr_format_radio_cb (GtkWidget *widget, ClockData *cd)
-{
-        GDesktopClockFormat format;
-
-       if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
-                format = G_DESKTOP_CLOCK_FORMAT_12H;
-        else
-                format = G_DESKTOP_CLOCK_FORMAT_24H;
-
-        g_settings_set_enum (cd->clock_settings, KEY_CLOCK_FORMAT, format);
-}
-
-static void
-fill_prefs_window (ClockData *cd)
-{
-        struct int_char_pair {
-                int v;
-                const char *c;
-        };
-
-        static const struct int_char_pair temperatures[] = {
-                { GWEATHER_TEMP_UNIT_DEFAULT, N_("Default") },
-                { GWEATHER_TEMP_UNIT_KELVIN, N_("Kelvin") },
-                { GWEATHER_TEMP_UNIT_CENTIGRADE, N_("Celsius") },
-                { GWEATHER_TEMP_UNIT_FAHRENHEIT, N_("Fahrenheit") },
-                { -1 }
-        };
-
-        static const struct int_char_pair speeds[] = {
-                { GWEATHER_SPEED_UNIT_DEFAULT, N_("Default") },
-                { GWEATHER_SPEED_UNIT_MS, N_("Meters per second (m/s)") },
-                { GWEATHER_SPEED_UNIT_KPH, N_("Kilometers per hour (kph)") },
-                { GWEATHER_SPEED_UNIT_MPH, N_("Miles per hour (mph)") },
-                { GWEATHER_SPEED_UNIT_KNOTS, N_("Knots") },
-                { GWEATHER_SPEED_UNIT_BFT, N_("Beaufort scale") },
-                { -1 }
-        };
-
-        GtkWidget *radio_12hr;
-        GtkWidget *radio_24hr;
-       GtkWidget *widget;
-       GtkCellRenderer *renderer;
-        GtkTreeViewColumn *col;
-       GtkListStore *store;
-        GtkTreeIter iter;
-        GEnumClass *enum_class;
-        int i;
-
-       /* Set the 12 hour / 24 hour widget */
-        radio_12hr = _clock_get_widget (cd, "12hr_radio");
-        radio_24hr = _clock_get_widget (cd, "24hr_radio");
-
-        if (g_settings_get_enum (cd->clock_settings, KEY_CLOCK_FORMAT) ==
-            G_DESKTOP_CLOCK_FORMAT_12H)
-                widget = radio_12hr;
-        else
-                widget = radio_24hr;
-
-        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
-
-       g_signal_connect (radio_12hr, "toggled",
-                         G_CALLBACK (set_12hr_format_radio_cb), cd);
-
-       /* Set the "Show Date" checkbox */
-       widget = _clock_get_widget (cd, "date_check");
-        g_settings_bind (cd->clock_settings, KEY_CLOCK_SHOW_DATE, widget, "active",
-                         G_SETTINGS_BIND_DEFAULT);
-
-       /* Set the "Show Seconds" checkbox */
-       widget = _clock_get_widget (cd, "seconds_check");
-        g_settings_bind (cd->clock_settings, KEY_CLOCK_SHOW_SECONDS, widget, "active",
-                         G_SETTINGS_BIND_DEFAULT);
-
-       /* Set the "Show weather" checkbox */
-       widget = _clock_get_widget (cd, "weather_check");
-        g_settings_bind (cd->applet_settings, KEY_SHOW_WEATHER, widget, "active",
-                         G_SETTINGS_BIND_DEFAULT);
-
-       /* Set the "Show temperature" checkbox */
-       widget = _clock_get_widget (cd, "temperature_check");
-        g_settings_bind (cd->applet_settings, KEY_SHOW_TEMPERATURE, widget, "active",
-                         G_SETTINGS_BIND_DEFAULT);
-
-       /* Fill the Cities list */
-       widget = _clock_get_widget (cd, "cities_list");
-
-       renderer = gtk_cell_renderer_text_new ();
-        col = gtk_tree_view_column_new_with_attributes (_("City Name"), renderer, "text", COL_CITY_NAME, 
NULL);
-        gtk_tree_view_insert_column (GTK_TREE_VIEW (widget), col, -1);
-
-       renderer = gtk_cell_renderer_text_new ();
-        col = gtk_tree_view_column_new_with_attributes (_("City Time Zone"), renderer, "text", COL_CITY_TZ, 
NULL);
-        gtk_tree_view_insert_column (GTK_TREE_VIEW (widget), col, -1);
-       
-       if (cd->cities_store == NULL)
-               create_cities_store (cd);
-
-        gtk_tree_view_set_model (GTK_TREE_VIEW (widget),
-                                 GTK_TREE_MODEL (cd->cities_store));
-
-        /* Temperature combo */
-       widget = _clock_get_widget (cd, "temperature_combo");
-       store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
-       gtk_combo_box_set_model (GTK_COMBO_BOX (widget), GTK_TREE_MODEL (store));
-        gtk_combo_box_set_id_column (GTK_COMBO_BOX (widget), 0);
-       renderer = gtk_cell_renderer_text_new ();
-       gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (widget), renderer, TRUE);
-       gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (widget), renderer, "text", 1, NULL);
-
-        enum_class = g_type_class_ref (GWEATHER_TYPE_TEMPERATURE_UNIT);
-        for (i = 0; temperatures[i].v != -1; i++)
-                gtk_list_store_insert_with_values (store, &iter, -1,
-                                                   0, g_enum_get_value (enum_class, 
temperatures[i].v)->value_nick,
-                                                   1, gettext (temperatures[i].c),
-                                                   -1);
-        g_type_class_unref (enum_class);
-
-        g_settings_bind (cd->weather_settings, KEY_TEMPERATURE_UNIT, widget, "active-id",
-                         G_SETTINGS_BIND_DEFAULT);
-
-        /* Wind speed combo */
-       widget = _clock_get_widget (cd, "wind_speed_combo");
-       store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
-       gtk_combo_box_set_model (GTK_COMBO_BOX (widget), GTK_TREE_MODEL (store));
-        gtk_combo_box_set_id_column (GTK_COMBO_BOX (widget), 0);
-       renderer = gtk_cell_renderer_text_new ();
-       gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (widget), renderer, TRUE);
-       gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (widget), renderer, "text", 1, NULL);
-
-        enum_class = g_type_class_ref (GWEATHER_TYPE_SPEED_UNIT);
-        for (i = 0; speeds[i].v != -1; i++)
-                gtk_list_store_insert_with_values (store, &iter, -1,
-                                                   0, g_enum_get_value (enum_class, speeds[i].v)->value_nick,
-                                                   1, gettext (speeds[i].c),
-                                                   -1);
-        g_type_class_unref (enum_class);
-
-        g_settings_bind (cd->weather_settings, KEY_SPEED_UNIT, widget, "active-id",
-                         G_SETTINGS_BIND_DEFAULT);
-}
-
-static void
-ensure_prefs_window_is_created (ClockData *cd)
-{
-       GtkWidget *prefs_close_button;
-       GtkWidget *prefs_help_button;
-       GtkWidget *clock_options;
-        GtkTreeSelection *selection;
-
-        if (cd->prefs_window)
-                return;
-
-        cd->prefs_window = _clock_get_widget (cd, "prefs-window");
-
-       gtk_window_set_icon_name (GTK_WINDOW (cd->prefs_window), CLOCK_ICON);
-
-        prefs_close_button = _clock_get_widget (cd, "prefs-close-button");
-        prefs_help_button = _clock_get_widget (cd, "prefs-help-button");
-        clock_options = _clock_get_widget (cd, "clock-options");
-        cd->prefs_locations = GTK_TREE_VIEW (_clock_get_widget (cd, "cities_list"));
-
-       if (!clock_locale_supports_am_pm ())
-               gtk_widget_hide (clock_options);
-
-        selection = gtk_tree_view_get_selection (cd->prefs_locations);
-        g_signal_connect (G_OBJECT (selection), "changed",
-                          G_CALLBACK (prefs_locations_changed), cd);
-
-        g_signal_connect (G_OBJECT (cd->prefs_window), "delete_event",
-                          G_CALLBACK (prefs_hide_event), cd);
-
-        g_signal_connect (G_OBJECT (prefs_close_button), "clicked",
-                          G_CALLBACK (prefs_hide), cd);
-
-        g_signal_connect (G_OBJECT (prefs_help_button), "clicked",
-                          G_CALLBACK (prefs_help), cd);
-
-        cd->prefs_location_remove_button = _clock_get_widget (cd, "prefs-locations-remove-button");
-
-        g_signal_connect (G_OBJECT (cd->prefs_location_remove_button), "clicked",
-                          G_CALLBACK (run_prefs_locations_remove), cd);
-
-        cd->prefs_location_add_button = _clock_get_widget (cd, "prefs-locations-add-button");
-
-        g_signal_connect (G_OBJECT (cd->prefs_location_add_button), "clicked",
-                          G_CALLBACK (run_prefs_locations_add), cd);
-
-        cd->prefs_location_edit_button = _clock_get_widget (cd, "prefs-locations-edit-button");
-
-        g_signal_connect (G_OBJECT (cd->prefs_location_edit_button), "clicked",
-                          G_CALLBACK (run_prefs_locations_edit), cd);
-
-        /* Set up the time setting section */
-
-        cd->time_settings_button = _clock_get_widget (cd, "time-settings-button");
-        g_signal_connect (cd->time_settings_button, "clicked",
-                          G_CALLBACK (run_time_settings), cd);
-
-        /* fill it with the current preferences */
-        fill_prefs_window (cd);
-}
-
-static void
 display_properties_dialog (ClockData *cd, gboolean start_in_locations_page)
 {
-        ensure_prefs_window_is_created (cd);
+        gint       page_number;
+        GtkWidget *prefs_window;
 
-        if (start_in_locations_page) {
-                GtkWidget *notebook = _clock_get_widget (cd, "notebook");
-                gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), 1);
-        }
+        page_number = 0;
+        if (start_in_locations_page)
+                page_number = 1;
 
-       update_set_time_button (cd);
+        prefs_window = clock_preferences_new (cd->applet_settings,
+                                              GTK_WINDOW (gtk_widget_get_toplevel (cd->applet)),
+                                              page_number);
 
-        gtk_window_set_screen (GTK_WINDOW (cd->prefs_window),
-                               gtk_widget_get_screen (cd->applet));
-       gtk_window_present (GTK_WINDOW (cd->prefs_window));
+        gtk_window_present (GTK_WINDOW (prefs_window));
 }
 
 static void
diff --git a/applets/clock/clock.gresource.xml b/applets/clock/clock.gresource.xml
index 43092e9..b81bde0 100644
--- a/applets/clock/clock.gresource.xml
+++ b/applets/clock/clock.gresource.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <gresources>
   <gresource prefix="/org/gnome/panel/applet/clock">
-    <file compressed="true">clock.ui</file>
     <file compressed="true">clock-location-edit.ui</file>
     <file compressed="true">clock-preferences.ui</file>
     <file compressed="true">clock-menu.xml</file>
diff --git a/applets/clock/gdesktop-enum-types.c b/applets/clock/gdesktop-enum-types.c
new file mode 100644
index 0000000..0d083d0
--- /dev/null
+++ b/applets/clock/gdesktop-enum-types.c
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2014 Alberts Muktupāvels
+ *
+ * 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 the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ *    Alberts Muktupāvels <alberts muktupavels gmail com>
+ */
+
+#include <gdesktop-enums.h>
+
+#include "gdesktop-enum-types.h"
+
+static const GEnumValue values[] = {
+       { G_DESKTOP_CLOCK_FORMAT_24H, "G_DESKTOP_CLOCK_FORMAT_24H", "24h" },
+       { G_DESKTOP_CLOCK_FORMAT_12H, "G_DESKTOP_CLOCK_FORMAT_12H", "12h" },
+       { 0, NULL, NULL }
+};
+
+GType
+g_desktop_clock_format_get_type (void)
+{
+       static GType type = 0;
+
+       if (!type)
+               type = g_enum_register_static ("GDesktopClockFormat", values);
+
+       return type;
+}
diff --git a/applets/clock/gdesktop-enum-types.h b/applets/clock/gdesktop-enum-types.h
new file mode 100644
index 0000000..f2f4656
--- /dev/null
+++ b/applets/clock/gdesktop-enum-types.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2014 Alberts Muktupāvels
+ *
+ * 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 the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors:
+ *    Alberts Muktupāvels <alberts muktupavels gmail com>
+ */
+
+#ifndef G_DESKTOP_ENUM_TYPES_H
+#define G_DESKTOP_ENUM_TYPES_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define G_DESKTOP_TYPE_CLOCK_FORMAT    (g_desktop_clock_format_get_type ())
+GType g_desktop_clock_format_get_type (void) G_GNUC_CONST;
+
+G_END_DECLS
+
+#endif


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