Separate --listen-focus/--listen-keystroke option of eekboard-system-client.
This commit is contained in:
14
README
14
README
@ -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
|
||||
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,
|
||||
--accessibility is to track focus/key events via AT-SPI, and --fakekey
|
||||
generates X key events when eekboard-server signals virtual
|
||||
key-press/key-release events.
|
||||
Where --listen-keyboard is to monitor system keyboard state/config
|
||||
change, --listen-focus is to track focus change, --listen-keystroke is
|
||||
to track keystroke events, and --generate-key-event is to generate X
|
||||
key events on virtual key-press/key-release events.
|
||||
|
||||
* Documentation
|
||||
|
||||
|
||||
33
src/server.c
33
src/server.c
@ -78,6 +78,9 @@ struct _EekboardServer {
|
||||
GtkWidget *window;
|
||||
GtkWidget *widget;
|
||||
EekKeyboard *keyboard;
|
||||
|
||||
gulong key_pressed_handler;
|
||||
gulong key_released_handler;
|
||||
};
|
||||
|
||||
struct _EekboardServerClass {
|
||||
@ -235,6 +238,8 @@ eekboard_server_init (EekboardServer *server)
|
||||
server->keyboard = NULL;
|
||||
server->widget = NULL;
|
||||
server->window = NULL;
|
||||
server->key_pressed_handler = 0;
|
||||
server->key_released_handler = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -277,6 +282,19 @@ on_key_released (EekKeyboard *keyboard,
|
||||
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
|
||||
handle_method_call (GDBusConnection *connection,
|
||||
const gchar *sender,
|
||||
@ -311,12 +329,15 @@ handle_method_call (GDBusConnection *connection,
|
||||
}
|
||||
|
||||
server->keyboard = eek_keyboard_new (layout, CSW, CSH);
|
||||
g_signal_connect (server->keyboard, "key-pressed",
|
||||
G_CALLBACK(on_key_pressed),
|
||||
server);
|
||||
g_signal_connect (server->keyboard, "key-released",
|
||||
G_CALLBACK(on_key_released),
|
||||
server);
|
||||
disconnect_keyboard_signals (server);
|
||||
server->key_pressed_handler =
|
||||
g_signal_connect (server->keyboard, "key-pressed",
|
||||
G_CALLBACK(on_key_pressed),
|
||||
server);
|
||||
server->key_released_handler =
|
||||
g_signal_connect (server->keyboard, "key-released",
|
||||
G_CALLBACK(on_key_released),
|
||||
server);
|
||||
eek_keyboard_set_modifier_behavior (server->keyboard,
|
||||
EEK_MODIFIER_BEHAVIOR_LATCH);
|
||||
|
||||
|
||||
@ -4,17 +4,20 @@
|
||||
#include <gconf/gconf-client.h>
|
||||
#include "system-client.h"
|
||||
|
||||
gboolean opt_xkl = FALSE;
|
||||
gboolean opt_cspi = FALSE;
|
||||
gboolean opt_keyboard = FALSE;
|
||||
gboolean opt_focus = FALSE;
|
||||
gboolean opt_keystroke = FALSE;
|
||||
gboolean opt_fakekey = FALSE;
|
||||
|
||||
static const GOptionEntry options[] = {
|
||||
{"xklavier", 'x', 0, G_OPTION_ARG_NONE, &opt_xkl,
|
||||
"Listen xklavier events"},
|
||||
{"accessibility", 'a', 0, G_OPTION_ARG_NONE, &opt_cspi,
|
||||
"Listen accessibility events"},
|
||||
{"fakekey", 'k', 0, G_OPTION_ARG_NONE, &opt_fakekey,
|
||||
"Generate X key events via libfakekey"},
|
||||
{"listen-keyboard", 'k', 0, G_OPTION_ARG_NONE, &opt_keyboard,
|
||||
"Listen keyboard change events with libxklavier"},
|
||||
{"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
|
||||
"Listen focus change events with AT-SPI"},
|
||||
{"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
|
||||
"Listen keystroke events with AT-SPI"},
|
||||
{"generate-key-event", 'g', 0, G_OPTION_ARG_NONE, &opt_fakekey,
|
||||
"Generate X key events with libfakekey"},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
@ -47,7 +50,7 @@ main (int argc, char **argv)
|
||||
|
||||
gconfc = gconf_client_get_default ();
|
||||
error = NULL;
|
||||
if (opt_cspi) {
|
||||
if (opt_focus || opt_keystroke) {
|
||||
if (gconf_client_get_bool (gconfc,
|
||||
"/desktop/gnome/interface/accessibility",
|
||||
&error) ||
|
||||
@ -59,8 +62,15 @@ main (int argc, char **argv)
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (!eekboard_system_client_enable_cspi (client)) {
|
||||
g_printerr ("Can't register accessibility event listeners\n");
|
||||
if (opt_focus &&
|
||||
!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);
|
||||
}
|
||||
} else {
|
||||
@ -68,7 +78,7 @@ main (int argc, char **argv)
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
if (opt_xkl &&
|
||||
if (opt_keyboard &&
|
||||
!eekboard_system_client_enable_xkl (client)) {
|
||||
g_printerr ("Can't register xklavier event listeners\n");
|
||||
exit (1);
|
||||
|
||||
@ -122,7 +122,8 @@ eekboard_system_client_dispose (GObject *object)
|
||||
EekboardSystemClient *client = EEKBOARD_SYSTEM_CLIENT(object);
|
||||
|
||||
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);
|
||||
|
||||
if (client->proxy) {
|
||||
@ -226,7 +227,7 @@ eekboard_system_client_disable_xkl (EekboardSystemClient *client)
|
||||
}
|
||||
|
||||
gboolean
|
||||
eekboard_system_client_enable_cspi (EekboardSystemClient *client)
|
||||
eekboard_system_client_enable_cspi_focus (EekboardSystemClient *client)
|
||||
{
|
||||
client->focus_listener = SPI_createAccessibleEventListener
|
||||
((AccessibleEventListenerCB)focus_listener_cb,
|
||||
@ -240,6 +241,22 @@ eekboard_system_client_enable_cspi (EekboardSystemClient *client)
|
||||
"focus:"))
|
||||
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 =
|
||||
SPI_createAccessibleKeystrokeListener (keystroke_listener_cb,
|
||||
client);
|
||||
@ -256,13 +273,8 @@ eekboard_system_client_enable_cspi (EekboardSystemClient *client)
|
||||
}
|
||||
|
||||
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) {
|
||||
SPI_deregisterAccessibleKeystrokeListener (client->keystroke_listener,
|
||||
0);
|
||||
|
||||
@ -39,9 +39,14 @@ gboolean eekboard_system_client_enable_xkl
|
||||
void eekboard_system_client_disable_xkl
|
||||
(EekboardSystemClient *client);
|
||||
|
||||
gboolean eekboard_system_client_enable_cspi
|
||||
gboolean eekboard_system_client_enable_cspi_focus
|
||||
(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);
|
||||
|
||||
gboolean eekboard_system_client_enable_fakekey
|
||||
|
||||
Reference in New Issue
Block a user