summaryrefslogtreecommitdiff
path: root/panels/user-accounts
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2011-08-20 02:17:06 -0400
committerMatthias Clasen <mclasen@redhat.com>2011-08-22 14:29:52 -0400
commit60c8f11a122d88d215a1d479f3cf9923096ccad9 (patch)
treefa45ac56def97742cc9968492adf79eb57c5b58d /panels/user-accounts
parentdaf2dae1ff1ab9a39d650f04de089edd53a70fc2 (diff)
downloadgnome-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.am2
-rw-r--r--panels/user-accounts/data/Makefile.am1
-rw-r--r--panels/user-accounts/data/language-chooser.ui113
-rw-r--r--panels/user-accounts/um-language-dialog.c370
-rw-r--r--panels/user-accounts/um-language-dialog.h38
-rw-r--r--panels/user-accounts/um-user-panel.c13
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",