From d29e83e5f6ab1e5bb83e14a08c75fb308df02049 Mon Sep 17 00:00:00 2001 From: Daiki Ueno Date: Wed, 26 Jan 2011 19:24:06 +0900 Subject: [PATCH] Add XML layout engine (WIP). --- configure.ac | 4 ++-- docs/reference/eek/Makefile.am | 4 ++-- eek/Makefile.am | 24 ++++++++++++--------- eek/eek-xml-layout.c | 15 +++++++------ eek/eek.h | 1 + src/Makefile.am | 4 ++-- src/eekboard.c | 39 +++++++++++++++++++++++++++++----- tests/Makefile.am | 2 +- 8 files changed, 65 insertions(+), 28 deletions(-) diff --git a/configure.ac b/configure.ac index e6d87bfc..89cb0a33 100644 --- a/configure.ac +++ b/configure.ac @@ -87,8 +87,8 @@ AM_CONDITIONAL([HAVE_GTK_3],[test "$with_gtk" = "3.0"]) AM_PATH_GLIB_2_0 PKG_CHECK_MODULES([GLIB2], [glib-2.0], , [AC_MSG_ERROR([GLib2 not found])]) -PKG_CHECK_MODULES([GOBJECT2], [gobject-2.0], , - [AC_MSG_ERROR([GObject2 not found])]) +PKG_CHECK_MODULES([GIO2], [gio-2.0], , + [AC_MSG_ERROR([Gio2 not found])]) PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo], , [AC_MSG_ERROR([PangoCairo not found])]) PKG_CHECK_MODULES([GTK], [ diff --git a/docs/reference/eek/Makefile.am b/docs/reference/eek/Makefile.am index 3f0034a0..9b9f945d 100644 --- a/docs/reference/eek/Makefile.am +++ b/docs/reference/eek/Makefile.am @@ -102,12 +102,12 @@ expand_content_files=eek-overview.xml # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) -GTKDOC_CFLAGS = $(GOBJECT2_CFLAGS) +GTKDOC_CFLAGS = $(GIO2_CFLAGS) GTKDOC_LIBS = $(top_srcdir)/eek/libeek.la \ $(top_srcdir)/eek/libeek-gtk.la \ $(top_srcdir)/eek/libeek-xkb.la \ $(top_srcdir)/eek/libeek-xkl.la \ - $(GOBJECT2_LIBS) \ + $(GIO2_LIBS) \ $(XKB_LIBS) if HAVE_CLUTTER diff --git a/eek/Makefile.am b/eek/Makefile.am index a67bd345..6bfd6d26 100644 --- a/eek/Makefile.am +++ b/eek/Makefile.am @@ -35,8 +35,17 @@ libeek_public_headers = \ $(srcdir)/eek-key.h \ $(srcdir)/eek-types.h \ $(srcdir)/eek-keysym.h \ + $(srcdir)/eek-xml.h \ $(srcdir)/eek.h +libeek_private_headers = \ + $(srcdir)/eek-renderer.h \ + $(srcdir)/eek-xml-layout.h \ + $(srcdir)/eek-special-keysym-labels.h \ + $(srcdir)/eek-unicode-keysym-labels.h \ + $(srcdir)/eek-keyname-keysym-labels.h \ + $(srcdir)/eek-marshallers.h + libeek_sources = \ $(srcdir)/eek-layout.c \ $(srcdir)/eek-element.c \ @@ -46,6 +55,8 @@ libeek_sources = \ $(srcdir)/eek-key.c \ $(srcdir)/eek-types.c \ $(srcdir)/eek-keysym.c \ + $(srcdir)/eek-xml.c \ + $(srcdir)/eek-xml-layout.c \ $(srcdir)/eek-renderer.c \ $(srcdir)/eek-keyboard-drawing.c @@ -62,13 +73,6 @@ libeek_marshallers_sources = \ $(srcdir)/eek-marshallers.c \ $(srcdir)/eek-marshallers.h -libeek_private_headers = \ - $(srcdir)/eek-renderer.h \ - $(srcdir)/eek-special-keysym-labels.h \ - $(srcdir)/eek-unicode-keysym-labels.h \ - $(srcdir)/eek-keyname-keysym-labels.h \ - $(srcdir)/eek-marshallers.h - BUILT_SOURCES = \ $(libeek_keysym_sources) \ $(libeek_marshallers_sources) @@ -77,8 +81,8 @@ libeek_la_SOURCES = \ $(libeek_sources) \ $(srcdir)/eek-marshallers.c -libeek_la_CFLAGS = $(GOBJECT2_CFLAGS) $(PANGOCAIRO_CFLAGS) -libeek_la_LIBADD = $(GOBJECT2_LIBS) $(PANGOCAIRO_LIBS) -lm +libeek_la_CFLAGS = $(GIO2_CFLAGS) $(PANGOCAIRO_CFLAGS) +libeek_la_LIBADD = $(GIO2_LIBS) $(PANGOCAIRO_LIBS) -lm if HAVE_CLUTTER libeek_clutter_public_headers = \ @@ -198,7 +202,7 @@ if HAVE_INTROSPECTION Eek@EEK_LIBRARY_SUFFIX@.gir: libeek.la Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --strip-prefix=Eek --pkg=glib-2.0 -Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 +Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gio-2.0 Eek@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_la_CFLAGS) Eek@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek.la Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_sources) $(libeek_public_headers) diff --git a/eek/eek-xml-layout.c b/eek/eek-xml-layout.c index b9c5f060..795deb97 100644 --- a/eek/eek-xml-layout.c +++ b/eek/eek-xml-layout.c @@ -83,9 +83,12 @@ validate (const gchar *element_name, { gint i; gchar *element_path; + GSList *head; + + head = g_slist_prepend (element_stack, element_name); + element_path = join_element_names (head); + g_slist_free1 (head); - element_stack = g_slist_prepend (element_stack, element_name); - element_path = join_element_names (element_stack); for (i = 0; i < G_N_ELEMENTS(valid_path_list); i++) { if (*valid_path_list[i] == '@') continue; @@ -163,11 +166,11 @@ end_element_callback (GMarkupParseContext *pcontext, GError **error) { ParseCallbackData *data = user_data; + GSList *head = data->element_stack; - g_free (data->element_stack->data); - data->element_stack = g_slist_remove_link (data->element_stack, - data->element_stack); - g_slist_free1 (data->element_stack); + g_free (head->data); + data->element_stack = g_slist_next (data->element_stack); + g_slist_free1 (head); } static void diff --git a/eek/eek.h b/eek/eek.h index 021eb0a7..f7a27619 100644 --- a/eek/eek.h +++ b/eek/eek.h @@ -25,5 +25,6 @@ #include "eek-key.h" #include "eek-layout.h" #include "eek-keysym.h" +#include "eek-xml.h" #endif /* EEK_H */ diff --git a/src/Makefile.am b/src/Makefile.am index ffc14b82..15541790 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -20,7 +20,7 @@ if ENABLE_EEKBOARD bin_PROGRAMS = eekboard eekboard_CFLAGS = \ -I$(top_srcdir) \ - $(GOBJECT2_CFLAGS) \ + $(GIO2_CFLAGS) \ $(GTK_CFLAGS) \ $(GCONF2_CFLAGS) \ $(XKB_CFLAGS) \ @@ -33,7 +33,7 @@ eekboard_LDFLAGS = \ $(top_builddir)/eek/libeek.la \ $(top_builddir)/eek/libeek-xkl.la \ $(top_builddir)/eek/libeek-gtk.la \ - $(GOBJECT2_LIBS) \ + $(GIO2_LIBS) \ $(GTK_LIBS) \ $(GCONF2_LIBS) \ $(XKB_LIBS) \ diff --git a/src/eekboard.c b/src/eekboard.c index e623c5b4..1f1837cd 100644 --- a/src/eekboard.c +++ b/src/eekboard.c @@ -209,6 +209,7 @@ static gboolean opt_version = FALSE; static gboolean opt_popup = FALSE; static gchar *opt_config = NULL; static gboolean opt_fullscreen = FALSE; +static gboolean opt_xml = FALSE; static const GOptionEntry options[] = { {"model", 'M', 0, G_OPTION_ARG_STRING, &opt_model, @@ -229,6 +230,8 @@ static const GOptionEntry options[] = { N_("Start in fullscreen mode")}, {"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config, N_("Specify configuration file")}, + {"xml", '\0', 0, G_OPTION_ARG_NONE, &opt_xml, + N_("Dump the keyboard in XML")}, {"version", 'v', 0, G_OPTION_ARG_NONE, &opt_version, N_("Display version")}, {NULL} @@ -1024,6 +1027,22 @@ on_allocation_changed (ClutterActor *stage, } #endif +static EekKeyboard * +create_keyboard (Eekboard *eekboard, + gint initial_width, + gint initial_height) +{ + EekKeyboard *keyboard; + + keyboard = eek_keyboard_new (eekboard->layout, + initial_width, + initial_height); + eek_keyboard_set_modifier_behavior (keyboard, + EEK_MODIFIER_BEHAVIOR_LATCH); + + return keyboard; +} + static GtkWidget * create_widget (Eekboard *eekboard, gint initial_width, @@ -1035,11 +1054,9 @@ create_widget (Eekboard *eekboard, #endif EekBounds bounds; - eekboard->keyboard = eek_keyboard_new (eekboard->layout, - initial_width, - initial_height); - eek_keyboard_set_modifier_behavior (eekboard->keyboard, - EEK_MODIFIER_BEHAVIOR_LATCH); + eekboard->keyboard = create_keyboard (eekboard, + initial_width, + initial_height); eekboard->on_key_pressed_id = g_signal_connect (eekboard->keyboard, "key-pressed", G_CALLBACK(on_key_pressed), eekboard); @@ -1175,6 +1192,18 @@ eekboard_new (gboolean accessibility_enabled) eek_xkl_layout_set_options (EEK_XKL_LAYOUT(eekboard->layout), options); g_strfreev (options); } + if (opt_xml) { + EekKeyboard *keyboard; + GString *output; + + output = g_string_sized_new (BUFSIZ); + keyboard = create_keyboard (eekboard, CSW, CSH); + eek_keyboard_output (keyboard, output, 0); + fwrite (output->str, output->len, 1, stdout); + g_string_free (output, TRUE); + + exit (0); + } g_signal_connect (eekboard->layout, "changed", G_CALLBACK(on_changed), eekboard); diff --git a/tests/Makefile.am b/tests/Makefile.am index 4f555291..f806522f 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -16,7 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA -INCLUDES = -I$(top_srcdir) $(GOBJECT2_CFLAGS) $(GTK_CFLAGS) $(XKB_CFLAGS) +INCLUDES = -I$(top_srcdir) $(GIO2_CFLAGS) $(GTK_CFLAGS) $(XKB_CFLAGS) TESTS = eek-simple-test eek-xkb-test noinst_PROGRAMS = $(TESTS)