Add XML layout engine (WIP).

This commit is contained in:
Daiki Ueno
2011-01-26 19:24:06 +09:00
parent 0dd37a39b9
commit d29e83e5f6
8 changed files with 65 additions and 28 deletions

View File

@ -87,8 +87,8 @@ AM_CONDITIONAL([HAVE_GTK_3],[test "$with_gtk" = "3.0"])
AM_PATH_GLIB_2_0 AM_PATH_GLIB_2_0
PKG_CHECK_MODULES([GLIB2], [glib-2.0], , PKG_CHECK_MODULES([GLIB2], [glib-2.0], ,
[AC_MSG_ERROR([GLib2 not found])]) [AC_MSG_ERROR([GLib2 not found])])
PKG_CHECK_MODULES([GOBJECT2], [gobject-2.0], , PKG_CHECK_MODULES([GIO2], [gio-2.0], ,
[AC_MSG_ERROR([GObject2 not found])]) [AC_MSG_ERROR([Gio2 not found])])
PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo], , PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo], ,
[AC_MSG_ERROR([PangoCairo not found])]) [AC_MSG_ERROR([PangoCairo not found])])
PKG_CHECK_MODULES([GTK], [ PKG_CHECK_MODULES([GTK], [

View File

@ -102,12 +102,12 @@ expand_content_files=eek-overview.xml
# signals and properties. # signals and properties.
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
GTKDOC_CFLAGS = $(GOBJECT2_CFLAGS) GTKDOC_CFLAGS = $(GIO2_CFLAGS)
GTKDOC_LIBS = $(top_srcdir)/eek/libeek.la \ GTKDOC_LIBS = $(top_srcdir)/eek/libeek.la \
$(top_srcdir)/eek/libeek-gtk.la \ $(top_srcdir)/eek/libeek-gtk.la \
$(top_srcdir)/eek/libeek-xkb.la \ $(top_srcdir)/eek/libeek-xkb.la \
$(top_srcdir)/eek/libeek-xkl.la \ $(top_srcdir)/eek/libeek-xkl.la \
$(GOBJECT2_LIBS) \ $(GIO2_LIBS) \
$(XKB_LIBS) $(XKB_LIBS)
if HAVE_CLUTTER if HAVE_CLUTTER

View File

@ -35,8 +35,17 @@ libeek_public_headers = \
$(srcdir)/eek-key.h \ $(srcdir)/eek-key.h \
$(srcdir)/eek-types.h \ $(srcdir)/eek-types.h \
$(srcdir)/eek-keysym.h \ $(srcdir)/eek-keysym.h \
$(srcdir)/eek-xml.h \
$(srcdir)/eek.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 = \ libeek_sources = \
$(srcdir)/eek-layout.c \ $(srcdir)/eek-layout.c \
$(srcdir)/eek-element.c \ $(srcdir)/eek-element.c \
@ -46,6 +55,8 @@ libeek_sources = \
$(srcdir)/eek-key.c \ $(srcdir)/eek-key.c \
$(srcdir)/eek-types.c \ $(srcdir)/eek-types.c \
$(srcdir)/eek-keysym.c \ $(srcdir)/eek-keysym.c \
$(srcdir)/eek-xml.c \
$(srcdir)/eek-xml-layout.c \
$(srcdir)/eek-renderer.c \ $(srcdir)/eek-renderer.c \
$(srcdir)/eek-keyboard-drawing.c $(srcdir)/eek-keyboard-drawing.c
@ -62,13 +73,6 @@ libeek_marshallers_sources = \
$(srcdir)/eek-marshallers.c \ $(srcdir)/eek-marshallers.c \
$(srcdir)/eek-marshallers.h $(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 = \ BUILT_SOURCES = \
$(libeek_keysym_sources) \ $(libeek_keysym_sources) \
$(libeek_marshallers_sources) $(libeek_marshallers_sources)
@ -77,8 +81,8 @@ libeek_la_SOURCES = \
$(libeek_sources) \ $(libeek_sources) \
$(srcdir)/eek-marshallers.c $(srcdir)/eek-marshallers.c
libeek_la_CFLAGS = $(GOBJECT2_CFLAGS) $(PANGOCAIRO_CFLAGS) libeek_la_CFLAGS = $(GIO2_CFLAGS) $(PANGOCAIRO_CFLAGS)
libeek_la_LIBADD = $(GOBJECT2_LIBS) $(PANGOCAIRO_LIBS) -lm libeek_la_LIBADD = $(GIO2_LIBS) $(PANGOCAIRO_LIBS) -lm
if HAVE_CLUTTER if HAVE_CLUTTER
libeek_clutter_public_headers = \ libeek_clutter_public_headers = \
@ -198,7 +202,7 @@ if HAVE_INTROSPECTION
Eek@EEK_LIBRARY_SUFFIX@.gir: libeek.la 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_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_CFLAGS = $(libeek_la_CFLAGS)
Eek@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek.la Eek@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek.la
Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_sources) $(libeek_public_headers) Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_sources) $(libeek_public_headers)

View File

@ -83,9 +83,12 @@ validate (const gchar *element_name,
{ {
gint i; gint i;
gchar *element_path; 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++) { for (i = 0; i < G_N_ELEMENTS(valid_path_list); i++) {
if (*valid_path_list[i] == '@') if (*valid_path_list[i] == '@')
continue; continue;
@ -163,11 +166,11 @@ end_element_callback (GMarkupParseContext *pcontext,
GError **error) GError **error)
{ {
ParseCallbackData *data = user_data; ParseCallbackData *data = user_data;
GSList *head = data->element_stack;
g_free (data->element_stack->data); g_free (head->data);
data->element_stack = g_slist_remove_link (data->element_stack, data->element_stack = g_slist_next (data->element_stack);
data->element_stack); g_slist_free1 (head);
g_slist_free1 (data->element_stack);
} }
static void static void

View File

@ -25,5 +25,6 @@
#include "eek-key.h" #include "eek-key.h"
#include "eek-layout.h" #include "eek-layout.h"
#include "eek-keysym.h" #include "eek-keysym.h"
#include "eek-xml.h"
#endif /* EEK_H */ #endif /* EEK_H */

View File

@ -20,7 +20,7 @@ if ENABLE_EEKBOARD
bin_PROGRAMS = eekboard bin_PROGRAMS = eekboard
eekboard_CFLAGS = \ eekboard_CFLAGS = \
-I$(top_srcdir) \ -I$(top_srcdir) \
$(GOBJECT2_CFLAGS) \ $(GIO2_CFLAGS) \
$(GTK_CFLAGS) \ $(GTK_CFLAGS) \
$(GCONF2_CFLAGS) \ $(GCONF2_CFLAGS) \
$(XKB_CFLAGS) \ $(XKB_CFLAGS) \
@ -33,7 +33,7 @@ eekboard_LDFLAGS = \
$(top_builddir)/eek/libeek.la \ $(top_builddir)/eek/libeek.la \
$(top_builddir)/eek/libeek-xkl.la \ $(top_builddir)/eek/libeek-xkl.la \
$(top_builddir)/eek/libeek-gtk.la \ $(top_builddir)/eek/libeek-gtk.la \
$(GOBJECT2_LIBS) \ $(GIO2_LIBS) \
$(GTK_LIBS) \ $(GTK_LIBS) \
$(GCONF2_LIBS) \ $(GCONF2_LIBS) \
$(XKB_LIBS) \ $(XKB_LIBS) \

View File

@ -209,6 +209,7 @@ static gboolean opt_version = FALSE;
static gboolean opt_popup = FALSE; static gboolean opt_popup = FALSE;
static gchar *opt_config = NULL; static gchar *opt_config = NULL;
static gboolean opt_fullscreen = FALSE; static gboolean opt_fullscreen = FALSE;
static gboolean opt_xml = FALSE;
static const GOptionEntry options[] = { static const GOptionEntry options[] = {
{"model", 'M', 0, G_OPTION_ARG_STRING, &opt_model, {"model", 'M', 0, G_OPTION_ARG_STRING, &opt_model,
@ -229,6 +230,8 @@ static const GOptionEntry options[] = {
N_("Start in fullscreen mode")}, N_("Start in fullscreen mode")},
{"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config, {"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config,
N_("Specify configuration file")}, 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, {"version", 'v', 0, G_OPTION_ARG_NONE, &opt_version,
N_("Display version")}, N_("Display version")},
{NULL} {NULL}
@ -1024,6 +1027,22 @@ on_allocation_changed (ClutterActor *stage,
} }
#endif #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 * static GtkWidget *
create_widget (Eekboard *eekboard, create_widget (Eekboard *eekboard,
gint initial_width, gint initial_width,
@ -1035,11 +1054,9 @@ create_widget (Eekboard *eekboard,
#endif #endif
EekBounds bounds; EekBounds bounds;
eekboard->keyboard = eek_keyboard_new (eekboard->layout, eekboard->keyboard = create_keyboard (eekboard,
initial_width, initial_width,
initial_height); initial_height);
eek_keyboard_set_modifier_behavior (eekboard->keyboard,
EEK_MODIFIER_BEHAVIOR_LATCH);
eekboard->on_key_pressed_id = eekboard->on_key_pressed_id =
g_signal_connect (eekboard->keyboard, "key-pressed", g_signal_connect (eekboard->keyboard, "key-pressed",
G_CALLBACK(on_key_pressed), eekboard); 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); eek_xkl_layout_set_options (EEK_XKL_LAYOUT(eekboard->layout), options);
g_strfreev (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_signal_connect (eekboard->layout, "changed",
G_CALLBACK(on_changed), eekboard); G_CALLBACK(on_changed), eekboard);

View File

@ -16,7 +16,7 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301 USA # 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 TESTS = eek-simple-test eek-xkb-test
noinst_PROGRAMS = $(TESTS) noinst_PROGRAMS = $(TESTS)