diff --git a/.gitignore b/.gitignore index 21d33221..197a96ab 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,5 @@ po/Makefile.in.in po/POTFILES po/stamp-it bindings/vala/*.vapi +py-compile + diff --git a/README b/README index 42f0d2ed..c959adb5 100644 --- a/README +++ b/README @@ -26,7 +26,7 @@ OPTIONAL: fakekey, CSPI, Clutter, Clutter-Gtk, Vala, gobject-introspection * How to test -eekboard currently includes 4 tools to implement your own virtual +eekboard currently includes 3 tools to implement your own virtual keyboard. ** eekboard-server @@ -38,14 +38,14 @@ do that with: $ eekboard-server & -** eekboard-desktop-client +** eekboard -eekboard-desktop-client is a client of eekboard-server. It listens -desktop events (keyboard change, focus in/out, and keystroke) and -generates key events when some keys are pressed on the on-screen -keyboard. It can be started with: +eekboard is a client of eekboard-server. It listens desktop events +(keyboard change, focus in/out, and keystroke) and generates key +events when some keys are pressed on the on-screen keyboard. It can +be started with: - $ eekboard-desktop-client + $ eekboard ** eekboard-xml @@ -60,16 +60,6 @@ You can display the dumped layout with: $ eekboard-xml --load keyboard.xml -** eekboard-client - -eekboard-client is a simple test client of eekboard-server. To upload -the keyboard description to the server, display it, and listen -key events. - - $ eekboard-client --set-keyboard keyboard.xml --show-keyboard --listen - KeyPressed XXXXX - KeyReleased XXXXX - * Documentation See file:docs/reference/eek/html/index.html diff --git a/configure.ac b/configure.ac index 20c5c3f6..83499bf0 100644 --- a/configure.ac +++ b/configure.ac @@ -248,6 +248,7 @@ data/themes/Makefile data/keyboards/Makefile examples/Makefile examples/eekboard-inscript/Makefile +examples/simple-client/Makefile eek/eek-${EEK_API_VERSION}.pc eek/eek-clutter-${EEK_API_VERSION}.pc eek/eek-gtk-${EEK_API_VERSION}.pc diff --git a/data/Makefile.am b/data/Makefile.am index 95dff22e..7e096829 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1 +1,2 @@ SUBDIRS = icons themes keyboards +EXTRA_DIST = eekboard.desktop diff --git a/data/eekboard.desktop b/data/eekboard.desktop new file mode 100644 index 00000000..3424fda4 --- /dev/null +++ b/data/eekboard.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Eekboard +GenericName=Eekboard Virtual Keyboard +Comment=Virtual Keyboard +Exec=eekboard-desktop-client +Icon=eekboard +Terminal=false +Type=Application +Categories=GTK;Utility; diff --git a/examples/Makefile.am b/examples/Makefile.am index 611a70ae..c7d4fd8e 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1 +1 @@ -SUBDIRS = eekboard-inscript +SUBDIRS = eekboard-inscript simple-client diff --git a/examples/simple-client/Makefile.am b/examples/simple-client/Makefile.am new file mode 100644 index 00000000..c9c6f18d --- /dev/null +++ b/examples/simple-client/Makefile.am @@ -0,0 +1,12 @@ +noinst_PROGRAMS = simple-client + +simple_client_CFLAGS = \ + -I$(top_srcdir) \ + $(GIO2_CFLAGS) + +simple_client_LDADD = \ + $(top_builddir)/eekboard/libeekboard.la \ + $(top_builddir)/eek/libeek.la \ + $(GIO2_LIBS) + +simple_client_SOURCES = main.c diff --git a/examples/simple-client/main.c b/examples/simple-client/main.c new file mode 100644 index 00000000..0d215b37 --- /dev/null +++ b/examples/simple-client/main.c @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2010-2011 Daiki Ueno + * Copyright (C) 2010-2011 Red Hat, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif /* HAVE_CONFIG_H */ + +#include +#include + +#include "eekboard/eekboard.h" + +static gboolean opt_system = FALSE; +static gboolean opt_session = FALSE; +static gchar *opt_address = NULL; + +static gchar *opt_set_keyboard = NULL; +static gint opt_set_group = -1; +static gboolean opt_show_keyboard = FALSE; +static gboolean opt_hide_keyboard = FALSE; +static gint opt_press_key = -1; +static gint opt_release_key = -1; +static gboolean opt_listen = FALSE; + +static const GOptionEntry options[] = { + {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system, + N_("Connect to the system bus")}, + {"session", 'e', 0, G_OPTION_ARG_NONE, &opt_session, + N_("Connect to the session bus")}, + {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, + N_("Connect to the given D-Bus address")}, + {"set-keyboard", '\0', 0, G_OPTION_ARG_STRING, &opt_set_keyboard, + N_("Upload keyboard description from an XML file")}, + {"set-group", '\0', 0, G_OPTION_ARG_INT, &opt_set_group, + N_("Set group of the keyboard")}, + {"show-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_show_keyboard, + N_("Show keyboard")}, + {"hide-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_hide_keyboard, + N_("Hide keyboard")}, + {"press-key", '\0', 0, G_OPTION_ARG_INT, &opt_press_key, + N_("Press key")}, + {"release-key", '\0', 0, G_OPTION_ARG_INT, &opt_release_key, + N_("Release key")}, + {"listen", '\0', 0, G_OPTION_ARG_NONE, &opt_listen, + N_("Listen events")}, + {NULL} +}; + +static void +on_key_pressed (guint keycode, gpointer user_data) +{ + g_print ("KeyPressed %u\n", keycode); +} + +static void +on_key_released (guint keycode, gpointer user_data) +{ + g_print ("KeyReleased %u\n", keycode); +} + +int +main (int argc, char **argv) +{ + EekboardEekboard *eekboard = NULL; + EekboardContext *context = NULL; + GBusType bus_type; + GDBusConnection *connection = NULL; + GError *error; + GOptionContext *option_context; + GMainLoop *loop = NULL; + gint retval = 0; + + g_type_init (); + g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL); + + option_context = g_option_context_new ("eekboard-client"); + g_option_context_add_main_entries (option_context, options, NULL); + g_option_context_parse (option_context, &argc, &argv, NULL); + g_option_context_free (option_context); + + if (opt_system) + bus_type = G_BUS_TYPE_SYSTEM; + else if (opt_address) + bus_type = G_BUS_TYPE_NONE; + else + bus_type = G_BUS_TYPE_SESSION; + + switch (bus_type) { + case G_BUS_TYPE_SYSTEM: + case G_BUS_TYPE_SESSION: + error = NULL; + connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (connection == NULL) { + g_printerr ("Can't connect to the bus: %s\n", error->message); + exit (1); + } + break; + case G_BUS_TYPE_NONE: + error = NULL; + connection = g_dbus_connection_new_for_address_sync (opt_address, + 0, + NULL, + NULL, + &error); + if (connection == NULL) { + g_printerr ("Can't connect to the bus at %s: %s\n", + opt_address, + error->message); + exit (1); + } + break; + default: + g_assert_not_reached (); + break; + } + + eekboard = eekboard_eekboard_new (connection, NULL); + if (eekboard == NULL) { + g_printerr ("Can't create eekboard proxy\n"); + retval = 1; + goto out; + } + + context = eekboard_eekboard_create_context (eekboard, + "eekboard-client", + NULL); + if (context == NULL) { + g_printerr ("Can't create context\n"); + retval = 1; + goto out; + } + + eekboard_eekboard_push_context (eekboard, context, NULL); + + if (opt_set_keyboard) { + GFile *file; + GFileInputStream *input; + EekLayout *layout; + EekKeyboard *keyboard; + guint keyboard_id; + + file = g_file_new_for_path (opt_set_keyboard); + + error = NULL; + input = g_file_read (file, NULL, &error); + if (error) { + g_printerr ("Can't read file %s: %s\n", + opt_set_keyboard, error->message); + retval = 1; + goto out; + } + + layout = eek_xml_layout_new (G_INPUT_STREAM(input)); + g_object_unref (input); + keyboard = eek_keyboard_new (layout, 640, 480); + g_object_unref (layout); + + keyboard_id = eekboard_context_add_keyboard (context, keyboard, NULL); + g_object_unref (keyboard); + + eekboard_context_set_keyboard (context, keyboard_id, NULL); + } + + if (opt_set_group >= 0) { + eekboard_context_set_group (context, opt_set_group, NULL); + } + + if (opt_show_keyboard) { + eekboard_context_show_keyboard (context, NULL); + } + + if (opt_hide_keyboard) { + eekboard_context_hide_keyboard (context, NULL); + } + + if (opt_press_key >= 0) { + eekboard_context_press_key (context, opt_press_key, NULL); + } + + if (opt_release_key >= 0) { + eekboard_context_release_key (context, opt_release_key, NULL); + } + + if (opt_listen) { + g_signal_connect (context, "key-pressed", + G_CALLBACK(on_key_pressed), NULL); + g_signal_connect (context, "key-released", + G_CALLBACK(on_key_released), NULL); + loop = g_main_loop_new (NULL, FALSE); + g_main_loop_run (loop); + } + + out: + if (context) + g_object_unref (context); + if (connection) + g_object_unref (connection); + if (loop) + g_main_loop_unref (loop); + + return retval; +} + diff --git a/po/POTFILES.in b/po/POTFILES.in index 650ce947..13d7503b 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,7 +1,7 @@ src/server-server.c src/server-context.c -src/client-main.c -src/desktop-client.c -src/desktop-client-main.c -src/xml-main.c src/server-main.c +src/client.c +src/client-main.c +src/xml-main.c +examples/simple-client/main.c diff --git a/src/Makefile.am b/src/Makefile.am index 5668ff21..409ed7d8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,14 +18,13 @@ if ENABLE_EEKBOARD bin_PROGRAMS = \ - eekboard-desktop-client \ - eekboard-client \ + eekboard \ eekboard-server \ eekboard-xml noinst_LTLIBRARIES = libxklutil.la -eekboard_desktop_client_CFLAGS = \ +eekboard_CFLAGS = \ -I$(top_srcdir) \ $(GIO2_CFLAGS) \ $(GTK_CFLAGS) \ @@ -33,7 +32,7 @@ eekboard_desktop_client_CFLAGS = \ $(XKB_CFLAGS) \ $(LIBXKLAVIER_CFLAGS) -eekboard_desktop_client_LDADD = \ +eekboard_LDADD = \ $(builddir)/libxklutil.la \ $(top_builddir)/eekboard/libeekboard.la \ $(top_builddir)/eek/libeek.la \ @@ -45,21 +44,21 @@ eekboard_desktop_client_LDADD = \ $(LIBXKLAVIER_LIBS) if ENABLE_FAKEKEY -eekboard_desktop_client_CFLAGS += \ +eekboard_CFLAGS += \ $(FAKEKEY_CFLAGS) -eekboard_desktop_client_LDADD += \ +eekboard_LDADD += \ $(FAKEKEY_LIBS) endif if ENABLE_CSPI -eekboard_desktop_client_CFLAGS += \ +eekboard_CFLAGS += \ $(CSPI_CFLAGS) -eekboard_desktop_client_LDADD += \ +eekboard_LDADD += \ $(CSPI_LIBS) endif -eekboard_desktop_client_headers = desktop-client.h -eekboard_desktop_client_SOURCES = desktop-client.c desktop-client-main.c +eekboard_headers = client.h +eekboard_SOURCES = client.c client-main.c eekboard_server_CFLAGS = \ -I$(top_srcdir) \ @@ -82,17 +81,6 @@ endif eekboard_server_headers = server-server.h server-context.h eekboard_server_SOURCES = server-server.c server-context.c server-main.c -eekboard_client_CFLAGS = \ - -I$(top_srcdir) \ - $(GIO2_CFLAGS) - -eekboard_client_LDADD = \ - $(top_builddir)/eekboard/libeekboard.la \ - $(top_builddir)/eek/libeek.la \ - $(GIO2_LIBS) - -eekboard_client_SOURCES = client-main.c - eekboard_xml_CFLAGS = \ -I$(top_srcdir) \ $(GIO2_CFLAGS) \ @@ -125,8 +113,7 @@ eekboard_HEADERS = \ $(libeekboard_headers) noinst_HEADERS = \ - $(eekboard_desktop_client_headers) \ - $(eekboard_client_headers) \ + $(eekboard_headers) \ $(eekboard_server_headers) \ $(eekboard_xml_headers) \ $(libxklutil_la_headers) diff --git a/src/client-main.c b/src/client-main.c index 0d215b37..cd6e4dab 100644 --- a/src/client-main.c +++ b/src/client-main.c @@ -20,21 +20,27 @@ #endif /* HAVE_CONFIG_H */ #include +#include +#include #include - +#include #include "eekboard/eekboard.h" +#include "client.h" static gboolean opt_system = FALSE; static gboolean opt_session = FALSE; static gchar *opt_address = NULL; -static gchar *opt_set_keyboard = NULL; -static gint opt_set_group = -1; -static gboolean opt_show_keyboard = FALSE; -static gboolean opt_hide_keyboard = FALSE; -static gint opt_press_key = -1; -static gint opt_release_key = -1; -static gboolean opt_listen = FALSE; +#ifdef HAVE_CSPI +static gboolean opt_focus = FALSE; +static gboolean opt_keystroke = FALSE; +#endif /* HAVE_CSPI */ + +static gchar *opt_model = NULL; +static gchar *opt_layouts = NULL; +static gchar *opt_options = NULL; + +static gboolean opt_fullscreen = FALSE; static const GOptionEntry options[] = { {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system, @@ -43,51 +49,75 @@ static const GOptionEntry options[] = { N_("Connect to the session bus")}, {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, N_("Connect to the given D-Bus address")}, - {"set-keyboard", '\0', 0, G_OPTION_ARG_STRING, &opt_set_keyboard, - N_("Upload keyboard description from an XML file")}, - {"set-group", '\0', 0, G_OPTION_ARG_INT, &opt_set_group, - N_("Set group of the keyboard")}, - {"show-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_show_keyboard, - N_("Show keyboard")}, - {"hide-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_hide_keyboard, - N_("Hide keyboard")}, - {"press-key", '\0', 0, G_OPTION_ARG_INT, &opt_press_key, - N_("Press key")}, - {"release-key", '\0', 0, G_OPTION_ARG_INT, &opt_release_key, - N_("Release key")}, - {"listen", '\0', 0, G_OPTION_ARG_NONE, &opt_listen, - N_("Listen events")}, +#ifdef HAVE_CSPI + {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus, + N_("Listen focus change events with AT-SPI")}, + {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke, + N_("Listen keystroke events with AT-SPI")}, +#endif /* HAVE_CSPI */ + {"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model, + N_("Specify model")}, + {"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts, + N_("Specify layouts")}, + {"options", '\0', 0, G_OPTION_ARG_STRING, &opt_options, + N_("Specify options")}, + {"fullscreen", 'F', 0, G_OPTION_ARG_NONE, &opt_fullscreen, + N_("Create window in fullscreen mode")}, {NULL} }; static void -on_key_pressed (guint keycode, gpointer user_data) +on_notify_keyboard_visible (GObject *object, + GParamSpec *spec, + gpointer user_data) { - g_print ("KeyPressed %u\n", keycode); + GMainLoop *loop = user_data; + gboolean visible; + + g_object_get (object, "keyboard-visible", &visible, NULL); + + /* user explicitly closed the window */ + if (!visible && eekboard_context_is_enabled (EEKBOARD_CONTEXT(object))) + g_main_loop_quit (loop); } static void -on_key_released (guint keycode, gpointer user_data) +on_context_destroyed (EekboardContext *context, + gpointer user_data) { - g_print ("KeyReleased %u\n", keycode); + GMainLoop *loop = user_data; + + g_main_loop_quit (loop); +} + +static void +on_destroyed (EekboardEekboard *eekboard, + gpointer user_data) +{ + GMainLoop *loop = user_data; + + g_main_loop_quit (loop); } int main (int argc, char **argv) { - EekboardEekboard *eekboard = NULL; - EekboardContext *context = NULL; + EekboardClient *client; + EekboardEekboard *eekboard; + EekboardContext *context; GBusType bus_type; - GDBusConnection *connection = NULL; + GDBusConnection *connection; GError *error; + GConfClient *gconfc; GOptionContext *option_context; - GMainLoop *loop = NULL; - gint retval = 0; + GMainLoop *loop; - g_type_init (); - g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL); + if (!gtk_init_check (&argc, &argv)) { + g_printerr ("Can't init GTK\n"); + exit (1); + } - option_context = g_option_context_new ("eekboard-client"); + option_context = g_option_context_new ("eekboard-desktop-client"); g_option_context_add_main_entries (option_context, options, NULL); g_option_context_parse (option_context, &argc, &argv, NULL); g_option_context_free (option_context); @@ -128,90 +158,88 @@ main (int argc, char **argv) break; } - eekboard = eekboard_eekboard_new (connection, NULL); - if (eekboard == NULL) { - g_printerr ("Can't create eekboard proxy\n"); - retval = 1; - goto out; + client = eekboard_client_new (connection); + if (client == NULL) { + g_printerr ("Can't create a client\n"); + exit (1); } - context = eekboard_eekboard_create_context (eekboard, - "eekboard-client", - NULL); - if (context == NULL) { - g_printerr ("Can't create context\n"); - retval = 1; - goto out; - } + gconfc = gconf_client_get_default (); - eekboard_eekboard_push_context (eekboard, context, NULL); +#ifdef HAVE_CSPI + error = NULL; + if (opt_focus || opt_keystroke) { + if (gconf_client_get_bool (gconfc, + "/desktop/gnome/interface/accessibility", + &error) || + gconf_client_get_bool (gconfc, + "/desktop/gnome/interface/accessibility2", + &error)) { + if (SPI_init () != 0) { + g_printerr ("Can't init CSPI\n"); + exit (1); + } - if (opt_set_keyboard) { - GFile *file; - GFileInputStream *input; - EekLayout *layout; - EekKeyboard *keyboard; - guint keyboard_id; + if (opt_focus && + !eekboard_client_enable_cspi_focus (client)) { + g_printerr ("Can't register focus change event listeners\n"); + exit (1); + } - file = g_file_new_for_path (opt_set_keyboard); - - error = NULL; - input = g_file_read (file, NULL, &error); - if (error) { - g_printerr ("Can't read file %s: %s\n", - opt_set_keyboard, error->message); - retval = 1; - goto out; + if (opt_keystroke && + !eekboard_client_enable_cspi_keystroke (client)) { + g_printerr ("Can't register keystroke event listeners\n"); + exit (1); + } + } else { + g_printerr ("Desktop accessibility support is disabled\n"); + exit (1); } + } +#endif /* HAVE_CSPI */ - layout = eek_xml_layout_new (G_INPUT_STREAM(input)); - g_object_unref (input); - keyboard = eek_keyboard_new (layout, 640, 480); - g_object_unref (layout); - - keyboard_id = eekboard_context_add_keyboard (context, keyboard, NULL); - g_object_unref (keyboard); - - eekboard_context_set_keyboard (context, keyboard_id, NULL); + if (opt_model || opt_layouts || opt_options) { + if (!eekboard_client_set_xkl_config (client, + opt_model, + opt_layouts, + opt_options)) { + g_printerr ("Can't set xklavier config\n"); + exit (1); + } + } else if (!eekboard_client_enable_xkl (client)) { + g_printerr ("Can't register xklavier event listeners\n"); + exit (1); } - if (opt_set_group >= 0) { - eekboard_context_set_group (context, opt_set_group, NULL); +#ifdef HAVE_FAKEKEY + if (!eekboard_client_enable_fakekey (client)) { + g_printerr ("Can't init fakekey\n"); + exit (1); } +#endif /* HAVE_FAKEKEY */ - if (opt_show_keyboard) { - eekboard_context_show_keyboard (context, NULL); - } - - if (opt_hide_keyboard) { - eekboard_context_hide_keyboard (context, NULL); - } - - if (opt_press_key >= 0) { - eekboard_context_press_key (context, opt_press_key, NULL); - } - - if (opt_release_key >= 0) { - eekboard_context_release_key (context, opt_release_key, NULL); - } - - if (opt_listen) { - g_signal_connect (context, "key-pressed", - G_CALLBACK(on_key_pressed), NULL); - g_signal_connect (context, "key-released", - G_CALLBACK(on_key_released), NULL); - loop = g_main_loop_new (NULL, FALSE); - g_main_loop_run (loop); - } - - out: - if (context) + loop = g_main_loop_new (NULL, FALSE); + if (!opt_focus) { + g_object_get (client, "context", &context, NULL); + g_signal_connect (context, "notify::keyboard-visible", + G_CALLBACK(on_notify_keyboard_visible), loop); + g_signal_connect (context, "destroyed", + G_CALLBACK(on_context_destroyed), loop); g_object_unref (context); - if (connection) - g_object_unref (connection); - if (loop) - g_main_loop_unref (loop); + } - return retval; + if (opt_fullscreen) { + g_object_get (client, "context", &context, NULL); + eekboard_context_set_fullscreen (context, TRUE, NULL); + g_object_unref (context); + } + + g_object_get (client, "eekboard", &eekboard, NULL); + g_signal_connect (eekboard, "destroyed", + G_CALLBACK(on_destroyed), loop); + + g_main_loop_run (loop); + g_main_loop_unref (loop); + + return 0; } - diff --git a/src/desktop-client.c b/src/client.c similarity index 88% rename from src/desktop-client.c rename to src/client.c index 1e3d4cbc..a2cf64c4 100644 --- a/src/desktop-client.c +++ b/src/client.c @@ -34,7 +34,7 @@ #include "eek/eek.h" #include "eek/eek-xkl.h" #include "eekboard/eekboard.h" -#include "desktop-client.h" +#include "client.h" #include "xklutil.h" #define CSW 640 @@ -48,9 +48,9 @@ enum { PROP_LAST }; -typedef struct _EekboardDesktopClientClass EekboardDesktopClientClass; +typedef struct _EekboardClientClass EekboardClientClass; -struct _EekboardDesktopClient { +struct _EekboardClient { GObject parent; EekboardEekboard *eekboard; @@ -78,11 +78,11 @@ struct _EekboardDesktopClient { #endif /* HAVE_FAKEKEY */ }; -struct _EekboardDesktopClientClass { +struct _EekboardClientClass { GObjectClass parent_class; }; -G_DEFINE_TYPE (EekboardDesktopClient, eekboard_desktop_client, G_TYPE_OBJECT); +G_DEFINE_TYPE (EekboardClient, eekboard_client, G_TYPE_OBJECT); static GdkFilterReturn filter_xkl_event (GdkXEvent *xev, GdkEvent *event, @@ -106,19 +106,19 @@ static SPIBoolean keystroke_listener_cb (const AccessibleKeystroke *stroke, void *user_data); #endif /* HAVE_CSPI */ -static gboolean set_keyboard (EekboardDesktopClient *client, +static gboolean set_keyboard (EekboardClient *client, gboolean show, const gchar *model, const gchar *layouts, const gchar *options); static void -eekboard_desktop_client_set_property (GObject *object, +eekboard_client_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { - EekboardDesktopClient *client = EEKBOARD_DESKTOP_CLIENT(object); + EekboardClient *client = EEKBOARD_CLIENT(object); GDBusConnection *connection; switch (prop_id) { @@ -129,7 +129,7 @@ eekboard_desktop_client_set_property (GObject *object, if (client->eekboard != NULL) { client->context = eekboard_eekboard_create_context (client->eekboard, - "eekboard-desktop-client", + "eekboard", NULL); if (client->context == NULL) { g_object_unref (client->eekboard); @@ -149,12 +149,12 @@ eekboard_desktop_client_set_property (GObject *object, } static void -eekboard_desktop_client_get_property (GObject *object, +eekboard_client_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { - EekboardDesktopClient *client = EEKBOARD_DESKTOP_CLIENT(object); + EekboardClient *client = EEKBOARD_CLIENT(object); switch (prop_id) { case PROP_EEKBOARD: @@ -172,19 +172,19 @@ eekboard_desktop_client_get_property (GObject *object, } static void -eekboard_desktop_client_dispose (GObject *object) +eekboard_client_dispose (GObject *object) { - EekboardDesktopClient *client = EEKBOARD_DESKTOP_CLIENT(object); + EekboardClient *client = EEKBOARD_CLIENT(object); - eekboard_desktop_client_disable_xkl (client); + eekboard_client_disable_xkl (client); #ifdef HAVE_CSPI - eekboard_desktop_client_disable_cspi_focus (client); - eekboard_desktop_client_disable_cspi_keystroke (client); + eekboard_client_disable_cspi_focus (client); + eekboard_client_disable_cspi_keystroke (client); #endif /* HAVE_CSPI */ #ifdef HAVE_FAKEKEY - eekboard_desktop_client_disable_fakekey (client); + eekboard_client_disable_fakekey (client); #endif /* HAVE_FAKEKEY */ if (client->context) { @@ -217,18 +217,18 @@ eekboard_desktop_client_dispose (GObject *object) client->display = NULL; } - G_OBJECT_CLASS (eekboard_desktop_client_parent_class)->dispose (object); + G_OBJECT_CLASS (eekboard_client_parent_class)->dispose (object); } static void -eekboard_desktop_client_class_init (EekboardDesktopClientClass *klass) +eekboard_client_class_init (EekboardClientClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GParamSpec *pspec; - gobject_class->set_property = eekboard_desktop_client_set_property; - gobject_class->get_property = eekboard_desktop_client_get_property; - gobject_class->dispose = eekboard_desktop_client_dispose; + gobject_class->set_property = eekboard_client_set_property; + gobject_class->get_property = eekboard_client_get_property; + gobject_class->dispose = eekboard_client_dispose; pspec = g_param_spec_object ("connection", "Connection", @@ -259,7 +259,7 @@ eekboard_desktop_client_class_init (EekboardDesktopClientClass *klass) } static void -eekboard_desktop_client_init (EekboardDesktopClient *client) +eekboard_client_init (EekboardClient *client) { client->eekboard = NULL; client->context = NULL; @@ -281,7 +281,7 @@ eekboard_desktop_client_init (EekboardDesktopClient *client) } gboolean -eekboard_desktop_client_set_xkl_config (EekboardDesktopClient *client, +eekboard_client_set_xkl_config (EekboardClient *client, const gchar *model, const gchar *layouts, const gchar *options) @@ -302,7 +302,7 @@ eekboard_desktop_client_set_xkl_config (EekboardDesktopClient *client, } gboolean -eekboard_desktop_client_enable_xkl (EekboardDesktopClient *client) +eekboard_client_enable_xkl (EekboardClient *client) { if (!client->display) { client->display = gdk_display_get_default (); @@ -346,7 +346,7 @@ eekboard_desktop_client_enable_xkl (EekboardDesktopClient *client) } void -eekboard_desktop_client_disable_xkl (EekboardDesktopClient *client) +eekboard_client_disable_xkl (EekboardClient *client) { if (client->xkl_engine) xkl_engine_stop_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE); @@ -362,7 +362,7 @@ eekboard_desktop_client_disable_xkl (EekboardDesktopClient *client) #ifdef HAVE_CSPI gboolean -eekboard_desktop_client_enable_cspi_focus (EekboardDesktopClient *client) +eekboard_client_enable_cspi_focus (EekboardClient *client) { client->focus_listener = SPI_createAccessibleEventListener ((AccessibleEventListenerCB)focus_listener_cb, @@ -380,7 +380,7 @@ eekboard_desktop_client_enable_cspi_focus (EekboardDesktopClient *client) } void -eekboard_desktop_client_disable_cspi_focus (EekboardDesktopClient *client) +eekboard_client_disable_cspi_focus (EekboardClient *client) { if (client->focus_listener) { SPI_deregisterGlobalEventListenerAll (client->focus_listener); @@ -390,7 +390,7 @@ eekboard_desktop_client_disable_cspi_focus (EekboardDesktopClient *client) } gboolean -eekboard_desktop_client_enable_cspi_keystroke (EekboardDesktopClient *client) +eekboard_client_enable_cspi_keystroke (EekboardClient *client) { client->keystroke_listener = SPI_createAccessibleKeystrokeListener (keystroke_listener_cb, @@ -408,7 +408,7 @@ eekboard_desktop_client_enable_cspi_keystroke (EekboardDesktopClient *client) } void -eekboard_desktop_client_disable_cspi_keystroke (EekboardDesktopClient *client) +eekboard_client_disable_cspi_keystroke (EekboardClient *client) { if (client->keystroke_listener) { SPI_deregisterAccessibleKeystrokeListener (client->keystroke_listener, @@ -422,7 +422,7 @@ static SPIBoolean focus_listener_cb (const AccessibleEvent *event, void *user_data) { - EekboardDesktopClient *client = user_data; + EekboardClient *client = user_data; Accessible *accessible = event->source; AccessibleStateSet *state_set = Accessible_getStateSet (accessible); AccessibleRole role = Accessible_getRole (accessible); @@ -466,7 +466,7 @@ static SPIBoolean keystroke_listener_cb (const AccessibleKeystroke *stroke, void *user_data) { - EekboardDesktopClient *client = user_data; + EekboardClient *client = user_data; EekKey *key; /* Ignore modifiers since the keystroke listener does not called @@ -489,10 +489,10 @@ keystroke_listener_cb (const AccessibleKeystroke *stroke, } #endif /* HAVE_CSPI */ -EekboardDesktopClient * -eekboard_desktop_client_new (GDBusConnection *connection) +EekboardClient * +eekboard_client_new (GDBusConnection *connection) { - EekboardDesktopClient *client = g_object_new (EEKBOARD_TYPE_DESKTOP_CLIENT, + EekboardClient *client = g_object_new (EEKBOARD_TYPE_CLIENT, "connection", connection, NULL); if (client->context) @@ -505,7 +505,7 @@ filter_xkl_event (GdkXEvent *xev, GdkEvent *event, gpointer user_data) { - EekboardDesktopClient *client = user_data; + EekboardClient *client = user_data; XEvent *xevent = (XEvent *)xev; xkl_engine_filter_events (client->xkl_engine, xevent); @@ -516,7 +516,7 @@ static void on_xkl_config_changed (XklEngine *xklengine, gpointer user_data) { - EekboardDesktopClient *client = user_data; + EekboardClient *client = user_data; gboolean retval; retval = set_keyboard (client, FALSE, NULL, NULL, NULL); @@ -529,7 +529,7 @@ on_xkl_config_changed (XklEngine *xklengine, } static gboolean -set_keyboard (EekboardDesktopClient *client, +set_keyboard (EekboardClient *client, gboolean show, const gchar *model, const gchar *layouts, @@ -608,7 +608,7 @@ on_xkl_state_changed (XklEngine *xklengine, gboolean restore, gpointer user_data) { - EekboardDesktopClient *client = user_data; + EekboardClient *client = user_data; if (type == GROUP_CHANGED && client->keyboard) { gint group = eek_element_get_group (EEK_ELEMENT(client->keyboard)); @@ -641,7 +641,7 @@ on_key_pressed (EekKeyboard *keyboard, EekKey *key, gpointer user_data) { - EekboardDesktopClient *client = user_data; + EekboardClient *client = user_data; EekSymbol *symbol; g_assert (client->fakekey); @@ -671,14 +671,14 @@ on_key_released (EekKeyboard *keyboard, EekKey *key, gpointer user_data) { - EekboardDesktopClient *client = user_data; + EekboardClient *client = user_data; g_assert (client->fakekey); fakekey_release (client->fakekey); } gboolean -eekboard_desktop_client_enable_fakekey (EekboardDesktopClient *client) +eekboard_client_enable_fakekey (EekboardClient *client) { if (!client->display) { client->display = gdk_display_get_default (); @@ -701,7 +701,7 @@ eekboard_desktop_client_enable_fakekey (EekboardDesktopClient *client) } void -eekboard_desktop_client_disable_fakekey (EekboardDesktopClient *client) +eekboard_client_disable_fakekey (EekboardClient *client) { if (client->fakekey) fakekey_release (client->fakekey); diff --git a/src/client.h b/src/client.h new file mode 100644 index 00000000..492f6b4d --- /dev/null +++ b/src/client.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2010-2011 Daiki Ueno + * Copyright (C) 2010-2011 Red Hat, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +#ifndef EEKBOARD_CLIENT_H +#define EEKBOARD_CLIENT_H 1 + +#include + +G_BEGIN_DECLS + +#define EEKBOARD_TYPE_CLIENT (eekboard_client_get_type()) +#define EEKBOARD_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEKBOARD_TYPE_CLIENT, EekboardClient)) +#define EEKBOARD_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEKBOARD_TYPE_CLIENT, EekboardClientClass)) +#define EEKBOARD_IS_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEKBOARD_TYPE_CLIENT)) +#define EEKBOARD_IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEKBOARD_TYPE_CLIENT)) +#define EEKBOARD_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEKBOARD_TYPE_CLIENT, EekboardClientClass)) + +typedef struct _EekboardClient EekboardClient; + +EekboardClient * eekboard_client_new (GDBusConnection *connection); + +gboolean eekboard_client_set_xkl_config (EekboardClient *client, + const gchar *model, + const gchar *layouts, + const gchar *options); + +gboolean eekboard_client_enable_xkl (EekboardClient *client); +void eekboard_client_disable_xkl (EekboardClient *client); + +gboolean eekboard_client_enable_cspi_focus + (EekboardClient *client); +void eekboard_client_disable_cspi_focus + (EekboardClient *client); + +gboolean eekboard_client_enable_cspi_keystroke + (EekboardClient *client); +void eekboard_client_disable_cspi_keystroke + (EekboardClient *client); + +gboolean eekboard_client_enable_fakekey (EekboardClient *client); +void eekboard_client_disable_fakekey (EekboardClient *client); + +G_END_DECLS +#endif /* EEKBOARD_CLIENT_H */ diff --git a/src/desktop-client-main.c b/src/desktop-client-main.c deleted file mode 100644 index 7b47d8be..00000000 --- a/src/desktop-client-main.c +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (C) 2010-2011 Daiki Ueno - * Copyright (C) 2010-2011 Red Hat, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif /* HAVE_CONFIG_H */ - -#include -#include -#include -#include -#include -#include "eekboard/eekboard.h" -#include "desktop-client.h" - -static gboolean opt_system = FALSE; -static gboolean opt_session = FALSE; -static gchar *opt_address = NULL; - -#ifdef HAVE_CSPI -static gboolean opt_focus = FALSE; -static gboolean opt_keystroke = FALSE; -#endif /* HAVE_CSPI */ - -static gchar *opt_model = NULL; -static gchar *opt_layouts = NULL; -static gchar *opt_options = NULL; - -static gboolean opt_fullscreen = FALSE; - -static const GOptionEntry options[] = { - {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system, - N_("Connect to the system bus")}, - {"session", 'e', 0, G_OPTION_ARG_NONE, &opt_session, - N_("Connect to the session bus")}, - {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, - N_("Connect to the given D-Bus address")}, -#ifdef HAVE_CSPI - {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus, - N_("Listen focus change events with AT-SPI")}, - {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke, - N_("Listen keystroke events with AT-SPI")}, -#endif /* HAVE_CSPI */ - {"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model, - N_("Specify model")}, - {"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts, - N_("Specify layouts")}, - {"options", '\0', 0, G_OPTION_ARG_STRING, &opt_options, - N_("Specify options")}, - {"fullscreen", 'F', 0, G_OPTION_ARG_NONE, &opt_fullscreen, - N_("Create window in fullscreen mode")}, - {NULL} -}; - -static void -on_notify_keyboard_visible (GObject *object, - GParamSpec *spec, - gpointer user_data) -{ - GMainLoop *loop = user_data; - gboolean visible; - - g_object_get (object, "keyboard-visible", &visible, NULL); - - /* user explicitly closed the window */ - if (!visible && eekboard_context_is_enabled (EEKBOARD_CONTEXT(object))) - g_main_loop_quit (loop); -} - -static void -on_context_destroyed (EekboardContext *context, - gpointer user_data) -{ - GMainLoop *loop = user_data; - - g_main_loop_quit (loop); -} - -static void -on_destroyed (EekboardEekboard *eekboard, - gpointer user_data) -{ - GMainLoop *loop = user_data; - - g_main_loop_quit (loop); -} - -int -main (int argc, char **argv) -{ - EekboardDesktopClient *client; - EekboardEekboard *eekboard; - EekboardContext *context; - GBusType bus_type; - GDBusConnection *connection; - GError *error; - GConfClient *gconfc; - GOptionContext *option_context; - GMainLoop *loop; - - if (!gtk_init_check (&argc, &argv)) { - g_printerr ("Can't init GTK\n"); - exit (1); - } - - option_context = g_option_context_new ("eekboard-desktop-client"); - g_option_context_add_main_entries (option_context, options, NULL); - g_option_context_parse (option_context, &argc, &argv, NULL); - g_option_context_free (option_context); - - if (opt_system) - bus_type = G_BUS_TYPE_SYSTEM; - else if (opt_address) - bus_type = G_BUS_TYPE_NONE; - else - bus_type = G_BUS_TYPE_SESSION; - - switch (bus_type) { - case G_BUS_TYPE_SYSTEM: - case G_BUS_TYPE_SESSION: - error = NULL; - connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); - if (connection == NULL) { - g_printerr ("Can't connect to the bus: %s\n", error->message); - exit (1); - } - break; - case G_BUS_TYPE_NONE: - error = NULL; - connection = g_dbus_connection_new_for_address_sync (opt_address, - 0, - NULL, - NULL, - &error); - if (connection == NULL) { - g_printerr ("Can't connect to the bus at %s: %s\n", - opt_address, - error->message); - exit (1); - } - break; - default: - g_assert_not_reached (); - break; - } - - client = eekboard_desktop_client_new (connection); - if (client == NULL) { - g_printerr ("Can't create a client\n"); - exit (1); - } - - gconfc = gconf_client_get_default (); - -#ifdef HAVE_CSPI - error = NULL; - if (opt_focus || opt_keystroke) { - if (gconf_client_get_bool (gconfc, - "/desktop/gnome/interface/accessibility", - &error) || - gconf_client_get_bool (gconfc, - "/desktop/gnome/interface/accessibility2", - &error)) { - if (SPI_init () != 0) { - g_printerr ("Can't init CSPI\n"); - exit (1); - } - - if (opt_focus && - !eekboard_desktop_client_enable_cspi_focus (client)) { - g_printerr ("Can't register focus change event listeners\n"); - exit (1); - } - - if (opt_keystroke && - !eekboard_desktop_client_enable_cspi_keystroke (client)) { - g_printerr ("Can't register keystroke event listeners\n"); - exit (1); - } - } else { - g_printerr ("Desktop accessibility support is disabled\n"); - exit (1); - } - } -#endif /* HAVE_CSPI */ - - if (opt_model || opt_layouts || opt_options) { - if (!eekboard_desktop_client_set_xkl_config (client, - opt_model, - opt_layouts, - opt_options)) { - g_printerr ("Can't set xklavier config\n"); - exit (1); - } - } else if (!eekboard_desktop_client_enable_xkl (client)) { - g_printerr ("Can't register xklavier event listeners\n"); - exit (1); - } - -#ifdef HAVE_FAKEKEY - if (!eekboard_desktop_client_enable_fakekey (client)) { - g_printerr ("Can't init fakekey\n"); - exit (1); - } -#endif /* HAVE_FAKEKEY */ - - loop = g_main_loop_new (NULL, FALSE); - if (!opt_focus) { - g_object_get (client, "context", &context, NULL); - g_signal_connect (context, "notify::keyboard-visible", - G_CALLBACK(on_notify_keyboard_visible), loop); - g_signal_connect (context, "destroyed", - G_CALLBACK(on_context_destroyed), loop); - g_object_unref (context); - } - - if (opt_fullscreen) { - g_object_get (client, "context", &context, NULL); - eekboard_context_set_fullscreen (context, TRUE, NULL); - g_object_unref (context); - } - - g_object_get (client, "eekboard", &eekboard, NULL); - g_signal_connect (eekboard, "destroyed", - G_CALLBACK(on_destroyed), loop); - - g_main_loop_run (loop); - g_main_loop_unref (loop); - - return 0; -} diff --git a/src/desktop-client.h b/src/desktop-client.h deleted file mode 100644 index 52006d15..00000000 --- a/src/desktop-client.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2010-2011 Daiki Ueno - * Copyright (C) 2010-2011 Red Hat, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#ifndef EEKBOARD_DESKTOP_CLIENT_H -#define EEKBOARD_DESKTOP_CLIENT_H 1 - -#include - -G_BEGIN_DECLS - -#define EEKBOARD_TYPE_DESKTOP_CLIENT (eekboard_desktop_client_get_type()) -#define EEKBOARD_DESKTOP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEKBOARD_TYPE_DESKTOP_CLIENT, EekboardDesktopClient)) -#define EEKBOARD_DESKTOP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEKBOARD_TYPE_DESKTOP_CLIENT, EekboardDesktopClientClass)) -#define EEKBOARD_IS_DESKTOP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEKBOARD_TYPE_DESKTOP_CLIENT)) -#define EEKBOARD_IS_DESKTOP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEKBOARD_TYPE_DESKTOP_CLIENT)) -#define EEKBOARD_DESKTOP_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEKBOARD_TYPE_DESKTOP_CLIENT, EekboardDesktopClientClass)) - -typedef struct _EekboardDesktopClient EekboardDesktopClient; - -EekboardDesktopClient * eekboard_desktop_client_new - (GDBusConnection *connection); - -gboolean eekboard_desktop_client_set_xkl_config - (EekboardDesktopClient *client, - const gchar *model, - const gchar *layouts, - const gchar *options); - -gboolean eekboard_desktop_client_enable_xkl - (EekboardDesktopClient *client); -void eekboard_desktop_client_disable_xkl - (EekboardDesktopClient *client); - -gboolean eekboard_desktop_client_enable_cspi_focus - (EekboardDesktopClient *client); -void eekboard_desktop_client_disable_cspi_focus - (EekboardDesktopClient *client); - -gboolean eekboard_desktop_client_enable_cspi_keystroke - (EekboardDesktopClient *client); -void eekboard_desktop_client_disable_cspi_keystroke - (EekboardDesktopClient *client); - -gboolean eekboard_desktop_client_enable_fakekey - (EekboardDesktopClient *client); -void eekboard_desktop_client_disable_fakekey - (EekboardDesktopClient *client); - -G_END_DECLS -#endif /* EEKBOARD_DESKTOP_CLIENT_H */