region: Show restart notification only if strictly needed
If the user is changing the setting back to the current locale we shouldn't show the restart notification. https://bugzilla.gnome.org/show_bug.cgi?id=695534
This commit is contained in:
parent
50ea2c11ce
commit
9c64f316b1
1 changed files with 91 additions and 22 deletions
|
@ -270,10 +270,92 @@ update_separator_func (GtkWidget **separator,
|
|||
}
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
CcRegionPanel *self;
|
||||
int category;
|
||||
gchar *target_locale;
|
||||
} MaybeNotifyData;
|
||||
|
||||
static void
|
||||
maybe_notify_finish (GObject *source,
|
||||
GAsyncResult *res,
|
||||
gpointer data)
|
||||
{
|
||||
MaybeNotifyData *mnd = data;
|
||||
CcRegionPanel *self = mnd->self;
|
||||
GError *error = NULL;
|
||||
GVariant *retval = NULL;
|
||||
gchar *current_lang_code = NULL;
|
||||
gchar *current_country_code = NULL;
|
||||
gchar *target_lang_code = NULL;
|
||||
gchar *target_country_code = NULL;
|
||||
const gchar *current_locale = NULL;
|
||||
|
||||
retval = g_dbus_proxy_call_finish (G_DBUS_PROXY (source), res, &error);
|
||||
if (!retval) {
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Failed to get locale: %s\n", error->message);
|
||||
goto out;
|
||||
}
|
||||
|
||||
g_variant_get (retval, "(&s)", ¤t_locale);
|
||||
|
||||
if (!gnome_parse_locale (current_locale,
|
||||
¤t_lang_code,
|
||||
¤t_country_code,
|
||||
NULL,
|
||||
NULL))
|
||||
goto out;
|
||||
|
||||
if (!gnome_parse_locale (mnd->target_locale,
|
||||
&target_lang_code,
|
||||
&target_country_code,
|
||||
NULL,
|
||||
NULL))
|
||||
goto out;
|
||||
|
||||
if (g_str_equal (current_lang_code, target_lang_code) == FALSE ||
|
||||
g_str_equal (current_country_code, target_country_code) == FALSE)
|
||||
show_restart_notification (self,
|
||||
mnd->category == LC_MESSAGES ? mnd->target_locale : NULL);
|
||||
out:
|
||||
g_free (target_country_code);
|
||||
g_free (target_lang_code);
|
||||
g_free (current_country_code);
|
||||
g_free (current_lang_code);
|
||||
g_clear_pointer (&retval, g_variant_unref);
|
||||
g_clear_error (&error);
|
||||
g_free (mnd->target_locale);
|
||||
g_free (mnd);
|
||||
}
|
||||
|
||||
static void
|
||||
maybe_notify (CcRegionPanel *self,
|
||||
int category,
|
||||
const gchar *target_locale)
|
||||
{
|
||||
CcRegionPanelPrivate *priv = self->priv;
|
||||
MaybeNotifyData *mnd;
|
||||
|
||||
mnd = g_new0 (MaybeNotifyData, 1);
|
||||
mnd->self = self;
|
||||
mnd->category = category;
|
||||
mnd->target_locale = g_strdup (target_locale);
|
||||
|
||||
g_dbus_proxy_call (priv->session,
|
||||
"GetLocale",
|
||||
g_variant_new ("(i)", category),
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1,
|
||||
priv->cancellable,
|
||||
maybe_notify_finish,
|
||||
mnd);
|
||||
}
|
||||
|
||||
static void set_localed_locale (CcRegionPanel *self,
|
||||
const gchar *language);
|
||||
|
||||
static gboolean
|
||||
static void
|
||||
update_language (CcRegionPanel *self,
|
||||
const gchar *language)
|
||||
{
|
||||
|
@ -281,14 +363,13 @@ update_language (CcRegionPanel *self,
|
|||
|
||||
if (priv->login) {
|
||||
if (g_strcmp0 (language, priv->system_language) == 0)
|
||||
return FALSE;
|
||||
return;
|
||||
set_localed_locale (self, language);
|
||||
return FALSE; /* don't show notification for login */
|
||||
} else {
|
||||
if (g_strcmp0 (language, priv->language) == 0)
|
||||
return FALSE;
|
||||
return;
|
||||
act_user_set_language (priv->user, language);
|
||||
return TRUE;
|
||||
maybe_notify (self, LC_MESSAGES, language);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -298,32 +379,26 @@ language_response (GtkDialog *chooser,
|
|||
CcRegionPanel *self)
|
||||
{
|
||||
const gchar *language;
|
||||
gboolean changed;
|
||||
|
||||
changed = FALSE;
|
||||
|
||||
if (response_id == GTK_RESPONSE_OK) {
|
||||
language = cc_language_chooser_get_language (GTK_WIDGET (chooser));
|
||||
changed = update_language (self, language);
|
||||
update_language (self, language);
|
||||
}
|
||||
|
||||
gtk_widget_destroy (GTK_WIDGET (chooser));
|
||||
|
||||
if (changed)
|
||||
show_restart_notification (self, language);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
static void
|
||||
update_region (CcRegionPanel *self,
|
||||
const gchar *region)
|
||||
{
|
||||
CcRegionPanelPrivate *priv = self->priv;
|
||||
|
||||
if (g_strcmp0 (region, priv->region) == 0)
|
||||
return FALSE;
|
||||
return;
|
||||
|
||||
g_settings_set_string (priv->locale_settings, KEY_REGION, region);
|
||||
return TRUE;
|
||||
maybe_notify (self, LC_TIME, region);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -332,19 +407,13 @@ format_response (GtkDialog *chooser,
|
|||
CcRegionPanel *self)
|
||||
{
|
||||
const gchar *region;
|
||||
gboolean changed;
|
||||
|
||||
changed = FALSE;
|
||||
|
||||
if (response_id == GTK_RESPONSE_OK) {
|
||||
region = cc_format_chooser_get_region (GTK_WIDGET (chooser));
|
||||
changed = update_region (self, region);
|
||||
update_region (self, region);
|
||||
}
|
||||
|
||||
gtk_widget_destroy (GTK_WIDGET (chooser));
|
||||
|
||||
if (changed)
|
||||
show_restart_notification (self, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Add table
Reference in a new issue