diff --git a/data/org.fedorahosted.eekboard.gschema.xml.in b/data/org.fedorahosted.eekboard.gschema.xml.in
index c09d9089..36ac2017 100644
--- a/data/org.fedorahosted.eekboard.gschema.xml.in
+++ b/data/org.fedorahosted.eekboard.gschema.xml.in
@@ -6,5 +6,15 @@
GUI toolkit used to render keyboard
The name of GUI toolkit (either 'gtk' or 'clutter') used to render keyboard on screen.
+
+ 'atspi'
+ Use the given focus listener
+ The name of the focus listener (either 'atspi' or 'ibus') used to detect focus events.
+
+
+ true
+ Hide keyboard automatically when focus is out
+ If true, hide keyboard automatically when focus is out.
+
diff --git a/src/client-main.c b/src/client-main.c
index e2bb3d12..7ee831a7 100644
--- a/src/client-main.c
+++ b/src/client-main.c
@@ -40,7 +40,6 @@ static gchar *opt_address = NULL;
static gboolean opt_use_system_layout = FALSE;
static gboolean opt_focus = FALSE;
-static gchar *opt_focus_listener = NULL;
static gboolean opt_keystroke = FALSE;
static gchar *opt_keyboard = NULL;
@@ -63,8 +62,6 @@ static const GOptionEntry options[] = {
#if ENABLE_FOCUS_LISTENER
{"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
N_("Listen focus change events")},
- {"focus-listener", '\0', 0, G_OPTION_ARG_STRING, &opt_focus_listener,
- N_("Use the given focus listener (\"atspi\" or \"ibus\")")},
#endif /* ENABLE_FOCUS_LISTENER */
#ifdef HAVE_ATSPI
{"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
@@ -189,14 +186,18 @@ main (int argc, char **argv)
focus = FOCUS_NONE;
if (opt_focus) {
- if (opt_focus_listener == NULL ||
- g_strcmp0 (opt_focus_listener, "atspi") == 0)
+ GSettings *settings = g_settings_new ("org.fedorahosted.eekboard");
+ gchar *focus_listener = g_settings_get_string (settings,
+ "focus-listener");
+ g_object_unref (settings);
+
+ if (g_strcmp0 (focus_listener, "atspi") == 0)
focus = FOCUS_ATSPI;
- else if (g_strcmp0 (opt_focus_listener, "ibus") == 0)
+ else if (g_strcmp0 (focus_listener, "ibus") == 0)
focus = FOCUS_IBUS;
else {
g_printerr ("Unknown focus listener \"%s\". "
- "Try \"atspi\" or \"ibus\"\n", opt_focus_listener);
+ "Try \"atspi\" or \"ibus\"\n", focus_listener);
exit (1);
}
}
@@ -204,8 +205,11 @@ main (int argc, char **argv)
#ifdef HAVE_ATSPI
if (focus == FOCUS_ATSPI || opt_keystroke) {
GSettings *settings = g_settings_new ("org.gnome.desktop.interface");
+ gboolean accessibility_enabled =
+ g_settings_get_boolean (settings, "toolkit-accessibility");
+ g_object_unref (settings);
- if (g_settings_get_boolean (settings, "toolkit-accessibility")) {
+ if (accessibility_enabled) {
if (atspi_init () != 0) {
g_printerr ("Can't init AT-SPI 2\n");
exit (1);
diff --git a/src/client.c b/src/client.c
index 98529110..5dde1674 100644
--- a/src/client.c
+++ b/src/client.c
@@ -74,9 +74,7 @@ struct _EekboardClient {
gulong key_pressed_handler;
gulong key_released_handler;
-#if ENABLE_FOCUS_LISTENER
gboolean follows_focus;
-#endif /* ENABLE_FOCUS_LISTENER */
#ifdef HAVE_ATSPI
AtspiAccessible *acc;
@@ -91,6 +89,8 @@ struct _EekboardClient {
#ifdef HAVE_XTEST
KeyCode modifier_keycodes[8];
#endif /* HAVE_XTEST */
+
+ GSettings *settings;
};
struct _EekboardClientClass {
@@ -169,9 +169,9 @@ eekboard_client_set_property (GObject *object,
static void
eekboard_client_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
EekboardClient *client = EEKBOARD_CLIENT(object);
@@ -238,6 +238,11 @@ eekboard_client_dispose (GObject *object)
client->display = NULL;
}
+ if (client->settings) {
+ g_object_unref (client->settings);
+ client->settings = NULL;
+ }
+
G_OBJECT_CLASS (eekboard_client_parent_class)->dispose (object);
}
@@ -302,6 +307,7 @@ eekboard_client_init (EekboardClient *client)
client->ibus_bus = NULL;
client->ibus_focus_message_filter = 0;
#endif /* HAVE_IBUS */
+ client->settings = g_settings_new ("org.fedorahosted.eekboard");
}
gboolean
@@ -519,7 +525,8 @@ focus_listener_cb (const AtspiEvent *event,
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
client->acc = accessible;
eekboard_context_show_keyboard (client->context, NULL);
- } else if (event->detail1 == 0 && accessible == client->acc) {
+ } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
+ event->detail1 == 0 && accessible == client->acc) {
client->acc = NULL;
eekboard_context_hide_keyboard (client->context, NULL);
}
@@ -528,7 +535,8 @@ focus_listener_cb (const AtspiEvent *event,
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
client->acc = accessible;
eekboard_context_show_keyboard (client->context, NULL);
- } else if (event->detail1 == 0) {
+ } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
+ event->detail1 == 0) {
client->acc = NULL;
eekboard_context_hide_keyboard (client->context, NULL);
}
@@ -606,6 +614,9 @@ focus_message_filter (GDBusConnection *connection,
if (g_strcmp0 (member, "FocusIn") == 0) {
eekboard_context_show_keyboard (client->context, NULL);
+ } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
+ g_strcmp0 (member, "FocusOut") == 0) {
+ eekboard_context_hide_keyboard (client->context, NULL);
}
}
@@ -624,6 +635,10 @@ eekboard_client_enable_ibus_focus (EekboardClient *client)
"type='method_call',"
"interface='" IBUS_INTERFACE_INPUT_CONTEXT "',"
"member='FocusIn'");
+ add_match_rule (connection,
+ "type='method_call',"
+ "interface='" IBUS_INTERFACE_INPUT_CONTEXT "',"
+ "member='FocusOut'");
client->ibus_focus_message_filter =
g_dbus_connection_add_filter (connection,
focus_message_filter,
diff --git a/src/server-context.c b/src/server-context.c
index a1a500b3..2871a0d0 100644
--- a/src/server-context.c
+++ b/src/server-context.c
@@ -34,6 +34,7 @@
#define CSW 640
#define CSH 480
+#define DEFAULT_THEME (THEMEDIR "/default.css")
enum {
PROP_0,
@@ -208,8 +209,6 @@ on_realize (GtkWidget *widget,
GDK_FUNC_CLOSE);
}
-#define DEFAULT_THEME (THEMEDIR "/default.css")
-
static void
set_geometry (ServerContext *context)
{