diff -pruN imsettings-1.6.3.orig/data/imsettings-functions.in imsettings-1.6.3/data/imsettings-functions.in
--- imsettings-1.6.3.orig/data/imsettings-functions.in 2019-02-22 08:34:48.223926116 +0000
+++ imsettings-1.6.3/data/imsettings-functions.in 2019-02-22 08:52:07.854839883 +0000
@@ -169,6 +169,11 @@ function is_xim_supported() {
return 1
}
+function is_desktop_supported() {
+ @libexecdir[@]/imsettings-target-checker.sh >/dev/null
+ [ $? -eq 0 ]
+}
+
function setup_gtk_immodule() {
if is_imsettings_enabled && is_gtk_supported; then
# Ensure GTK_IM_MODULE is empty. otherwise GTK+ doesn't pick up immodule through XSETTINGS
diff -pruN imsettings-1.6.3.orig/data/xinput.sh.in.in imsettings-1.6.3/data/xinput.sh.in.in
--- imsettings-1.6.3.orig/data/xinput.sh.in.in 2019-02-22 08:34:48.236926116 +0000
+++ imsettings-1.6.3/data/xinput.sh.in.in 2019-02-22 08:49:06.690865058 +0000
@@ -39,6 +39,11 @@ tmplang=${LC_CTYPE:-${LANG:-"en_US.UTF-8
unset AUXILIARY_PROGRAM AUXILIARY_ARGS GTK_IM_MODULE ICON IMSETTINGS_IGNORE_ME LONG_DESC NOT_RUN PREFERENCE_PROGRAM PREFERENCE_ARGS QT_IM_MODULE SHORT_DESC XIM XIM_PROGRAM XIM_ARGS XMODIFIERS
[ -z "${IMSETTINGS_DISABLE_USER_XINPUTRC-}" ] && IMSETTINGS_DISABLE_USER_XINPUTRC=no
+[ -z "${IMSETTINGS_DISABLE_SYS_XINPUTRC-}" ] && IMSETTINGS_DISABLE_SYS_XINPUTRC=no
+
+if ! is_desktop_supported; then
+ IMSETTINGS_DISABLE_SYS_XINPUTRC=yes
+fi
# migrate old configuration file
[ ! -d $CONFIGDIR ] && mkdir -p $CONFIGDIR || :
@@ -51,7 +56,7 @@ if [ -r "$USER_XINPUTRC" -a "x$IMSETTING
if [ ! -h "$USER_XINPUTRC" ]; then
SHORT_DESC="User Specific"
fi
-elif [ -r "$SYS_XINPUTRC" ]; then
+elif [ -r "$SYS_XINPUTRC" -a "x$IMSETTINGS_DISABLE_SYS_XINPUTRC" = "xno" ]; then
# FIXME: This hardcoded list has to be gone in the future.
# Locales that normally use input-method for native input
_im_language_list="as bn gu hi ja kn ko mai ml mr ne or pa si ta te th ur vi zh"
@@ -87,7 +92,7 @@ fi
[ -z "${IMSETTINGS_INTEGRATE_DESKTOP-}" ] && IMSETTINGS_INTEGRATE_DESKTOP=yes
export IMSETTINGS_INTEGRATE_DESKTOP
-[ -z "$XIM" ] && XIM=none
+[ -z "$XIM" -a "x$IMSETTINGS_DISABLE_SYS_XINPUTRC" = "xno" ] && XIM=none
# start IM via imsettings
IMSETTINGS_MODULE=${SHORT_DESC:-${XIM}}
diff -pruN imsettings-1.6.3.orig/data/xinputinfo.sh.in imsettings-1.6.3/data/xinputinfo.sh.in
--- imsettings-1.6.3.orig/data/xinputinfo.sh.in 2019-02-22 08:34:48.236926116 +0000
+++ imsettings-1.6.3/data/xinputinfo.sh.in 2019-02-22 08:53:17.758832692 +0000
@@ -57,11 +57,12 @@ if [ $# -gt 0 ]; then
IMSETTINGS_FILENAME=$1
else
[ -z "${IMSETTINGS_DISABLE_USER_XINPUTRC-}" ] && IMSETTINGS_DISABLE_USER_XINPUTRC=no
+ [ -z "${IMSETTINGS_DISABLE_SYS_XINPUTRC-}" ] && IMSETTINGS_DISABLE_SYS_XINPUTRC=no
if [ -r "$USER_XINPUTRC" -a "x$IMSETTINGS_DISABLE_USER_XINPUTRC" = "xno" ]; then
source "$USER_XINPUTRC"
IMSETTINGS_FILENAME=$USER_XINPUTRC
- elif [ -r "$SYS_XINPUTRC" ]; then
+ elif [ -r "$SYS_XINPUTRC" -a "x$IMSETTINGS_DISABLE_SYS_XINPUTRC" = "xno" ]; then
source "$SYS_XINPUTRC"
IMSETTINGS_FILENAME=$SYS_XINPUTRC
fi
diff -pruN imsettings-1.6.3.orig/imsettings/imsettings-client.c imsettings-1.6.3/imsettings/imsettings-client.c
--- imsettings-1.6.3.orig/imsettings/imsettings-client.c 2013-01-18 03:25:38.000000000 +0000
+++ imsettings-1.6.3/imsettings/imsettings-client.c 2019-02-22 11:20:19.756465170 +0000
@@ -1372,3 +1372,106 @@ imsettings_client_ping(IMSettingsClient
return FALSE;
}
+
+/**
+ * imsettings_client_is_supported_desktop:
+ * @client: a #IMSettingsClient.
+ * @cancellable: (allow-none): a #GCancellable or %NULL.
+ * @error: (allow-none): a #GError to store an error if any, or %NULL.
+ *
+ * Check if current desktop is supported by IMSettings or not.
+ *
+ * You could access through DBus API instead:
+ *
+ * |[
+ * <interface name='com.redhat.imsettings'>
+ * <method name='IsSupportedDesktop'>
+ * <arg type='s' name='desktop' direction='in' />
+ * <arg type='b' name='ret' direction'out' />
+ * </method>
+ * </interface>
+ * ]|
+ *
+ * Returns: if supported, returns %TRUE otherwise %FALSE.
+ */
+gboolean
+imsettings_client_is_supported_desktop(IMSettingsClient *client,
+ GCancellable *cancellable,
+ GError **error)
+{
+ const gchar *desktop;
+ GDBusProxy *proxy;
+ GVariant *value;
+ gboolean retval = FALSE;
+
+ g_return_val_if_fail (IMSETTINGS_IS_CLIENT (client), FALSE);
+
+ desktop = NULL;
+ proxy = imsettings_client_get_proxy(client);
+ value = g_dbus_proxy_call_sync(proxy,
+ "IsSupportedDesktop",
+ g_variant_new("(s)",
+ desktop ? desktop : ""),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ error);
+ if (value) {
+ g_variant_get(value, "(b)", &retval);
+ g_variant_unref(value);
+ }
+
+ return retval;
+}
+
+/**
+ * imsettings_client_is_supported_desktop_start:
+ * @client: a #IMSettingsClient.
+ * @cancellable: (allow-none): a #GCancellable or %NULL.
+ * @callback: (scope async): a #GAsyncReadyCallback.
+ * @user_data: (closure): a pointer of the user data to give it to @callback.
+ *
+ * Request asking if current desktop is supported or not asynchronously
+ */
+void
+imsettings_client_is_supported_desktop_start(IMSettingsClient *client,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GDBusProxy *proxy;
+ const gchar *desktop;
+
+ g_return_if_fail (IMSETTINGS_IS_CLIENT (client));
+
+ desktop = NULL;
+ proxy = imsettings_client_get_proxy(client);
+ g_dbus_proxy_call(proxy,
+ "IsSupportedDesktop",
+ g_variant_new("(s)", desktop ? desktop : ""),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ callback,
+ user_data);
+}
+
+/**
+ * imsettings_client_is_supported_desktop_finish:
+ * @client: a #IMSettingsClient.
+ * @result: a #GAsyncResult pushed through #GAsyncReadyCallback.
+ * @error: (allow-none): a #GError to store an error if any, or %NULL.
+ *
+ * Obtains the result of the request from
+ * imsettings_client_is_supported_desktop_start().
+ *
+ * Returns: if the operation is successfully done, returns %TRUE
+ * otherwise %FALSE
+ */
+gboolean
+imsettings_client_is_supported_desktop_finish(IMSettingsClient *client,
+ GAsyncResult *result,
+ GError **error)
+{
+ return imsettings_client_async_result_boolean(client, result, error);
+}
diff -pruN imsettings-1.6.3.orig/imsettings/imsettings-client.h imsettings-1.6.3/imsettings/imsettings-client.h
--- imsettings-1.6.3.orig/imsettings/imsettings-client.h 2012-12-13 08:36:42.000000000 +0000
+++ imsettings-1.6.3/imsettings/imsettings-client.h 2019-02-22 11:16:30.576563361 +0000
@@ -117,6 +117,9 @@ gboolean imsettings_client_im_is_
const gchar *module,
GCancellable *cancellable,
GError **error);
+gboolean imsettings_client_is_supported_desktop(IMSettingsClient *client,
+ GCancellable *cancellable,
+ GError **error);
gboolean imsettings_client_switch_im (IMSettingsClient *client,
const gchar *module,
gboolean update_xinputrc,
@@ -161,6 +164,13 @@ void imsettings_client_get_system_i
gchar *imsettings_client_get_system_im_finish (IMSettingsClient *client,
GAsyncResult *result,
GError **error);
+void imsettings_client_is_supported_desktop_start(IMSettingsClient *client,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean imsettings_client_is_supported_desktop_finish(IMSettingsClient *client,
+ GAsyncResult *result,
+ GError **error);
void imsettings_client_switch_im_start (IMSettingsClient *client,
const gchar *module,
gboolean update_xinputrc,
diff -pruN imsettings-1.6.3.orig/imsettings/imsettings-utils.c imsettings-1.6.3/imsettings/imsettings-utils.c
--- imsettings-1.6.3.orig/imsettings/imsettings-utils.c 2012-12-13 08:36:42.000000000 +0000
+++ imsettings-1.6.3/imsettings/imsettings-utils.c 2019-02-22 11:17:26.029541189 +0000
@@ -85,6 +85,10 @@ static const gchar introspection_xml[] =
" "
" "
" "
+ " "
+ " "
+ " "
+ " "
" "
" "
" "
diff -pruN imsettings-1.6.3.orig/imsettings/imsettings.h imsettings-1.6.3/imsettings/imsettings.h
--- imsettings-1.6.3.orig/imsettings/imsettings.h 2012-12-13 08:36:42.000000000 +0000
+++ imsettings-1.6.3/imsettings/imsettings.h 2019-02-22 11:17:45.845532854 +0000
@@ -78,7 +78,7 @@ G_BEGIN_DECLS
*
* A DBus API version in imsettings.
*/
-#define IMSETTINGS_SETTINGS_API_VERSION 5
+#define IMSETTINGS_SETTINGS_API_VERSION 6
/**
* IMSETTINGS_GLOBAL_XINPUT_CONF:
diff -pruN imsettings-1.6.3.orig/imsettings-daemon/imsettings-server.c imsettings-1.6.3/imsettings-daemon/imsettings-server.c
--- imsettings-1.6.3.orig/imsettings-daemon/imsettings-server.c 2019-02-22 08:34:48.233926116 +0000
+++ imsettings-1.6.3/imsettings-daemon/imsettings-server.c 2019-02-22 11:12:54.983660142 +0000
@@ -685,6 +685,67 @@ imsettings_server_cb_get_info_variant(IM
return value;
}
+static gchar *
+_escape_desktop_name(const gchar *name)
+{
+ if (name) {
+ size_t l, len = strlen(name);
+ GString *ss = g_string_new(NULL);
+
+ for (l = 0; l < len; l++) {
+ if ((name[l] >= 'A' && name[l] <= 'Z') ||
+ (name[l] >= 'a' && name[l] <= 'z') ||
+ (name[l] >= '0' && name[l] <= '9') ||
+ name[l] == '-' || name[l] == '+' || name[l] == '_' || name[l] == '.' || name[l] == ',')
+ g_string_append_c(ss, name[l]);
+ else
+ g_string_append_c(ss, '_');
+ }
+ return g_string_free(ss, FALSE);
+ }
+
+ return NULL;
+}
+
+static gboolean
+imsettings_server_cb_is_supported_desktop(IMSettingsServer *server,
+ const gchar *desktop)
+{
+ const gchar *pp;
+ gchar *helper_path, *script, *quoted_desktop = NULL;
+ gchar *cmd;
+ gint ret;
+ gboolean match = FALSE;
+ GError *err = NULL;
+
+ quoted_desktop = _escape_desktop_name(desktop);
+ pp = g_getenv("IMSETTINGS_HELPER_PATH");
+ if (pp)
+ helper_path = g_strdup(pp);
+ else
+ helper_path = g_strdup(IMSETTINGS_HELPER_PATH);
+ script = g_build_filename(helper_path, "imsettings-target-checker.sh", NULL);
+ if (desktop)
+ cmd = g_strdup_printf("sh -c 'export XDG_CURRENT_DESKTOP=%s; sh %s'", quoted_desktop ? quoted_desktop : "", script);
+ else
+ cmd = g_strdup_printf("sh -c %s", script);
+ g_free(script);
+ g_free(helper_path);
+
+ if (g_spawn_command_line_sync(cmd, NULL, NULL, &ret, &err))
+ match = TRUE;
+ if (!g_spawn_check_exit_status(ret, &err))
+ match = FALSE;
+ if (err) {
+ g_warning("%s", err->message);
+ g_error_free(err);
+ }
+ g_free(cmd);
+ g_free(quoted_desktop);
+
+ return !match;
+}
+
static gboolean
imsettings_server_cb_switch_im(IMSettingsServer *server,
const gchar *lang,
@@ -699,11 +760,6 @@ imsettings_server_cb_switch_im(IMSetting
const gchar *homedir, *xinputfile;
struct stat st;
gint save_errno;
- const gchar *pp;
- gchar *helper_path, *script;
- gboolean match = FALSE;
- gchar *cmd;
- gint ret;
g_log(G_LOG_DOMAIN, G_LOG_LEVEL_INFO,
"Attempting to switch IM to %s [lang=%s, update=%s]",
@@ -737,24 +793,7 @@ imsettings_server_cb_switch_im(IMSetting
return FALSE;
}
- pp = g_getenv("IMSETTINGS_HELPER_PATH");
- if (pp)
- helper_path = g_strdup(pp);
- else
- helper_path = g_strdup(IMSETTINGS_HELPER_PATH);
- script = g_build_filename(helper_path, "imsettings-target-checker.sh", NULL);
- cmd = g_strdup_printf("sh %s", script);
- g_free(script);
- g_free(helper_path);
-
- if (g_spawn_command_line_sync(cmd, NULL, NULL, &ret, error))
- match = TRUE;
- if (!g_spawn_check_exit_status(ret, error))
- match = FALSE;
- g_free(cmd);
- if (*error) {
- g_clear_error(error);
- } else if (match) {
+ if (!imsettings_server_cb_is_supported_desktop(server, NULL)) {
g_set_error(error, IMSETTINGS_GERROR, IMSETTINGS_GERROR_NOT_TARGETED_DESKTOP,
_("Current desktop isn't targeted by IMSettings."));
g_warning("%s", (*error)->message);
@@ -1208,6 +1247,14 @@ imsettings_server_bus_method_call(GDBusC
IMSETTINGS_GERROR_CONFIGURATION_ERROR,
"No modules loaded");
}
+ } else if (g_strcmp0(method_name, "IsSupportedDesktop") == 0) {
+ const gchar *desktop;
+ gboolean ret;
+
+ g_variant_get(parameters, "(&s)",
+ &desktop);
+ ret = imsettings_server_cb_is_supported_desktop(server, desktop);
+ value = g_variant_new_boolean(ret);
}
finalize:
/* GVariant uses a floating reference count system.
diff -pruN imsettings-1.6.3.orig/utils/imsettings-switch.c imsettings-1.6.3/utils/imsettings-switch.c
--- imsettings-1.6.3.orig/utils/imsettings-switch.c 2013-05-27 03:39:15.000000000 +0000
+++ imsettings-1.6.3/utils/imsettings-switch.c 2019-02-22 11:18:25.882515247 +0000
@@ -102,6 +102,11 @@ main(int argc,
retval = 1;
goto end;
}
+ if (!imsettings_client_is_supported_desktop(client, NULL, &error)) {
+ g_printerr(_("Current desktop isn't supported by IMSettings. Please follow instructions on your desktop to enable Input Method.\n"));
+ retval = 1;
+ goto end;
+ }
v = imsettings_client_get_module_settings(client, NULL, &error);
if (error)
goto error;