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;