Commit 0177f967 authored by Daiki Ueno's avatar Daiki Ueno

Move eekboard-client from src to examples; rename eekboard-desktop-client to eekboard.

parent ec56773d
...@@ -72,3 +72,5 @@ po/Makefile.in.in ...@@ -72,3 +72,5 @@ po/Makefile.in.in
po/POTFILES po/POTFILES
po/stamp-it po/stamp-it
bindings/vala/*.vapi bindings/vala/*.vapi
py-compile
...@@ -26,7 +26,7 @@ OPTIONAL: fakekey, CSPI, Clutter, Clutter-Gtk, Vala, gobject-introspection ...@@ -26,7 +26,7 @@ OPTIONAL: fakekey, CSPI, Clutter, Clutter-Gtk, Vala, gobject-introspection
* How to test * How to test
eekboard currently includes 4 tools to implement your own virtual eekboard currently includes 3 tools to implement your own virtual
keyboard. keyboard.
** eekboard-server ** eekboard-server
...@@ -38,14 +38,14 @@ do that with: ...@@ -38,14 +38,14 @@ do that with:
$ eekboard-server & $ eekboard-server &
** eekboard-desktop-client ** eekboard
eekboard-desktop-client is a client of eekboard-server. It listens eekboard is a client of eekboard-server. It listens desktop events
desktop events (keyboard change, focus in/out, and keystroke) and (keyboard change, focus in/out, and keystroke) and generates key
generates key events when some keys are pressed on the on-screen events when some keys are pressed on the on-screen keyboard. It can
keyboard. It can be started with: be started with:
$ eekboard-desktop-client $ eekboard
** eekboard-xml ** eekboard-xml
...@@ -60,16 +60,6 @@ You can display the dumped layout with: ...@@ -60,16 +60,6 @@ You can display the dumped layout with:
$ eekboard-xml --load keyboard.xml $ 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 * Documentation
See file:docs/reference/eek/html/index.html See file:docs/reference/eek/html/index.html
...@@ -248,6 +248,7 @@ data/themes/Makefile ...@@ -248,6 +248,7 @@ data/themes/Makefile
data/keyboards/Makefile data/keyboards/Makefile
examples/Makefile examples/Makefile
examples/eekboard-inscript/Makefile examples/eekboard-inscript/Makefile
examples/simple-client/Makefile
eek/eek-${EEK_API_VERSION}.pc eek/eek-${EEK_API_VERSION}.pc
eek/eek-clutter-${EEK_API_VERSION}.pc eek/eek-clutter-${EEK_API_VERSION}.pc
eek/eek-gtk-${EEK_API_VERSION}.pc eek/eek-gtk-${EEK_API_VERSION}.pc
......
SUBDIRS = icons themes keyboards SUBDIRS = icons themes keyboards
EXTRA_DIST = eekboard.desktop
[Desktop Entry]
Name=Eekboard
GenericName=Eekboard Virtual Keyboard
Comment=Virtual Keyboard
Exec=eekboard-desktop-client
Icon=eekboard
Terminal=false
Type=Application
Categories=GTK;Utility;
SUBDIRS = eekboard-inscript SUBDIRS = eekboard-inscript simple-client
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
...@@ -20,27 +20,21 @@ ...@@ -20,27 +20,21 @@
#endif /* HAVE_CONFIG_H */ #endif /* HAVE_CONFIG_H */
#include <stdlib.h> #include <stdlib.h>
#include <cspi/spi.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <gconf/gconf-client.h>
#include "eekboard/eekboard.h" #include "eekboard/eekboard.h"
#include "desktop-client.h"
static gboolean opt_system = FALSE; static gboolean opt_system = FALSE;
static gboolean opt_session = FALSE; static gboolean opt_session = FALSE;
static gchar *opt_address = NULL; static gchar *opt_address = NULL;
#ifdef HAVE_CSPI static gchar *opt_set_keyboard = NULL;
static gboolean opt_focus = FALSE; static gint opt_set_group = -1;
static gboolean opt_keystroke = FALSE; static gboolean opt_show_keyboard = FALSE;
#endif /* HAVE_CSPI */ static gboolean opt_hide_keyboard = FALSE;
static gint opt_press_key = -1;
static gchar *opt_model = NULL; static gint opt_release_key = -1;
static gchar *opt_layouts = NULL; static gboolean opt_listen = FALSE;
static gchar *opt_options = NULL;
static gboolean opt_fullscreen = FALSE;
static const GOptionEntry options[] = { static const GOptionEntry options[] = {
{"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system, {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system,
...@@ -49,75 +43,51 @@ static const GOptionEntry options[] = { ...@@ -49,75 +43,51 @@ static const GOptionEntry options[] = {
N_("Connect to the session bus")}, N_("Connect to the session bus")},
{"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address,
N_("Connect to the given D-Bus address")}, N_("Connect to the given D-Bus address")},
#ifdef HAVE_CSPI {"set-keyboard", '\0', 0, G_OPTION_ARG_STRING, &opt_set_keyboard,
{"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus, N_("Upload keyboard description from an XML file")},
N_("Listen focus change events with AT-SPI")}, {"set-group", '\0', 0, G_OPTION_ARG_INT, &opt_set_group,
{"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke, N_("Set group of the keyboard")},
N_("Listen keystroke events with AT-SPI")}, {"show-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_show_keyboard,
#endif /* HAVE_CSPI */ N_("Show keyboard")},
{"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model, {"hide-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_hide_keyboard,
N_("Specify model")}, N_("Hide keyboard")},
{"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts, {"press-key", '\0', 0, G_OPTION_ARG_INT, &opt_press_key,
N_("Specify layouts")}, N_("Press key")},
{"options", '\0', 0, G_OPTION_ARG_STRING, &opt_options, {"release-key", '\0', 0, G_OPTION_ARG_INT, &opt_release_key,
N_("Specify options")}, N_("Release key")},
{"fullscreen", 'F', 0, G_OPTION_ARG_NONE, &opt_fullscreen, {"listen", '\0', 0, G_OPTION_ARG_NONE, &opt_listen,
N_("Create window in fullscreen mode")}, N_("Listen events")},
{NULL} {NULL}
}; };
static void static void
on_notify_keyboard_visible (GObject *object, on_key_pressed (guint keycode, gpointer user_data)
GParamSpec *spec,
gpointer user_data)
{ {
GMainLoop *loop = user_data; g_print ("KeyPressed %u\n", keycode);
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 static void
on_context_destroyed (EekboardContext *context, on_key_released (guint keycode, gpointer user_data)
gpointer user_data)
{ {
GMainLoop *loop = user_data; g_print ("KeyReleased %u\n", keycode);
g_main_loop_quit (loop);
}
static void
on_destroyed (EekboardEekboard *eekboard,
gpointer user_data)
{
GMainLoop *loop = user_data;
g_main_loop_quit (loop);
} }
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
EekboardDesktopClient *client; EekboardEekboard *eekboard = NULL;
EekboardEekboard *eekboard; EekboardContext *context = NULL;
EekboardContext *context;
GBusType bus_type; GBusType bus_type;
GDBusConnection *connection; GDBusConnection *connection = NULL;
GError *error; GError *error;
GConfClient *gconfc;
GOptionContext *option_context; GOptionContext *option_context;
GMainLoop *loop; GMainLoop *loop = NULL;
gint retval = 0;
if (!gtk_init_check (&argc, &argv)) { g_type_init ();
g_printerr ("Can't init GTK\n"); g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
exit (1);
}
option_context = g_option_context_new ("eekboard-desktop-client"); option_context = g_option_context_new ("eekboard-client");
g_option_context_add_main_entries (option_context, options, NULL); g_option_context_add_main_entries (option_context, options, NULL);
g_option_context_parse (option_context, &argc, &argv, NULL); g_option_context_parse (option_context, &argc, &argv, NULL);
g_option_context_free (option_context); g_option_context_free (option_context);
...@@ -158,88 +128,90 @@ main (int argc, char **argv) ...@@ -158,88 +128,90 @@ main (int argc, char **argv)
break; break;
} }
client = eekboard_desktop_client_new (connection); eekboard = eekboard_eekboard_new (connection, NULL);
if (client == NULL) { if (eekboard == NULL) {
g_printerr ("Can't create a client\n"); g_printerr ("Can't create eekboard proxy\n");
exit (1); retval = 1;
goto out;
} }
gconfc = gconf_client_get_default (); context = eekboard_eekboard_create_context (eekboard,
"eekboard-client",
#ifdef HAVE_CSPI NULL);
error = NULL; if (context == NULL) {
if (opt_focus || opt_keystroke) { g_printerr ("Can't create context\n");
if (gconf_client_get_bool (gconfc, retval = 1;
"/desktop/gnome/interface/accessibility", goto out;
&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 */
eekboard_eekboard_push_context (eekboard, context, NULL);
if (opt_model || opt_layouts || opt_options) {
if (!eekboard_desktop_client_set_xkl_config (client, if (opt_set_keyboard) {
opt_model, GFile *file;
opt_layouts, GFileInputStream *input;
opt_options)) { EekLayout *layout;
g_printerr ("Can't set xklavier config\n"); EekKeyboard *keyboard;
exit (1); 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;
} }
} else if (!eekboard_desktop_client_enable_xkl (client)) {
g_printerr ("Can't register xklavier event listeners\n"); layout = eek_xml_layout_new (G_INPUT_STREAM(input));
exit (1); 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);
} }
#ifdef HAVE_FAKEKEY if (opt_set_group >= 0) {
if (!eekboard_desktop_client_enable_fakekey (client)) { eekboard_context_set_group (context, opt_set_group, NULL);
g_printerr ("Can't init fakekey\n");
exit (1);
} }
#endif /* HAVE_FAKEKEY */
if (opt_show_keyboard) {
loop = g_main_loop_new (NULL, FALSE); eekboard_context_show_keyboard (context, NULL);
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) { if (opt_hide_keyboard) {
g_object_get (client, "context", &context, NULL); eekboard_context_hide_keyboard (context, NULL);
eekboard_context_set_fullscreen (context, TRUE, NULL); }
g_object_unref (context);
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);
} }
g_object_get (client, "eekboard", &eekboard, NULL); if (opt_listen) {
g_signal_connect (eekboard, "destroyed", g_signal_connect (context, "key-pressed",
G_CALLBACK(on_destroyed), loop); 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);
}
g_main_loop_run (loop); out:
g_main_loop_unref (loop); if (context)
g_object_unref (context);
if (connection)
g_object_unref (connection);
if (loop)
g_main_loop_unref (loop);
return 0; return retval;
} }
src/server-server.c src/server-server.c
src/server-context.c src/server-context.c
src/server-main.c
src/client.c
src/client-main.c src/client-main.c
src/desktop-client.c
src/desktop-client-main.c
src/xml-main.c src/xml-main.c
src/server-main.c examples/simple-client/main.c
...@@ -18,14 +18,13 @@ ...@@ -18,14 +18,13 @@
if ENABLE_EEKBOARD if ENABLE_EEKBOARD
bin_PROGRAMS = \ bin_PROGRAMS = \
eekboard-desktop-client \ eekboard \
eekboard-client \
eekboard-server \ eekboard-server \
eekboard-xml eekboard-xml
noinst_LTLIBRARIES = libxklutil.la noinst_LTLIBRARIES = libxklutil.la
eekboard_desktop_client_CFLAGS = \ eekboard_CFLAGS = \
-I$(top_srcdir) \ -I$(top_srcdir) \
$(GIO2_CFLAGS) \ $(GIO2_CFLAGS) \
$(GTK_CFLAGS) \ $(GTK_CFLAGS) \
...@@ -33,7 +32,7 @@ eekboard_desktop_client_CFLAGS = \ ...@@ -33,7 +32,7 @@ eekboard_desktop_client_CFLAGS = \
$(XKB_CFLAGS) \ $(XKB_CFLAGS) \
$(LIBXKLAVIER_CFLAGS) $(LIBXKLAVIER_CFLAGS)
eekboard_desktop_client_LDADD = \ eekboard_LDADD = \
$(builddir)/libxklutil.la \ $(builddir)/libxklutil.la \
$(top_builddir)/eekboard/libeekboard.la \ $(top_builddir)/eekboard/libeekboard.la \
$(top_builddir)/eek/libeek.la \ $(top_builddir)/eek/libeek.la \
...@@ -45,21 +44,21 @@ eekboard_desktop_client_LDADD = \ ...@@ -45,21 +44,21 @@ eekboard_desktop_client_LDADD = \
$(LIBXKLAVIER_LIBS) $(LIBXKLAVIER_LIBS)
if ENABLE_FAKEKEY if ENABLE_FAKEKEY
eekboard_desktop_client_CFLAGS += \ eekboard_CFLAGS += \
$(FAKEKEY_CFLAGS) $(FAKEKEY_CFLAGS)
eekboard_desktop_client_LDADD += \ eekboard_LDADD += \
$(FAKEKEY_LIBS) $(FAKEKEY_LIBS)
endif endif
if ENABLE_CSPI if ENABLE_CSPI
eekboard_desktop_client_CFLAGS += \ eekboard_CFLAGS += \
$(CSPI_CFLAGS) $(CSPI_CFLAGS)
eekboard_desktop_client_LDADD += \ eekboard_LDADD += \
$(CSPI_LIBS) $(CSPI_LIBS)
endif endif
eekboard_desktop_client_headers = desktop-client.h eekboard_headers = client.h
eekboard_desktop_client_SOURCES = desktop-client.c desktop-client-main.c eekboard_SOURCES = client.c client-main.c
eekboard_server_CFLAGS = \ eekboard_server_CFLAGS = \
-I$(top_srcdir) \ -I$(top_srcdir) \
...@@ -82,17 +81,6 @@ endif ...@@ -82,17 +81,6 @@ endif
eekboard_server_headers = server-server.h server-context.h eekboard_server_headers = server-server.h server-context.h
eekboard_server_SOURCES = server-server.c server-context.c server-main.c 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 = \ eekboard_xml_CFLAGS = \
-I$(top_srcdir) \ -I$(top_srcdir) \
$(GIO2_CFLAGS) \ $(GIO2_CFLAGS) \
...@@ -125,8 +113,7 @@ eekboard_HEADERS = \ ...@@ -125,8 +113,7 @@ eekboard_HEADERS = \
$(libeekboard_headers) $(libeekboard_headers)
noinst_HEADERS = \ noinst_HEADERS = \
$(eekboard_desktop_client_headers) \ $(eekboard_headers) \
$(eekboard_client_headers) \
$(eekboard_server_headers) \ $(eekboard_server_headers) \
$(eekboard_xml_headers) \ $(eekboard_xml_headers) \
$(libxklutil_la_headers) $(libxklutil_la_headers)
......
...@@ -20,21 +20,27 @@ ...@@ -20,21 +20,27 @@
#endif /* HAVE_CONFIG_H */ #endif /* HAVE_CONFIG_H */
#include <stdlib.h> #include <stdlib.h>
#include <cspi/spi.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <gconf/gconf-client.h>
#include "eekboard/eekboard.h" #include "eekboard/eekboard.h"
#include "client.h"
static gboolean opt_system = FALSE; static gboolean opt_system = FALSE;
static gboolean opt_session = FALSE; static gboolean opt_session = FALSE;
static gchar *opt_address = NULL; static gchar *opt_address = NULL;
static gchar *opt_set_keyboard = NULL; #ifdef HAVE_CSPI
static gint opt_set_group = -1; static gboolean opt_focus = FALSE;
static gboolean opt_show_keyboard = FALSE; static gboolean opt_keystroke = FALSE;
static gboolean opt_hide_keyboard = FALSE; #endif /* HAVE_CSPI */
static gint opt_press_key = -1;
static gint opt_release_key = -1; static gchar *opt_model = NULL;
static gboolean opt_listen = FALSE; static gchar *opt_layouts = NULL;
static gchar *opt_options = NULL;
static gboolean opt_fullscreen = FALSE;
static const GOptionEntry options[] = { static const GOptionEntry options[] = {
{"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system, {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system,
...@@ -43,51 +49,75 @@ static const GOptionEntry options[] = { ...@@ -43,51 +49,75 @@ static const GOptionEntry options[] = {
N_("Connect to the session bus")}, N_("Connect to the session bus")},
{"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address, {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address,
N_("Connect to the given D-Bus address")}, N_("Connect to the given D-Bus address")},
{"set-keyboard", '\0', 0, G_OPTION_ARG_STRING, &opt_set_keyboard, #ifdef HAVE_CSPI
N_("Upload keyboard description from an XML file")}, {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
{"set-group", '\0', 0, G_OPTION_ARG_INT, &opt_set_group, N_("Listen focus change events with AT-SPI")},
N_("Set group of the keyboard")}, {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
{"show-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_show_keyboard, N_("Listen keystroke events with AT-SPI")},
N_("Show keyboard")}, #endif /* HAVE_CSPI */
{"hide-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_hide_keyboard, {"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model,
N_("Hide keyboard")}, N_("Specify model")},
{"press-key", '\0', 0, G_OPTION_ARG_INT, &opt_press_key, {"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts,
N_("Press key")}, N_("Specify layouts")},
{"release-key", '\0', 0, G_OPTION_ARG_INT, &opt_release_key, {"options", '\0', 0, G_OPTION_ARG_STRING, &opt_options,
N_("Release key")}, N_("Specify options")},
{"listen", '\0', 0, G_OPTION_ARG_NONE, &opt_listen, {"fullscreen", 'F', 0, G_OPTION_ARG_NONE, &opt_fullscreen,
N_("Listen events")}, N_("Create window in fullscreen mode")},
{NULL} {NULL}
}; };
static void 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 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 int
main (int argc, char **argv) main (int argc, char **argv)
{ {
EekboardEekboard *eekboard = NULL; EekboardClient *client;
EekboardContext *context = NULL; EekboardEekboard *eekboard;
EekboardContext *context;
GBusType bus_type; GBusType bus_type;
GDBusConnection *connection = NULL; GDBusConnection *connection;
GError *error; GError *error;
GConfClient *gconfc;
GOptionContext *option_context; GOptionContext *option_context;
GMainLoop *loop = NULL; GMainLoop *loop;
gint retval = 0;
g_type_init (); if (!gtk_init_check (&argc, &argv)) {
g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL); 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_add_main_entries (option_context, options, NULL);
g_option_context_parse (option_context, &argc, &argv, NULL); g_option_context_parse (option_context, &argc, &argv, NULL);
g_option_context_free (option_context); g_option_context_free (option_context);
...@@ -128,90 +158,88 @@ main (int argc, char **argv) ...@@ -128,90 +158,88 @@ main (int argc, char **argv)
break; break;
} }
eekboard = eekboard_eekboard_new (connection, NULL); client = eekboard_client_new (connection);
if (eekboard == NULL) { if (client == NULL) {
g_printerr ("Can't create eekboard proxy\n"); g_printerr ("Can't create a client\n");
retval = 1; exit (1);
goto out;
}
context = eekboard_eekboard_create_context (eekboard,
"eekboard-client",