diff options
author | Matthias Clasen <mclasen@redhat.com> | 2011-08-20 02:17:06 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-08-22 14:29:52 -0400 |
commit | 60c8f11a122d88d215a1d479f3cf9923096ccad9 (patch) | |
tree | fa45ac56def97742cc9968492adf79eb57c5b58d /panels/user-accounts | |
parent | daf2dae1ff1ab9a39d650f04de089edd53a70fc2 (diff) | |
download | gnome-control-center-60c8f11a122d88d215a1d479f3cf9923096ccad9.tar.gz |
user: Move the language chooser to common
It will soon be used in the region panel as well.
Diffstat (limited to 'panels/user-accounts')
-rw-r--r-- | panels/user-accounts/Makefile.am | 2 | ||||
-rw-r--r-- | panels/user-accounts/data/Makefile.am | 1 | ||||
-rw-r--r-- | panels/user-accounts/data/language-chooser.ui | 113 | ||||
-rw-r--r-- | panels/user-accounts/um-language-dialog.c | 370 | ||||
-rw-r--r-- | panels/user-accounts/um-language-dialog.h | 38 | ||||
-rw-r--r-- | panels/user-accounts/um-user-panel.c | 13 |
6 files changed, 6 insertions, 531 deletions
diff --git a/panels/user-accounts/Makefile.am b/panels/user-accounts/Makefile.am index 6bc4f39a3..6a3f2987e 100644 --- a/panels/user-accounts/Makefile.am +++ b/panels/user-accounts/Makefile.am @@ -40,8 +40,6 @@ libuser_accounts_la_SOURCES = \ um-user-manager.c \ um-account-dialog.h \ um-account-dialog.c \ - um-language-dialog.h \ - um-language-dialog.c \ um-password-dialog.h \ um-password-dialog.c \ um-photo-dialog.h \ diff --git a/panels/user-accounts/data/Makefile.am b/panels/user-accounts/data/Makefile.am index bccb64e4a..dbc17c651 100644 --- a/panels/user-accounts/data/Makefile.am +++ b/panels/user-accounts/data/Makefile.am @@ -3,7 +3,6 @@ SUBDIRS = faces icons uidir = $(pkgdatadir)/ui/user-accounts ui_DATA = \ account-dialog.ui \ - language-chooser.ui \ password-dialog.ui \ photo-dialog.ui \ user-accounts-dialog.ui \ diff --git a/panels/user-accounts/data/language-chooser.ui b/panels/user-accounts/data/language-chooser.ui deleted file mode 100644 index 5e635c3d4..000000000 --- a/panels/user-accounts/data/language-chooser.ui +++ /dev/null @@ -1,113 +0,0 @@ -<?xml version="1.0"?> -<interface> - <object class="GtkDialog" id="dialog"> - <property name="height_request">400</property> - <property name="border_width">5</property> - <property name="modal">True</property> - <property name="window_position">center-on-parent</property> - <property name="type_hint">dialog</property> - <property name="title"> </property> - <property name="icon_name">system-users</property> - <child internal-child="vbox"> - <object class="GtkBox" id="content-area"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <property name="margin_left">10</property> - <property name="margin_right">10</property> - <child> - <object class="GtkLabel" id="title"> - <property name="visible">True</property> - <property name="halign">start</property> - <property name="label" translatable="yes">Select a language</property> - </object> - <packing> - <property name="position">1</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">never</property> - <property name="vscrollbar_policy">automatic</property> - <property name="shadow_type">in</property> - <child> - <object class="GtkTreeView" id="language-list"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="headers_visible">False</property> - <property name="headers_clickable">False</property> - </object> - </child> - </object> - <packing> - <property name="position">2</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="filter-entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="secondary_icon_name">edit-find-symbolic</property> - <property name="secondary_icon_activatable">False</property> - <property name="secondary_icon_sensitive">False</property> - </object> - <packing> - <property name="position">3</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child internal-child="action_area"> - <object class="GtkButtonBox" id="action-area"> - <property name="visible">True</property> - <property name="layout_style">end</property> - <child> - <object class="GtkButton" id="cancel-button"> - <property name="label" translatable="yes">_Cancel</property> - <property name="use_underline">True</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="ok-button"> - <property name="label" translatable="yes">_Select</property> - <property name="use_underline">True</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="pack_type">end</property> - <property name="position">0</property> - </packing> - </child> - </object> - </child> - <action-widgets> - <action-widget response="-6">cancel-button</action-widget> - <action-widget response="-5">ok-button</action-widget> - </action-widgets> - </object> -</interface> diff --git a/panels/user-accounts/um-language-dialog.c b/panels/user-accounts/um-language-dialog.c deleted file mode 100644 index 945eb7264..000000000 --- a/panels/user-accounts/um-language-dialog.c +++ /dev/null @@ -1,370 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright 2009-2010 Red Hat, Inc, - * - * 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 3 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Written by: Matthias Clasen <mclasen@redhat.com> - */ - -#include "config.h" - -#include <stdlib.h> -#include <locale.h> - -#include <glib.h> -#include <glib/gi18n.h> -#include <gtk/gtk.h> - -#include <fontconfig/fontconfig.h> - -#include "um-language-dialog.h" -#include "um-user-manager.h" -#include "cc-common-language.h" - -#include "gdm-languages.h" - -gchar * -um_language_chooser_get_language (GtkWidget *chooser) -{ - GtkTreeView *tv; - GtkTreeSelection *selection; - GtkTreeModel *model; - GtkTreeIter iter; - gchar *lang; - - tv = (GtkTreeView *) g_object_get_data (G_OBJECT (chooser), "list"); - selection = gtk_tree_view_get_selection (tv); - if (gtk_tree_selection_get_selected (selection, &model, &iter)) - gtk_tree_model_get (model, &iter, LOCALE_COL, &lang, -1); - else - lang = NULL; - - return lang; -} - -void -um_language_chooser_clear_filter (GtkWidget *chooser) -{ - GtkEntry *entry; - - entry = (GtkEntry *) g_object_get_data (G_OBJECT (chooser), "filter-entry"); - gtk_entry_set_text (entry, ""); -} - -static void -row_activated (GtkTreeView *tree_view, - GtkTreePath *path, - GtkTreeViewColumn *column, - GtkWidget *chooser) -{ - gtk_dialog_response (GTK_DIALOG (chooser), GTK_RESPONSE_OK); -} - -static GHashTable * -new_ht_for_user_languages (void) -{ - GHashTable *ht; - UmUserManager *manager; - GSList *users, *l; - UmUser *user; - char *name; - - ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); - - /* Add some common languages here */ - g_hash_table_insert (ht, g_strdup ("en_US.utf8"), g_strdup (_("English"))); - g_hash_table_insert (ht, g_strdup ("de_DE.utf8"), g_strdup (_("German"))); - g_hash_table_insert (ht, g_strdup ("fr_FR.utf8"), g_strdup (_("French"))); - g_hash_table_insert (ht, g_strdup ("es_ES.utf8"), g_strdup (_("Spanish"))); - g_hash_table_insert (ht, g_strdup ("zh_CN.utf8"), g_strdup (_("Chinese"))); - - manager = um_user_manager_ref_default (); - users = um_user_manager_list_users (manager); - g_object_unref (manager); - - for (l = users; l; l = l->next) { - const char *lang; - char *language; - - user = l->data; - lang = um_user_get_language (user); - if (!lang || !cc_common_language_has_font (lang)) { - continue; - } - - name = gdm_normalize_language_name (lang); - if (g_hash_table_lookup (ht, name) != NULL) { - g_free (name); - continue; - } - - language = gdm_get_language_from_name (name, NULL); - - g_hash_table_insert (ht, name, language); - } - - g_slist_free (users); - - /* Make sure the current locale is present */ - name = cc_common_language_get_current_language (); - if (g_hash_table_lookup (ht, name) == NULL) { - char *language; - language = gdm_get_language_from_name (name, NULL); - g_hash_table_insert (ht, name, language); - } else { - g_free (name); - } - - return ht; -} - -static void -languages_foreach_cb (gpointer key, - gpointer value, - gpointer user_data) -{ - GtkListStore *store = (GtkListStore *) user_data; - const char *locale = (const char *) key; - const char *display_locale = (const char *) value; - GtkTreeIter iter; - - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, - LOCALE_COL, locale, - DISPLAY_LOCALE_COL, display_locale, - -1); -} - -void -um_add_user_languages (GtkTreeModel *model) -{ - char *name; - GtkTreeIter iter; - GtkListStore *store = GTK_LIST_STORE (model); - GHashTable *user_langs; - const char *display; - - gtk_list_store_clear (store); - - user_langs = new_ht_for_user_languages (); - - /* Add the current locale first */ - name = cc_common_language_get_current_language (); - display = g_hash_table_lookup (user_langs, name); - - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, LOCALE_COL, name, DISPLAY_LOCALE_COL, display, -1); - g_hash_table_remove (user_langs, name); - g_free (name); - - /* The rest of the languages */ - g_hash_table_foreach (user_langs, (GHFunc) languages_foreach_cb, store); - - /* And now the "Other..." selection */ - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, LOCALE_COL, NULL, DISPLAY_LOCALE_COL, _("Other..."), -1); - - g_hash_table_destroy (user_langs); -} - -static void -remove_timeout (gpointer data, - GObject *where_the_object_was) -{ - guint timeout = GPOINTER_TO_UINT (data); - g_source_remove (timeout); -} - -static void -remove_async (gpointer data) -{ - guint async_id = GPOINTER_TO_UINT (data); - - g_source_remove (async_id); -} - -static gboolean -finish_um_language_chooser (gpointer user_data) -{ - GtkWidget *chooser = (GtkWidget *) user_data; - GtkWidget *list; - GtkTreeModel *model; - GtkWindow *parent; - GHashTable *user_langs; - guint timeout; - guint async_id; - - /* Did we get called after the widget was destroyed? */ - if (chooser == NULL) - return FALSE; - - list = g_object_get_data (G_OBJECT (chooser), "list"); - model = gtk_tree_view_get_model (GTK_TREE_VIEW (list)); - model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model)); - user_langs = g_object_get_data (G_OBJECT (chooser), "user-langs"); - - async_id = cc_common_language_add_available_languages (GTK_LIST_STORE (model), user_langs); - g_object_set_data_full (G_OBJECT (chooser), "language-async", GUINT_TO_POINTER (async_id), remove_async); - - parent = gtk_window_get_transient_for (GTK_WINDOW (chooser)); - gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (parent)), NULL); - - g_object_set_data (G_OBJECT (chooser), "user-langs", NULL); - timeout = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (chooser), "timeout")); - g_object_weak_unref (G_OBJECT (chooser), (GWeakNotify) remove_timeout, GUINT_TO_POINTER (timeout)); - - /* And select the current language */ - cc_common_language_select_current_language (GTK_TREE_VIEW (list)); - - return FALSE; -} - -static void -filter_clear (GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, gpointer user_data) -{ - gtk_entry_set_text (entry, ""); -} - -static void -filter_changed (GtkWidget *entry, GParamSpec *pspec, GtkWidget *list) -{ - const gchar *pattern; - GtkTreeModel *filter_model; - GtkTreeModel *model; - - pattern = gtk_entry_get_text (GTK_ENTRY (entry)); - - filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (list)); - model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (filter_model)); - - if (g_strcmp0 (pattern, "") == 0) { - g_object_set (G_OBJECT (entry), - "secondary-icon-name", "edit-find-symbolic", - "secondary-icon-activatable", FALSE, - "secondary-icon-sensitive", FALSE, - NULL); - - g_object_set_data_full (G_OBJECT (model), "filter-string", - g_strdup (""), g_free); - - } else { - g_object_set (G_OBJECT (entry), - "secondary-icon-name", "edit-clear-symbolic", - "secondary-icon-activatable", TRUE, - "secondary-icon-sensitive", TRUE, - NULL); - - g_object_set_data_full (G_OBJECT (model), "filter-string", - g_utf8_casefold (pattern, -1), g_free); - } - - gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (filter_model)); -} - -static gboolean -filter_languages (GtkTreeModel *model, - GtkTreeIter *iter, - gpointer data) -{ - const gchar *filter_string; - gchar *locale, *l; - gboolean visible; - - filter_string = g_object_get_data (G_OBJECT (model), "filter-string"); - - if (filter_string == NULL) { - return TRUE; - } - - gtk_tree_model_get (model, iter, DISPLAY_LOCALE_COL, &locale, -1); - l = g_utf8_casefold (locale, -1); - - visible = strstr (l, filter_string) != NULL; - - g_free (locale); - g_free (l); - - return visible; -} - -GtkWidget * -um_language_chooser_new (GtkWidget *parent) -{ - GtkBuilder *builder; - const char *filename; - GError *error = NULL; - GtkWidget *chooser; - GtkWidget *list; - GtkWidget *button; - GtkWidget *entry; - GHashTable *user_langs; - GdkCursor *cursor; - guint timeout; - GtkTreeModel *model; - GtkTreeModel *filter_model; - - builder = gtk_builder_new (); - filename = UIDIR "/language-chooser.ui"; - if (!g_file_test (filename, G_FILE_TEST_EXISTS)) - filename = "data/language-chooser.ui"; - if (!gtk_builder_add_from_file (builder, filename, &error)) { - g_warning ("failed to load language chooser: %s", error->message); - g_error_free (error); - return NULL; - } - - chooser = (GtkWidget *) gtk_builder_get_object (builder, "dialog"); - - list = (GtkWidget *) gtk_builder_get_object (builder, "language-list"); - g_object_set_data (G_OBJECT (chooser), "list", list); - g_signal_connect (list, "row-activated", - G_CALLBACK (row_activated), chooser); - - button = (GtkWidget *) gtk_builder_get_object (builder, "ok-button"); - gtk_widget_grab_default (button); - - entry = (GtkWidget *) gtk_builder_get_object (builder, "filter-entry"); - g_object_set_data (G_OBJECT (chooser), "filter-entry", entry); - g_signal_connect (entry, "notify::text", - G_CALLBACK (filter_changed), list); - g_signal_connect (entry, "icon-release", - G_CALLBACK (filter_clear), NULL); - - /* Add user languages */ - user_langs = new_ht_for_user_languages (); - cc_common_language_setup_list (list, user_langs); - - model = gtk_tree_view_get_model (GTK_TREE_VIEW (list)); - filter_model = gtk_tree_model_filter_new (model, NULL); - gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (filter_model), filter_languages, - NULL, NULL); - gtk_tree_view_set_model (GTK_TREE_VIEW (list), filter_model); - - /* Setup so that the list is added after the dialogue is shown */ - cursor = gdk_cursor_new (GDK_WATCH); - gdk_window_set_cursor (gtk_widget_get_window (parent), cursor); - g_object_unref (cursor); - - g_object_set_data_full (G_OBJECT (chooser), "user-langs", - user_langs, (GDestroyNotify) g_hash_table_destroy); - timeout = g_idle_add ((GSourceFunc) finish_um_language_chooser, chooser); - g_object_set_data (G_OBJECT (chooser), "timeout", GUINT_TO_POINTER (timeout)); - g_object_weak_ref (G_OBJECT (chooser), (GWeakNotify) remove_timeout, GUINT_TO_POINTER (timeout)); - - g_object_unref (builder); - - return chooser; -} diff --git a/panels/user-accounts/um-language-dialog.h b/panels/user-accounts/um-language-dialog.h deleted file mode 100644 index 9b476e3c3..000000000 --- a/panels/user-accounts/um-language-dialog.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- - * - * Copyright 2009-2010 Red Hat, Inc, - * - * 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 3 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, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Written by: Matthias Clasen <mclasen@redhat.com> - */ - -#ifndef __UM_LANGUAGE_DIALOG_H__ -#define __UM_LANGUAGE_DIALOG_H__ - -#include <gtk/gtk.h> -#include "um-user.h" - -G_BEGIN_DECLS - -void um_add_user_languages (GtkTreeModel *model); - -GtkWidget *um_language_chooser_new (GtkWidget *parent); -void um_language_chooser_clear_filter (GtkWidget *chooser); -gchar *um_language_chooser_get_language (GtkWidget *chooser); - -G_END_DECLS - -#endif diff --git a/panels/user-accounts/um-user-panel.c b/panels/user-accounts/um-user-panel.c index 4510924b5..26efdcc5c 100644 --- a/panels/user-accounts/um-user-panel.c +++ b/panels/user-accounts/um-user-panel.c @@ -49,7 +49,7 @@ #include "um-editable-combo.h" #include "um-account-dialog.h" -#include "um-language-dialog.h" +#include "cc-language-chooser.h" #include "um-password-dialog.h" #include "um-photo-dialog.h" #include "um-fingerprint-dialog.h" @@ -582,7 +582,7 @@ show_user (UmUser *user, UmUserPanelPrivate *d) widget = get_widget (d, "account-language-combo"); model = um_editable_combo_get_model (UM_EDITABLE_COMBO (widget)); - um_add_user_languages (model); + cc_add_user_languages (model); lang = g_strdup (um_user_get_language (user)); if (!lang) @@ -673,7 +673,7 @@ language_response (GtkDialog *dialog, model = um_editable_combo_get_model (UM_EDITABLE_COMBO (combo)); if (response_id == GTK_RESPONSE_OK) { - lang = um_language_chooser_get_language (GTK_WIDGET (dialog)); + lang = cc_language_chooser_get_language (GTK_WIDGET (dialog)); um_user_set_language (user, lang); } else { @@ -714,15 +714,14 @@ language_changed (UmEditableCombo *combo, } if (d->language_chooser) { - um_language_chooser_clear_filter (d->language_chooser); + cc_language_chooser_clear_filter (d->language_chooser); gtk_window_present (GTK_WINDOW (d->language_chooser)); gtk_widget_set_sensitive (GTK_WIDGET (combo), FALSE); return; } - d->language_chooser = um_language_chooser_new (gtk_widget_get_toplevel (d->main_box)); - gtk_window_set_transient_for (GTK_WINDOW (d->language_chooser), - GTK_WINDOW (gtk_widget_get_toplevel (d->main_box))); + d->language_chooser = cc_language_chooser_new (gtk_widget_get_toplevel (d->main_box)); + g_signal_connect (d->language_chooser, "response", G_CALLBACK (language_response), d); g_signal_connect (d->language_chooser, "delete-event", |