Separate --listen-focus/--listen-keystroke option of eekboard-system-client.

This commit is contained in:
Daiki Ueno
2011-02-01 12:43:33 +09:00
parent aed12cd831
commit eb646ff769
5 changed files with 85 additions and 33 deletions

14
README
View File

@ -49,12 +49,16 @@ NOTE: eekboard-system-client is now being heavily developed and it may
behave wrongly. Make sure to close windows where you are doing any behave wrongly. Make sure to close windows where you are doing any
important work, before running eekboard. important work, before running eekboard.
$ ./src/eekboard-system-client --xklavier --accessibility --fakekey $ ./src/eekboard-system-client \
--listen-keyboard \
--listen-focus \
--listen-keystroke \
--generate-key-event
Where --xklavier is to monitor system keyboard layout change, Where --listen-keyboard is to monitor system keyboard state/config
--accessibility is to track focus/key events via AT-SPI, and --fakekey change, --listen-focus is to track focus change, --listen-keystroke is
generates X key events when eekboard-server signals virtual to track keystroke events, and --generate-key-event is to generate X
key-press/key-release events. key events on virtual key-press/key-release events.
* Documentation * Documentation

View File

@ -78,6 +78,9 @@ struct _EekboardServer {
GtkWidget *window; GtkWidget *window;
GtkWidget *widget; GtkWidget *widget;
EekKeyboard *keyboard; EekKeyboard *keyboard;
gulong key_pressed_handler;
gulong key_released_handler;
}; };
struct _EekboardServerClass { struct _EekboardServerClass {
@ -235,6 +238,8 @@ eekboard_server_init (EekboardServer *server)
server->keyboard = NULL; server->keyboard = NULL;
server->widget = NULL; server->widget = NULL;
server->window = NULL; server->window = NULL;
server->key_pressed_handler = 0;
server->key_released_handler = 0;
} }
static void static void
@ -277,6 +282,19 @@ on_key_released (EekKeyboard *keyboard,
g_assert_no_error (error); g_assert_no_error (error);
} }
static void
disconnect_keyboard_signals (EekboardServer *server)
{
if (g_signal_handler_is_connected (server->keyboard,
server->key_pressed_handler))
g_signal_handler_disconnect (server->keyboard,
server->key_pressed_handler);
if (g_signal_handler_is_connected (server->keyboard,
server->key_released_handler))
g_signal_handler_disconnect (server->keyboard,
server->key_released_handler);
}
static void static void
handle_method_call (GDBusConnection *connection, handle_method_call (GDBusConnection *connection,
const gchar *sender, const gchar *sender,
@ -311,9 +329,12 @@ handle_method_call (GDBusConnection *connection,
} }
server->keyboard = eek_keyboard_new (layout, CSW, CSH); server->keyboard = eek_keyboard_new (layout, CSW, CSH);
disconnect_keyboard_signals (server);
server->key_pressed_handler =
g_signal_connect (server->keyboard, "key-pressed", g_signal_connect (server->keyboard, "key-pressed",
G_CALLBACK(on_key_pressed), G_CALLBACK(on_key_pressed),
server); server);
server->key_released_handler =
g_signal_connect (server->keyboard, "key-released", g_signal_connect (server->keyboard, "key-released",
G_CALLBACK(on_key_released), G_CALLBACK(on_key_released),
server); server);

View File

@ -4,17 +4,20 @@
#include <gconf/gconf-client.h> #include <gconf/gconf-client.h>
#include "system-client.h" #include "system-client.h"
gboolean opt_xkl = FALSE; gboolean opt_keyboard = FALSE;
gboolean opt_cspi = FALSE; gboolean opt_focus = FALSE;
gboolean opt_keystroke = FALSE;
gboolean opt_fakekey = FALSE; gboolean opt_fakekey = FALSE;
static const GOptionEntry options[] = { static const GOptionEntry options[] = {
{"xklavier", 'x', 0, G_OPTION_ARG_NONE, &opt_xkl, {"listen-keyboard", 'k', 0, G_OPTION_ARG_NONE, &opt_keyboard,
"Listen xklavier events"}, "Listen keyboard change events with libxklavier"},
{"accessibility", 'a', 0, G_OPTION_ARG_NONE, &opt_cspi, {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
"Listen accessibility events"}, "Listen focus change events with AT-SPI"},
{"fakekey", 'k', 0, G_OPTION_ARG_NONE, &opt_fakekey, {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
"Generate X key events via libfakekey"}, "Listen keystroke events with AT-SPI"},
{"generate-key-event", 'g', 0, G_OPTION_ARG_NONE, &opt_fakekey,
"Generate X key events with libfakekey"},
{NULL} {NULL}
}; };
@ -47,7 +50,7 @@ main (int argc, char **argv)
gconfc = gconf_client_get_default (); gconfc = gconf_client_get_default ();
error = NULL; error = NULL;
if (opt_cspi) { if (opt_focus || opt_keystroke) {
if (gconf_client_get_bool (gconfc, if (gconf_client_get_bool (gconfc,
"/desktop/gnome/interface/accessibility", "/desktop/gnome/interface/accessibility",
&error) || &error) ||
@ -59,8 +62,15 @@ main (int argc, char **argv)
exit (1); exit (1);
} }
if (!eekboard_system_client_enable_cspi (client)) { if (opt_focus &&
g_printerr ("Can't register accessibility event listeners\n"); !eekboard_system_client_enable_cspi_focus (client)) {
g_printerr ("Can't register focus change event listeners\n");
exit (1);
}
if (opt_keystroke &&
!eekboard_system_client_enable_cspi_keystroke (client)) {
g_printerr ("Can't register keystroke event listeners\n");
exit (1); exit (1);
} }
} else { } else {
@ -68,7 +78,7 @@ main (int argc, char **argv)
exit (1); exit (1);
} }
} }
if (opt_xkl && if (opt_keyboard &&
!eekboard_system_client_enable_xkl (client)) { !eekboard_system_client_enable_xkl (client)) {
g_printerr ("Can't register xklavier event listeners\n"); g_printerr ("Can't register xklavier event listeners\n");
exit (1); exit (1);

View File

@ -122,7 +122,8 @@ eekboard_system_client_dispose (GObject *object)
EekboardSystemClient *client = EEKBOARD_SYSTEM_CLIENT(object); EekboardSystemClient *client = EEKBOARD_SYSTEM_CLIENT(object);
eekboard_system_client_disable_xkl (client); eekboard_system_client_disable_xkl (client);
eekboard_system_client_disable_cspi (client); eekboard_system_client_disable_cspi_focus (client);
eekboard_system_client_disable_cspi_keystroke (client);
eekboard_system_client_disable_fakekey (client); eekboard_system_client_disable_fakekey (client);
if (client->proxy) { if (client->proxy) {
@ -226,7 +227,7 @@ eekboard_system_client_disable_xkl (EekboardSystemClient *client)
} }
gboolean gboolean
eekboard_system_client_enable_cspi (EekboardSystemClient *client) eekboard_system_client_enable_cspi_focus (EekboardSystemClient *client)
{ {
client->focus_listener = SPI_createAccessibleEventListener client->focus_listener = SPI_createAccessibleEventListener
((AccessibleEventListenerCB)focus_listener_cb, ((AccessibleEventListenerCB)focus_listener_cb,
@ -240,6 +241,22 @@ eekboard_system_client_enable_cspi (EekboardSystemClient *client)
"focus:")) "focus:"))
return FALSE; return FALSE;
return TRUE;
}
void
eekboard_system_client_disable_cspi_focus (EekboardSystemClient *client)
{
if (client->focus_listener) {
SPI_deregisterGlobalEventListenerAll (client->focus_listener);
AccessibleEventListener_unref (client->focus_listener);
client->focus_listener = NULL;
}
}
gboolean
eekboard_system_client_enable_cspi_keystroke (EekboardSystemClient *client)
{
client->keystroke_listener = client->keystroke_listener =
SPI_createAccessibleKeystrokeListener (keystroke_listener_cb, SPI_createAccessibleKeystrokeListener (keystroke_listener_cb,
client); client);
@ -256,13 +273,8 @@ eekboard_system_client_enable_cspi (EekboardSystemClient *client)
} }
void void
eekboard_system_client_disable_cspi (EekboardSystemClient *client) eekboard_system_client_disable_cspi_keystroke (EekboardSystemClient *client)
{ {
if (client->focus_listener) {
SPI_deregisterGlobalEventListenerAll (client->focus_listener);
AccessibleEventListener_unref (client->focus_listener);
client->focus_listener = NULL;
}
if (client->keystroke_listener) { if (client->keystroke_listener) {
SPI_deregisterAccessibleKeystrokeListener (client->keystroke_listener, SPI_deregisterAccessibleKeystrokeListener (client->keystroke_listener,
0); 0);

View File

@ -39,9 +39,14 @@ gboolean eekboard_system_client_enable_xkl
void eekboard_system_client_disable_xkl void eekboard_system_client_disable_xkl
(EekboardSystemClient *client); (EekboardSystemClient *client);
gboolean eekboard_system_client_enable_cspi gboolean eekboard_system_client_enable_cspi_focus
(EekboardSystemClient *client); (EekboardSystemClient *client);
void eekboard_system_client_disable_cspi void eekboard_system_client_disable_cspi_focus
(EekboardSystemClient *client);
gboolean eekboard_system_client_enable_cspi_keystroke
(EekboardSystemClient *client);
void eekboard_system_client_disable_cspi_keystroke
(EekboardSystemClient *client); (EekboardSystemClient *client);
gboolean eekboard_system_client_enable_fakekey gboolean eekboard_system_client_enable_fakekey