* New patch, 095_gtk-im-module-setting, adds XSETTINGS support for immodule;
from GNOME 502446.
This commit is contained in:
2
debian/changelog
vendored
2
debian/changelog
vendored
@ -11,6 +11,8 @@ gtk+2.0 (2.12.6-1) unstable; urgency=low
|
||||
- New patch, 094_directfb-deprecation-fixes, fixes directfb build with
|
||||
GLib 2.15 deprecation of G_GNUC_FUNCTION in favor of G_STRLOC.
|
||||
* Fix ordering in series.
|
||||
* New patch, 095_gtk-im-module-setting, adds XSETTINGS support for immodule;
|
||||
from GNOME 502446.
|
||||
|
||||
-- Loic Minier <lool@dooz.org> Mon, 21 Jan 2008 18:42:28 +0100
|
||||
|
||||
|
353
debian/patches/095_gtk-im-module-setting.patch
vendored
Normal file
353
debian/patches/095_gtk-im-module-setting.patch
vendored
Normal file
@ -0,0 +1,353 @@
|
||||
GNOME 502446; Adds XSETTINGS support for immodule
|
||||
|
||||
--- a/gdk/x11/gdksettings.c 2008-01-29 04:36:31.000000000 +0100
|
||||
+++ b/gdk/x11/gdksettings.c 2008-01-29 21:14:07.000000000 +0100
|
||||
@@ -65,7 +65,8 @@
|
||||
"Xft/RGBA\0" "gtk-xft-rgba\0"
|
||||
"Xft/DPI\0" "gtk-xft-dpi\0"
|
||||
"Net/FallbackIconTheme\0" "gtk-fallback-icon-theme\0"
|
||||
- "Gtk/TouchscreenMode\0" "gtk-touchscreen-mode\0";
|
||||
+ "Gtk/TouchscreenMode\0" "gtk-touchscreen-mode\0"
|
||||
+ "Gtk/IMModule\0" "gtk-im-module\0";
|
||||
|
||||
static const struct
|
||||
{
|
||||
@@ -107,5 +108,6 @@
|
||||
{ 1197, 1206 },
|
||||
{ 1219, 1227 },
|
||||
{ 1239, 1261 },
|
||||
- { 1285, 1305 }
|
||||
+ { 1285, 1305 },
|
||||
+ { 1460, 1473 }
|
||||
};
|
||||
--- a/gtk/gtkimmulticontext.c 2008-01-29 04:35:46.000000000 +0100
|
||||
+++ b/gtk/gtkimmulticontext.c 2008-01-29 21:13:12.000000000 +0100
|
||||
@@ -85,6 +85,7 @@
|
||||
gint n_chars,
|
||||
GtkIMMulticontext *multicontext);
|
||||
|
||||
+static const gchar *user_context_id = NULL;
|
||||
static const gchar *global_context_id = NULL;
|
||||
|
||||
G_DEFINE_TYPE (GtkIMMulticontext, gtk_im_multicontext, GTK_TYPE_IM_CONTEXT)
|
||||
@@ -141,6 +142,7 @@
|
||||
GtkIMMulticontext *multicontext = GTK_IM_MULTICONTEXT (object);
|
||||
|
||||
gtk_im_multicontext_set_slave (multicontext, NULL, TRUE);
|
||||
+ g_free (multicontext->context_id);
|
||||
|
||||
G_OBJECT_CLASS (gtk_im_multicontext_parent_class)->finalize (object);
|
||||
}
|
||||
@@ -224,35 +226,68 @@
|
||||
{
|
||||
GtkIMContext *slave;
|
||||
|
||||
- if (!global_context_id)
|
||||
- {
|
||||
- gchar *locale = _gtk_get_lc_ctype ();
|
||||
- global_context_id = _gtk_im_module_get_default_context_id (locale);
|
||||
- g_free (locale);
|
||||
- }
|
||||
-
|
||||
+ if (!global_context_id)
|
||||
+ {
|
||||
+ if (user_context_id)
|
||||
+ global_context_id = user_context_id;
|
||||
+ else
|
||||
+ global_context_id = _gtk_im_module_get_default_context_id (multicontext->priv->client_window);
|
||||
+ }
|
||||
slave = _gtk_im_module_create (global_context_id);
|
||||
gtk_im_multicontext_set_slave (multicontext, slave, FALSE);
|
||||
g_object_unref (slave);
|
||||
|
||||
- multicontext->context_id = global_context_id;
|
||||
+ multicontext->context_id = g_strdup (global_context_id);
|
||||
}
|
||||
|
||||
return multicontext->slave;
|
||||
}
|
||||
|
||||
static void
|
||||
+im_module_setting_changed (GtkSettings *settings,
|
||||
+ gpointer data)
|
||||
+{
|
||||
+ global_context_id = NULL;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void
|
||||
gtk_im_multicontext_set_client_window (GtkIMContext *context,
|
||||
GdkWindow *window)
|
||||
{
|
||||
GtkIMMulticontext *multicontext = GTK_IM_MULTICONTEXT (context);
|
||||
-
|
||||
- GtkIMContext *slave = gtk_im_multicontext_get_slave (multicontext);
|
||||
+ GtkIMContext *slave;
|
||||
+ GdkScreen *screen;
|
||||
+ GtkSettings *settings;
|
||||
+ gboolean connected;
|
||||
|
||||
multicontext->priv->client_window = window;
|
||||
-
|
||||
+
|
||||
+ slave = gtk_im_multicontext_get_slave (multicontext);
|
||||
+
|
||||
if (slave)
|
||||
gtk_im_context_set_client_window (slave, window);
|
||||
+
|
||||
+ if (window == NULL)
|
||||
+ return;
|
||||
+
|
||||
+ screen = gdk_drawable_get_screen (GDK_DRAWABLE (window));
|
||||
+ if (screen)
|
||||
+ settings = gtk_settings_get_for_screen (screen);
|
||||
+ else
|
||||
+ settings = gtk_settings_get_default ();
|
||||
+
|
||||
+ connected = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (settings),
|
||||
+ "gtk-im-module-connected"));
|
||||
+ if (!connected)
|
||||
+ {
|
||||
+ g_signal_connect (settings, "notify::gtk-im-module",
|
||||
+ G_CALLBACK (im_module_setting_changed), NULL);
|
||||
+ g_object_set_data (G_OBJECT (settings), "gtk-im-module-connected",
|
||||
+ GINT_TO_POINTER (TRUE));
|
||||
+
|
||||
+ global_context_id = NULL;
|
||||
+ }
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -298,7 +333,8 @@
|
||||
* using before, get rid of the old slave and create a new one
|
||||
* for the new global context type.
|
||||
*/
|
||||
- if (!multicontext->context_id ||
|
||||
+ if (multicontext->context_id == NULL ||
|
||||
+ global_context_id == NULL ||
|
||||
strcmp (global_context_id, multicontext->context_id) != 0)
|
||||
gtk_im_multicontext_set_slave (multicontext, NULL, FALSE);
|
||||
|
||||
@@ -459,7 +495,8 @@
|
||||
|
||||
gtk_im_context_reset (GTK_IM_CONTEXT (context));
|
||||
|
||||
- global_context_id = id;
|
||||
+ user_context_id = id;
|
||||
+ global_context_id = NULL;
|
||||
gtk_im_multicontext_set_slave (context, NULL, FALSE);
|
||||
}
|
||||
}
|
||||
@@ -500,12 +537,22 @@
|
||||
const GtkIMContextInfo **contexts;
|
||||
guint n_contexts, i;
|
||||
GSList *group = NULL;
|
||||
+ GtkWidget *menuitem;
|
||||
|
||||
+ menuitem = gtk_radio_menu_item_new_with_label (group, Q_("input method menu|System"));
|
||||
+ if (!user_context_id)
|
||||
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
|
||||
+ group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
|
||||
+ g_object_set_data (G_OBJECT (menuitem), I_("gtk-context-id"), NULL);
|
||||
+ g_signal_connect (menuitem, "activate", G_CALLBACK (activate_cb), context);
|
||||
+
|
||||
+ gtk_widget_show (menuitem);
|
||||
+ gtk_menu_shell_append (menushell, menuitem);
|
||||
+
|
||||
_gtk_im_module_list (&contexts, &n_contexts);
|
||||
|
||||
- for (i=0; i < n_contexts; i++)
|
||||
+ for (i = 0; i < n_contexts; i++)
|
||||
{
|
||||
- GtkWidget *menuitem;
|
||||
const gchar *translated_name;
|
||||
#ifdef ENABLE_NLS
|
||||
if (contexts[i]->domain && contexts[i]->domain[0])
|
||||
@@ -562,11 +609,9 @@
|
||||
menuitem = gtk_radio_menu_item_new_with_label (group,
|
||||
translated_name);
|
||||
|
||||
- if ((global_context_id == NULL && group == NULL) ||
|
||||
- (global_context_id &&
|
||||
- strcmp (contexts[i]->context_id, global_context_id) == 0))
|
||||
- gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem),
|
||||
- TRUE);
|
||||
+ if ((user_context_id &&
|
||||
+ strcmp (contexts[i]->context_id, user_context_id) == 0))
|
||||
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE);
|
||||
|
||||
group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (menuitem));
|
||||
|
||||
--- a/gtk/gtkimmulticontext.h 2008-01-29 04:35:46.000000000 +0100
|
||||
+++ b/gtk/gtkimmulticontext.h 2008-01-29 21:13:12.000000000 +0100
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
GtkIMMulticontextPrivate *priv;
|
||||
|
||||
- const gchar *context_id;
|
||||
+ gchar *context_id;
|
||||
};
|
||||
|
||||
struct _GtkIMMulticontextClass
|
||||
--- a/gtk/gtksettings.c 2008-01-29 21:11:57.000000000 +0100
|
||||
+++ b/gtk/gtksettings.c 2008-01-29 21:13:12.000000000 +0100
|
||||
@@ -106,7 +106,8 @@
|
||||
PROP_PRINT_PREVIEW_COMMAND,
|
||||
PROP_ENABLE_MNEMONICS,
|
||||
PROP_ENABLE_ACCELS,
|
||||
- PROP_RECENT_FILES_LIMIT
|
||||
+ PROP_RECENT_FILES_LIMIT,
|
||||
+ PROP_IM_MODULE
|
||||
};
|
||||
|
||||
|
||||
@@ -805,6 +806,20 @@
|
||||
GTK_PARAM_READWRITE),
|
||||
NULL);
|
||||
g_assert (result == PROP_RECENT_FILES_LIMIT);
|
||||
+
|
||||
+ /**
|
||||
+ * GtkSettings:gtk-im-module:
|
||||
+ *
|
||||
+ * Which IM module should be used by default.
|
||||
+ */
|
||||
+ result = settings_install_property_parser (class,
|
||||
+ g_param_spec_string ("gtk-im-module",
|
||||
+ P_("Default IM module"),
|
||||
+ P_("Which IM module should be used by default"),
|
||||
+ NULL,
|
||||
+ GTK_PARAM_READWRITE),
|
||||
+ NULL);
|
||||
+ g_assert (result == PROP_IM_MODULE);
|
||||
}
|
||||
|
||||
static void
|
||||
--- a/gtk/gtkimmodule.c 2008-01-29 21:11:57.000000000 +0100
|
||||
+++ b/gtk/gtkimmodule.c 2008-01-29 21:13:12.000000000 +0100
|
||||
@@ -37,6 +37,8 @@
|
||||
#include <pango/pango-utils.h>
|
||||
#include "gtkimmodule.h"
|
||||
#include "gtkimcontextsimple.h"
|
||||
+#include "gtksettings.h"
|
||||
+#include "gtkmain.h"
|
||||
#include "gtkrc.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkalias.h"
|
||||
@@ -471,7 +473,7 @@
|
||||
#endif
|
||||
GtkIMContextInfo simple_context_info = {
|
||||
SIMPLE_ID,
|
||||
- N_("Default"),
|
||||
+ N_("Simple"),
|
||||
GETTEXT_PACKAGE,
|
||||
#ifdef GTK_LOCALEDIR
|
||||
GTK_LOCALEDIR,
|
||||
@@ -599,17 +601,15 @@
|
||||
|
||||
/**
|
||||
* _gtk_im_module_get_default_context_id:
|
||||
- * @locale: a locale id in the form 'en_US'
|
||||
+ * @client_window: a window
|
||||
*
|
||||
- * Return the context_id of the best IM context type
|
||||
- * for the given locale ID.
|
||||
+ * Return the context_id of the best IM context type
|
||||
+ * for the given window.
|
||||
*
|
||||
* Return value: the context ID (will never be %NULL)
|
||||
- * the value is newly allocated and must be freed
|
||||
- * with g_free().
|
||||
**/
|
||||
const gchar *
|
||||
-_gtk_im_module_get_default_context_id (const gchar *locale)
|
||||
+_gtk_im_module_get_default_context_id (GdkWindow *client_window)
|
||||
{
|
||||
GSList *tmp_list;
|
||||
const gchar *context_id = NULL;
|
||||
@@ -617,6 +617,8 @@
|
||||
gint i;
|
||||
gchar *tmp_locale, *tmp;
|
||||
const gchar *envvar;
|
||||
+ GdkScreen *screen;
|
||||
+ GtkSettings *settings;
|
||||
|
||||
if (!contexts_hash)
|
||||
gtk_im_module_initialize ();
|
||||
@@ -624,12 +626,41 @@
|
||||
envvar = g_getenv ("GTK_IM_MODULE");
|
||||
if (envvar &&
|
||||
(strcmp (envvar, SIMPLE_ID) == 0 ||
|
||||
- g_hash_table_lookup (contexts_hash, envvar)))
|
||||
- return g_strdup (envvar);
|
||||
+ g_hash_table_lookup (contexts_hash, envvar)))
|
||||
+ return envvar;
|
||||
+
|
||||
+ /* Check if the certain immodule is set in XSETTINGS.
|
||||
+ */
|
||||
+ if (client_window != NULL && GDK_IS_DRAWABLE (client_window))
|
||||
+ {
|
||||
+ screen = gdk_drawable_get_screen (GDK_DRAWABLE (client_window));
|
||||
+ if (screen)
|
||||
+ settings = gtk_settings_get_for_screen (screen);
|
||||
+ else
|
||||
+ settings = gtk_settings_get_default ();
|
||||
+
|
||||
+ g_object_get (G_OBJECT (settings), "gtk-im-module", &tmp, NULL);
|
||||
+ if (tmp)
|
||||
+ {
|
||||
+ if (strcmp (tmp, SIMPLE_ID) == 0)
|
||||
+ context_id = SIMPLE_ID;
|
||||
+ else
|
||||
+ {
|
||||
+ GtkIMModule *module;
|
||||
+ module = g_hash_table_lookup (contexts_hash, tmp);
|
||||
+ if (module)
|
||||
+ context_id = module->contexts[0]->context_id;
|
||||
+ }
|
||||
+ g_free (tmp);
|
||||
+
|
||||
+ if (context_id)
|
||||
+ return context_id;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
/* Strip the locale code down to the essentials
|
||||
*/
|
||||
- tmp_locale = g_strdup (locale);
|
||||
+ tmp_locale = _gtk_get_lc_ctype ();
|
||||
tmp = strchr (tmp_locale, '.');
|
||||
if (tmp)
|
||||
*tmp = '\0';
|
||||
@@ -642,7 +673,7 @@
|
||||
{
|
||||
GtkIMModule *module = tmp_list->data;
|
||||
|
||||
- for (i=0; i<module->n_contexts; i++)
|
||||
+ for (i = 0; i < module->n_contexts; i++)
|
||||
{
|
||||
const gchar *p = module->contexts[i]->default_locales;
|
||||
while (p)
|
||||
@@ -665,5 +696,5 @@
|
||||
|
||||
g_free (tmp_locale);
|
||||
|
||||
- return g_strdup (context_id ? context_id : SIMPLE_ID);
|
||||
+ return context_id ? context_id : SIMPLE_ID;
|
||||
}
|
||||
--- a/gtk/gtkimmodule.h 2008-01-29 04:35:47.000000000 +0100
|
||||
+++ b/gtk/gtkimmodule.h 2008-01-29 21:13:12.000000000 +0100
|
||||
@@ -38,10 +38,10 @@
|
||||
|
||||
/* Functions for use within GTK+
|
||||
*/
|
||||
-void _gtk_im_module_list (const GtkIMContextInfo ***contexts,
|
||||
- guint *n_contexts);
|
||||
-GtkIMContext *_gtk_im_module_create (const gchar *context_id);
|
||||
-const gchar * _gtk_im_module_get_default_context_id (const gchar *lang);
|
||||
+void _gtk_im_module_list (const GtkIMContextInfo ***contexts,
|
||||
+ guint *n_contexts);
|
||||
+GtkIMContext * _gtk_im_module_create (const gchar *context_id);
|
||||
+const gchar * _gtk_im_module_get_default_context_id (GdkWindow *client_window);
|
||||
|
||||
/* The following entry points are exported by each input method module
|
||||
*/
|
1
debian/patches/series
vendored
1
debian/patches/series
vendored
@ -23,3 +23,4 @@
|
||||
092_recentfiles-recursion-fix.patch
|
||||
093_directfb-type-changes.patch
|
||||
094_directfb-deprecation-fixes.patch
|
||||
095_gtk-im-module-setting.patch
|
||||
|
Reference in New Issue
Block a user