Compare commits
	
		
			3 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 2c302320f6 | |||
| 5230171d47 | |||
| 436740b64a | 
@ -25,20 +25,16 @@ dist_vapi_DATA =				\
 | 
			
		||||
	eek-$(EEK_API_VERSION).deps		\
 | 
			
		||||
	eek-gtk-$(EEK_API_VERSION).vapi		\
 | 
			
		||||
	eek-gtk-$(EEK_API_VERSION).deps		\
 | 
			
		||||
	eek-xkl-$(EEK_API_VERSION).vapi		\
 | 
			
		||||
	eek-xkl-$(EEK_API_VERSION).deps		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST =					\
 | 
			
		||||
	Eek-$(EEK_API_VERSION).metadata		\
 | 
			
		||||
	EekGtk-$(EEK_API_VERSION).metadata	\
 | 
			
		||||
	EekXkl-$(EEK_API_VERSION).metadata	\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
GITIGNOREFILES = \
 | 
			
		||||
	eek-$(EEK_API_VERSION).vapi		\
 | 
			
		||||
	eek-gtk-$(EEK_API_VERSION).vapi		\
 | 
			
		||||
	eek-xkl-$(EEK_API_VERSION).vapi		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local:
 | 
			
		||||
@ -72,20 +68,20 @@ eek-gtk-$(EEK_API_VERSION).vapi: $(eek_gtk_vapi_deps)
 | 
			
		||||
		--metadatadir=$(srcdir)	\
 | 
			
		||||
		$(top_builddir)/eek/EekGtk-$(EEK_API_VERSION).gir
 | 
			
		||||
 | 
			
		||||
eek_xkl_vapi_deps =						\
 | 
			
		||||
	$(srcdir)/EekXkl-$(EEK_API_VERSION).metadata		\
 | 
			
		||||
	|							\
 | 
			
		||||
	$(top_builddir)/eek/EekXkl-$(EEK_API_VERSION).gir	\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
eek-xkl-$(EEK_API_VERSION).vapi: $(eek_xkl_vapi_deps)
 | 
			
		||||
	$(VAPIGEN_V)$(VAPIGEN) \
 | 
			
		||||
		--vapidir=$(builddir) \
 | 
			
		||||
		--library eek-xkl-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg gio-2.0 \
 | 
			
		||||
		--metadatadir=$(srcdir) \
 | 
			
		||||
		$(top_builddir)/eek/EekXkl-$(EEK_API_VERSION).gir
 | 
			
		||||
# eek_xkl_vapi_deps =						\
 | 
			
		||||
# 	$(srcdir)/EekXkl-$(EEK_API_VERSION).metadata		\
 | 
			
		||||
# 	|							\
 | 
			
		||||
# 	$(top_builddir)/eek/EekXkl-$(EEK_API_VERSION).gir	\
 | 
			
		||||
# 	$(NULL)
 | 
			
		||||
# 
 | 
			
		||||
# eek-xkl-$(EEK_API_VERSION).vapi: $(eek_xkl_vapi_deps)
 | 
			
		||||
# 	$(VAPIGEN_V)$(VAPIGEN) \
 | 
			
		||||
# 		--vapidir=$(builddir) \
 | 
			
		||||
# 		--library eek-xkl-$(EEK_API_VERSION) \
 | 
			
		||||
# 		--pkg eek-$(EEK_API_VERSION) \
 | 
			
		||||
# 		--pkg gio-2.0 \
 | 
			
		||||
# 		--metadatadir=$(srcdir) \
 | 
			
		||||
# 		$(top_builddir)/eek/EekXkl-$(EEK_API_VERSION).gir
 | 
			
		||||
 | 
			
		||||
# set up the verbosity rules to avoid some build noise
 | 
			
		||||
VAPIGEN_V = $(VAPIGEN_V_$(V))
 | 
			
		||||
 | 
			
		||||
@ -225,7 +225,6 @@ examples/Makefile
 | 
			
		||||
examples/simple-client/Makefile
 | 
			
		||||
eek/eek-${EEK_API_VERSION}.pc
 | 
			
		||||
eek/eek-gtk-${EEK_API_VERSION}.pc
 | 
			
		||||
eek/eek-xkl-${EEK_API_VERSION}.pc
 | 
			
		||||
eekboard/eekboard-${EEK_API_VERSION}.pc])
 | 
			
		||||
AC_OUTPUT
 | 
			
		||||
AC_MSG_RESULT([
 | 
			
		||||
 | 
			
		||||
@ -105,7 +105,6 @@ expand_content_files=eek-overview.xml
 | 
			
		||||
GTKDOC_CFLAGS = $(GIO2_CFLAGS)
 | 
			
		||||
GTKDOC_LIBS = $(top_builddir)/eek/libeek.la \
 | 
			
		||||
	$(top_builddir)/eek/libeek-gtk.la \
 | 
			
		||||
	$(top_builddir)/eek/libeek-xkl.la \
 | 
			
		||||
	$(GIO2_LIBS) \
 | 
			
		||||
	$(GTK_LIBS) \
 | 
			
		||||
	$(LIBXKLAVIER_LIBS)
 | 
			
		||||
 | 
			
		||||
@ -21,7 +21,6 @@ NULL =
 | 
			
		||||
lib_LTLIBRARIES =				\
 | 
			
		||||
	libeek.la				\
 | 
			
		||||
	libeek-gtk.la				\
 | 
			
		||||
	libeek-xkl.la				\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
libeek_public_headers =				\
 | 
			
		||||
@ -134,34 +133,32 @@ libeek_gtk_la_SOURCES = $(libeek_gtk_sources)
 | 
			
		||||
libeek_gtk_la_CFLAGS = -DEEK_COMPILATION=1 $(GTK_CFLAGS) $(LIBCANBERRA_CFLAGS)
 | 
			
		||||
libeek_gtk_la_LIBADD = libeek.la $(GTK_LIBS) $(LIBCANBERRA_LIBS)
 | 
			
		||||
 | 
			
		||||
libeek_xkl_public_headers =			\
 | 
			
		||||
	$(srcdir)/eek-xkl-layout.h		\
 | 
			
		||||
	$(srcdir)/eek-xkl.h			\
 | 
			
		||||
	$(srcdir)/eek-xkb-layout.h		\
 | 
			
		||||
	$(srcdir)/eek-xkb.h			\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
libeek_xkl_sources =				\
 | 
			
		||||
	$(srcdir)/eek-xkb-layout.c		\
 | 
			
		||||
	$(srcdir)/eek-xkl-layout.c		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
libeek_xkl_la_SOURCES = $(libeek_xkl_sources)
 | 
			
		||||
libeek_xkl_la_CFLAGS = -DEEK_COMPILATION=1 $(LIBXKLAVIER_CFLAGS)
 | 
			
		||||
libeek_xkl_la_LIBADD = libeek.la $(LIBXKLAVIER_LIBS)
 | 
			
		||||
# libeek_xkl_public_headers =			\
 | 
			
		||||
# 	$(srcdir)/eek-xkl-layout.h		\
 | 
			
		||||
# 	$(srcdir)/eek-xkl.h			\
 | 
			
		||||
# 	$(srcdir)/eek-xkb-layout.h		\
 | 
			
		||||
# 	$(srcdir)/eek-xkb.h			\
 | 
			
		||||
# 	$(NULL)
 | 
			
		||||
# 
 | 
			
		||||
# libeek_xkl_sources =				\
 | 
			
		||||
# 	$(srcdir)/eek-xkb-layout.c		\
 | 
			
		||||
# 	$(srcdir)/eek-xkl-layout.c		\
 | 
			
		||||
# 	$(NULL)
 | 
			
		||||
# 
 | 
			
		||||
# libeek_xkl_la_SOURCES = $(libeek_xkl_sources)
 | 
			
		||||
# libeek_xkl_la_CFLAGS = -DEEK_COMPILATION=1 $(LIBXKLAVIER_CFLAGS)
 | 
			
		||||
# libeek_xkl_la_LIBADD = libeek.la $(LIBXKLAVIER_LIBS)
 | 
			
		||||
 | 
			
		||||
eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek
 | 
			
		||||
eek_HEADERS =					\
 | 
			
		||||
	$(libeek_public_headers)		\
 | 
			
		||||
	$(builddir)/eek-enumtypes.h		\
 | 
			
		||||
	$(libeek_gtk_public_headers)		\
 | 
			
		||||
	$(libeek_xkl_public_headers)		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
noinst_HEADERS =				\
 | 
			
		||||
	$(libeek_private_headers)		\
 | 
			
		||||
	$(libeek_gtk_private_headers)		\
 | 
			
		||||
	$(libeek_xkl_private_headers)		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
eek-special-keysym-entries.h: special-keysym-entries.txt
 | 
			
		||||
@ -206,7 +203,6 @@ pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA =				\
 | 
			
		||||
	eek-$(EEK_API_VERSION).pc		\
 | 
			
		||||
	eek-gtk-$(EEK_API_VERSION).pc		\
 | 
			
		||||
	eek-xkl-$(EEK_API_VERSION).pc		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
CLEANFILES =
 | 
			
		||||
@ -267,23 +263,22 @@ EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_FILES =	\
 | 
			
		||||
	$(libeek_gtk_public_headers)		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
EekXkl@EEK_LIBRARY_SUFFIX@.gir: libeek-xkl.la Eek@EEK_LIBRARY_SUFFIX@.gir
 | 
			
		||||
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = \
 | 
			
		||||
	--identifier-prefix=Eek			\
 | 
			
		||||
	--symbol-prefix=eek			\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Eek@EEK_LIBRARY_SUFFIX@
 | 
			
		||||
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkl_la_CFLAGS)
 | 
			
		||||
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkl.la
 | 
			
		||||
EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_FILES =	\
 | 
			
		||||
	$(libeek_xkl_sources)			\
 | 
			
		||||
	$(libeek_xkl_public_headers)		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
# EekXkl@EEK_LIBRARY_SUFFIX@.gir: libeek-xkl.la Eek@EEK_LIBRARY_SUFFIX@.gir
 | 
			
		||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = \
 | 
			
		||||
# 	--identifier-prefix=Eek			\
 | 
			
		||||
# 	--symbol-prefix=eek			\
 | 
			
		||||
# 	$(NULL)
 | 
			
		||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Eek@EEK_LIBRARY_SUFFIX@
 | 
			
		||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_xkl_la_CFLAGS)
 | 
			
		||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-xkl.la
 | 
			
		||||
# EekXkl@EEK_LIBRARY_SUFFIX_U@_gir_FILES =	\
 | 
			
		||||
# 	$(libeek_xkl_sources)			\
 | 
			
		||||
# 	$(libeek_xkl_public_headers)		\
 | 
			
		||||
# 	$(NULL)
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_GIRS +=				\
 | 
			
		||||
	Eek@EEK_LIBRARY_SUFFIX@.gir		\
 | 
			
		||||
	EekGtk@EEK_LIBRARY_SUFFIX@.gir		\
 | 
			
		||||
	EekXkl@EEK_LIBRARY_SUFFIX@.gir		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
girdir = $(datadir)/gir-1.0
 | 
			
		||||
 | 
			
		||||
@ -25,7 +25,7 @@
 | 
			
		||||
#ifndef EEK_KEYSYM_H
 | 
			
		||||
#define EEK_KEYSYM_H 1
 | 
			
		||||
 | 
			
		||||
#include <X11/XKBlib.h>
 | 
			
		||||
//#include <X11/XKBlib.h>   //luci
 | 
			
		||||
#include "eek-symbol.h"
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
@ -16,15 +16,15 @@
 | 
			
		||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
# 02110-1301 USA
 | 
			
		||||
 | 
			
		||||
prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@
 | 
			
		||||
includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: libeek-xkl
 | 
			
		||||
Description: A Library to Create Keyboard-like UI (Libxklavier Support)
 | 
			
		||||
URL: http://fedorahosted.org/eekboard/
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Requires: eek-@EEK_API_VERSION@ libxklavier
 | 
			
		||||
Libs: -L${libdir} -leek-xkl
 | 
			
		||||
Cflags: -I${includedir}/eek-@EEK_API_VERSION@
 | 
			
		||||
# prefix=@prefix@
 | 
			
		||||
# exec_prefix=@exec_prefix@
 | 
			
		||||
# libdir=@libdir@
 | 
			
		||||
# includedir=@includedir@
 | 
			
		||||
# 
 | 
			
		||||
# Name: libeek-xkb
 | 
			
		||||
# Description: A Library to Create Keyboard-like UI (XKB Support)
 | 
			
		||||
# URL: http://fedorahosted.org/eekboard/
 | 
			
		||||
# Version: @VERSION@
 | 
			
		||||
# Requires: eek-@EEK_API_VERSION@ gtk+-x11-@GTK_API_VERSION@
 | 
			
		||||
# Libs: -L${libdir} -leek-xkb
 | 
			
		||||
# Cflags: -I${includedir}/eek-@EEK_API_VERSION@
 | 
			
		||||
							
								
								
									
										679
									
								
								eek/eek-wkb-layout.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										679
									
								
								eek/eek-wkb-layout.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,679 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2006 Sergey V. Udaltsov <svu@gnome.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2 of
 | 
			
		||||
 * the License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library 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
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:eek-xkb-layout
 | 
			
		||||
 * @short_description: Layout engine using XKB configuration
 | 
			
		||||
 *
 | 
			
		||||
 * The #EekXkbLayout inherits #EekLayout class and arranges keyboard
 | 
			
		||||
 * elements using XKB.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// #ifdef HAVE_CONFIG_H
 | 
			
		||||
// #include "config.h"
 | 
			
		||||
// #endif  /* HAVE_CONFIG_H */
 | 
			
		||||
// 
 | 
			
		||||
// #include <X11/keysym.h>
 | 
			
		||||
// #include <X11/XKBlib.h>
 | 
			
		||||
// #include <X11/extensions/XKBgeom.h>
 | 
			
		||||
// #include <string.h>
 | 
			
		||||
// #include <stdarg.h>
 | 
			
		||||
// #include <gio/gio.h>
 | 
			
		||||
// 
 | 
			
		||||
// #include "eek-xkb-layout.h"
 | 
			
		||||
// #include "eek-keyboard.h"
 | 
			
		||||
// #include "eek-section.h"
 | 
			
		||||
// #include "eek-key.h"
 | 
			
		||||
// #include "eek-keysym.h"
 | 
			
		||||
// 
 | 
			
		||||
// #define XKB_COMPONENT_MASK (XkbGBN_GeometryMask |       \
 | 
			
		||||
//                             XkbGBN_KeyNamesMask |       \
 | 
			
		||||
//                             XkbGBN_OtherNamesMask |     \
 | 
			
		||||
//                             XkbGBN_SymbolsMask |        \
 | 
			
		||||
//                             XkbGBN_IndicatorMapMask)
 | 
			
		||||
// 
 | 
			
		||||
// static void initable_iface_init (GInitableIface *initable_iface);
 | 
			
		||||
// 
 | 
			
		||||
// G_DEFINE_TYPE_WITH_CODE (EekXkbLayout, eek_xkb_layout, EEK_TYPE_LAYOUT,
 | 
			
		||||
//                          G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
 | 
			
		||||
//                                                 initable_iface_init));
 | 
			
		||||
// 
 | 
			
		||||
// #define EEK_XKB_LAYOUT_GET_PRIVATE(obj)                                  \
 | 
			
		||||
//     (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutPrivate))
 | 
			
		||||
// 
 | 
			
		||||
// enum {
 | 
			
		||||
//     PROP_0,
 | 
			
		||||
//     PROP_DISPLAY,
 | 
			
		||||
//     PROP_LAST
 | 
			
		||||
// };
 | 
			
		||||
// 
 | 
			
		||||
// struct _EekXkbLayoutPrivate
 | 
			
		||||
// {
 | 
			
		||||
//     /* Configuration names that should synch'ed to the symbolic names
 | 
			
		||||
//        in priv->xkb->names.  Since we use GLib's memory allocator,
 | 
			
		||||
//        don't store any address returned from the X server here. */
 | 
			
		||||
//     XkbComponentNamesRec names;
 | 
			
		||||
// 
 | 
			
		||||
//     Display *display;
 | 
			
		||||
// 
 | 
			
		||||
//     /* Actual XKB configuration of DISPLAY. */
 | 
			
		||||
//     XkbDescRec *xkb;
 | 
			
		||||
// 
 | 
			
		||||
//     /* Hash table to cache orefs by shape address. */
 | 
			
		||||
//     GHashTable *shape_oref_hash;
 | 
			
		||||
// 
 | 
			
		||||
//     gint scale_numerator;
 | 
			
		||||
//     gint scale_denominator;
 | 
			
		||||
// };
 | 
			
		||||
// 
 | 
			
		||||
// static guint    find_keycode             (EekXkbLayout *layout,
 | 
			
		||||
//                                           gchar        *key_name);
 | 
			
		||||
// 
 | 
			
		||||
// static gboolean get_keyboard_from_server (EekXkbLayout *layout,
 | 
			
		||||
//                                           GError      **error);
 | 
			
		||||
// 
 | 
			
		||||
// static gboolean get_names_from_server    (EekXkbLayout *layout,
 | 
			
		||||
//                                           GError      **error);
 | 
			
		||||
// 
 | 
			
		||||
// static void     setup_scaling            (EekXkbLayout *layout,
 | 
			
		||||
//                                           gdouble       width,
 | 
			
		||||
//                                           gdouble       height);
 | 
			
		||||
// 
 | 
			
		||||
// G_INLINE_FUNC gint
 | 
			
		||||
// xkb_to_pixmap_coord (EekXkbLayout *layout,
 | 
			
		||||
//                      gint          n)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
//     return n * priv->scale_numerator / priv->scale_denominator;
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// G_INLINE_FUNC gdouble
 | 
			
		||||
// xkb_to_pixmap_double (EekXkbLayout *layout,
 | 
			
		||||
//                      gdouble       d)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
//     return d * priv->scale_numerator / priv->scale_denominator;
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void
 | 
			
		||||
// create_key (EekXkbLayout *layout,
 | 
			
		||||
//             EekKeyboard  *keyboard,
 | 
			
		||||
//             EekSection   *section,
 | 
			
		||||
//             gint          column,
 | 
			
		||||
//             gint          row,
 | 
			
		||||
//             gdouble       x,
 | 
			
		||||
//             gdouble       y,
 | 
			
		||||
//             XkbKeyRec    *xkbkey)
 | 
			
		||||
// {
 | 
			
		||||
//     XkbGeometryRec *xkbgeometry;
 | 
			
		||||
//     XkbBoundsRec *xkbbounds;
 | 
			
		||||
//     XkbShapeRec *xkbshape;
 | 
			
		||||
//     XkbOutlineRec *xkboutline;
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
//     EekKey *key;
 | 
			
		||||
//     EekBounds bounds;
 | 
			
		||||
//     EekSymbolMatrix *matrix = NULL;
 | 
			
		||||
//     gchar name[XkbKeyNameLength + 1];
 | 
			
		||||
//     KeyCode keycode;
 | 
			
		||||
//     gint num_groups, num_levels;
 | 
			
		||||
//     guint oref;
 | 
			
		||||
//     gpointer v;
 | 
			
		||||
// 
 | 
			
		||||
//     xkbgeometry = priv->xkb->geom;
 | 
			
		||||
//     xkbshape = &xkbgeometry->shapes[xkbkey->shape_ndx];
 | 
			
		||||
//     if (g_hash_table_lookup_extended (priv->shape_oref_hash, xkbshape,
 | 
			
		||||
//                                       NULL, &v)) {
 | 
			
		||||
//         oref = GPOINTER_TO_UINT(v);
 | 
			
		||||
//     } else {
 | 
			
		||||
//         EekOutline *outline;
 | 
			
		||||
// 
 | 
			
		||||
//         xkboutline = xkbshape->primary == NULL ? &xkbshape->outlines[0] :
 | 
			
		||||
//             xkbshape->primary;
 | 
			
		||||
// 
 | 
			
		||||
//         outline = g_slice_new (EekOutline);
 | 
			
		||||
//         outline->corner_radius = xkb_to_pixmap_coord(layout,
 | 
			
		||||
//                                                      xkboutline->corner_radius);
 | 
			
		||||
// 
 | 
			
		||||
//         if (xkboutline->num_points <= 2) { /* rectangular */
 | 
			
		||||
//             gdouble x1, y1, x2, y2;
 | 
			
		||||
// 
 | 
			
		||||
//             outline->num_points = 4;
 | 
			
		||||
//             outline->points = g_slice_alloc0 (sizeof (EekPoint) *
 | 
			
		||||
//                                               outline->num_points);
 | 
			
		||||
//             if (xkboutline->num_points == 1) {
 | 
			
		||||
//                 x1 = xkb_to_pixmap_coord(layout, xkbshape->bounds.x1);
 | 
			
		||||
//                 y1 = xkb_to_pixmap_coord(layout, xkbshape->bounds.y1);
 | 
			
		||||
//                 x2 = xkb_to_pixmap_coord(layout, xkboutline->points[0].x);
 | 
			
		||||
//                 y2 = xkb_to_pixmap_coord(layout, xkboutline->points[0].y);
 | 
			
		||||
//             } else {
 | 
			
		||||
//                 x1 = xkb_to_pixmap_coord(layout, xkboutline->points[0].x);
 | 
			
		||||
//                 y1 = xkb_to_pixmap_coord(layout, xkboutline->points[0].y);
 | 
			
		||||
//                 x2 = xkb_to_pixmap_coord(layout, xkboutline->points[1].x);
 | 
			
		||||
//                 y2 = xkb_to_pixmap_coord(layout, xkboutline->points[1].y);
 | 
			
		||||
//             }
 | 
			
		||||
//             outline->points[0].x = outline->points[3].x = x1;
 | 
			
		||||
//             outline->points[0].y = outline->points[1].y = y1;
 | 
			
		||||
//             outline->points[1].x = outline->points[2].x = x2;
 | 
			
		||||
//             outline->points[2].y = outline->points[3].y = y2;
 | 
			
		||||
//         } else {                /* polygon */
 | 
			
		||||
//             gint i;
 | 
			
		||||
// 
 | 
			
		||||
//             outline->num_points = xkboutline->num_points;
 | 
			
		||||
//             outline->points = g_new0 (EekPoint, outline->num_points);
 | 
			
		||||
//             for (i = 0; i < xkboutline->num_points; i++) {
 | 
			
		||||
//                 outline->points[i].x =
 | 
			
		||||
//                     xkb_to_pixmap_coord(layout, xkboutline->points[i].x);
 | 
			
		||||
//                 outline->points[i].y =
 | 
			
		||||
//                     xkb_to_pixmap_coord(layout, xkboutline->points[i].y);
 | 
			
		||||
//             }
 | 
			
		||||
//         }
 | 
			
		||||
//         oref = eek_keyboard_add_outline (keyboard, outline);
 | 
			
		||||
//         eek_outline_free (outline);
 | 
			
		||||
//         g_hash_table_insert (priv->shape_oref_hash, xkbshape,
 | 
			
		||||
//                              GUINT_TO_POINTER(oref));
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     memset (name, 0, sizeof name);
 | 
			
		||||
//     memcpy (name, xkbkey->name.name, sizeof name - 1);
 | 
			
		||||
// 
 | 
			
		||||
//     xkbbounds = &xkbgeometry->shapes[xkbkey->shape_ndx].bounds;
 | 
			
		||||
//     bounds.x = xkb_to_pixmap_coord(layout, xkbbounds->x1 + x);
 | 
			
		||||
//     bounds.y = xkb_to_pixmap_coord(layout, xkbbounds->y1 + y);
 | 
			
		||||
//     bounds.width = xkb_to_pixmap_coord(layout, xkbbounds->x2 - xkbbounds->x1);
 | 
			
		||||
//     bounds.height = xkb_to_pixmap_coord(layout, xkbbounds->y2 - xkbbounds->y1);
 | 
			
		||||
// 
 | 
			
		||||
//     keycode = find_keycode (layout, name);
 | 
			
		||||
//     if (keycode == EEK_INVALID_KEYCODE) {
 | 
			
		||||
//         num_groups = num_levels = 0;
 | 
			
		||||
//         matrix = eek_symbol_matrix_new (0, 0);
 | 
			
		||||
//     } else {
 | 
			
		||||
//         KeySym keysym;
 | 
			
		||||
//         gint i, j;
 | 
			
		||||
// 
 | 
			
		||||
//         num_groups = XkbKeyNumGroups (priv->xkb, keycode);
 | 
			
		||||
//         num_levels = XkbKeyGroupsWidth (priv->xkb, keycode);
 | 
			
		||||
//         matrix = eek_symbol_matrix_new (num_groups, num_levels);
 | 
			
		||||
//         for (i = 0; i < num_groups; i++)
 | 
			
		||||
//             for (j = 0; j < num_levels; j++) {
 | 
			
		||||
//                 EekModifierType modifier;
 | 
			
		||||
// 
 | 
			
		||||
//                 keysym = XkbKeySymEntry (priv->xkb, keycode, j, i);
 | 
			
		||||
//                 modifier = XkbKeysymToModifiers (priv->display, keysym);
 | 
			
		||||
//                 matrix->data[i * num_levels + j] =
 | 
			
		||||
//                     EEK_SYMBOL(eek_keysym_new_with_modifier (keysym,
 | 
			
		||||
//                                                              modifier));
 | 
			
		||||
//             }
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     key = eek_section_create_key (section, keycode, column, row);
 | 
			
		||||
//     eek_element_set_name (EEK_ELEMENT(key), name);
 | 
			
		||||
//     eek_element_set_bounds (EEK_ELEMENT(key), &bounds);
 | 
			
		||||
//     eek_key_set_symbol_matrix (key, matrix);
 | 
			
		||||
//     eek_symbol_matrix_free (matrix);
 | 
			
		||||
//     eek_key_set_oref (key, oref);
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void
 | 
			
		||||
// create_section (EekXkbLayout  *layout,
 | 
			
		||||
//                 EekKeyboard   *keyboard,
 | 
			
		||||
//                 XkbSectionRec *xkbsection)
 | 
			
		||||
// {
 | 
			
		||||
//     XkbGeometryRec *xkbgeometry;
 | 
			
		||||
//     EekXkbLayoutPrivate *priv;
 | 
			
		||||
//     EekSection *section;
 | 
			
		||||
//     EekBounds bounds;
 | 
			
		||||
//     gchar *name;
 | 
			
		||||
//     gfloat left, top;
 | 
			
		||||
//     gint i, j;
 | 
			
		||||
// 
 | 
			
		||||
//     bounds.x = xkb_to_pixmap_coord(layout, xkbsection->left);
 | 
			
		||||
//     bounds.y = xkb_to_pixmap_coord(layout, xkbsection->top);
 | 
			
		||||
//     bounds.width = xkb_to_pixmap_coord(layout, xkbsection->width);
 | 
			
		||||
//     bounds.height = xkb_to_pixmap_coord(layout, xkbsection->height);
 | 
			
		||||
// 
 | 
			
		||||
//     priv = layout->priv;
 | 
			
		||||
//     xkbgeometry = priv->xkb->geom;
 | 
			
		||||
//     section = eek_keyboard_create_section (keyboard);
 | 
			
		||||
//     name = XGetAtomName (priv->display, xkbsection->name);
 | 
			
		||||
//     eek_element_set_name (EEK_ELEMENT(section), name);
 | 
			
		||||
//     XFree (name);
 | 
			
		||||
//     eek_element_set_bounds (EEK_ELEMENT(section), &bounds);
 | 
			
		||||
//     eek_section_set_angle (section,
 | 
			
		||||
//                            /* angle is in tenth of degree */
 | 
			
		||||
//                            xkbsection->angle / 10);
 | 
			
		||||
// 
 | 
			
		||||
//     for (i = 0; i < xkbsection->num_rows; i++) {
 | 
			
		||||
//         XkbRowRec *xkbrow;
 | 
			
		||||
// 
 | 
			
		||||
//         xkbrow = &xkbsection->rows[i];
 | 
			
		||||
//         left = xkbrow->left;
 | 
			
		||||
//         top = xkbrow->top;
 | 
			
		||||
//         eek_section_add_row (section,
 | 
			
		||||
//                              xkbrow->num_keys,
 | 
			
		||||
//                              xkbrow->vertical ?
 | 
			
		||||
//                              EEK_ORIENTATION_VERTICAL :
 | 
			
		||||
//                              EEK_ORIENTATION_HORIZONTAL);
 | 
			
		||||
//         for (j = 0; j < xkbrow->num_keys; j++) {
 | 
			
		||||
//             XkbKeyRec *xkbkey;
 | 
			
		||||
//             XkbBoundsRec *xkbbounds;
 | 
			
		||||
// 
 | 
			
		||||
//             xkbkey = &xkbrow->keys[j];
 | 
			
		||||
//             if (xkbrow->vertical)
 | 
			
		||||
//                 top += xkbkey->gap;
 | 
			
		||||
//             else
 | 
			
		||||
//                 left += xkbkey->gap;
 | 
			
		||||
//             create_key (layout, keyboard, section, j, i, left, top, xkbkey);
 | 
			
		||||
//             xkbbounds = &xkbgeometry->shapes[xkbkey->shape_ndx].bounds;
 | 
			
		||||
//             if (xkbrow->vertical)
 | 
			
		||||
//                 top += xkbbounds->y2 - xkbbounds->y1;
 | 
			
		||||
//             else
 | 
			
		||||
//                 left += xkbbounds->x2 - xkbbounds->x1;
 | 
			
		||||
//         }
 | 
			
		||||
//     }
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void
 | 
			
		||||
// create_keyboard (EekXkbLayout *layout, EekKeyboard *keyboard)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
//     XkbGeometryRec *xkbgeometry;
 | 
			
		||||
//     EekBounds bounds;
 | 
			
		||||
//     gint i;
 | 
			
		||||
// 
 | 
			
		||||
//     g_return_if_fail (priv->xkb);
 | 
			
		||||
//     g_return_if_fail (priv->xkb->geom);
 | 
			
		||||
// 
 | 
			
		||||
//     xkbgeometry = priv->xkb->geom;
 | 
			
		||||
// 
 | 
			
		||||
//     eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
			
		||||
//     setup_scaling (EEK_XKB_LAYOUT(layout), bounds.width, bounds.height);
 | 
			
		||||
// 
 | 
			
		||||
//     bounds.x = bounds.y = 0;
 | 
			
		||||
//     bounds.width = xkb_to_pixmap_coord(layout, xkbgeometry->width_mm);
 | 
			
		||||
//     bounds.height = xkb_to_pixmap_coord(layout, xkbgeometry->height_mm);
 | 
			
		||||
// 
 | 
			
		||||
//     for (i = 0; i < xkbgeometry->num_sections; i++) {
 | 
			
		||||
//         XkbSectionRec *xkbsection;
 | 
			
		||||
// 
 | 
			
		||||
//         xkbsection = &xkbgeometry->sections[i];
 | 
			
		||||
//         create_section (layout, keyboard, xkbsection);
 | 
			
		||||
//     }
 | 
			
		||||
//     eek_element_set_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static EekKeyboard *
 | 
			
		||||
// eek_xkb_layout_real_create_keyboard (EekLayout *self,
 | 
			
		||||
//                                      gdouble    initial_width,
 | 
			
		||||
//                                      gdouble    initial_height)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
 | 
			
		||||
//     EekBounds bounds;
 | 
			
		||||
//     EekKeyboard *keyboard;
 | 
			
		||||
// 
 | 
			
		||||
//     keyboard = g_object_new (EEK_TYPE_KEYBOARD, "layout", self, NULL);
 | 
			
		||||
//     bounds.x = bounds.y = 0.0;
 | 
			
		||||
//     bounds.width = initial_width;
 | 
			
		||||
//     bounds.height = initial_height;
 | 
			
		||||
//     eek_element_set_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
			
		||||
// 
 | 
			
		||||
//     /* resolve modifiers dynamically assigned at run time */
 | 
			
		||||
//     eek_keyboard_set_num_lock_mask (keyboard,
 | 
			
		||||
//                                     XkbKeysymToModifiers (priv->display,
 | 
			
		||||
//                                                           XK_Num_Lock));
 | 
			
		||||
//     eek_keyboard_set_alt_gr_mask (keyboard,
 | 
			
		||||
//                                   XkbKeysymToModifiers (priv->display,
 | 
			
		||||
//                                                         XK_ISO_Level3_Shift));
 | 
			
		||||
// 
 | 
			
		||||
//     if (priv->shape_oref_hash)
 | 
			
		||||
//         g_hash_table_destroy (priv->shape_oref_hash);
 | 
			
		||||
// 
 | 
			
		||||
//     priv->shape_oref_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
 | 
			
		||||
//     create_keyboard (EEK_XKB_LAYOUT(self), keyboard);
 | 
			
		||||
//     g_hash_table_destroy (priv->shape_oref_hash);
 | 
			
		||||
// 
 | 
			
		||||
//     return keyboard;
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void
 | 
			
		||||
// eek_xkb_layout_finalize (GObject *object)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (object);
 | 
			
		||||
// 
 | 
			
		||||
//     g_free (priv->names.keycodes);
 | 
			
		||||
//     g_free (priv->names.geometry);
 | 
			
		||||
//     g_free (priv->names.symbols);
 | 
			
		||||
//     XkbFreeKeyboard (priv->xkb, 0, TRUE);   /* free_all = TRUE */
 | 
			
		||||
//     G_OBJECT_CLASS (eek_xkb_layout_parent_class)->finalize (object);
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void 
 | 
			
		||||
// eek_xkb_layout_set_property (GObject      *object,
 | 
			
		||||
//                              guint         prop_id,
 | 
			
		||||
//                              const GValue *value,
 | 
			
		||||
//                              GParamSpec   *pspec)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
 | 
			
		||||
// 
 | 
			
		||||
//     switch (prop_id) {
 | 
			
		||||
//     case PROP_DISPLAY:
 | 
			
		||||
//         layout->priv->display = g_value_get_pointer (value);
 | 
			
		||||
//         break;
 | 
			
		||||
//     default:
 | 
			
		||||
//         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
//         break;
 | 
			
		||||
//     }
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void 
 | 
			
		||||
// eek_xkb_layout_get_property (GObject    *object,
 | 
			
		||||
//                              guint       prop_id,
 | 
			
		||||
//                              GValue     *value,
 | 
			
		||||
//                              GParamSpec *pspec)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
 | 
			
		||||
// 
 | 
			
		||||
//     switch (prop_id) {
 | 
			
		||||
//     case PROP_DISPLAY:
 | 
			
		||||
//         g_value_set_pointer (value, layout->priv->display);
 | 
			
		||||
//         break;
 | 
			
		||||
//     default:
 | 
			
		||||
//         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
//         break;
 | 
			
		||||
//     }
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void
 | 
			
		||||
// eek_xkb_layout_class_init (EekXkbLayoutClass *klass)
 | 
			
		||||
// {
 | 
			
		||||
//     EekLayoutClass *layout_class = EEK_LAYOUT_CLASS (klass);
 | 
			
		||||
//     GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
//     GParamSpec *pspec;
 | 
			
		||||
// 
 | 
			
		||||
//     g_type_class_add_private (gobject_class, sizeof (EekXkbLayoutPrivate));
 | 
			
		||||
// 
 | 
			
		||||
//     layout_class->create_keyboard = eek_xkb_layout_real_create_keyboard;
 | 
			
		||||
// 
 | 
			
		||||
//     gobject_class->finalize = eek_xkb_layout_finalize;
 | 
			
		||||
//     gobject_class->set_property = eek_xkb_layout_set_property;
 | 
			
		||||
//     gobject_class->get_property = eek_xkb_layout_get_property;
 | 
			
		||||
// 
 | 
			
		||||
//     pspec = g_param_spec_pointer ("display",
 | 
			
		||||
//                                   "Display",
 | 
			
		||||
//                                   "X Display",
 | 
			
		||||
//                                   G_PARAM_READWRITE |
 | 
			
		||||
//                                   G_PARAM_CONSTRUCT_ONLY);
 | 
			
		||||
//     g_object_class_install_property (gobject_class, PROP_DISPLAY, pspec);
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void
 | 
			
		||||
// eek_xkb_layout_init (EekXkbLayout *self)
 | 
			
		||||
// {
 | 
			
		||||
//     self->priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static gboolean
 | 
			
		||||
// get_names_from_server (EekXkbLayout *layout,
 | 
			
		||||
//                        GError      **error)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
//     gchar *name;
 | 
			
		||||
// 
 | 
			
		||||
//     XkbGetNames (priv->display, XkbAllNamesMask, priv->xkb);
 | 
			
		||||
// 
 | 
			
		||||
//     if (priv->xkb->names->keycodes <= 0)
 | 
			
		||||
//         g_warning ("XKB keycodes setting is not loaded properly");
 | 
			
		||||
//     else {
 | 
			
		||||
//         name = XGetAtomName (priv->display, priv->xkb->names->keycodes);
 | 
			
		||||
//         if (!name)
 | 
			
		||||
//             g_warning ("Can't get the name of keycodes");
 | 
			
		||||
//         else if (!priv->names.keycodes ||
 | 
			
		||||
//                  g_strcmp0 (name, priv->names.keycodes)) {
 | 
			
		||||
//             g_free (priv->names.keycodes);
 | 
			
		||||
//             priv->names.keycodes = g_strdup (name);
 | 
			
		||||
//             XFree (name);
 | 
			
		||||
//         }
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     if (priv->xkb->names->geometry <= 0)
 | 
			
		||||
//         g_warning ("XKB geometry setting is not loaded");
 | 
			
		||||
//     else {
 | 
			
		||||
//         name = XGetAtomName (priv->display, priv->xkb->names->geometry);
 | 
			
		||||
//         if (!name)
 | 
			
		||||
//             g_warning ("Can't get the name of geometry");
 | 
			
		||||
//         else if (!priv->names.geometry ||
 | 
			
		||||
//                  g_strcmp0 (name, priv->names.geometry)) {
 | 
			
		||||
//             g_free (priv->names.geometry);
 | 
			
		||||
//             priv->names.geometry = g_strdup (name);
 | 
			
		||||
//             XFree (name);
 | 
			
		||||
//         }
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     if (priv->xkb->names->symbols <= 0)
 | 
			
		||||
//         g_warning ("XKB symbols setting is not loaded");
 | 
			
		||||
//     else {
 | 
			
		||||
//         name = XGetAtomName (priv->display, priv->xkb->names->symbols);
 | 
			
		||||
//         if (!name)
 | 
			
		||||
//             g_warning ("Can't get the name of symbols");
 | 
			
		||||
//         else if (!priv->names.symbols ||
 | 
			
		||||
//                  g_strcmp0 (name, priv->names.symbols)) {
 | 
			
		||||
//             g_free (priv->names.symbols);
 | 
			
		||||
//             priv->names.symbols = g_strdup (name);
 | 
			
		||||
//             XFree (name);
 | 
			
		||||
//         }
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     return TRUE;
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// /**
 | 
			
		||||
//  * eek_xkb_layout_new:
 | 
			
		||||
//  *
 | 
			
		||||
//  * Create a new #EekXkbLayout.
 | 
			
		||||
//  */
 | 
			
		||||
// EekLayout *
 | 
			
		||||
// eek_xkb_layout_new (Display *display,
 | 
			
		||||
//                     GError **error)
 | 
			
		||||
// {
 | 
			
		||||
//     return (EekLayout *) g_initable_new (EEK_TYPE_XKB_LAYOUT,
 | 
			
		||||
//                                          NULL,
 | 
			
		||||
//                                          error,
 | 
			
		||||
//                                          "display", display,
 | 
			
		||||
//                                          NULL);
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// /**
 | 
			
		||||
//  * eek_xkb_layout_set_names: (skip)
 | 
			
		||||
//  * @layout: an #EekXkbLayout
 | 
			
		||||
//  * @names: XKB component names
 | 
			
		||||
//  * @error: a #GError
 | 
			
		||||
//  *
 | 
			
		||||
//  * Set the XKB component names to @layout.
 | 
			
		||||
//  * Returns: %TRUE if the component names are successfully set, %FALSE otherwise
 | 
			
		||||
//  */
 | 
			
		||||
// gboolean
 | 
			
		||||
// eek_xkb_layout_set_names (EekXkbLayout         *layout,
 | 
			
		||||
//                           XkbComponentNamesRec *names,
 | 
			
		||||
//                           GError              **error)
 | 
			
		||||
// {
 | 
			
		||||
//     if (g_strcmp0 (names->keycodes, layout->priv->names.keycodes)) {
 | 
			
		||||
//         g_free (layout->priv->names.keycodes);
 | 
			
		||||
//         layout->priv->names.keycodes = g_strdup (names->keycodes);
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     if (g_strcmp0 (names->geometry, layout->priv->names.geometry)) {
 | 
			
		||||
//         g_free (layout->priv->names.geometry);
 | 
			
		||||
//         layout->priv->names.geometry = g_strdup (names->geometry);
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     if (g_strcmp0 (names->symbols, layout->priv->names.symbols)) {
 | 
			
		||||
//         g_free (layout->priv->names.symbols);
 | 
			
		||||
//         layout->priv->names.symbols = g_strdup (names->symbols);
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     return get_keyboard_from_server (layout, error);
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static gboolean
 | 
			
		||||
// get_keyboard_from_server (EekXkbLayout *layout,
 | 
			
		||||
//                           GError      **error)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
// 
 | 
			
		||||
//     if (priv->xkb) {
 | 
			
		||||
//         XkbFreeKeyboard (priv->xkb, 0, True);
 | 
			
		||||
//         priv->xkb = NULL;
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     if (priv->names.keycodes && priv->names.geometry && priv->names.symbols) {
 | 
			
		||||
//         priv->xkb = XkbGetKeyboardByName (priv->display,
 | 
			
		||||
//                                           XkbUseCoreKbd,
 | 
			
		||||
//                                           &priv->names,
 | 
			
		||||
//                                           0,
 | 
			
		||||
//                                           XKB_COMPONENT_MASK,
 | 
			
		||||
//                                           False);
 | 
			
		||||
//     } else {
 | 
			
		||||
//         priv->xkb = XkbGetKeyboard (priv->display,
 | 
			
		||||
//                                     XKB_COMPONENT_MASK,
 | 
			
		||||
//                                     XkbUseCoreKbd);
 | 
			
		||||
//         if (!get_names_from_server (layout, error)) {
 | 
			
		||||
//             XkbFreeKeyboard (priv->xkb, 0, True);
 | 
			
		||||
//             priv->xkb = NULL;
 | 
			
		||||
//         }
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     if (priv->xkb == NULL) {
 | 
			
		||||
//         g_set_error (error,
 | 
			
		||||
//                      EEK_ERROR,
 | 
			
		||||
//                      EEK_ERROR_LAYOUT_ERROR,
 | 
			
		||||
//                      "can't get keyboard from server");
 | 
			
		||||
//         g_free (priv->names.keycodes);
 | 
			
		||||
//         priv->names.keycodes = NULL;
 | 
			
		||||
//         g_free (priv->names.geometry);
 | 
			
		||||
//         priv->names.geometry = NULL;
 | 
			
		||||
//         g_free (priv->names.symbols);
 | 
			
		||||
//         priv->names.symbols = NULL;
 | 
			
		||||
//         return FALSE;
 | 
			
		||||
//     }
 | 
			
		||||
//     return TRUE;
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// 
 | 
			
		||||
// static guint
 | 
			
		||||
// find_keycode (EekXkbLayout *layout, gchar *key_name)
 | 
			
		||||
// {
 | 
			
		||||
// #define KEYSYM_NAME_MAX_LENGTH 4
 | 
			
		||||
//     guint keycode;
 | 
			
		||||
//     gint i, j;
 | 
			
		||||
//     XkbKeyNamePtr pkey;
 | 
			
		||||
//     XkbKeyAliasPtr palias;
 | 
			
		||||
//     guint is_name_matched;
 | 
			
		||||
//     gchar *src, *dst;
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
// 
 | 
			
		||||
//     if (!priv->xkb)
 | 
			
		||||
//         return EEK_INVALID_KEYCODE;
 | 
			
		||||
// 
 | 
			
		||||
//     pkey = priv->xkb->names->keys + priv->xkb->min_key_code;
 | 
			
		||||
//     for (keycode = priv->xkb->min_key_code;
 | 
			
		||||
//          keycode <= priv->xkb->max_key_code; keycode++) {
 | 
			
		||||
//         is_name_matched = 1;
 | 
			
		||||
//         src = key_name;
 | 
			
		||||
//         dst = pkey->name;
 | 
			
		||||
//         for (i = KEYSYM_NAME_MAX_LENGTH; --i >= 0;) {
 | 
			
		||||
//             if ('\0' == *src)
 | 
			
		||||
//                 break;
 | 
			
		||||
//             if (*src++ != *dst++) {
 | 
			
		||||
//                 is_name_matched = 0;
 | 
			
		||||
//                 break;
 | 
			
		||||
//             }
 | 
			
		||||
//         }
 | 
			
		||||
//         if (is_name_matched)
 | 
			
		||||
//             return keycode;
 | 
			
		||||
//         pkey++;
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     palias = priv->xkb->names->key_aliases;
 | 
			
		||||
//     for (j = priv->xkb->names->num_key_aliases; --j >= 0;) {
 | 
			
		||||
//         is_name_matched = 1;
 | 
			
		||||
//         src = key_name;
 | 
			
		||||
//         dst = palias->alias;
 | 
			
		||||
//         for (i = KEYSYM_NAME_MAX_LENGTH; --i >= 0;) {
 | 
			
		||||
//             if ('\0' == *src)
 | 
			
		||||
//                 break;
 | 
			
		||||
//             if (*src++ != *dst++) {
 | 
			
		||||
//                 is_name_matched = 0;
 | 
			
		||||
//                 break;
 | 
			
		||||
//             }
 | 
			
		||||
//         }
 | 
			
		||||
// 
 | 
			
		||||
//         if (is_name_matched) {
 | 
			
		||||
//             keycode = find_keycode (layout, palias->real);
 | 
			
		||||
//             return keycode;
 | 
			
		||||
//         }
 | 
			
		||||
//         palias++;
 | 
			
		||||
//     }
 | 
			
		||||
// 
 | 
			
		||||
//     return EEK_INVALID_KEYCODE;
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void
 | 
			
		||||
// setup_scaling (EekXkbLayout *layout,
 | 
			
		||||
//                gdouble       width,
 | 
			
		||||
//                gdouble       height)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
// 
 | 
			
		||||
//     g_return_if_fail (priv->xkb);
 | 
			
		||||
// 
 | 
			
		||||
//     g_return_if_fail (priv->xkb->geom->width_mm > 0);
 | 
			
		||||
//     g_return_if_fail (priv->xkb->geom->height_mm > 0);
 | 
			
		||||
// 
 | 
			
		||||
//     if (width * priv->xkb->geom->height_mm <
 | 
			
		||||
//         height * priv->xkb->geom->width_mm) {
 | 
			
		||||
//         priv->scale_numerator = width;
 | 
			
		||||
//         priv->scale_denominator = priv->xkb->geom->width_mm;
 | 
			
		||||
//     } else {
 | 
			
		||||
//         priv->scale_numerator = height;
 | 
			
		||||
//         priv->scale_denominator = priv->xkb->geom->height_mm;
 | 
			
		||||
//     }
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static gboolean
 | 
			
		||||
// initable_init (GInitable    *initable,
 | 
			
		||||
//                GCancellable *cancellable,
 | 
			
		||||
//                GError      **error)
 | 
			
		||||
// {
 | 
			
		||||
//     EekXkbLayout *layout = EEK_XKB_LAYOUT (initable);
 | 
			
		||||
// 
 | 
			
		||||
//     if (!get_keyboard_from_server (layout, error))
 | 
			
		||||
//         return FALSE;
 | 
			
		||||
// 
 | 
			
		||||
//     if (!get_names_from_server (layout, error))
 | 
			
		||||
//         return FALSE;
 | 
			
		||||
// 
 | 
			
		||||
//     return TRUE;
 | 
			
		||||
// }
 | 
			
		||||
// 
 | 
			
		||||
// static void
 | 
			
		||||
// initable_iface_init (GInitableIface *initable_iface)
 | 
			
		||||
// {
 | 
			
		||||
//   initable_iface->init = initable_init;
 | 
			
		||||
// }
 | 
			
		||||
							
								
								
									
										72
									
								
								eek/eek-wkb-layout.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								eek/eek-wkb-layout.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,72 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2 of
 | 
			
		||||
 * the License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library 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
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
//#error "Only <eek/eek-xkb.h> can be included directly."
 | 
			
		||||
//#endif
 | 
			
		||||
//
 | 
			
		||||
//#ifndef EEK_XKB_LAYOUT_H
 | 
			
		||||
//#define EEK_XKB_LAYOUT_H 1
 | 
			
		||||
//
 | 
			
		||||
//#include <X11/Xlib.h>
 | 
			
		||||
//#include <X11/XKBlib.h>
 | 
			
		||||
//#include "eek-layout.h"
 | 
			
		||||
//
 | 
			
		||||
//G_BEGIN_DECLS
 | 
			
		||||
//
 | 
			
		||||
//#define EEK_TYPE_XKB_LAYOUT (eek_xkb_layout_get_type())
 | 
			
		||||
//#define EEK_XKB_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayout))
 | 
			
		||||
//#define EEK_XKB_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutClass))
 | 
			
		||||
//#define EEK_IS_XKB_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_XKB_LAYOUT))
 | 
			
		||||
//#define EEK_IS_XKB_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_XKB_LAYOUT))
 | 
			
		||||
//#define EEK_XKB_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutClass))
 | 
			
		||||
//
 | 
			
		||||
//typedef struct _EekXkbLayout        EekXkbLayout;
 | 
			
		||||
//typedef struct _EekXkbLayoutClass   EekXkbLayoutClass;
 | 
			
		||||
//typedef struct _EekXkbLayoutPrivate EekXkbLayoutPrivate;
 | 
			
		||||
//
 | 
			
		||||
//struct _EekXkbLayout
 | 
			
		||||
//{
 | 
			
		||||
//    /*< private >*/
 | 
			
		||||
//    EekLayout parent;
 | 
			
		||||
//
 | 
			
		||||
//    EekXkbLayoutPrivate *priv;
 | 
			
		||||
//};
 | 
			
		||||
//
 | 
			
		||||
//struct _EekXkbLayoutClass
 | 
			
		||||
//{
 | 
			
		||||
//    /*< private >*/
 | 
			
		||||
//    EekLayoutClass parent_class;
 | 
			
		||||
//
 | 
			
		||||
//    /*< private >*/
 | 
			
		||||
//    /* padding */
 | 
			
		||||
//    gpointer pdummy[24];
 | 
			
		||||
//};
 | 
			
		||||
//
 | 
			
		||||
//GType      eek_xkb_layout_get_type  (void) G_GNUC_CONST;
 | 
			
		||||
//EekLayout *eek_xkb_layout_new       (Display              *display,
 | 
			
		||||
//                                     GError              **error);
 | 
			
		||||
//
 | 
			
		||||
//gboolean   eek_xkb_layout_set_names (EekXkbLayout         *layout,
 | 
			
		||||
//                                     XkbComponentNamesRec *names,
 | 
			
		||||
//                                     GError              **error);
 | 
			
		||||
//
 | 
			
		||||
//G_END_DECLS
 | 
			
		||||
//#endif              /* #ifndef EEK_XKB_LAYOUT_H */
 | 
			
		||||
@ -17,10 +17,10 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
#ifndef EEK_XKL_H
 | 
			
		||||
#define EEK_XKL_H 1
 | 
			
		||||
 | 
			
		||||
#include "eek.h"
 | 
			
		||||
#include "eek-xkl-layout.h"
 | 
			
		||||
 | 
			
		||||
#endif  /* EEK_XKL_H */
 | 
			
		||||
//#ifndef EEK_XKB_H
 | 
			
		||||
//#define EEK_XKB_H 1
 | 
			
		||||
//
 | 
			
		||||
//#include "eek.h"
 | 
			
		||||
//#include "eek-xkb-layout.h"
 | 
			
		||||
//
 | 
			
		||||
//#endif  /* EEK_XKB_H */
 | 
			
		||||
@ -16,15 +16,15 @@
 | 
			
		||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
# 02110-1301 USA
 | 
			
		||||
 | 
			
		||||
prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@
 | 
			
		||||
includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: libeek-xkb
 | 
			
		||||
Description: A Library to Create Keyboard-like UI (XKB Support)
 | 
			
		||||
URL: http://fedorahosted.org/eekboard/
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Requires: eek-@EEK_API_VERSION@ gtk+-x11-@GTK_API_VERSION@
 | 
			
		||||
Libs: -L${libdir} -leek-xkb
 | 
			
		||||
Cflags: -I${includedir}/eek-@EEK_API_VERSION@
 | 
			
		||||
# prefix=@prefix@
 | 
			
		||||
# exec_prefix=@exec_prefix@
 | 
			
		||||
# libdir=@libdir@
 | 
			
		||||
# includedir=@includedir@
 | 
			
		||||
# 
 | 
			
		||||
# Name: libeek-xkl
 | 
			
		||||
# Description: A Library to Create Keyboard-like UI (Libxklavier Support)
 | 
			
		||||
# URL: http://fedorahosted.org/eekboard/
 | 
			
		||||
# Version: @VERSION@
 | 
			
		||||
# Requires: eek-@EEK_API_VERSION@ libxklavier
 | 
			
		||||
# Libs: -L${libdir} -leek-xkl
 | 
			
		||||
# Cflags: -I${includedir}/eek-@EEK_API_VERSION@
 | 
			
		||||
							
								
								
									
										663
									
								
								eek/eek-wkl-layout.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										663
									
								
								eek/eek-wkl-layout.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,663 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2 of
 | 
			
		||||
 * the License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library 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
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:eek-xkl-layout
 | 
			
		||||
 * @short_description: Layout engine using Libxklavier configuration
 | 
			
		||||
 *
 | 
			
		||||
 * The #EekXklLayout is a simple wrapper around #EekXkbLayout class
 | 
			
		||||
 * to use Libxklavier configuration.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//#ifdef HAVE_CONFIG_H
 | 
			
		||||
//#include "config.h"
 | 
			
		||||
//#endif  /* HAVE_CONFIG_H */
 | 
			
		||||
//
 | 
			
		||||
//#include <libxklavier/xklavier.h>
 | 
			
		||||
//#include <gio/gio.h>
 | 
			
		||||
//#include <string.h>
 | 
			
		||||
//
 | 
			
		||||
//#include "eek-xkl-layout.h"
 | 
			
		||||
//
 | 
			
		||||
//#define noKBDRAW_DEBUG
 | 
			
		||||
//
 | 
			
		||||
//static GInitableIface *parent_initable_iface;
 | 
			
		||||
//
 | 
			
		||||
//static void initable_iface_init (GInitableIface *initable_iface);
 | 
			
		||||
//
 | 
			
		||||
//G_DEFINE_TYPE_WITH_CODE (EekXklLayout, eek_xkl_layout, EEK_TYPE_XKB_LAYOUT,
 | 
			
		||||
//                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
 | 
			
		||||
//                                                initable_iface_init));
 | 
			
		||||
//
 | 
			
		||||
//#define EEK_XKL_LAYOUT_GET_PRIVATE(obj)                                  \
 | 
			
		||||
//    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_XKL_LAYOUT, EekXklLayoutPrivate))
 | 
			
		||||
//
 | 
			
		||||
//enum {
 | 
			
		||||
//    PROP_0,
 | 
			
		||||
//    PROP_MODEL,
 | 
			
		||||
//    PROP_LAYOUTS,
 | 
			
		||||
//    PROP_VARIANTS,
 | 
			
		||||
//    PROP_OPTIONS,
 | 
			
		||||
//    PROP_LAST
 | 
			
		||||
//};
 | 
			
		||||
//
 | 
			
		||||
//struct _EekXklLayoutPrivate
 | 
			
		||||
//{
 | 
			
		||||
//    XklEngine *engine;
 | 
			
		||||
//    XklConfigRec *config;
 | 
			
		||||
//};
 | 
			
		||||
//
 | 
			
		||||
///* from gnome-keyboard-properties-xkbpv.c:
 | 
			
		||||
// *  BAD STYLE: Taken from xklavier_private_xkb.h
 | 
			
		||||
// *  Any ideas on architectural improvements are WELCOME
 | 
			
		||||
// */
 | 
			
		||||
//extern gboolean xkl_xkb_config_native_prepare (XklEngine * engine,
 | 
			
		||||
//                                               const XklConfigRec * data,
 | 
			
		||||
//                                               XkbComponentNamesPtr
 | 
			
		||||
//                                               component_names);
 | 
			
		||||
//
 | 
			
		||||
//extern void xkl_xkb_config_native_cleanup (XklEngine * engine,
 | 
			
		||||
//                                           XkbComponentNamesPtr
 | 
			
		||||
//                                           component_names);
 | 
			
		||||
//
 | 
			
		||||
//static gboolean set_xkb_component_names (EekXklLayout *layout,
 | 
			
		||||
//                                         XklConfigRec *config);
 | 
			
		||||
//
 | 
			
		||||
//static void
 | 
			
		||||
//eek_xkl_layout_dispose (GObject *object)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (object);
 | 
			
		||||
//
 | 
			
		||||
//    if (priv->config) {
 | 
			
		||||
//        g_object_unref (priv->config);
 | 
			
		||||
//        priv->config = NULL;
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    G_OBJECT_CLASS (eek_xkl_layout_parent_class)->dispose (object);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//static void 
 | 
			
		||||
//eek_xkl_layout_set_property (GObject      *object,
 | 
			
		||||
//                             guint         prop_id,
 | 
			
		||||
//                             const GValue *value,
 | 
			
		||||
//                             GParamSpec   *pspec)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayout *layout = EEK_XKL_LAYOUT(object);
 | 
			
		||||
//
 | 
			
		||||
//    switch (prop_id) {
 | 
			
		||||
//    case PROP_MODEL:
 | 
			
		||||
//        eek_xkl_layout_set_model (layout, g_value_get_string (value));
 | 
			
		||||
//        break;
 | 
			
		||||
//    case PROP_LAYOUTS:
 | 
			
		||||
//        eek_xkl_layout_set_layouts (layout, g_value_get_boxed (value));
 | 
			
		||||
//        break;
 | 
			
		||||
//    case PROP_VARIANTS:
 | 
			
		||||
//        eek_xkl_layout_set_variants (layout, g_value_get_boxed (value));
 | 
			
		||||
//        break;
 | 
			
		||||
//    case PROP_OPTIONS:
 | 
			
		||||
//        eek_xkl_layout_set_options (layout, g_value_get_boxed (value));
 | 
			
		||||
//        break;
 | 
			
		||||
//    default:
 | 
			
		||||
//        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
//        break;
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//static void 
 | 
			
		||||
//eek_xkl_layout_get_property (GObject    *object,
 | 
			
		||||
//                             guint       prop_id,
 | 
			
		||||
//                             GValue     *value,
 | 
			
		||||
//                             GParamSpec *pspec)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayout *layout = EEK_XKL_LAYOUT(object);
 | 
			
		||||
//
 | 
			
		||||
//    switch (prop_id) {
 | 
			
		||||
//    case PROP_MODEL:
 | 
			
		||||
//        g_value_set_string (value,
 | 
			
		||||
//                            eek_xkl_layout_get_model (layout));
 | 
			
		||||
//        break;
 | 
			
		||||
//    case PROP_LAYOUTS:
 | 
			
		||||
//        g_value_set_boxed (value,
 | 
			
		||||
//                           eek_xkl_layout_get_layouts (layout));
 | 
			
		||||
//        break;
 | 
			
		||||
//    case PROP_VARIANTS:
 | 
			
		||||
//        g_value_set_boxed (value,
 | 
			
		||||
//                           eek_xkl_layout_get_variants (layout));
 | 
			
		||||
//        break;
 | 
			
		||||
//    case PROP_OPTIONS:
 | 
			
		||||
//        g_value_set_boxed (value,
 | 
			
		||||
//                           eek_xkl_layout_get_options (layout));
 | 
			
		||||
//        break;
 | 
			
		||||
//    default:
 | 
			
		||||
//        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
//        break;
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//static void
 | 
			
		||||
//eek_xkl_layout_class_init (EekXklLayoutClass *klass)
 | 
			
		||||
//{
 | 
			
		||||
//    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
//    GParamSpec *pspec;
 | 
			
		||||
//
 | 
			
		||||
//    g_type_class_add_private (gobject_class, sizeof (EekXklLayoutPrivate));
 | 
			
		||||
//
 | 
			
		||||
//    gobject_class->dispose = eek_xkl_layout_dispose;
 | 
			
		||||
//    gobject_class->set_property = eek_xkl_layout_set_property;
 | 
			
		||||
//    gobject_class->get_property = eek_xkl_layout_get_property;
 | 
			
		||||
//
 | 
			
		||||
//    /**
 | 
			
		||||
//     * EekXklLayout:model:
 | 
			
		||||
//     *
 | 
			
		||||
//     * The libxklavier model name of #EekXklLayout.
 | 
			
		||||
//     */
 | 
			
		||||
//    pspec = g_param_spec_string ("model",
 | 
			
		||||
//                                 "Model",
 | 
			
		||||
//                                 "Libxklavier model",
 | 
			
		||||
//                                 NULL,
 | 
			
		||||
//                                 G_PARAM_READWRITE);
 | 
			
		||||
//    g_object_class_install_property (gobject_class, PROP_MODEL, pspec);
 | 
			
		||||
//
 | 
			
		||||
//    /**
 | 
			
		||||
//     * EekXklLayout:layouts:
 | 
			
		||||
//     *
 | 
			
		||||
//     * The libxklavier layout names of #EekXklLayout.
 | 
			
		||||
//     */
 | 
			
		||||
//    pspec = g_param_spec_boxed ("layouts",
 | 
			
		||||
//                                "Layouts",
 | 
			
		||||
//                                "Libxklavier layouts",
 | 
			
		||||
//                                G_TYPE_STRV,
 | 
			
		||||
//                                G_PARAM_READWRITE);
 | 
			
		||||
//    g_object_class_install_property (gobject_class, PROP_LAYOUTS, pspec);
 | 
			
		||||
//
 | 
			
		||||
//    /**
 | 
			
		||||
//     * EekXklLayout:variants:
 | 
			
		||||
//     *
 | 
			
		||||
//     * The libxklavier variant names of #EekXklLayout.
 | 
			
		||||
//     */
 | 
			
		||||
//    pspec = g_param_spec_boxed ("variants",
 | 
			
		||||
//                                "Variants",
 | 
			
		||||
//                                "Libxklavier variants",
 | 
			
		||||
//                                G_TYPE_STRV,
 | 
			
		||||
//                                G_PARAM_READWRITE);
 | 
			
		||||
//    g_object_class_install_property (gobject_class, PROP_VARIANTS, pspec);
 | 
			
		||||
//
 | 
			
		||||
//    /**
 | 
			
		||||
//     * EekXklLayout:options:
 | 
			
		||||
//     *
 | 
			
		||||
//     * The libxklavier option names of #EekXklLayout.
 | 
			
		||||
//     */
 | 
			
		||||
//    pspec = g_param_spec_boxed ("options",
 | 
			
		||||
//                                "Options",
 | 
			
		||||
//                                "Libxklavier options",
 | 
			
		||||
//                                G_TYPE_STRV,
 | 
			
		||||
//                                G_PARAM_READWRITE);
 | 
			
		||||
//    g_object_class_install_property (gobject_class, PROP_OPTIONS, pspec);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//static void
 | 
			
		||||
//eek_xkl_layout_init (EekXklLayout *self)
 | 
			
		||||
//{
 | 
			
		||||
//    self->priv = EEK_XKL_LAYOUT_GET_PRIVATE (self);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_new:
 | 
			
		||||
// *
 | 
			
		||||
// * Create a new #EekXklLayout.
 | 
			
		||||
// */
 | 
			
		||||
//EekLayout *
 | 
			
		||||
//eek_xkl_layout_new (Display *display, GError **error)
 | 
			
		||||
//{
 | 
			
		||||
//    return (EekLayout *) g_initable_new (EEK_TYPE_XKL_LAYOUT,
 | 
			
		||||
//                                         NULL,
 | 
			
		||||
//                                         error,
 | 
			
		||||
//                                         "display", display,
 | 
			
		||||
//                                         NULL);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//G_INLINE_FUNC void
 | 
			
		||||
//merge_xkl_config_rec (XklConfigRec *dst, XklConfigRec *src)
 | 
			
		||||
//{
 | 
			
		||||
//    if (src->model) {
 | 
			
		||||
//        g_free (dst->model);
 | 
			
		||||
//        dst->model = g_strdup (src->model);
 | 
			
		||||
//    }
 | 
			
		||||
//    if (src->layouts) {
 | 
			
		||||
//        g_strfreev (dst->layouts);
 | 
			
		||||
//        dst->layouts = g_strdupv (src->layouts);
 | 
			
		||||
//    }
 | 
			
		||||
//    if (src->variants) {
 | 
			
		||||
//        g_strfreev (dst->variants);
 | 
			
		||||
//        dst->variants = g_strdupv (src->variants);
 | 
			
		||||
//    }
 | 
			
		||||
//    if (src->options) {
 | 
			
		||||
//        g_strfreev (dst->options);
 | 
			
		||||
//        dst->options = g_strdupv (src->options);
 | 
			
		||||
//    }
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_set_config: (skip)
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// * @config: Libxklavier configuration
 | 
			
		||||
// *
 | 
			
		||||
// * Reconfigure @layout with @config.
 | 
			
		||||
// * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
// */
 | 
			
		||||
//gboolean
 | 
			
		||||
//eek_xkl_layout_set_config (EekXklLayout *layout,
 | 
			
		||||
//                           XklConfigRec *config)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
//    XklConfigRec *c;
 | 
			
		||||
//    gboolean retval;
 | 
			
		||||
//
 | 
			
		||||
//    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
//    c = xkl_config_rec_new ();
 | 
			
		||||
//    merge_xkl_config_rec (c, priv->config);
 | 
			
		||||
//    merge_xkl_config_rec (c, config);
 | 
			
		||||
//    retval = set_xkb_component_names (layout, c);
 | 
			
		||||
//    g_object_unref (c);
 | 
			
		||||
//    merge_xkl_config_rec (priv->config, config);
 | 
			
		||||
//    return retval;
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_set_config_full:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// * @model: Libxklavier model name
 | 
			
		||||
// * @layouts: Libxklavier layouts
 | 
			
		||||
// * @variants: Libxklavier variants
 | 
			
		||||
// * @options: Libxklavier options
 | 
			
		||||
// *
 | 
			
		||||
// * Reconfigure @layout with @model, @layouts, @variants, and @options.
 | 
			
		||||
// * This function is merely a wrapper around
 | 
			
		||||
// * eek_xkl_layout_set_config() to avoid passing a pointer of
 | 
			
		||||
// * XklConfigRec, which is not currently available in the
 | 
			
		||||
// * gobject-introspection repository.
 | 
			
		||||
// *
 | 
			
		||||
// * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
// * Since: 0.0.2
 | 
			
		||||
// */
 | 
			
		||||
//gboolean
 | 
			
		||||
//eek_xkl_layout_set_config_full (EekXklLayout *layout,
 | 
			
		||||
//                                gchar *model,
 | 
			
		||||
//                                gchar **layouts,
 | 
			
		||||
//                                gchar **variants,
 | 
			
		||||
//                                gchar **options)
 | 
			
		||||
//{
 | 
			
		||||
//    XklConfigRec *config;
 | 
			
		||||
//    gboolean retval;
 | 
			
		||||
//
 | 
			
		||||
//    config = xkl_config_rec_new ();
 | 
			
		||||
//    config->model = g_strdup (model);
 | 
			
		||||
//    config->layouts = g_strdupv (layouts);
 | 
			
		||||
//    config->variants = g_strdupv (variants);
 | 
			
		||||
//    config->options = g_strdupv (options);
 | 
			
		||||
//    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
//    g_object_unref (config);
 | 
			
		||||
//    return retval;
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_set_model:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// * @model: model name
 | 
			
		||||
// *
 | 
			
		||||
// * Set the model name of @layout configuration (in the Libxklavier terminology).
 | 
			
		||||
// * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
// */
 | 
			
		||||
//gboolean
 | 
			
		||||
//eek_xkl_layout_set_model (EekXklLayout *layout,
 | 
			
		||||
//                          const gchar  *model)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
//    XklConfigRec *config;
 | 
			
		||||
//    gboolean retval;
 | 
			
		||||
//    
 | 
			
		||||
//    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
//    config = xkl_config_rec_new ();
 | 
			
		||||
//    /* config->model will be freed on g_object_unref (config) */
 | 
			
		||||
//    if (model)
 | 
			
		||||
//        config->model = g_strdup (model);
 | 
			
		||||
//    else
 | 
			
		||||
//        config->model = NULL;
 | 
			
		||||
//    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
//    g_object_unref (config);
 | 
			
		||||
//    return retval;
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_set_layouts:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// * @layouts: layout names
 | 
			
		||||
// *
 | 
			
		||||
// * Set the layout names of @layout (in the Libxklavier terminology).
 | 
			
		||||
// * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
// */
 | 
			
		||||
//gboolean
 | 
			
		||||
//eek_xkl_layout_set_layouts (EekXklLayout *layout,
 | 
			
		||||
//                            gchar       **layouts)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
//    XklConfigRec *config;
 | 
			
		||||
//    gboolean retval;
 | 
			
		||||
//
 | 
			
		||||
//    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
//    config = xkl_config_rec_new ();
 | 
			
		||||
//    /* config->layouts will be freed on g_object_unref (config) */
 | 
			
		||||
//    if (layouts)
 | 
			
		||||
//        config->layouts = g_strdupv (layouts);
 | 
			
		||||
//    else
 | 
			
		||||
//        config->layouts = layouts;
 | 
			
		||||
//    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
//    g_object_unref (config);
 | 
			
		||||
//    return retval;
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_set_variants:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// * @variants: variant names
 | 
			
		||||
// *
 | 
			
		||||
// * Set the variant names of @layout (in the Libxklavier terminology).
 | 
			
		||||
// * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
// */
 | 
			
		||||
//gboolean
 | 
			
		||||
//eek_xkl_layout_set_variants (EekXklLayout *layout,
 | 
			
		||||
//                             gchar       **variants)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
//    XklConfigRec *config;
 | 
			
		||||
//    gboolean retval;
 | 
			
		||||
//
 | 
			
		||||
//    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
//    config = xkl_config_rec_new ();
 | 
			
		||||
//    /* config->variants will be freed on g_object_unref (config) */
 | 
			
		||||
//    if (variants)
 | 
			
		||||
//        config->variants = g_strdupv (variants);
 | 
			
		||||
//    else
 | 
			
		||||
//        config->variants = NULL;
 | 
			
		||||
//    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
//    g_object_unref (config);
 | 
			
		||||
//    return retval;
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_set_options:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// * @options: option names
 | 
			
		||||
// *
 | 
			
		||||
// * Set the option names of @layout (in the Libxklavier terminology).
 | 
			
		||||
// * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
// */
 | 
			
		||||
//gboolean
 | 
			
		||||
//eek_xkl_layout_set_options (EekXklLayout *layout,
 | 
			
		||||
//                            gchar       **options)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
//    XklConfigRec *config;
 | 
			
		||||
//    gboolean retval;
 | 
			
		||||
//
 | 
			
		||||
//    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
//    config = xkl_config_rec_new ();
 | 
			
		||||
//    /* config->options will be freed on g_object_unref (config) */
 | 
			
		||||
//    if (options)
 | 
			
		||||
//        config->options = options;
 | 
			
		||||
//    else
 | 
			
		||||
//        config->options = NULL;
 | 
			
		||||
//    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
//    g_object_unref (config);
 | 
			
		||||
//    return retval;
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_enable_option:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// * @option: option name
 | 
			
		||||
// *
 | 
			
		||||
// * Set the option of @layout (in the Libxklavier terminology).
 | 
			
		||||
// * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
// */
 | 
			
		||||
//gboolean
 | 
			
		||||
//eek_xkl_layout_enable_option  (EekXklLayout *layout,
 | 
			
		||||
//                               const gchar  *option)
 | 
			
		||||
//{
 | 
			
		||||
//    gchar **options, **_options;
 | 
			
		||||
//    gint i, j;
 | 
			
		||||
//
 | 
			
		||||
//    options = eek_xkl_layout_get_options (layout);
 | 
			
		||||
//    for (i = 0; options && options[i]; i++)
 | 
			
		||||
//        if (g_strcmp0 (options[i], option) == 0)
 | 
			
		||||
//            return TRUE;
 | 
			
		||||
//    _options = g_new0 (gchar *, (i + 2));
 | 
			
		||||
//    for (j = 0; j < i; j++)
 | 
			
		||||
//        _options[j] = g_strdup (options[j]);
 | 
			
		||||
//    _options[i] = g_strdup (option);
 | 
			
		||||
//    /* eek_xkl_layout_set_options() will free _options and its elements. */
 | 
			
		||||
//    return eek_xkl_layout_set_options (layout, _options);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_disable_option:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// * @option: option name
 | 
			
		||||
// *
 | 
			
		||||
// * Unset the option of @layout (in the Libxklavier terminology).
 | 
			
		||||
// * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
// */
 | 
			
		||||
//gboolean
 | 
			
		||||
//eek_xkl_layout_disable_option (EekXklLayout *layout,
 | 
			
		||||
//                               const gchar  *option)
 | 
			
		||||
//{
 | 
			
		||||
//    gchar **options, **_options;
 | 
			
		||||
//    gint i, j, k;
 | 
			
		||||
//
 | 
			
		||||
//    options = eek_xkl_layout_get_options (layout);
 | 
			
		||||
//    if (!options)
 | 
			
		||||
//        return TRUE;
 | 
			
		||||
//    for (i = 0, k = 0; options[i]; i++)
 | 
			
		||||
//        if (g_strcmp0 (options[i], option) == 0)
 | 
			
		||||
//            k = i;
 | 
			
		||||
//    if (options[k] == NULL)
 | 
			
		||||
//        return TRUE;
 | 
			
		||||
//    _options = g_new0 (gchar *, i);
 | 
			
		||||
//    for (j = 0; j < k; j++)
 | 
			
		||||
//        _options[j] = g_strdup (options[j]);
 | 
			
		||||
//    for (j = k + 1; j < i; j++)
 | 
			
		||||
//        _options[j] = g_strdup (options[j]);
 | 
			
		||||
//    /* eek_xkl_layout_set_options() will free _options and its elements. */
 | 
			
		||||
//    return eek_xkl_layout_set_options (layout, _options);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_get_model:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// *
 | 
			
		||||
// * Get the model name of @layout configuration (in the Libxklavier terminology).
 | 
			
		||||
// */
 | 
			
		||||
//gchar *
 | 
			
		||||
//eek_xkl_layout_get_model (EekXklLayout *layout)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
//
 | 
			
		||||
//    g_return_val_if_fail (priv, NULL);
 | 
			
		||||
//    return g_strdup (priv->config->model);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_get_layouts:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// *
 | 
			
		||||
// * Get the layout names of @layout configuration (in the Libxklavier
 | 
			
		||||
// * terminology).
 | 
			
		||||
// */
 | 
			
		||||
//gchar **
 | 
			
		||||
//eek_xkl_layout_get_layouts (EekXklLayout *layout)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
//
 | 
			
		||||
//    g_return_val_if_fail (priv, NULL);
 | 
			
		||||
//    return g_strdupv (priv->config->layouts);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_get_variants:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// *
 | 
			
		||||
// * Get the variant names of @layout configuration (in the Libxklavier
 | 
			
		||||
// * terminology).
 | 
			
		||||
// */
 | 
			
		||||
//gchar **
 | 
			
		||||
//eek_xkl_layout_get_variants (EekXklLayout *layout)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
//
 | 
			
		||||
//    g_return_val_if_fail (priv, NULL);
 | 
			
		||||
//    return g_strdupv (priv->config->variants);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_get_options:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// *
 | 
			
		||||
// * Get the option names of @layout configuration (in the Libxklavier
 | 
			
		||||
// * terminology).
 | 
			
		||||
// */
 | 
			
		||||
//gchar **
 | 
			
		||||
//eek_xkl_layout_get_options (EekXklLayout *layout)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
//
 | 
			
		||||
//    g_return_val_if_fail (priv, NULL);
 | 
			
		||||
//    return g_strdupv (priv->config->options);
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//static gboolean
 | 
			
		||||
//set_xkb_component_names (EekXklLayout *layout, XklConfigRec *config)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayoutPrivate *priv = layout->priv;
 | 
			
		||||
//    XkbComponentNamesRec names;
 | 
			
		||||
//    gboolean retval = FALSE;
 | 
			
		||||
//
 | 
			
		||||
//#if DEBUG
 | 
			
		||||
//    if (config->layouts) {
 | 
			
		||||
//        gint i;
 | 
			
		||||
//
 | 
			
		||||
//        fprintf (stderr, "layout = ");
 | 
			
		||||
//        for (i = 0; config->layouts[i] != NULL; i++)
 | 
			
		||||
//            fprintf (stderr, "\"%s\" ", config->layouts[i]);
 | 
			
		||||
//        fputc ('\n', stderr);
 | 
			
		||||
//    } else
 | 
			
		||||
//        fprintf (stderr, "layouts = NULL\n");
 | 
			
		||||
//    if (config->variants) {
 | 
			
		||||
//        gint i;
 | 
			
		||||
//
 | 
			
		||||
//        fprintf (stderr, "variant = ");
 | 
			
		||||
//        for (i = 0; config->variants[i]; i++)
 | 
			
		||||
//            fprintf (stderr, "\"%s\" ", config->variants[i]);
 | 
			
		||||
//        fputc ('\n', stderr);
 | 
			
		||||
//    } else
 | 
			
		||||
//        fprintf (stderr, "variants = NULL\n");
 | 
			
		||||
//    if (config->options) {
 | 
			
		||||
//        gint i;
 | 
			
		||||
//
 | 
			
		||||
//        fprintf (stderr, "option = ");
 | 
			
		||||
//        for (i = 0; config->options[i]; i++)
 | 
			
		||||
//            fprintf (stderr, "\"%s\" ", config->options[i]);
 | 
			
		||||
//        fputc ('\n', stderr);
 | 
			
		||||
//    } else
 | 
			
		||||
//        fprintf (stderr, "options = NULL\n");
 | 
			
		||||
//#endif
 | 
			
		||||
//
 | 
			
		||||
//    if (xkl_xkb_config_native_prepare (priv->engine, config, &names)) {
 | 
			
		||||
//        GError *error = NULL;
 | 
			
		||||
//        retval = eek_xkb_layout_set_names (EEK_XKB_LAYOUT(layout),
 | 
			
		||||
//                                           &names,
 | 
			
		||||
//                                           &error);
 | 
			
		||||
//        if (!retval)
 | 
			
		||||
//            g_warning ("can't set XKB layout");
 | 
			
		||||
//        xkl_xkb_config_native_cleanup (priv->engine, &names);
 | 
			
		||||
//    }
 | 
			
		||||
//    return retval;
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
///**
 | 
			
		||||
// * eek_xkl_layout_get_option:
 | 
			
		||||
// * @layout: an #EekXklLayout
 | 
			
		||||
// * @option: option name
 | 
			
		||||
// *
 | 
			
		||||
// * Tell if the option of @layout (in the Libxklavier terminology) is set.
 | 
			
		||||
// * Returns: %TRUE if the option is set, %FALSE otherwise
 | 
			
		||||
// */
 | 
			
		||||
//gboolean
 | 
			
		||||
//eek_xkl_layout_get_option (EekXklLayout *layout,
 | 
			
		||||
//                           const gchar  *option)
 | 
			
		||||
//{
 | 
			
		||||
//    gchar **options;
 | 
			
		||||
//    gint i;
 | 
			
		||||
//
 | 
			
		||||
//    options = eek_xkl_layout_get_options (layout);
 | 
			
		||||
//    for (i = 0; options && options[i]; i++)
 | 
			
		||||
//        if (g_strcmp0 (options[i], option) == 0)
 | 
			
		||||
//            return TRUE;
 | 
			
		||||
//    return FALSE;
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//static gboolean
 | 
			
		||||
//initable_init (GInitable    *initable,
 | 
			
		||||
//               GCancellable *cancellable,
 | 
			
		||||
//               GError      **error)
 | 
			
		||||
//{
 | 
			
		||||
//    EekXklLayout *layout = EEK_XKL_LAYOUT (initable);
 | 
			
		||||
//    Display *display;
 | 
			
		||||
//
 | 
			
		||||
//    if (!parent_initable_iface->init (initable, cancellable, error))
 | 
			
		||||
//        return FALSE;
 | 
			
		||||
//
 | 
			
		||||
//    layout->priv->config = xkl_config_rec_new ();
 | 
			
		||||
//
 | 
			
		||||
//    g_object_get (G_OBJECT (initable),
 | 
			
		||||
//                  "display", &display,
 | 
			
		||||
//                  NULL);
 | 
			
		||||
//
 | 
			
		||||
//    layout->priv->engine = xkl_engine_get_instance (display);
 | 
			
		||||
//
 | 
			
		||||
//    if (!xkl_config_rec_get_from_server (layout->priv->config,
 | 
			
		||||
//                                         layout->priv->engine)) {
 | 
			
		||||
//        g_set_error (error,
 | 
			
		||||
//                     EEK_ERROR,
 | 
			
		||||
//                     EEK_ERROR_LAYOUT_ERROR,
 | 
			
		||||
//                     "can't load libxklavier configuration");
 | 
			
		||||
//        return FALSE;
 | 
			
		||||
//    }
 | 
			
		||||
//
 | 
			
		||||
//    set_xkb_component_names (layout, layout->priv->config);
 | 
			
		||||
//    return TRUE;
 | 
			
		||||
//}
 | 
			
		||||
//
 | 
			
		||||
//static void
 | 
			
		||||
//initable_iface_init (GInitableIface *initable_iface)
 | 
			
		||||
//{
 | 
			
		||||
//    parent_initable_iface = g_type_interface_peek_parent (initable_iface);
 | 
			
		||||
//    initable_iface->init = initable_init;
 | 
			
		||||
//}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										97
									
								
								eek/eek-wkl-layout.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								eek/eek-wkl-layout.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,97 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2 of
 | 
			
		||||
 * the License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library 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
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
//#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
//#error "Only <eek/eek-xkl.h> can be included directly."
 | 
			
		||||
//#endif
 | 
			
		||||
//
 | 
			
		||||
//#ifndef EEK_XKL_LAYOUT_H
 | 
			
		||||
//#define EEK_XKL_LAYOUT_H 1
 | 
			
		||||
//
 | 
			
		||||
//#include <libxklavier/xklavier.h>
 | 
			
		||||
//#include "eek-xkb-layout.h"
 | 
			
		||||
//
 | 
			
		||||
//G_BEGIN_DECLS
 | 
			
		||||
//
 | 
			
		||||
//#define EEK_TYPE_XKL_LAYOUT (eek_xkl_layout_get_type())
 | 
			
		||||
//#define EEK_XKL_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_XKL_LAYOUT, EekXklLayout))
 | 
			
		||||
//#define EEK_XKL_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_XKL_LAYOUT, EekXklLayoutClass))
 | 
			
		||||
//#define EEK_IS_XKL_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_XKL_LAYOUT))
 | 
			
		||||
//#define EEK_IS_XKL_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_XKL_LAYOUT))
 | 
			
		||||
//#define EEK_XKL_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_XKL_LAYOUT, EekXklLayoutClass))
 | 
			
		||||
//
 | 
			
		||||
//typedef struct _EekXklLayout        EekXklLayout;
 | 
			
		||||
//typedef struct _EekXklLayoutClass   EekXklLayoutClass;
 | 
			
		||||
//typedef struct _EekXklLayoutPrivate EekXklLayoutPrivate;
 | 
			
		||||
//
 | 
			
		||||
//struct _EekXklLayout
 | 
			
		||||
//{
 | 
			
		||||
//    /*< private >*/
 | 
			
		||||
//    EekXkbLayout parent;
 | 
			
		||||
//
 | 
			
		||||
//    EekXklLayoutPrivate *priv;
 | 
			
		||||
//};
 | 
			
		||||
//
 | 
			
		||||
//struct _EekXklLayoutClass
 | 
			
		||||
//{
 | 
			
		||||
//    /*< private >*/
 | 
			
		||||
//    EekXkbLayoutClass parent_class;
 | 
			
		||||
//
 | 
			
		||||
//    /*< private >*/
 | 
			
		||||
//    /* padding */
 | 
			
		||||
//    gpointer pdummy[24];
 | 
			
		||||
//};
 | 
			
		||||
//
 | 
			
		||||
//GType      eek_xkl_layout_get_type        (void) G_GNUC_CONST;
 | 
			
		||||
//
 | 
			
		||||
//EekLayout *eek_xkl_layout_new             (Display      *display,
 | 
			
		||||
//                                           GError      **error);
 | 
			
		||||
//
 | 
			
		||||
//gboolean   eek_xkl_layout_set_config      (EekXklLayout *layout,
 | 
			
		||||
//                                           XklConfigRec *config);
 | 
			
		||||
//
 | 
			
		||||
//gboolean   eek_xkl_layout_set_config_full (EekXklLayout *layout,
 | 
			
		||||
//                                           gchar        *model,
 | 
			
		||||
//                                           gchar       **layouts,
 | 
			
		||||
//                                           gchar       **variants,
 | 
			
		||||
//                                           gchar       **options);
 | 
			
		||||
//
 | 
			
		||||
//gboolean   eek_xkl_layout_set_model       (EekXklLayout *layout,
 | 
			
		||||
//                                           const gchar  *model);
 | 
			
		||||
//gboolean   eek_xkl_layout_set_layouts     (EekXklLayout *layout,
 | 
			
		||||
//                                           gchar       **layouts);
 | 
			
		||||
//gboolean   eek_xkl_layout_set_variants    (EekXklLayout *layout,
 | 
			
		||||
//                                           gchar       **variants);
 | 
			
		||||
//gboolean   eek_xkl_layout_set_options     (EekXklLayout *layout,
 | 
			
		||||
//                                           gchar       **options);
 | 
			
		||||
//gboolean   eek_xkl_layout_enable_option   (EekXklLayout *layout,
 | 
			
		||||
//                                           const gchar  *option);
 | 
			
		||||
//gboolean   eek_xkl_layout_disable_option  (EekXklLayout *layout,
 | 
			
		||||
//                                           const gchar  *option);
 | 
			
		||||
//
 | 
			
		||||
//gchar     *eek_xkl_layout_get_model       (EekXklLayout *layout);
 | 
			
		||||
//gchar    **eek_xkl_layout_get_layouts     (EekXklLayout *layout);
 | 
			
		||||
//gchar    **eek_xkl_layout_get_variants    (EekXklLayout *layout);
 | 
			
		||||
//gchar    **eek_xkl_layout_get_options     (EekXklLayout *layout);
 | 
			
		||||
//gboolean   eek_xkl_layout_get_option      (EekXklLayout *layout,
 | 
			
		||||
//                                           const gchar  *option);
 | 
			
		||||
//
 | 
			
		||||
//G_END_DECLS
 | 
			
		||||
//#endif              /* #ifndef EEK_XKL_LAYOUT_H */
 | 
			
		||||
@ -17,10 +17,10 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
#ifndef EEK_XKB_H
 | 
			
		||||
#define EEK_XKB_H 1
 | 
			
		||||
 | 
			
		||||
#include "eek.h"
 | 
			
		||||
#include "eek-xkb-layout.h"
 | 
			
		||||
 | 
			
		||||
#endif  /* EEK_XKB_H */
 | 
			
		||||
//#ifndef EEK_XKL_H
 | 
			
		||||
//#define EEK_XKL_H 1
 | 
			
		||||
//
 | 
			
		||||
//#include "eek.h"
 | 
			
		||||
//#include "eek-xkl-layout.h"
 | 
			
		||||
//
 | 
			
		||||
//#endif  /* EEK_XKL_H */
 | 
			
		||||
@ -1,679 +0,0 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2006 Sergey V. Udaltsov <svu@gnome.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2 of
 | 
			
		||||
 * the License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library 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
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:eek-xkb-layout
 | 
			
		||||
 * @short_description: Layout engine using XKB configuration
 | 
			
		||||
 *
 | 
			
		||||
 * The #EekXkbLayout inherits #EekLayout class and arranges keyboard
 | 
			
		||||
 * elements using XKB.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CONFIG_H
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#endif  /* HAVE_CONFIG_H */
 | 
			
		||||
 | 
			
		||||
#include <X11/keysym.h>
 | 
			
		||||
#include <X11/XKBlib.h>
 | 
			
		||||
#include <X11/extensions/XKBgeom.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <gio/gio.h>
 | 
			
		||||
 | 
			
		||||
#include "eek-xkb-layout.h"
 | 
			
		||||
#include "eek-keyboard.h"
 | 
			
		||||
#include "eek-section.h"
 | 
			
		||||
#include "eek-key.h"
 | 
			
		||||
#include "eek-keysym.h"
 | 
			
		||||
 | 
			
		||||
#define XKB_COMPONENT_MASK (XkbGBN_GeometryMask |       \
 | 
			
		||||
                            XkbGBN_KeyNamesMask |       \
 | 
			
		||||
                            XkbGBN_OtherNamesMask |     \
 | 
			
		||||
                            XkbGBN_SymbolsMask |        \
 | 
			
		||||
                            XkbGBN_IndicatorMapMask)
 | 
			
		||||
 | 
			
		||||
static void initable_iface_init (GInitableIface *initable_iface);
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_CODE (EekXkbLayout, eek_xkb_layout, EEK_TYPE_LAYOUT,
 | 
			
		||||
                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
 | 
			
		||||
                                                initable_iface_init));
 | 
			
		||||
 | 
			
		||||
#define EEK_XKB_LAYOUT_GET_PRIVATE(obj)                                  \
 | 
			
		||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutPrivate))
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
    PROP_0,
 | 
			
		||||
    PROP_DISPLAY,
 | 
			
		||||
    PROP_LAST
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _EekXkbLayoutPrivate
 | 
			
		||||
{
 | 
			
		||||
    /* Configuration names that should synch'ed to the symbolic names
 | 
			
		||||
       in priv->xkb->names.  Since we use GLib's memory allocator,
 | 
			
		||||
       don't store any address returned from the X server here. */
 | 
			
		||||
    XkbComponentNamesRec names;
 | 
			
		||||
 | 
			
		||||
    Display *display;
 | 
			
		||||
 | 
			
		||||
    /* Actual XKB configuration of DISPLAY. */
 | 
			
		||||
    XkbDescRec *xkb;
 | 
			
		||||
 | 
			
		||||
    /* Hash table to cache orefs by shape address. */
 | 
			
		||||
    GHashTable *shape_oref_hash;
 | 
			
		||||
 | 
			
		||||
    gint scale_numerator;
 | 
			
		||||
    gint scale_denominator;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static guint    find_keycode             (EekXkbLayout *layout,
 | 
			
		||||
                                          gchar        *key_name);
 | 
			
		||||
 | 
			
		||||
static gboolean get_keyboard_from_server (EekXkbLayout *layout,
 | 
			
		||||
                                          GError      **error);
 | 
			
		||||
 | 
			
		||||
static gboolean get_names_from_server    (EekXkbLayout *layout,
 | 
			
		||||
                                          GError      **error);
 | 
			
		||||
 | 
			
		||||
static void     setup_scaling            (EekXkbLayout *layout,
 | 
			
		||||
                                          gdouble       width,
 | 
			
		||||
                                          gdouble       height);
 | 
			
		||||
 | 
			
		||||
G_INLINE_FUNC gint
 | 
			
		||||
xkb_to_pixmap_coord (EekXkbLayout *layout,
 | 
			
		||||
                     gint          n)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
    return n * priv->scale_numerator / priv->scale_denominator;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
G_INLINE_FUNC gdouble
 | 
			
		||||
xkb_to_pixmap_double (EekXkbLayout *layout,
 | 
			
		||||
                     gdouble       d)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
    return d * priv->scale_numerator / priv->scale_denominator;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
create_key (EekXkbLayout *layout,
 | 
			
		||||
            EekKeyboard  *keyboard,
 | 
			
		||||
            EekSection   *section,
 | 
			
		||||
            gint          column,
 | 
			
		||||
            gint          row,
 | 
			
		||||
            gdouble       x,
 | 
			
		||||
            gdouble       y,
 | 
			
		||||
            XkbKeyRec    *xkbkey)
 | 
			
		||||
{
 | 
			
		||||
    XkbGeometryRec *xkbgeometry;
 | 
			
		||||
    XkbBoundsRec *xkbbounds;
 | 
			
		||||
    XkbShapeRec *xkbshape;
 | 
			
		||||
    XkbOutlineRec *xkboutline;
 | 
			
		||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
    EekKey *key;
 | 
			
		||||
    EekBounds bounds;
 | 
			
		||||
    EekSymbolMatrix *matrix = NULL;
 | 
			
		||||
    gchar name[XkbKeyNameLength + 1];
 | 
			
		||||
    KeyCode keycode;
 | 
			
		||||
    gint num_groups, num_levels;
 | 
			
		||||
    guint oref;
 | 
			
		||||
    gpointer v;
 | 
			
		||||
 | 
			
		||||
    xkbgeometry = priv->xkb->geom;
 | 
			
		||||
    xkbshape = &xkbgeometry->shapes[xkbkey->shape_ndx];
 | 
			
		||||
    if (g_hash_table_lookup_extended (priv->shape_oref_hash, xkbshape,
 | 
			
		||||
                                      NULL, &v)) {
 | 
			
		||||
        oref = GPOINTER_TO_UINT(v);
 | 
			
		||||
    } else {
 | 
			
		||||
        EekOutline *outline;
 | 
			
		||||
 | 
			
		||||
        xkboutline = xkbshape->primary == NULL ? &xkbshape->outlines[0] :
 | 
			
		||||
            xkbshape->primary;
 | 
			
		||||
 | 
			
		||||
        outline = g_slice_new (EekOutline);
 | 
			
		||||
        outline->corner_radius = xkb_to_pixmap_coord(layout,
 | 
			
		||||
                                                     xkboutline->corner_radius);
 | 
			
		||||
 | 
			
		||||
        if (xkboutline->num_points <= 2) { /* rectangular */
 | 
			
		||||
            gdouble x1, y1, x2, y2;
 | 
			
		||||
 | 
			
		||||
            outline->num_points = 4;
 | 
			
		||||
            outline->points = g_slice_alloc0 (sizeof (EekPoint) *
 | 
			
		||||
                                              outline->num_points);
 | 
			
		||||
            if (xkboutline->num_points == 1) {
 | 
			
		||||
                x1 = xkb_to_pixmap_coord(layout, xkbshape->bounds.x1);
 | 
			
		||||
                y1 = xkb_to_pixmap_coord(layout, xkbshape->bounds.y1);
 | 
			
		||||
                x2 = xkb_to_pixmap_coord(layout, xkboutline->points[0].x);
 | 
			
		||||
                y2 = xkb_to_pixmap_coord(layout, xkboutline->points[0].y);
 | 
			
		||||
            } else {
 | 
			
		||||
                x1 = xkb_to_pixmap_coord(layout, xkboutline->points[0].x);
 | 
			
		||||
                y1 = xkb_to_pixmap_coord(layout, xkboutline->points[0].y);
 | 
			
		||||
                x2 = xkb_to_pixmap_coord(layout, xkboutline->points[1].x);
 | 
			
		||||
                y2 = xkb_to_pixmap_coord(layout, xkboutline->points[1].y);
 | 
			
		||||
            }
 | 
			
		||||
            outline->points[0].x = outline->points[3].x = x1;
 | 
			
		||||
            outline->points[0].y = outline->points[1].y = y1;
 | 
			
		||||
            outline->points[1].x = outline->points[2].x = x2;
 | 
			
		||||
            outline->points[2].y = outline->points[3].y = y2;
 | 
			
		||||
        } else {                /* polygon */
 | 
			
		||||
            gint i;
 | 
			
		||||
 | 
			
		||||
            outline->num_points = xkboutline->num_points;
 | 
			
		||||
            outline->points = g_new0 (EekPoint, outline->num_points);
 | 
			
		||||
            for (i = 0; i < xkboutline->num_points; i++) {
 | 
			
		||||
                outline->points[i].x =
 | 
			
		||||
                    xkb_to_pixmap_coord(layout, xkboutline->points[i].x);
 | 
			
		||||
                outline->points[i].y =
 | 
			
		||||
                    xkb_to_pixmap_coord(layout, xkboutline->points[i].y);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        oref = eek_keyboard_add_outline (keyboard, outline);
 | 
			
		||||
        eek_outline_free (outline);
 | 
			
		||||
        g_hash_table_insert (priv->shape_oref_hash, xkbshape,
 | 
			
		||||
                             GUINT_TO_POINTER(oref));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memset (name, 0, sizeof name);
 | 
			
		||||
    memcpy (name, xkbkey->name.name, sizeof name - 1);
 | 
			
		||||
 | 
			
		||||
    xkbbounds = &xkbgeometry->shapes[xkbkey->shape_ndx].bounds;
 | 
			
		||||
    bounds.x = xkb_to_pixmap_coord(layout, xkbbounds->x1 + x);
 | 
			
		||||
    bounds.y = xkb_to_pixmap_coord(layout, xkbbounds->y1 + y);
 | 
			
		||||
    bounds.width = xkb_to_pixmap_coord(layout, xkbbounds->x2 - xkbbounds->x1);
 | 
			
		||||
    bounds.height = xkb_to_pixmap_coord(layout, xkbbounds->y2 - xkbbounds->y1);
 | 
			
		||||
 | 
			
		||||
    keycode = find_keycode (layout, name);
 | 
			
		||||
    if (keycode == EEK_INVALID_KEYCODE) {
 | 
			
		||||
        num_groups = num_levels = 0;
 | 
			
		||||
        matrix = eek_symbol_matrix_new (0, 0);
 | 
			
		||||
    } else {
 | 
			
		||||
        KeySym keysym;
 | 
			
		||||
        gint i, j;
 | 
			
		||||
 | 
			
		||||
        num_groups = XkbKeyNumGroups (priv->xkb, keycode);
 | 
			
		||||
        num_levels = XkbKeyGroupsWidth (priv->xkb, keycode);
 | 
			
		||||
        matrix = eek_symbol_matrix_new (num_groups, num_levels);
 | 
			
		||||
        for (i = 0; i < num_groups; i++)
 | 
			
		||||
            for (j = 0; j < num_levels; j++) {
 | 
			
		||||
                EekModifierType modifier;
 | 
			
		||||
 | 
			
		||||
                keysym = XkbKeySymEntry (priv->xkb, keycode, j, i);
 | 
			
		||||
                modifier = XkbKeysymToModifiers (priv->display, keysym);
 | 
			
		||||
                matrix->data[i * num_levels + j] =
 | 
			
		||||
                    EEK_SYMBOL(eek_keysym_new_with_modifier (keysym,
 | 
			
		||||
                                                             modifier));
 | 
			
		||||
            }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    key = eek_section_create_key (section, keycode, column, row);
 | 
			
		||||
    eek_element_set_name (EEK_ELEMENT(key), name);
 | 
			
		||||
    eek_element_set_bounds (EEK_ELEMENT(key), &bounds);
 | 
			
		||||
    eek_key_set_symbol_matrix (key, matrix);
 | 
			
		||||
    eek_symbol_matrix_free (matrix);
 | 
			
		||||
    eek_key_set_oref (key, oref);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
create_section (EekXkbLayout  *layout,
 | 
			
		||||
                EekKeyboard   *keyboard,
 | 
			
		||||
                XkbSectionRec *xkbsection)
 | 
			
		||||
{
 | 
			
		||||
    XkbGeometryRec *xkbgeometry;
 | 
			
		||||
    EekXkbLayoutPrivate *priv;
 | 
			
		||||
    EekSection *section;
 | 
			
		||||
    EekBounds bounds;
 | 
			
		||||
    gchar *name;
 | 
			
		||||
    gfloat left, top;
 | 
			
		||||
    gint i, j;
 | 
			
		||||
 | 
			
		||||
    bounds.x = xkb_to_pixmap_coord(layout, xkbsection->left);
 | 
			
		||||
    bounds.y = xkb_to_pixmap_coord(layout, xkbsection->top);
 | 
			
		||||
    bounds.width = xkb_to_pixmap_coord(layout, xkbsection->width);
 | 
			
		||||
    bounds.height = xkb_to_pixmap_coord(layout, xkbsection->height);
 | 
			
		||||
 | 
			
		||||
    priv = layout->priv;
 | 
			
		||||
    xkbgeometry = priv->xkb->geom;
 | 
			
		||||
    section = eek_keyboard_create_section (keyboard);
 | 
			
		||||
    name = XGetAtomName (priv->display, xkbsection->name);
 | 
			
		||||
    eek_element_set_name (EEK_ELEMENT(section), name);
 | 
			
		||||
    XFree (name);
 | 
			
		||||
    eek_element_set_bounds (EEK_ELEMENT(section), &bounds);
 | 
			
		||||
    eek_section_set_angle (section,
 | 
			
		||||
                           /* angle is in tenth of degree */
 | 
			
		||||
                           xkbsection->angle / 10);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < xkbsection->num_rows; i++) {
 | 
			
		||||
        XkbRowRec *xkbrow;
 | 
			
		||||
 | 
			
		||||
        xkbrow = &xkbsection->rows[i];
 | 
			
		||||
        left = xkbrow->left;
 | 
			
		||||
        top = xkbrow->top;
 | 
			
		||||
        eek_section_add_row (section,
 | 
			
		||||
                             xkbrow->num_keys,
 | 
			
		||||
                             xkbrow->vertical ?
 | 
			
		||||
                             EEK_ORIENTATION_VERTICAL :
 | 
			
		||||
                             EEK_ORIENTATION_HORIZONTAL);
 | 
			
		||||
        for (j = 0; j < xkbrow->num_keys; j++) {
 | 
			
		||||
            XkbKeyRec *xkbkey;
 | 
			
		||||
            XkbBoundsRec *xkbbounds;
 | 
			
		||||
 | 
			
		||||
            xkbkey = &xkbrow->keys[j];
 | 
			
		||||
            if (xkbrow->vertical)
 | 
			
		||||
                top += xkbkey->gap;
 | 
			
		||||
            else
 | 
			
		||||
                left += xkbkey->gap;
 | 
			
		||||
            create_key (layout, keyboard, section, j, i, left, top, xkbkey);
 | 
			
		||||
            xkbbounds = &xkbgeometry->shapes[xkbkey->shape_ndx].bounds;
 | 
			
		||||
            if (xkbrow->vertical)
 | 
			
		||||
                top += xkbbounds->y2 - xkbbounds->y1;
 | 
			
		||||
            else
 | 
			
		||||
                left += xkbbounds->x2 - xkbbounds->x1;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
create_keyboard (EekXkbLayout *layout, EekKeyboard *keyboard)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
    XkbGeometryRec *xkbgeometry;
 | 
			
		||||
    EekBounds bounds;
 | 
			
		||||
    gint i;
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail (priv->xkb);
 | 
			
		||||
    g_return_if_fail (priv->xkb->geom);
 | 
			
		||||
 | 
			
		||||
    xkbgeometry = priv->xkb->geom;
 | 
			
		||||
 | 
			
		||||
    eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
			
		||||
    setup_scaling (EEK_XKB_LAYOUT(layout), bounds.width, bounds.height);
 | 
			
		||||
 | 
			
		||||
    bounds.x = bounds.y = 0;
 | 
			
		||||
    bounds.width = xkb_to_pixmap_coord(layout, xkbgeometry->width_mm);
 | 
			
		||||
    bounds.height = xkb_to_pixmap_coord(layout, xkbgeometry->height_mm);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < xkbgeometry->num_sections; i++) {
 | 
			
		||||
        XkbSectionRec *xkbsection;
 | 
			
		||||
 | 
			
		||||
        xkbsection = &xkbgeometry->sections[i];
 | 
			
		||||
        create_section (layout, keyboard, xkbsection);
 | 
			
		||||
    }
 | 
			
		||||
    eek_element_set_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static EekKeyboard *
 | 
			
		||||
eek_xkb_layout_real_create_keyboard (EekLayout *self,
 | 
			
		||||
                                     gdouble    initial_width,
 | 
			
		||||
                                     gdouble    initial_height)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
 | 
			
		||||
    EekBounds bounds;
 | 
			
		||||
    EekKeyboard *keyboard;
 | 
			
		||||
 | 
			
		||||
    keyboard = g_object_new (EEK_TYPE_KEYBOARD, "layout", self, NULL);
 | 
			
		||||
    bounds.x = bounds.y = 0.0;
 | 
			
		||||
    bounds.width = initial_width;
 | 
			
		||||
    bounds.height = initial_height;
 | 
			
		||||
    eek_element_set_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
			
		||||
 | 
			
		||||
    /* resolve modifiers dynamically assigned at run time */
 | 
			
		||||
    eek_keyboard_set_num_lock_mask (keyboard,
 | 
			
		||||
                                    XkbKeysymToModifiers (priv->display,
 | 
			
		||||
                                                          XK_Num_Lock));
 | 
			
		||||
    eek_keyboard_set_alt_gr_mask (keyboard,
 | 
			
		||||
                                  XkbKeysymToModifiers (priv->display,
 | 
			
		||||
                                                        XK_ISO_Level3_Shift));
 | 
			
		||||
 | 
			
		||||
    if (priv->shape_oref_hash)
 | 
			
		||||
        g_hash_table_destroy (priv->shape_oref_hash);
 | 
			
		||||
 | 
			
		||||
    priv->shape_oref_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
 | 
			
		||||
    create_keyboard (EEK_XKB_LAYOUT(self), keyboard);
 | 
			
		||||
    g_hash_table_destroy (priv->shape_oref_hash);
 | 
			
		||||
 | 
			
		||||
    return keyboard;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_xkb_layout_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (object);
 | 
			
		||||
 | 
			
		||||
    g_free (priv->names.keycodes);
 | 
			
		||||
    g_free (priv->names.geometry);
 | 
			
		||||
    g_free (priv->names.symbols);
 | 
			
		||||
    XkbFreeKeyboard (priv->xkb, 0, TRUE);	/* free_all = TRUE */
 | 
			
		||||
    G_OBJECT_CLASS (eek_xkb_layout_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void 
 | 
			
		||||
eek_xkb_layout_set_property (GObject      *object,
 | 
			
		||||
                             guint         prop_id,
 | 
			
		||||
                             const GValue *value,
 | 
			
		||||
                             GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
 | 
			
		||||
 | 
			
		||||
    switch (prop_id) {
 | 
			
		||||
    case PROP_DISPLAY:
 | 
			
		||||
        layout->priv->display = g_value_get_pointer (value);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void 
 | 
			
		||||
eek_xkb_layout_get_property (GObject    *object,
 | 
			
		||||
                             guint       prop_id,
 | 
			
		||||
                             GValue     *value,
 | 
			
		||||
                             GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
 | 
			
		||||
 | 
			
		||||
    switch (prop_id) {
 | 
			
		||||
    case PROP_DISPLAY:
 | 
			
		||||
        g_value_set_pointer (value, layout->priv->display);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_xkb_layout_class_init (EekXkbLayoutClass *klass)
 | 
			
		||||
{
 | 
			
		||||
    EekLayoutClass *layout_class = EEK_LAYOUT_CLASS (klass);
 | 
			
		||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
    GParamSpec *pspec;
 | 
			
		||||
 | 
			
		||||
    g_type_class_add_private (gobject_class, sizeof (EekXkbLayoutPrivate));
 | 
			
		||||
 | 
			
		||||
    layout_class->create_keyboard = eek_xkb_layout_real_create_keyboard;
 | 
			
		||||
 | 
			
		||||
    gobject_class->finalize = eek_xkb_layout_finalize;
 | 
			
		||||
    gobject_class->set_property = eek_xkb_layout_set_property;
 | 
			
		||||
    gobject_class->get_property = eek_xkb_layout_get_property;
 | 
			
		||||
 | 
			
		||||
    pspec = g_param_spec_pointer ("display",
 | 
			
		||||
                                  "Display",
 | 
			
		||||
                                  "X Display",
 | 
			
		||||
                                  G_PARAM_READWRITE |
 | 
			
		||||
                                  G_PARAM_CONSTRUCT_ONLY);
 | 
			
		||||
    g_object_class_install_property (gobject_class, PROP_DISPLAY, pspec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_xkb_layout_init (EekXkbLayout *self)
 | 
			
		||||
{
 | 
			
		||||
    self->priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
get_names_from_server (EekXkbLayout *layout,
 | 
			
		||||
                       GError      **error)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
    gchar *name;
 | 
			
		||||
 | 
			
		||||
    XkbGetNames (priv->display, XkbAllNamesMask, priv->xkb);
 | 
			
		||||
 | 
			
		||||
    if (priv->xkb->names->keycodes <= 0)
 | 
			
		||||
        g_warning ("XKB keycodes setting is not loaded properly");
 | 
			
		||||
    else {
 | 
			
		||||
        name = XGetAtomName (priv->display, priv->xkb->names->keycodes);
 | 
			
		||||
        if (!name)
 | 
			
		||||
            g_warning ("Can't get the name of keycodes");
 | 
			
		||||
        else if (!priv->names.keycodes ||
 | 
			
		||||
                 g_strcmp0 (name, priv->names.keycodes)) {
 | 
			
		||||
            g_free (priv->names.keycodes);
 | 
			
		||||
            priv->names.keycodes = g_strdup (name);
 | 
			
		||||
            XFree (name);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (priv->xkb->names->geometry <= 0)
 | 
			
		||||
        g_warning ("XKB geometry setting is not loaded");
 | 
			
		||||
    else {
 | 
			
		||||
        name = XGetAtomName (priv->display, priv->xkb->names->geometry);
 | 
			
		||||
        if (!name)
 | 
			
		||||
            g_warning ("Can't get the name of geometry");
 | 
			
		||||
        else if (!priv->names.geometry ||
 | 
			
		||||
                 g_strcmp0 (name, priv->names.geometry)) {
 | 
			
		||||
            g_free (priv->names.geometry);
 | 
			
		||||
            priv->names.geometry = g_strdup (name);
 | 
			
		||||
            XFree (name);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (priv->xkb->names->symbols <= 0)
 | 
			
		||||
        g_warning ("XKB symbols setting is not loaded");
 | 
			
		||||
    else {
 | 
			
		||||
        name = XGetAtomName (priv->display, priv->xkb->names->symbols);
 | 
			
		||||
        if (!name)
 | 
			
		||||
            g_warning ("Can't get the name of symbols");
 | 
			
		||||
        else if (!priv->names.symbols ||
 | 
			
		||||
                 g_strcmp0 (name, priv->names.symbols)) {
 | 
			
		||||
            g_free (priv->names.symbols);
 | 
			
		||||
            priv->names.symbols = g_strdup (name);
 | 
			
		||||
            XFree (name);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkb_layout_new:
 | 
			
		||||
 *
 | 
			
		||||
 * Create a new #EekXkbLayout.
 | 
			
		||||
 */
 | 
			
		||||
EekLayout *
 | 
			
		||||
eek_xkb_layout_new (Display *display,
 | 
			
		||||
                    GError **error)
 | 
			
		||||
{
 | 
			
		||||
    return (EekLayout *) g_initable_new (EEK_TYPE_XKB_LAYOUT,
 | 
			
		||||
                                         NULL,
 | 
			
		||||
                                         error,
 | 
			
		||||
                                         "display", display,
 | 
			
		||||
                                         NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkb_layout_set_names: (skip)
 | 
			
		||||
 * @layout: an #EekXkbLayout
 | 
			
		||||
 * @names: XKB component names
 | 
			
		||||
 * @error: a #GError
 | 
			
		||||
 *
 | 
			
		||||
 * Set the XKB component names to @layout.
 | 
			
		||||
 * Returns: %TRUE if the component names are successfully set, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkb_layout_set_names (EekXkbLayout         *layout,
 | 
			
		||||
                          XkbComponentNamesRec *names,
 | 
			
		||||
                          GError              **error)
 | 
			
		||||
{
 | 
			
		||||
    if (g_strcmp0 (names->keycodes, layout->priv->names.keycodes)) {
 | 
			
		||||
        g_free (layout->priv->names.keycodes);
 | 
			
		||||
        layout->priv->names.keycodes = g_strdup (names->keycodes);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (g_strcmp0 (names->geometry, layout->priv->names.geometry)) {
 | 
			
		||||
        g_free (layout->priv->names.geometry);
 | 
			
		||||
        layout->priv->names.geometry = g_strdup (names->geometry);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (g_strcmp0 (names->symbols, layout->priv->names.symbols)) {
 | 
			
		||||
        g_free (layout->priv->names.symbols);
 | 
			
		||||
        layout->priv->names.symbols = g_strdup (names->symbols);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return get_keyboard_from_server (layout, error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
get_keyboard_from_server (EekXkbLayout *layout,
 | 
			
		||||
                          GError      **error)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
 | 
			
		||||
    if (priv->xkb) {
 | 
			
		||||
        XkbFreeKeyboard (priv->xkb, 0, True);
 | 
			
		||||
        priv->xkb = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (priv->names.keycodes && priv->names.geometry && priv->names.symbols) {
 | 
			
		||||
        priv->xkb = XkbGetKeyboardByName (priv->display,
 | 
			
		||||
                                          XkbUseCoreKbd,
 | 
			
		||||
                                          &priv->names,
 | 
			
		||||
                                          0,
 | 
			
		||||
                                          XKB_COMPONENT_MASK,
 | 
			
		||||
                                          False);
 | 
			
		||||
    } else {
 | 
			
		||||
        priv->xkb = XkbGetKeyboard (priv->display,
 | 
			
		||||
                                    XKB_COMPONENT_MASK,
 | 
			
		||||
                                    XkbUseCoreKbd);
 | 
			
		||||
        if (!get_names_from_server (layout, error)) {
 | 
			
		||||
            XkbFreeKeyboard (priv->xkb, 0, True);
 | 
			
		||||
            priv->xkb = NULL;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (priv->xkb == NULL) {
 | 
			
		||||
        g_set_error (error,
 | 
			
		||||
                     EEK_ERROR,
 | 
			
		||||
                     EEK_ERROR_LAYOUT_ERROR,
 | 
			
		||||
                     "can't get keyboard from server");
 | 
			
		||||
        g_free (priv->names.keycodes);
 | 
			
		||||
        priv->names.keycodes = NULL;
 | 
			
		||||
        g_free (priv->names.geometry);
 | 
			
		||||
        priv->names.geometry = NULL;
 | 
			
		||||
        g_free (priv->names.symbols);
 | 
			
		||||
        priv->names.symbols = NULL;
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static guint
 | 
			
		||||
find_keycode (EekXkbLayout *layout, gchar *key_name)
 | 
			
		||||
{
 | 
			
		||||
#define KEYSYM_NAME_MAX_LENGTH 4
 | 
			
		||||
    guint keycode;
 | 
			
		||||
    gint i, j;
 | 
			
		||||
    XkbKeyNamePtr pkey;
 | 
			
		||||
    XkbKeyAliasPtr palias;
 | 
			
		||||
    guint is_name_matched;
 | 
			
		||||
    gchar *src, *dst;
 | 
			
		||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
 | 
			
		||||
    if (!priv->xkb)
 | 
			
		||||
        return EEK_INVALID_KEYCODE;
 | 
			
		||||
 | 
			
		||||
    pkey = priv->xkb->names->keys + priv->xkb->min_key_code;
 | 
			
		||||
    for (keycode = priv->xkb->min_key_code;
 | 
			
		||||
         keycode <= priv->xkb->max_key_code; keycode++) {
 | 
			
		||||
        is_name_matched = 1;
 | 
			
		||||
        src = key_name;
 | 
			
		||||
        dst = pkey->name;
 | 
			
		||||
        for (i = KEYSYM_NAME_MAX_LENGTH; --i >= 0;) {
 | 
			
		||||
            if ('\0' == *src)
 | 
			
		||||
                break;
 | 
			
		||||
            if (*src++ != *dst++) {
 | 
			
		||||
                is_name_matched = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (is_name_matched)
 | 
			
		||||
            return keycode;
 | 
			
		||||
        pkey++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    palias = priv->xkb->names->key_aliases;
 | 
			
		||||
    for (j = priv->xkb->names->num_key_aliases; --j >= 0;) {
 | 
			
		||||
        is_name_matched = 1;
 | 
			
		||||
        src = key_name;
 | 
			
		||||
        dst = palias->alias;
 | 
			
		||||
        for (i = KEYSYM_NAME_MAX_LENGTH; --i >= 0;) {
 | 
			
		||||
            if ('\0' == *src)
 | 
			
		||||
                break;
 | 
			
		||||
            if (*src++ != *dst++) {
 | 
			
		||||
                is_name_matched = 0;
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (is_name_matched) {
 | 
			
		||||
            keycode = find_keycode (layout, palias->real);
 | 
			
		||||
            return keycode;
 | 
			
		||||
        }
 | 
			
		||||
        palias++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return EEK_INVALID_KEYCODE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
setup_scaling (EekXkbLayout *layout,
 | 
			
		||||
               gdouble       width,
 | 
			
		||||
               gdouble       height)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail (priv->xkb);
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail (priv->xkb->geom->width_mm > 0);
 | 
			
		||||
    g_return_if_fail (priv->xkb->geom->height_mm > 0);
 | 
			
		||||
 | 
			
		||||
    if (width * priv->xkb->geom->height_mm <
 | 
			
		||||
        height * priv->xkb->geom->width_mm) {
 | 
			
		||||
        priv->scale_numerator = width;
 | 
			
		||||
        priv->scale_denominator = priv->xkb->geom->width_mm;
 | 
			
		||||
    } else {
 | 
			
		||||
        priv->scale_numerator = height;
 | 
			
		||||
        priv->scale_denominator = priv->xkb->geom->height_mm;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
initable_init (GInitable    *initable,
 | 
			
		||||
               GCancellable *cancellable,
 | 
			
		||||
               GError      **error)
 | 
			
		||||
{
 | 
			
		||||
    EekXkbLayout *layout = EEK_XKB_LAYOUT (initable);
 | 
			
		||||
 | 
			
		||||
    if (!get_keyboard_from_server (layout, error))
 | 
			
		||||
        return FALSE;
 | 
			
		||||
 | 
			
		||||
    if (!get_names_from_server (layout, error))
 | 
			
		||||
        return FALSE;
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
initable_iface_init (GInitableIface *initable_iface)
 | 
			
		||||
{
 | 
			
		||||
  initable_iface->init = initable_init;
 | 
			
		||||
}
 | 
			
		||||
@ -1,72 +0,0 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2 of
 | 
			
		||||
 * the License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library 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
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek-xkb.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_XKB_LAYOUT_H
 | 
			
		||||
#define EEK_XKB_LAYOUT_H 1
 | 
			
		||||
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
#include <X11/XKBlib.h>
 | 
			
		||||
#include "eek-layout.h"
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define EEK_TYPE_XKB_LAYOUT (eek_xkb_layout_get_type())
 | 
			
		||||
#define EEK_XKB_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayout))
 | 
			
		||||
#define EEK_XKB_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutClass))
 | 
			
		||||
#define EEK_IS_XKB_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_XKB_LAYOUT))
 | 
			
		||||
#define EEK_IS_XKB_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_XKB_LAYOUT))
 | 
			
		||||
#define EEK_XKB_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_XKB_LAYOUT, EekXkbLayoutClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _EekXkbLayout        EekXkbLayout;
 | 
			
		||||
typedef struct _EekXkbLayoutClass   EekXkbLayoutClass;
 | 
			
		||||
typedef struct _EekXkbLayoutPrivate EekXkbLayoutPrivate;
 | 
			
		||||
 | 
			
		||||
struct _EekXkbLayout
 | 
			
		||||
{
 | 
			
		||||
    /*< private >*/
 | 
			
		||||
    EekLayout parent;
 | 
			
		||||
 | 
			
		||||
    EekXkbLayoutPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _EekXkbLayoutClass
 | 
			
		||||
{
 | 
			
		||||
    /*< private >*/
 | 
			
		||||
    EekLayoutClass parent_class;
 | 
			
		||||
 | 
			
		||||
    /*< private >*/
 | 
			
		||||
    /* padding */
 | 
			
		||||
    gpointer pdummy[24];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
GType      eek_xkb_layout_get_type  (void) G_GNUC_CONST;
 | 
			
		||||
EekLayout *eek_xkb_layout_new       (Display              *display,
 | 
			
		||||
                                     GError              **error);
 | 
			
		||||
 | 
			
		||||
gboolean   eek_xkb_layout_set_names (EekXkbLayout         *layout,
 | 
			
		||||
                                     XkbComponentNamesRec *names,
 | 
			
		||||
                                     GError              **error);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
#endif				/* #ifndef EEK_XKB_LAYOUT_H */
 | 
			
		||||
@ -1,663 +0,0 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2 of
 | 
			
		||||
 * the License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library 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
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:eek-xkl-layout
 | 
			
		||||
 * @short_description: Layout engine using Libxklavier configuration
 | 
			
		||||
 *
 | 
			
		||||
 * The #EekXklLayout is a simple wrapper around #EekXkbLayout class
 | 
			
		||||
 * to use Libxklavier configuration.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CONFIG_H
 | 
			
		||||
#include "config.h"
 | 
			
		||||
#endif  /* HAVE_CONFIG_H */
 | 
			
		||||
 | 
			
		||||
#include <libxklavier/xklavier.h>
 | 
			
		||||
#include <gio/gio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "eek-xkl-layout.h"
 | 
			
		||||
 | 
			
		||||
#define noKBDRAW_DEBUG
 | 
			
		||||
 | 
			
		||||
static GInitableIface *parent_initable_iface;
 | 
			
		||||
 | 
			
		||||
static void initable_iface_init (GInitableIface *initable_iface);
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_CODE (EekXklLayout, eek_xkl_layout, EEK_TYPE_XKB_LAYOUT,
 | 
			
		||||
                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
 | 
			
		||||
                                                initable_iface_init));
 | 
			
		||||
 | 
			
		||||
#define EEK_XKL_LAYOUT_GET_PRIVATE(obj)                                  \
 | 
			
		||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_XKL_LAYOUT, EekXklLayoutPrivate))
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
    PROP_0,
 | 
			
		||||
    PROP_MODEL,
 | 
			
		||||
    PROP_LAYOUTS,
 | 
			
		||||
    PROP_VARIANTS,
 | 
			
		||||
    PROP_OPTIONS,
 | 
			
		||||
    PROP_LAST
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _EekXklLayoutPrivate
 | 
			
		||||
{
 | 
			
		||||
    XklEngine *engine;
 | 
			
		||||
    XklConfigRec *config;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* from gnome-keyboard-properties-xkbpv.c:
 | 
			
		||||
 *  BAD STYLE: Taken from xklavier_private_xkb.h
 | 
			
		||||
 *  Any ideas on architectural improvements are WELCOME
 | 
			
		||||
 */
 | 
			
		||||
extern gboolean xkl_xkb_config_native_prepare (XklEngine * engine,
 | 
			
		||||
					       const XklConfigRec * data,
 | 
			
		||||
					       XkbComponentNamesPtr
 | 
			
		||||
					       component_names);
 | 
			
		||||
 | 
			
		||||
extern void xkl_xkb_config_native_cleanup (XklEngine * engine,
 | 
			
		||||
					   XkbComponentNamesPtr
 | 
			
		||||
					   component_names);
 | 
			
		||||
 | 
			
		||||
static gboolean set_xkb_component_names (EekXklLayout *layout,
 | 
			
		||||
                                         XklConfigRec *config);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_xkl_layout_dispose (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (object);
 | 
			
		||||
 | 
			
		||||
    if (priv->config) {
 | 
			
		||||
        g_object_unref (priv->config);
 | 
			
		||||
        priv->config = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    G_OBJECT_CLASS (eek_xkl_layout_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void 
 | 
			
		||||
eek_xkl_layout_set_property (GObject      *object,
 | 
			
		||||
                             guint         prop_id,
 | 
			
		||||
                             const GValue *value,
 | 
			
		||||
                             GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayout *layout = EEK_XKL_LAYOUT(object);
 | 
			
		||||
 | 
			
		||||
    switch (prop_id) {
 | 
			
		||||
    case PROP_MODEL:
 | 
			
		||||
        eek_xkl_layout_set_model (layout, g_value_get_string (value));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_LAYOUTS:
 | 
			
		||||
        eek_xkl_layout_set_layouts (layout, g_value_get_boxed (value));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_VARIANTS:
 | 
			
		||||
        eek_xkl_layout_set_variants (layout, g_value_get_boxed (value));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_OPTIONS:
 | 
			
		||||
        eek_xkl_layout_set_options (layout, g_value_get_boxed (value));
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void 
 | 
			
		||||
eek_xkl_layout_get_property (GObject    *object,
 | 
			
		||||
                             guint       prop_id,
 | 
			
		||||
                             GValue     *value,
 | 
			
		||||
                             GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayout *layout = EEK_XKL_LAYOUT(object);
 | 
			
		||||
 | 
			
		||||
    switch (prop_id) {
 | 
			
		||||
    case PROP_MODEL:
 | 
			
		||||
        g_value_set_string (value,
 | 
			
		||||
                            eek_xkl_layout_get_model (layout));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_LAYOUTS:
 | 
			
		||||
        g_value_set_boxed (value,
 | 
			
		||||
                           eek_xkl_layout_get_layouts (layout));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_VARIANTS:
 | 
			
		||||
        g_value_set_boxed (value,
 | 
			
		||||
                           eek_xkl_layout_get_variants (layout));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_OPTIONS:
 | 
			
		||||
        g_value_set_boxed (value,
 | 
			
		||||
                           eek_xkl_layout_get_options (layout));
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_xkl_layout_class_init (EekXklLayoutClass *klass)
 | 
			
		||||
{
 | 
			
		||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
    GParamSpec *pspec;
 | 
			
		||||
 | 
			
		||||
    g_type_class_add_private (gobject_class, sizeof (EekXklLayoutPrivate));
 | 
			
		||||
 | 
			
		||||
    gobject_class->dispose = eek_xkl_layout_dispose;
 | 
			
		||||
    gobject_class->set_property = eek_xkl_layout_set_property;
 | 
			
		||||
    gobject_class->get_property = eek_xkl_layout_get_property;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * EekXklLayout:model:
 | 
			
		||||
     *
 | 
			
		||||
     * The libxklavier model name of #EekXklLayout.
 | 
			
		||||
     */
 | 
			
		||||
    pspec = g_param_spec_string ("model",
 | 
			
		||||
                                 "Model",
 | 
			
		||||
                                 "Libxklavier model",
 | 
			
		||||
                                 NULL,
 | 
			
		||||
                                 G_PARAM_READWRITE);
 | 
			
		||||
    g_object_class_install_property (gobject_class, PROP_MODEL, pspec);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * EekXklLayout:layouts:
 | 
			
		||||
     *
 | 
			
		||||
     * The libxklavier layout names of #EekXklLayout.
 | 
			
		||||
     */
 | 
			
		||||
    pspec = g_param_spec_boxed ("layouts",
 | 
			
		||||
                                "Layouts",
 | 
			
		||||
                                "Libxklavier layouts",
 | 
			
		||||
                                G_TYPE_STRV,
 | 
			
		||||
                                G_PARAM_READWRITE);
 | 
			
		||||
    g_object_class_install_property (gobject_class, PROP_LAYOUTS, pspec);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * EekXklLayout:variants:
 | 
			
		||||
     *
 | 
			
		||||
     * The libxklavier variant names of #EekXklLayout.
 | 
			
		||||
     */
 | 
			
		||||
    pspec = g_param_spec_boxed ("variants",
 | 
			
		||||
                                "Variants",
 | 
			
		||||
                                "Libxklavier variants",
 | 
			
		||||
                                G_TYPE_STRV,
 | 
			
		||||
                                G_PARAM_READWRITE);
 | 
			
		||||
    g_object_class_install_property (gobject_class, PROP_VARIANTS, pspec);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * EekXklLayout:options:
 | 
			
		||||
     *
 | 
			
		||||
     * The libxklavier option names of #EekXklLayout.
 | 
			
		||||
     */
 | 
			
		||||
    pspec = g_param_spec_boxed ("options",
 | 
			
		||||
                                "Options",
 | 
			
		||||
                                "Libxklavier options",
 | 
			
		||||
                                G_TYPE_STRV,
 | 
			
		||||
                                G_PARAM_READWRITE);
 | 
			
		||||
    g_object_class_install_property (gobject_class, PROP_OPTIONS, pspec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_xkl_layout_init (EekXklLayout *self)
 | 
			
		||||
{
 | 
			
		||||
    self->priv = EEK_XKL_LAYOUT_GET_PRIVATE (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_new:
 | 
			
		||||
 *
 | 
			
		||||
 * Create a new #EekXklLayout.
 | 
			
		||||
 */
 | 
			
		||||
EekLayout *
 | 
			
		||||
eek_xkl_layout_new (Display *display, GError **error)
 | 
			
		||||
{
 | 
			
		||||
    return (EekLayout *) g_initable_new (EEK_TYPE_XKL_LAYOUT,
 | 
			
		||||
                                         NULL,
 | 
			
		||||
                                         error,
 | 
			
		||||
                                         "display", display,
 | 
			
		||||
                                         NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
G_INLINE_FUNC void
 | 
			
		||||
merge_xkl_config_rec (XklConfigRec *dst, XklConfigRec *src)
 | 
			
		||||
{
 | 
			
		||||
    if (src->model) {
 | 
			
		||||
        g_free (dst->model);
 | 
			
		||||
        dst->model = g_strdup (src->model);
 | 
			
		||||
    }
 | 
			
		||||
    if (src->layouts) {
 | 
			
		||||
        g_strfreev (dst->layouts);
 | 
			
		||||
        dst->layouts = g_strdupv (src->layouts);
 | 
			
		||||
    }
 | 
			
		||||
    if (src->variants) {
 | 
			
		||||
        g_strfreev (dst->variants);
 | 
			
		||||
        dst->variants = g_strdupv (src->variants);
 | 
			
		||||
    }
 | 
			
		||||
    if (src->options) {
 | 
			
		||||
        g_strfreev (dst->options);
 | 
			
		||||
        dst->options = g_strdupv (src->options);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_set_config: (skip)
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 * @config: Libxklavier configuration
 | 
			
		||||
 *
 | 
			
		||||
 * Reconfigure @layout with @config.
 | 
			
		||||
 * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkl_layout_set_config (EekXklLayout *layout,
 | 
			
		||||
                           XklConfigRec *config)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
    XklConfigRec *c;
 | 
			
		||||
    gboolean retval;
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
    c = xkl_config_rec_new ();
 | 
			
		||||
    merge_xkl_config_rec (c, priv->config);
 | 
			
		||||
    merge_xkl_config_rec (c, config);
 | 
			
		||||
    retval = set_xkb_component_names (layout, c);
 | 
			
		||||
    g_object_unref (c);
 | 
			
		||||
    merge_xkl_config_rec (priv->config, config);
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_set_config_full:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 * @model: Libxklavier model name
 | 
			
		||||
 * @layouts: Libxklavier layouts
 | 
			
		||||
 * @variants: Libxklavier variants
 | 
			
		||||
 * @options: Libxklavier options
 | 
			
		||||
 *
 | 
			
		||||
 * Reconfigure @layout with @model, @layouts, @variants, and @options.
 | 
			
		||||
 * This function is merely a wrapper around
 | 
			
		||||
 * eek_xkl_layout_set_config() to avoid passing a pointer of
 | 
			
		||||
 * XklConfigRec, which is not currently available in the
 | 
			
		||||
 * gobject-introspection repository.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
 * Since: 0.0.2
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkl_layout_set_config_full (EekXklLayout *layout,
 | 
			
		||||
                                gchar *model,
 | 
			
		||||
                                gchar **layouts,
 | 
			
		||||
                                gchar **variants,
 | 
			
		||||
                                gchar **options)
 | 
			
		||||
{
 | 
			
		||||
    XklConfigRec *config;
 | 
			
		||||
    gboolean retval;
 | 
			
		||||
 | 
			
		||||
    config = xkl_config_rec_new ();
 | 
			
		||||
    config->model = g_strdup (model);
 | 
			
		||||
    config->layouts = g_strdupv (layouts);
 | 
			
		||||
    config->variants = g_strdupv (variants);
 | 
			
		||||
    config->options = g_strdupv (options);
 | 
			
		||||
    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
    g_object_unref (config);
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_set_model:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 * @model: model name
 | 
			
		||||
 *
 | 
			
		||||
 * Set the model name of @layout configuration (in the Libxklavier terminology).
 | 
			
		||||
 * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkl_layout_set_model (EekXklLayout *layout,
 | 
			
		||||
                          const gchar  *model)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
    XklConfigRec *config;
 | 
			
		||||
    gboolean retval;
 | 
			
		||||
    
 | 
			
		||||
    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
    config = xkl_config_rec_new ();
 | 
			
		||||
    /* config->model will be freed on g_object_unref (config) */
 | 
			
		||||
    if (model)
 | 
			
		||||
        config->model = g_strdup (model);
 | 
			
		||||
    else
 | 
			
		||||
        config->model = NULL;
 | 
			
		||||
    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
    g_object_unref (config);
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_set_layouts:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 * @layouts: layout names
 | 
			
		||||
 *
 | 
			
		||||
 * Set the layout names of @layout (in the Libxklavier terminology).
 | 
			
		||||
 * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkl_layout_set_layouts (EekXklLayout *layout,
 | 
			
		||||
                            gchar       **layouts)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
    XklConfigRec *config;
 | 
			
		||||
    gboolean retval;
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
    config = xkl_config_rec_new ();
 | 
			
		||||
    /* config->layouts will be freed on g_object_unref (config) */
 | 
			
		||||
    if (layouts)
 | 
			
		||||
        config->layouts = g_strdupv (layouts);
 | 
			
		||||
    else
 | 
			
		||||
        config->layouts = layouts;
 | 
			
		||||
    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
    g_object_unref (config);
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_set_variants:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 * @variants: variant names
 | 
			
		||||
 *
 | 
			
		||||
 * Set the variant names of @layout (in the Libxklavier terminology).
 | 
			
		||||
 * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkl_layout_set_variants (EekXklLayout *layout,
 | 
			
		||||
                             gchar       **variants)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
    XklConfigRec *config;
 | 
			
		||||
    gboolean retval;
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
    config = xkl_config_rec_new ();
 | 
			
		||||
    /* config->variants will be freed on g_object_unref (config) */
 | 
			
		||||
    if (variants)
 | 
			
		||||
        config->variants = g_strdupv (variants);
 | 
			
		||||
    else
 | 
			
		||||
        config->variants = NULL;
 | 
			
		||||
    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
    g_object_unref (config);
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_set_options:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 * @options: option names
 | 
			
		||||
 *
 | 
			
		||||
 * Set the option names of @layout (in the Libxklavier terminology).
 | 
			
		||||
 * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkl_layout_set_options (EekXklLayout *layout,
 | 
			
		||||
                            gchar       **options)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
    XklConfigRec *config;
 | 
			
		||||
    gboolean retval;
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_fail (priv, FALSE);
 | 
			
		||||
    config = xkl_config_rec_new ();
 | 
			
		||||
    /* config->options will be freed on g_object_unref (config) */
 | 
			
		||||
    if (options)
 | 
			
		||||
        config->options = options;
 | 
			
		||||
    else
 | 
			
		||||
        config->options = NULL;
 | 
			
		||||
    retval = eek_xkl_layout_set_config (layout, config);
 | 
			
		||||
    g_object_unref (config);
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_enable_option:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 * @option: option name
 | 
			
		||||
 *
 | 
			
		||||
 * Set the option of @layout (in the Libxklavier terminology).
 | 
			
		||||
 * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkl_layout_enable_option  (EekXklLayout *layout,
 | 
			
		||||
                               const gchar  *option)
 | 
			
		||||
{
 | 
			
		||||
    gchar **options, **_options;
 | 
			
		||||
    gint i, j;
 | 
			
		||||
 | 
			
		||||
    options = eek_xkl_layout_get_options (layout);
 | 
			
		||||
    for (i = 0; options && options[i]; i++)
 | 
			
		||||
        if (g_strcmp0 (options[i], option) == 0)
 | 
			
		||||
            return TRUE;
 | 
			
		||||
    _options = g_new0 (gchar *, (i + 2));
 | 
			
		||||
    for (j = 0; j < i; j++)
 | 
			
		||||
        _options[j] = g_strdup (options[j]);
 | 
			
		||||
    _options[i] = g_strdup (option);
 | 
			
		||||
    /* eek_xkl_layout_set_options() will free _options and its elements. */
 | 
			
		||||
    return eek_xkl_layout_set_options (layout, _options);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_disable_option:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 * @option: option name
 | 
			
		||||
 *
 | 
			
		||||
 * Unset the option of @layout (in the Libxklavier terminology).
 | 
			
		||||
 * Returns: %TRUE if the current layout changed, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkl_layout_disable_option (EekXklLayout *layout,
 | 
			
		||||
                               const gchar  *option)
 | 
			
		||||
{
 | 
			
		||||
    gchar **options, **_options;
 | 
			
		||||
    gint i, j, k;
 | 
			
		||||
 | 
			
		||||
    options = eek_xkl_layout_get_options (layout);
 | 
			
		||||
    if (!options)
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    for (i = 0, k = 0; options[i]; i++)
 | 
			
		||||
        if (g_strcmp0 (options[i], option) == 0)
 | 
			
		||||
            k = i;
 | 
			
		||||
    if (options[k] == NULL)
 | 
			
		||||
        return TRUE;
 | 
			
		||||
    _options = g_new0 (gchar *, i);
 | 
			
		||||
    for (j = 0; j < k; j++)
 | 
			
		||||
        _options[j] = g_strdup (options[j]);
 | 
			
		||||
    for (j = k + 1; j < i; j++)
 | 
			
		||||
        _options[j] = g_strdup (options[j]);
 | 
			
		||||
    /* eek_xkl_layout_set_options() will free _options and its elements. */
 | 
			
		||||
    return eek_xkl_layout_set_options (layout, _options);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_get_model:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 *
 | 
			
		||||
 * Get the model name of @layout configuration (in the Libxklavier terminology).
 | 
			
		||||
 */
 | 
			
		||||
gchar *
 | 
			
		||||
eek_xkl_layout_get_model (EekXklLayout *layout)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_fail (priv, NULL);
 | 
			
		||||
    return g_strdup (priv->config->model);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_get_layouts:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 *
 | 
			
		||||
 * Get the layout names of @layout configuration (in the Libxklavier
 | 
			
		||||
 * terminology).
 | 
			
		||||
 */
 | 
			
		||||
gchar **
 | 
			
		||||
eek_xkl_layout_get_layouts (EekXklLayout *layout)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_fail (priv, NULL);
 | 
			
		||||
    return g_strdupv (priv->config->layouts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_get_variants:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 *
 | 
			
		||||
 * Get the variant names of @layout configuration (in the Libxklavier
 | 
			
		||||
 * terminology).
 | 
			
		||||
 */
 | 
			
		||||
gchar **
 | 
			
		||||
eek_xkl_layout_get_variants (EekXklLayout *layout)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_fail (priv, NULL);
 | 
			
		||||
    return g_strdupv (priv->config->variants);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_get_options:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 *
 | 
			
		||||
 * Get the option names of @layout configuration (in the Libxklavier
 | 
			
		||||
 * terminology).
 | 
			
		||||
 */
 | 
			
		||||
gchar **
 | 
			
		||||
eek_xkl_layout_get_options (EekXklLayout *layout)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_fail (priv, NULL);
 | 
			
		||||
    return g_strdupv (priv->config->options);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
set_xkb_component_names (EekXklLayout *layout, XklConfigRec *config)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayoutPrivate *priv = layout->priv;
 | 
			
		||||
    XkbComponentNamesRec names;
 | 
			
		||||
    gboolean retval = FALSE;
 | 
			
		||||
 | 
			
		||||
#if DEBUG
 | 
			
		||||
    if (config->layouts) {
 | 
			
		||||
        gint i;
 | 
			
		||||
 | 
			
		||||
        fprintf (stderr, "layout = ");
 | 
			
		||||
        for (i = 0; config->layouts[i] != NULL; i++)
 | 
			
		||||
            fprintf (stderr, "\"%s\" ", config->layouts[i]);
 | 
			
		||||
        fputc ('\n', stderr);
 | 
			
		||||
    } else
 | 
			
		||||
        fprintf (stderr, "layouts = NULL\n");
 | 
			
		||||
    if (config->variants) {
 | 
			
		||||
        gint i;
 | 
			
		||||
 | 
			
		||||
        fprintf (stderr, "variant = ");
 | 
			
		||||
        for (i = 0; config->variants[i]; i++)
 | 
			
		||||
            fprintf (stderr, "\"%s\" ", config->variants[i]);
 | 
			
		||||
        fputc ('\n', stderr);
 | 
			
		||||
    } else
 | 
			
		||||
        fprintf (stderr, "variants = NULL\n");
 | 
			
		||||
    if (config->options) {
 | 
			
		||||
        gint i;
 | 
			
		||||
 | 
			
		||||
        fprintf (stderr, "option = ");
 | 
			
		||||
        for (i = 0; config->options[i]; i++)
 | 
			
		||||
            fprintf (stderr, "\"%s\" ", config->options[i]);
 | 
			
		||||
        fputc ('\n', stderr);
 | 
			
		||||
    } else
 | 
			
		||||
        fprintf (stderr, "options = NULL\n");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if (xkl_xkb_config_native_prepare (priv->engine, config, &names)) {
 | 
			
		||||
        GError *error = NULL;
 | 
			
		||||
        retval = eek_xkb_layout_set_names (EEK_XKB_LAYOUT(layout),
 | 
			
		||||
                                           &names,
 | 
			
		||||
                                           &error);
 | 
			
		||||
        if (!retval)
 | 
			
		||||
            g_warning ("can't set XKB layout");
 | 
			
		||||
        xkl_xkb_config_native_cleanup (priv->engine, &names);
 | 
			
		||||
    }
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_xkl_layout_get_option:
 | 
			
		||||
 * @layout: an #EekXklLayout
 | 
			
		||||
 * @option: option name
 | 
			
		||||
 *
 | 
			
		||||
 * Tell if the option of @layout (in the Libxklavier terminology) is set.
 | 
			
		||||
 * Returns: %TRUE if the option is set, %FALSE otherwise
 | 
			
		||||
 */
 | 
			
		||||
gboolean
 | 
			
		||||
eek_xkl_layout_get_option (EekXklLayout *layout,
 | 
			
		||||
                           const gchar  *option)
 | 
			
		||||
{
 | 
			
		||||
    gchar **options;
 | 
			
		||||
    gint i;
 | 
			
		||||
 | 
			
		||||
    options = eek_xkl_layout_get_options (layout);
 | 
			
		||||
    for (i = 0; options && options[i]; i++)
 | 
			
		||||
        if (g_strcmp0 (options[i], option) == 0)
 | 
			
		||||
            return TRUE;
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
initable_init (GInitable    *initable,
 | 
			
		||||
               GCancellable *cancellable,
 | 
			
		||||
               GError      **error)
 | 
			
		||||
{
 | 
			
		||||
    EekXklLayout *layout = EEK_XKL_LAYOUT (initable);
 | 
			
		||||
    Display *display;
 | 
			
		||||
 | 
			
		||||
    if (!parent_initable_iface->init (initable, cancellable, error))
 | 
			
		||||
        return FALSE;
 | 
			
		||||
 | 
			
		||||
    layout->priv->config = xkl_config_rec_new ();
 | 
			
		||||
 | 
			
		||||
    g_object_get (G_OBJECT (initable),
 | 
			
		||||
                  "display", &display,
 | 
			
		||||
                  NULL);
 | 
			
		||||
 | 
			
		||||
    layout->priv->engine = xkl_engine_get_instance (display);
 | 
			
		||||
 | 
			
		||||
    if (!xkl_config_rec_get_from_server (layout->priv->config,
 | 
			
		||||
                                         layout->priv->engine)) {
 | 
			
		||||
        g_set_error (error,
 | 
			
		||||
                     EEK_ERROR,
 | 
			
		||||
                     EEK_ERROR_LAYOUT_ERROR,
 | 
			
		||||
                     "can't load libxklavier configuration");
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set_xkb_component_names (layout, layout->priv->config);
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
initable_iface_init (GInitableIface *initable_iface)
 | 
			
		||||
{
 | 
			
		||||
    parent_initable_iface = g_type_interface_peek_parent (initable_iface);
 | 
			
		||||
    initable_iface->init = initable_init;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,97 +0,0 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
			
		||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public License
 | 
			
		||||
 * as published by the Free Software Foundation; either version 2 of
 | 
			
		||||
 * the License, or (at your option) any later version.
 | 
			
		||||
 * 
 | 
			
		||||
 * This library 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
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 * 
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek-xkl.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_XKL_LAYOUT_H
 | 
			
		||||
#define EEK_XKL_LAYOUT_H 1
 | 
			
		||||
 | 
			
		||||
#include <libxklavier/xklavier.h>
 | 
			
		||||
#include "eek-xkb-layout.h"
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define EEK_TYPE_XKL_LAYOUT (eek_xkl_layout_get_type())
 | 
			
		||||
#define EEK_XKL_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_XKL_LAYOUT, EekXklLayout))
 | 
			
		||||
#define EEK_XKL_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_XKL_LAYOUT, EekXklLayoutClass))
 | 
			
		||||
#define EEK_IS_XKL_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_XKL_LAYOUT))
 | 
			
		||||
#define EEK_IS_XKL_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_XKL_LAYOUT))
 | 
			
		||||
#define EEK_XKL_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_XKL_LAYOUT, EekXklLayoutClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _EekXklLayout        EekXklLayout;
 | 
			
		||||
typedef struct _EekXklLayoutClass   EekXklLayoutClass;
 | 
			
		||||
typedef struct _EekXklLayoutPrivate EekXklLayoutPrivate;
 | 
			
		||||
 | 
			
		||||
struct _EekXklLayout
 | 
			
		||||
{
 | 
			
		||||
    /*< private >*/
 | 
			
		||||
    EekXkbLayout parent;
 | 
			
		||||
 | 
			
		||||
    EekXklLayoutPrivate *priv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _EekXklLayoutClass
 | 
			
		||||
{
 | 
			
		||||
    /*< private >*/
 | 
			
		||||
    EekXkbLayoutClass parent_class;
 | 
			
		||||
 | 
			
		||||
    /*< private >*/
 | 
			
		||||
    /* padding */
 | 
			
		||||
    gpointer pdummy[24];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
GType      eek_xkl_layout_get_type        (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
EekLayout *eek_xkl_layout_new             (Display      *display,
 | 
			
		||||
                                           GError      **error);
 | 
			
		||||
 | 
			
		||||
gboolean   eek_xkl_layout_set_config      (EekXklLayout *layout,
 | 
			
		||||
                                           XklConfigRec *config);
 | 
			
		||||
 | 
			
		||||
gboolean   eek_xkl_layout_set_config_full (EekXklLayout *layout,
 | 
			
		||||
                                           gchar        *model,
 | 
			
		||||
                                           gchar       **layouts,
 | 
			
		||||
                                           gchar       **variants,
 | 
			
		||||
                                           gchar       **options);
 | 
			
		||||
 | 
			
		||||
gboolean   eek_xkl_layout_set_model       (EekXklLayout *layout,
 | 
			
		||||
                                           const gchar  *model);
 | 
			
		||||
gboolean   eek_xkl_layout_set_layouts     (EekXklLayout *layout,
 | 
			
		||||
                                           gchar       **layouts);
 | 
			
		||||
gboolean   eek_xkl_layout_set_variants    (EekXklLayout *layout,
 | 
			
		||||
                                           gchar       **variants);
 | 
			
		||||
gboolean   eek_xkl_layout_set_options     (EekXklLayout *layout,
 | 
			
		||||
                                           gchar       **options);
 | 
			
		||||
gboolean   eek_xkl_layout_enable_option   (EekXklLayout *layout,
 | 
			
		||||
                                           const gchar  *option);
 | 
			
		||||
gboolean   eek_xkl_layout_disable_option  (EekXklLayout *layout,
 | 
			
		||||
                                           const gchar  *option);
 | 
			
		||||
 | 
			
		||||
gchar     *eek_xkl_layout_get_model       (EekXklLayout *layout);
 | 
			
		||||
gchar    **eek_xkl_layout_get_layouts     (EekXklLayout *layout);
 | 
			
		||||
gchar    **eek_xkl_layout_get_variants    (EekXklLayout *layout);
 | 
			
		||||
gchar    **eek_xkl_layout_get_options     (EekXklLayout *layout);
 | 
			
		||||
gboolean   eek_xkl_layout_get_option      (EekXklLayout *layout,
 | 
			
		||||
                                           const gchar  *option);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
#endif				/* #ifndef EEK_XKL_LAYOUT_H */
 | 
			
		||||
@ -63,7 +63,6 @@ libeekboard_la_CFLAGS =					\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
libeekboard_la_LIBADD =				\
 | 
			
		||||
	$(top_builddir)/eek/libeek.la		\
 | 
			
		||||
	$(top_builddir)/eek/libeek-xkl.la	\
 | 
			
		||||
	$(GIO2_LIBS)				\
 | 
			
		||||
	$(LIBXKLAVIER_LIBS)			\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
@ -31,7 +31,7 @@
 | 
			
		||||
 | 
			
		||||
#include "eekboard/eekboard-context-service.h"
 | 
			
		||||
#include "eekboard/eekboard-xklutil.h"
 | 
			
		||||
#include "eek/eek-xkl.h"
 | 
			
		||||
//#include "eek/eek-xkl.h"  //x11_stub
 | 
			
		||||
 | 
			
		||||
#define CSW 640
 | 
			
		||||
#define CSH 480
 | 
			
		||||
@ -173,6 +173,8 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self,
 | 
			
		||||
            display = XOpenDisplay (NULL);
 | 
			
		||||
 | 
			
		||||
        error = NULL;
 | 
			
		||||
        /*
 | 
			
		||||
        //x11_stub_start
 | 
			
		||||
        layout = eek_xkl_layout_new (display, &error);
 | 
			
		||||
        if (layout == NULL) {
 | 
			
		||||
            g_warning ("can't create keyboard %s: %s",
 | 
			
		||||
@ -185,6 +187,8 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self,
 | 
			
		||||
            g_object_unref (layout);
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
        //x11_stub_eend
 | 
			
		||||
        */
 | 
			
		||||
    } else {
 | 
			
		||||
        error = NULL;
 | 
			
		||||
        layout = eek_xml_layout_new (keyboard_type, &error);
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,6 @@ eekboard_CFLAGS =					\
 | 
			
		||||
	-I$(top_srcdir)					\
 | 
			
		||||
	$(GIO2_CFLAGS)					\
 | 
			
		||||
	$(GTK_CFLAGS)					\
 | 
			
		||||
	$(XKB_CFLAGS)					\
 | 
			
		||||
	$(LIBXKLAVIER_CFLAGS)				\
 | 
			
		||||
	-DLIBEXECDIR=\"$(libexecdir)\"			\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
@ -37,10 +36,8 @@ eekboard_CFLAGS =					\
 | 
			
		||||
eekboard_LDADD =				\
 | 
			
		||||
	$(top_builddir)/eekboard/libeekboard.la	\
 | 
			
		||||
	$(top_builddir)/eek/libeek.la		\
 | 
			
		||||
	$(top_builddir)/eek/libeek-xkl.la	\
 | 
			
		||||
	$(GIO2_LIBS)				\
 | 
			
		||||
	$(GTK_LIBS)				\
 | 
			
		||||
	$(XKB_LIBS)				\
 | 
			
		||||
	$(LIBXKLAVIER_LIBS)			\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
@ -75,7 +72,6 @@ eekboard_server_LDADD =				\
 | 
			
		||||
	$(top_builddir)/eekboard/libeekboard.la	\
 | 
			
		||||
	$(top_builddir)/eek/libeek.la		\
 | 
			
		||||
	$(top_builddir)/eek/libeek-gtk.la	\
 | 
			
		||||
	$(top_builddir)/eek/libeek-xkl.la	\
 | 
			
		||||
	$(GIO2_LIBS)				\
 | 
			
		||||
	$(GTK_LIBS)				\
 | 
			
		||||
	$(LIBXKLAVIER_LIBS)			\
 | 
			
		||||
@ -101,7 +97,6 @@ eekboard_setup_CFLAGS = \
 | 
			
		||||
	-I$(top_srcdir)					\
 | 
			
		||||
	$(GIO2_CFLAGS)					\
 | 
			
		||||
	$(GTK_CFLAGS)					\
 | 
			
		||||
	$(XKB_CFLAGS)					\
 | 
			
		||||
	$(LIBXKLAVIER_CFLAGS)				\
 | 
			
		||||
	-DPKGDATADIR=\"$(pkgdatadir)\"			\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										33
									
								
								src/client.c
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								src/client.c
									
									
									
									
									
								
							@ -29,12 +29,12 @@
 | 
			
		||||
#include <gdk/gdkx.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_XTEST
 | 
			
		||||
#include <X11/extensions/XTest.h>
 | 
			
		||||
#include <X11/XKBlib.h>
 | 
			
		||||
//#include <X11/extensions/XTest.h>
 | 
			
		||||
//#include <X11/XKBlib.h>
 | 
			
		||||
#endif  /* HAVE_XTEST */
 | 
			
		||||
 | 
			
		||||
#include "eek/eek.h"
 | 
			
		||||
#include "eek/eek-xkl.h"
 | 
			
		||||
//#include "eek/eek-xkl.h"
 | 
			
		||||
#include "eekboard/eekboard-client.h"
 | 
			
		||||
#include "eekboard/eekboard-xklutil.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
@ -93,7 +93,7 @@ struct _Client {
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_XTEST
 | 
			
		||||
    guint modifier_keycodes[8]; 
 | 
			
		||||
    XkbDescRec *xkb;
 | 
			
		||||
//    XkbDescRec *xkb;  //x11_stub
 | 
			
		||||
#endif  /* HAVE_XTEST */
 | 
			
		||||
 | 
			
		||||
    GSettings *settings;
 | 
			
		||||
@ -858,6 +858,8 @@ get_replaced_keycode (Client *client)
 | 
			
		||||
{
 | 
			
		||||
    guint keycode;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    //x11_stub_start
 | 
			
		||||
    for (keycode = client->xkb->max_key_code;
 | 
			
		||||
         keycode >= client->xkb->min_key_code;
 | 
			
		||||
         --keycode) {
 | 
			
		||||
@ -867,6 +869,8 @@ get_replaced_keycode (Client *client)
 | 
			
		||||
            return keycode;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    //x11_stub_eend
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@ -889,6 +893,8 @@ replace_keycode (Client *client,
 | 
			
		||||
    int keysyms_per_keycode;
 | 
			
		||||
    KeySym *syms;
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    //x11_stub_start
 | 
			
		||||
    g_return_val_if_fail (client->xkb->min_key_code <= keycode &&
 | 
			
		||||
                          keycode <= client->xkb->max_key_code,
 | 
			
		||||
                          FALSE);
 | 
			
		||||
@ -900,6 +906,9 @@ replace_keycode (Client *client,
 | 
			
		||||
    XChangeKeyboardMapping (xdisplay, keycode, 1, syms, 1);
 | 
			
		||||
    XSync (xdisplay, False);
 | 
			
		||||
    XFree (syms);
 | 
			
		||||
    //x11_stub_eend
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    *keysym = old_keysym;
 | 
			
		||||
    
 | 
			
		||||
    return TRUE;
 | 
			
		||||
@ -1117,6 +1126,9 @@ client_enable_xtest (Client *client)
 | 
			
		||||
 | 
			
		||||
    g_assert (display);
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    //x11_stub_start
 | 
			
		||||
 | 
			
		||||
    if (!XTestQueryExtension (xdisplay,
 | 
			
		||||
                              &event_base, &error_base,
 | 
			
		||||
                              &major_version, &minor_version)) {
 | 
			
		||||
@ -1141,15 +1153,20 @@ client_enable_xtest (Client *client)
 | 
			
		||||
        g_signal_connect (client->context, "key-activated",
 | 
			
		||||
                          G_CALLBACK(on_key_activated), client);
 | 
			
		||||
 | 
			
		||||
    //x11_stub_eend
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
client_disable_xtest (Client *client)
 | 
			
		||||
{
 | 
			
		||||
    if (client->xkb) {
 | 
			
		||||
        XkbFreeKeyboard (client->xkb, 0, TRUE);	/* free_all = TRUE */
 | 
			
		||||
        client->xkb = NULL;
 | 
			
		||||
    }
 | 
			
		||||
    //x11_stub_start
 | 
			
		||||
    //if (client->xkb) {
 | 
			
		||||
    //    XkbFreeKeyboard (client->xkb, 0, TRUE); /* free_all = TRUE */
 | 
			
		||||
    //    client->xkb = NULL;
 | 
			
		||||
    //}
 | 
			
		||||
    //x11_stub_eend
 | 
			
		||||
}
 | 
			
		||||
#endif  /* HAVE_XTEST */
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,6 @@ eek_simple_test_SOURCES = eek-simple-test.c
 | 
			
		||||
eek_simple_test_LDADD = $(top_builddir)/eek/libeek.la $(GIO2_LIBS)
 | 
			
		||||
 | 
			
		||||
eek_xml_test_SOURCES = eek-xml-test.c
 | 
			
		||||
eek_xml_test_LDADD = $(top_builddir)/eek/libeek.la $(top_builddir)/eek/libeek-xkl.la $(GIO2_LIBS) $(GTK_LIBS)
 | 
			
		||||
eek_xml_test_LDADD = $(top_builddir)/eek/libeek.la $(GIO2_LIBS) $(GTK_LIBS)
 | 
			
		||||
 | 
			
		||||
-include $(top_srcdir)/git.mk
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user