diff options
-rw-r--r-- | data/com.canonical.indicator.datetime.gschema.xml | 12 | ||||
-rw-r--r-- | data/datetime-dialog.ui | 5 | ||||
-rw-r--r-- | src/datetime-prefs.c | 53 | ||||
-rw-r--r-- | src/settings-shared.h | 2 | ||||
-rw-r--r-- | src/utils.c | 11 | ||||
-rw-r--r-- | src/utils.h | 1 |
6 files changed, 78 insertions, 6 deletions
diff --git a/data/com.canonical.indicator.datetime.gschema.xml b/data/com.canonical.indicator.datetime.gschema.xml index b33f34e..5361896 100644 --- a/data/com.canonical.indicator.datetime.gschema.xml +++ b/data/com.canonical.indicator.datetime.gschema.xml @@ -5,6 +5,11 @@ <value nick="24-hour" value="2" /> <value nick="custom" value="3" /> </enum> + <enum id="week-start-enum"> + <value nick="locale-default" value="0" /> + <value nick="sunday" value="1" /> + <value nick="monday" value="2" /> + </enum> <schema id="com.canonical.indicator.datetime" path="/com/canonical/indicator/datetime/" gettext-domain="indicator-datetime"> <key name="show-clock" type="b"> <default>true</default> @@ -78,6 +83,13 @@ Shows the week numbers in the monthly calendar in indicator-datetime's menu. </description> </key> + <key name="week-start" enum="week-start-enum"> + <default>'locale-default'</default> + <summary>When the week starts</summary> + <description> + Controls whether weeks in the calendar are shown to start on Sunday or Monday. + </description> + </key> <key name="show-events" type="b"> <default>true</default> <summary>Show events in the indicator</summary> diff --git a/data/datetime-dialog.ui b/data/datetime-dialog.ui index 8b48702..c2a39b9 100644 --- a/data/datetime-dialog.ui +++ b/data/datetime-dialog.ui @@ -578,6 +578,7 @@ <object class="GtkVBox" id="vbox4"> <property name="visible">True</property> <property name="can_focus">False</property> + <property name="spacing">6</property> <child> <object class="GtkCheckButton" id="includeWeekNumbersCheck"> <property name="label" translatable="yes">Include week num_bers</property> @@ -597,8 +598,8 @@ </child> <child> <object class="GtkLabel" id="label5"> + <property name="visible">True</property> <property name="can_focus">False</property> - <property name="no_show_all">True</property> <property name="xalign">0</property> <property name="label" translatable="yes">Week begins on:</property> </object> @@ -610,8 +611,8 @@ </child> <child> <object class="GtkHBox" id="hbox3"> + <property name="visible">True</property> <property name="can_focus">False</property> - <property name="no_show_all">True</property> <property name="homogeneous">True</property> <child> <object class="GtkRadioButton" id="startOnSundayRadio"> diff --git a/src/datetime-prefs.c b/src/datetime-prefs.c index 622a999..44b9b24 100644 --- a/src/datetime-prefs.c +++ b/src/datetime-prefs.c @@ -29,7 +29,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #include <libintl.h> #include <locale.h> #include <langinfo.h> -#include <glib/gi18n.h> +#include <glib/gi18n-lib.h> #include <gtk/gtk.h> #include <unique/unique.h> #include <polkitgtk/polkitgtk.h> @@ -85,6 +85,45 @@ bind_hours_get (GValue * value, GVariant * variant, gpointer user_data) return TRUE; } +/* Turns the boolean property into a string gsettings */ +static GVariant * +bind_week_start_set (const GValue * value, const GVariantType * type, gpointer user_data) +{ + const gchar * output = NULL; + gboolean is_sunday_button = (gboolean)GPOINTER_TO_INT(user_data); + + if (g_value_get_boolean(value)) { + /* Only do anything if we're setting active = true */ + output = is_sunday_button ? "sunday" : "monday"; + } else { + return NULL; + } + + return g_variant_new_string (output); +} + +/* Turns a string gsettings into a boolean property */ +static gboolean +bind_week_start_get (GValue * value, GVariant * variant, gpointer user_data) +{ + const gchar * str = g_variant_get_string(variant, NULL); + gboolean output = FALSE; + gboolean is_sunday_button = (gboolean)GPOINTER_TO_INT(user_data); + + if (g_strcmp0(str, "locale-default") == 0) { + output = (is_sunday_button == is_locale_week_start_sunday ()); + } else if (g_strcmp0(str, "sunday") == 0) { + output = is_sunday_button; + } else if (g_strcmp0(str, "monday") == 0) { + output = !is_sunday_button; + } else { + return FALSE; + } + + g_value_set_boolean (value, output); + return TRUE; +} + static void widget_dependency_cb (GtkWidget * parent, GParamSpec *pspec, GtkWidget * dependent) { @@ -473,8 +512,16 @@ create_dialog (void) "active", G_SETTINGS_BIND_DEFAULT); g_settings_bind (conf, SETTINGS_SHOW_WEEK_NUMBERS_S, WIG ("includeWeekNumbersCheck"), "active", G_SETTINGS_BIND_DEFAULT); - /*g_settings_bind_(conf, SETTINGS_WEEK_BEGINS_SUNDAY_S, WIG ("startOnSundayRadio"), - "active", G_SETTINGS_BIND_DEFAULT);*/ + g_settings_bind_with_mapping (conf, SETTINGS_WEEK_START_S, + WIG ("startOnSundayRadio"), "active", + G_SETTINGS_BIND_DEFAULT, + bind_week_start_get, bind_week_start_set, + GINT_TO_POINTER(TRUE), NULL); + g_settings_bind_with_mapping (conf, SETTINGS_WEEK_START_S, + WIG ("startOnMondayRadio"), "active", + G_SETTINGS_BIND_DEFAULT, + bind_week_start_get, bind_week_start_set, + GINT_TO_POINTER(FALSE), NULL); g_settings_bind (conf, SETTINGS_SHOW_EVENTS_S, WIG ("showEventsCheck"), "active", G_SETTINGS_BIND_DEFAULT); g_settings_bind (conf, SETTINGS_SHOW_LOCATIONS_S, WIG ("showLocationsCheck"), diff --git a/src/settings-shared.h b/src/settings-shared.h index d866b81..b8e1789 100644 --- a/src/settings-shared.h +++ b/src/settings-shared.h @@ -33,7 +33,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. #define SETTINGS_CUSTOM_TIME_FORMAT_S "custom-time-format" #define SETTINGS_SHOW_CALENDAR_S "show-calendar" #define SETTINGS_SHOW_WEEK_NUMBERS_S "show-week-numbers" -#define SETTINGS_WEEK_BEGINS_SUNDAY_S "week-begins-sunday" +#define SETTINGS_WEEK_START_S "week-start" #define SETTINGS_SHOW_EVENTS_S "show-events" #define SETTINGS_SHOW_LOCATIONS_S "show-locations" #define SETTINGS_LOCATIONS_S "locations" diff --git a/src/utils.c b/src/utils.c index f73ed14..89c499b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -50,6 +50,17 @@ is_locale_12h (void) return TRUE; } +/* Check the system locale setting to see if the week starts on Sunday or Monday */ +gboolean +is_locale_week_start_sunday (void) +{ + const char * week_1stday = nl_langinfo (_NL_TIME_WEEK_1STDAY); + + /* This appears to be a special value that libc uses for Sunday, it's not + really a string */ + return (GPOINTER_TO_INT (week_1stday) == 19971130); +} + void split_settings_location (const gchar * location, gchar ** zone, gchar ** name) { diff --git a/src/utils.h b/src/utils.h index 5f7842c..3dc8df1 100644 --- a/src/utils.h +++ b/src/utils.h @@ -28,6 +28,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>. G_BEGIN_DECLS gboolean is_locale_12h (void); +gboolean is_locale_week_start_sunday (void); void split_settings_location (const gchar * location, gchar ** zone, gchar ** name); gchar * generate_format_string_full (gboolean show_day, gboolean show_date); gchar * generate_format_string_at_time (GDateTime * time); |