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
|
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
|
||||||
|
|
||||||
|
|||||||
33
src/server.c
33
src/server.c
@ -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,12 +329,15 @@ handle_method_call (GDBusConnection *connection,
|
|||||||
}
|
}
|
||||||
|
|
||||||
server->keyboard = eek_keyboard_new (layout, CSW, CSH);
|
server->keyboard = eek_keyboard_new (layout, CSW, CSH);
|
||||||
g_signal_connect (server->keyboard, "key-pressed",
|
disconnect_keyboard_signals (server);
|
||||||
G_CALLBACK(on_key_pressed),
|
server->key_pressed_handler =
|
||||||
server);
|
g_signal_connect (server->keyboard, "key-pressed",
|
||||||
g_signal_connect (server->keyboard, "key-released",
|
G_CALLBACK(on_key_pressed),
|
||||||
G_CALLBACK(on_key_released),
|
server);
|
||||||
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_keyboard_set_modifier_behavior (server->keyboard,
|
||||||
EEK_MODIFIER_BEHAVIOR_LATCH);
|
EEK_MODIFIER_BEHAVIOR_LATCH);
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user