Reimplement keystroke listener.
This commit is contained in:
2
README
2
README
@ -42,6 +42,8 @@ Access to the D-Bus server:
|
|||||||
KeyPressed XXXXX
|
KeyPressed XXXXX
|
||||||
KeyReleased XXXXX
|
KeyReleased XXXXX
|
||||||
$ ./src/eekboard-client --set-group 1
|
$ ./src/eekboard-client --set-group 1
|
||||||
|
$ ./src/eekboard-client --press-key 65
|
||||||
|
$ ./src/eekboard-client --release-key 65
|
||||||
|
|
||||||
Listen and follow the system events:
|
Listen and follow the system events:
|
||||||
|
|
||||||
|
|||||||
@ -25,6 +25,8 @@ static gchar *opt_set_keyboard = NULL;
|
|||||||
static gint opt_set_group = -1;
|
static gint opt_set_group = -1;
|
||||||
static gboolean opt_show = FALSE;
|
static gboolean opt_show = FALSE;
|
||||||
static gboolean opt_hide = FALSE;
|
static gboolean opt_hide = FALSE;
|
||||||
|
static gint opt_press_key = -1;
|
||||||
|
static gint opt_release_key = -1;
|
||||||
static gboolean opt_listen = FALSE;
|
static gboolean opt_listen = FALSE;
|
||||||
|
|
||||||
static const GOptionEntry options[] = {
|
static const GOptionEntry options[] = {
|
||||||
@ -36,6 +38,10 @@ static const GOptionEntry options[] = {
|
|||||||
"Show keyboard"},
|
"Show keyboard"},
|
||||||
{"hide", '\0', 0, G_OPTION_ARG_NONE, &opt_hide,
|
{"hide", '\0', 0, G_OPTION_ARG_NONE, &opt_hide,
|
||||||
"Hide keyboard"},
|
"Hide keyboard"},
|
||||||
|
{"press-key", '\0', 0, G_OPTION_ARG_INT, &opt_press_key,
|
||||||
|
"Press key"},
|
||||||
|
{"release-key", '\0', 0, G_OPTION_ARG_INT, &opt_release_key,
|
||||||
|
"Release key"},
|
||||||
{"listen", '\0', 0, G_OPTION_ARG_NONE, &opt_listen,
|
{"listen", '\0', 0, G_OPTION_ARG_NONE, &opt_listen,
|
||||||
"Listen events"},
|
"Listen events"},
|
||||||
{NULL}
|
{NULL}
|
||||||
@ -127,6 +133,14 @@ main (int argc, char **argv)
|
|||||||
eekboard_proxy_hide (proxy);
|
eekboard_proxy_hide (proxy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opt_press_key >= 0) {
|
||||||
|
eekboard_proxy_press_key (proxy, opt_press_key);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt_release_key >= 0) {
|
||||||
|
eekboard_proxy_release_key (proxy, opt_release_key);
|
||||||
|
}
|
||||||
|
|
||||||
if (opt_listen) {
|
if (opt_listen) {
|
||||||
g_signal_connect (proxy, "key-pressed",
|
g_signal_connect (proxy, "key-pressed",
|
||||||
G_CALLBACK(on_key_pressed), NULL);
|
G_CALLBACK(on_key_pressed), NULL);
|
||||||
|
|||||||
34
src/proxy.c
34
src/proxy.c
@ -142,9 +142,9 @@ proxy_call_async_ready_cb (GObject *source_object,
|
|||||||
result = g_dbus_proxy_call_finish (G_DBUS_PROXY(source_object),
|
result = g_dbus_proxy_call_finish (G_DBUS_PROXY(source_object),
|
||||||
res,
|
res,
|
||||||
&error);
|
&error);
|
||||||
g_assert_no_error (error);
|
// g_assert_no_error (error);
|
||||||
g_assert (result != NULL);
|
if (result)
|
||||||
g_variant_unref (result);
|
g_variant_unref (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -210,3 +210,31 @@ eekboard_proxy_hide (EekboardProxy *proxy)
|
|||||||
proxy_call_async_ready_cb,
|
proxy_call_async_ready_cb,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
eekboard_proxy_press_key (EekboardProxy *proxy,
|
||||||
|
guint keycode)
|
||||||
|
{
|
||||||
|
g_dbus_proxy_call (G_DBUS_PROXY(proxy),
|
||||||
|
"PressKey",
|
||||||
|
g_variant_new ("(u)", keycode),
|
||||||
|
G_DBUS_CALL_FLAGS_NONE,
|
||||||
|
-1,
|
||||||
|
NULL,
|
||||||
|
proxy_call_async_ready_cb,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
eekboard_proxy_release_key (EekboardProxy *proxy,
|
||||||
|
guint keycode)
|
||||||
|
{
|
||||||
|
g_dbus_proxy_call (G_DBUS_PROXY(proxy),
|
||||||
|
"ReleaseKey",
|
||||||
|
g_variant_new ("(u)", keycode),
|
||||||
|
G_DBUS_CALL_FLAGS_NONE,
|
||||||
|
-1,
|
||||||
|
NULL,
|
||||||
|
proxy_call_async_ready_cb,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|||||||
@ -43,6 +43,10 @@ void eekboard_proxy_set_group (EekboardProxy *proxy,
|
|||||||
gint group);
|
gint group);
|
||||||
void eekboard_proxy_show (EekboardProxy *proxy);
|
void eekboard_proxy_show (EekboardProxy *proxy);
|
||||||
void eekboard_proxy_hide (EekboardProxy *proxy);
|
void eekboard_proxy_hide (EekboardProxy *proxy);
|
||||||
|
void eekboard_proxy_press_key (EekboardProxy *proxy,
|
||||||
|
guint keycode);
|
||||||
|
void eekboard_proxy_release_key (EekboardProxy *proxy,
|
||||||
|
guint keycode);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif /* EEKBOARD_PROXY_H */
|
#endif /* EEKBOARD_PROXY_H */
|
||||||
|
|||||||
47
src/server.c
47
src/server.c
@ -53,10 +53,10 @@ static const gchar introspection_xml[] =
|
|||||||
" <method name='Show'/>"
|
" <method name='Show'/>"
|
||||||
" <method name='Hide'/>"
|
" <method name='Hide'/>"
|
||||||
" <method name='PressKey'>"
|
" <method name='PressKey'>"
|
||||||
" <arg type='s' name='key_id' direction='in'/>"
|
" <arg type='u' name='keycode'/>"
|
||||||
" </method>"
|
" </method>"
|
||||||
" <method name='ReleaseKey'>"
|
" <method name='ReleaseKey'>"
|
||||||
" <arg type='s' name='key_id' direction='in'/>"
|
" <arg type='u' name='keycode'/>"
|
||||||
" </method>"
|
" </method>"
|
||||||
" <signal name='KeyPressed'>"
|
" <signal name='KeyPressed'>"
|
||||||
" <arg type='u' name='keycode'/>"
|
" <arg type='u' name='keycode'/>"
|
||||||
@ -401,6 +401,49 @@ handle_method_call (GDBusConnection *connection,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_strcmp0 (method_name, "PressKey") == 0 ||
|
||||||
|
g_strcmp0 (method_name, "ReleaseKey") == 0) {
|
||||||
|
EekKey *key;
|
||||||
|
guint keycode;
|
||||||
|
|
||||||
|
if (!server->keyboard) {
|
||||||
|
g_dbus_method_invocation_return_error (invocation,
|
||||||
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_FAILED_HANDLED,
|
||||||
|
"keyboard is not set");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_variant_get (parameters, "(u)", &keycode);
|
||||||
|
key = eek_keyboard_find_key_by_keycode (server->keyboard, keycode);
|
||||||
|
|
||||||
|
if (!key) {
|
||||||
|
g_dbus_method_invocation_return_error (invocation,
|
||||||
|
G_IO_ERROR,
|
||||||
|
G_IO_ERROR_FAILED_HANDLED,
|
||||||
|
"key for %u is not found",
|
||||||
|
keycode);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_strcmp0 (method_name, "PressKey") == 0) {
|
||||||
|
g_signal_handler_block (server->keyboard,
|
||||||
|
server->key_pressed_handler);
|
||||||
|
g_signal_emit_by_name (key, "pressed");
|
||||||
|
g_signal_handler_unblock (server->keyboard,
|
||||||
|
server->key_pressed_handler);
|
||||||
|
} else {
|
||||||
|
g_signal_handler_block (server->keyboard,
|
||||||
|
server->key_released_handler);
|
||||||
|
g_signal_emit_by_name (key, "released");
|
||||||
|
g_signal_handler_unblock (server->keyboard,
|
||||||
|
server->key_released_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_dbus_method_invocation_return_value (invocation, NULL);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
g_return_if_reached ();
|
g_return_if_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -339,29 +339,11 @@ keystroke_listener_cb (const AccessibleKeystroke *stroke,
|
|||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
EekboardSystemClient *client = user_data;
|
EekboardSystemClient *client = user_data;
|
||||||
EekKey *key;
|
|
||||||
EekSymbol *symbol;
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
key = eek_keyboard_find_key_by_keycode (client->keyboard,
|
|
||||||
stroke->keycode);
|
|
||||||
if (!key)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
|
|
||||||
if (!symbol)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* XXX: Ignore modifier keys since there is no way to receive
|
|
||||||
SPI_KEY_RELEASED event for them. */
|
|
||||||
if (eek_symbol_is_modifier (symbol))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (stroke->type == SPI_KEY_PRESSED)
|
if (stroke->type == SPI_KEY_PRESSED)
|
||||||
g_signal_emit_by_name (key, "pressed");
|
eekboard_proxy_press_key (client->proxy, stroke->keycode);
|
||||||
else
|
else
|
||||||
g_signal_emit_by_name (key, "released");
|
eekboard_proxy_release_key (client->proxy, stroke->keycode);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user