Merge branch 'master' into 'use_gresource'
# Conflicts: # src/server-context-service.c
This commit is contained in:
		
							
								
								
									
										41
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										41
									
								
								Makefile.am
									
									
									
									
									
								
							@ -1,41 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
ACLOCAL_AMFLAGS = -I m4
 | 
					 | 
				
			||||||
SUBDIRS = eek eekboard src tests bindings docs po data examples
 | 
					 | 
				
			||||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection
 | 
					 | 
				
			||||||
AUTOMAKE_OPTIONS = foreign # allow README.md to exist
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GITIGNOREFILES =				\
 | 
					 | 
				
			||||||
	INSTALL					\
 | 
					 | 
				
			||||||
	aclocal.m4				\
 | 
					 | 
				
			||||||
	compile					\
 | 
					 | 
				
			||||||
	config.guess				\
 | 
					 | 
				
			||||||
	config.h.in				\
 | 
					 | 
				
			||||||
	config.sub				\
 | 
					 | 
				
			||||||
	depcomp					\
 | 
					 | 
				
			||||||
	gtk-doc.make				\
 | 
					 | 
				
			||||||
	install-sh				\
 | 
					 | 
				
			||||||
	ltmain.sh				\
 | 
					 | 
				
			||||||
	m4					\
 | 
					 | 
				
			||||||
	missing					\
 | 
					 | 
				
			||||||
	mkinstalldirs				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,21 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SUBDIRS = vala
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,96 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NULL =
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if ENABLE_VALA
 | 
					 | 
				
			||||||
vapidir = $(datadir)/vala/vapi
 | 
					 | 
				
			||||||
dist_vapi_DATA =				\
 | 
					 | 
				
			||||||
	eek-$(EEK_API_VERSION).vapi		\
 | 
					 | 
				
			||||||
	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:
 | 
					 | 
				
			||||||
	rm -f *.vapi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eek_vapi_deps =						\
 | 
					 | 
				
			||||||
	$(srcdir)/Eek-$(EEK_API_VERSION).metadata	\
 | 
					 | 
				
			||||||
	|						\
 | 
					 | 
				
			||||||
	$(top_builddir)/eek/Eek-$(EEK_API_VERSION).gir	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eek-$(EEK_API_VERSION).vapi: $(eek_vapi_deps)
 | 
					 | 
				
			||||||
	$(VAPIGEN_V)$(VAPIGEN) \
 | 
					 | 
				
			||||||
		--library eek-$(EEK_API_VERSION) \
 | 
					 | 
				
			||||||
		--pkg gio-2.0 \
 | 
					 | 
				
			||||||
		--metadatadir=$(srcdir) \
 | 
					 | 
				
			||||||
		$(top_builddir)/eek/Eek-$(EEK_API_VERSION).gir
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eek_gtk_vapi_deps =					\
 | 
					 | 
				
			||||||
	$(srcdir)/EekGtk-$(EEK_API_VERSION).metadata	\
 | 
					 | 
				
			||||||
	|						\
 | 
					 | 
				
			||||||
	$(top_builddir)/eek/EekGtk-$(EEK_API_VERSION).gir	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eek-gtk-$(EEK_API_VERSION).vapi: $(eek_gtk_vapi_deps)
 | 
					 | 
				
			||||||
	$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
 | 
					 | 
				
			||||||
		--library eek-gtk-$(EEK_API_VERSION) \
 | 
					 | 
				
			||||||
		--pkg eek-$(EEK_API_VERSION) \
 | 
					 | 
				
			||||||
		--pkg gio-2.0 \
 | 
					 | 
				
			||||||
		--pkg gtk+-3.0 \
 | 
					 | 
				
			||||||
		--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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# set up the verbosity rules to avoid some build noise
 | 
					 | 
				
			||||||
VAPIGEN_V = $(VAPIGEN_V_$(V))
 | 
					 | 
				
			||||||
VAPIGEN_V_ = $(VAPIGEN_V_$(AM_DEFAULT_VERBOSITY))
 | 
					 | 
				
			||||||
VAPIGEN_V_0 = @echo "  VAPIG " $@;
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
							
								
								
									
										245
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										245
									
								
								configure.ac
									
									
									
									
									
								
							@ -1,245 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_PREREQ(2.63)
 | 
					 | 
				
			||||||
dnl AC_CONFIG_SRCDIR([configure.ac])
 | 
					 | 
				
			||||||
AC_CONFIG_MACRO_DIR([m4])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_INIT([eekboard], [1.0.8], [ueno@unixuser.org])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl Init automake
 | 
					 | 
				
			||||||
AM_INIT_AUTOMAKE
 | 
					 | 
				
			||||||
AM_MAINTAINER_MODE([enable])
 | 
					 | 
				
			||||||
AC_GNU_SOURCE
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl Support silent build
 | 
					 | 
				
			||||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl Check for programs
 | 
					 | 
				
			||||||
AC_PROG_CC
 | 
					 | 
				
			||||||
AM_PROG_CC_C_O
 | 
					 | 
				
			||||||
AC_PROG_CC_STDC
 | 
					 | 
				
			||||||
AC_PROG_INSTALL
 | 
					 | 
				
			||||||
AC_PROG_CXX
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# define PACKAGE_VERSION_* variables
 | 
					 | 
				
			||||||
AM_DISABLE_STATIC
 | 
					 | 
				
			||||||
AC_ISC_POSIX
 | 
					 | 
				
			||||||
AC_HEADER_STDC
 | 
					 | 
				
			||||||
LT_INIT
 | 
					 | 
				
			||||||
IT_PROG_INTLTOOL([0.35.0])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GTK_API_VERSION=3.0
 | 
					 | 
				
			||||||
GTK_REQUIRED=2.91.0
 | 
					 | 
				
			||||||
EEK_API_VERSION=0.90
 | 
					 | 
				
			||||||
EEK_API_MAJOR_VERSION=0
 | 
					 | 
				
			||||||
EEK_API_MINOR_VERSION=90
 | 
					 | 
				
			||||||
EEK_API_PC_VERSION=0.90
 | 
					 | 
				
			||||||
EEK_LIBRARY_SUFFIX="-$EEK_API_VERSION"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_SUBST([GTK_API_VERSION])
 | 
					 | 
				
			||||||
AC_SUBST([EEK_API_VERSION])
 | 
					 | 
				
			||||||
AC_SUBST([EEK_API_MAJOR_VERSION])
 | 
					 | 
				
			||||||
AC_SUBST([EEK_API_MINOR_VERSION])
 | 
					 | 
				
			||||||
AC_SUBST([EEK_API_PC_VERSION])
 | 
					 | 
				
			||||||
AC_SUBST([EEK_LIBRARY_SUFFIX])
 | 
					 | 
				
			||||||
AC_SUBST([EEK_LIBRARY_SUFFIX_U],[AS_TR_SH([$EEK_LIBRARY_SUFFIX])])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AM_PATH_GLIB_2_0
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= 2.26.0], ,
 | 
					 | 
				
			||||||
  [AC_MSG_ERROR([GLib2 not found])])
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES([GIO2], [gio-2.0], ,
 | 
					 | 
				
			||||||
  [AC_MSG_ERROR([Gio2 not found])])
 | 
					 | 
				
			||||||
GLIB_GSETTINGS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo], ,
 | 
					 | 
				
			||||||
  [AC_MSG_ERROR([PangoCairo not found])])
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES([GTK], [
 | 
					 | 
				
			||||||
  gtk+-$GTK_API_VERSION >= $GTK_REQUIRED
 | 
					 | 
				
			||||||
  gdk-$GTK_API_VERSION >= $GTK_REQUIRED], ,
 | 
					 | 
				
			||||||
  [AC_MSG_ERROR([GTK not found])])
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], ,
 | 
					 | 
				
			||||||
  [AC_MSG_ERROR([Libxklavier not found])])
 | 
					 | 
				
			||||||
PKG_CHECK_MODULES([LIBCROCO], [libcroco-0.6], ,
 | 
					 | 
				
			||||||
  [AC_MSG_ERROR([libcroco not found])])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl use XTest to generate key events
 | 
					 | 
				
			||||||
AC_MSG_CHECKING([whether you enable XTest])
 | 
					 | 
				
			||||||
AC_ARG_ENABLE(xtest,
 | 
					 | 
				
			||||||
              AS_HELP_STRING([--enable-xtest=no/yes],
 | 
					 | 
				
			||||||
                             [Enable XTest default=yes]),
 | 
					 | 
				
			||||||
              enable_xtest=$enableval,
 | 
					 | 
				
			||||||
              enable_xtest=yes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if test x$enable_xtest = xyes; then
 | 
					 | 
				
			||||||
  PKG_CHECK_MODULES([XTEST], [xtst], , enable_xtest=no)
 | 
					 | 
				
			||||||
  if test x$enable_xtest = xyes; then
 | 
					 | 
				
			||||||
    AC_DEFINE([HAVE_XTEST], [1], [Define if XTest is found])
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
AM_CONDITIONAL(ENABLE_XTEST, [test x$enable_xtest = xyes])
 | 
					 | 
				
			||||||
AC_MSG_RESULT($enable_xtest)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl use X to mark the fullscreen window as dock
 | 
					 | 
				
			||||||
AC_MSG_CHECKING([whether you enable X dock])
 | 
					 | 
				
			||||||
AC_ARG_ENABLE(x-dock,
 | 
					 | 
				
			||||||
              AS_HELP_STRING([--enable-x-dock=no/yes],
 | 
					 | 
				
			||||||
                             [Enable X dock default=yes]),
 | 
					 | 
				
			||||||
              enable_x_dock=$enableval,
 | 
					 | 
				
			||||||
              enable_x_dock=yes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if test x$enable_x_dock = xyes; then
 | 
					 | 
				
			||||||
  PKG_CHECK_MODULES([XDOCK], [x11], , enable_x_dock=no)
 | 
					 | 
				
			||||||
  if test x$enable_x_dock = xyes; then
 | 
					 | 
				
			||||||
    AC_DEFINE([HAVE_XDOCK], [1], [Define if X dock is found])
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
AM_CONDITIONAL(ENABLE_XDOCK, [test x$enable_x_dock = xyes])
 | 
					 | 
				
			||||||
AC_MSG_RESULT($enable_x_dock)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
focus_listeners="ibus"
 | 
					 | 
				
			||||||
keystroke_listeners=""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl use AT-SPI 2 to capture focus/keystroke events
 | 
					 | 
				
			||||||
AC_MSG_CHECKING([whether you enable AT-SPI 2 event handling])
 | 
					 | 
				
			||||||
AC_ARG_ENABLE(atspi,
 | 
					 | 
				
			||||||
              AS_HELP_STRING([--enable-atspi=no/yes],
 | 
					 | 
				
			||||||
                             [Enable AT-SPI 2 event handling default=yes]),
 | 
					 | 
				
			||||||
              enable_atspi=$enableval,
 | 
					 | 
				
			||||||
              enable_atspi=yes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if test x$enable_atspi = xyes; then
 | 
					 | 
				
			||||||
  PKG_CHECK_MODULES([ATSPI2], [atspi-2], , enable_atspi=no)
 | 
					 | 
				
			||||||
  if test x$enable_atspi = xyes; then
 | 
					 | 
				
			||||||
    AC_DEFINE([HAVE_ATSPI], [1], [Define if AT-SPI 2 is found])
 | 
					 | 
				
			||||||
    focus_listeners="atspi $focus_listeners"
 | 
					 | 
				
			||||||
    keystroke_listeners="atspi $keystroke_listeners"
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
AC_MSG_RESULT($enable_atspi)
 | 
					 | 
				
			||||||
AM_CONDITIONAL(ENABLE_ATSPI, [test x$enable_atspi = xyes])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if test -n "$focus_listeners"; then
 | 
					 | 
				
			||||||
  AC_DEFINE(ENABLE_FOCUS_LISTENER, [1], [Define if eekboard can follow focus changes])
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GOBJECT_INTROSPECTION_CHECK([0.9.0])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl Vala langauge binding
 | 
					 | 
				
			||||||
AC_MSG_CHECKING([whether you enable Vala language support])
 | 
					 | 
				
			||||||
AC_ARG_ENABLE(vala,
 | 
					 | 
				
			||||||
              AS_HELP_STRING([--enable-vala=no/yes],
 | 
					 | 
				
			||||||
                             [Enable Vala language binding default=yes]),
 | 
					 | 
				
			||||||
              enable_vala=$enableval,
 | 
					 | 
				
			||||||
              enable_vala=yes)
 | 
					 | 
				
			||||||
if test x$enable_vala = xyes; then
 | 
					 | 
				
			||||||
  if test "x$INTROSPECTION_SCANNER" = x; then
 | 
					 | 
				
			||||||
    enable_vala=no
 | 
					 | 
				
			||||||
    AC_MSG_WARN([GObject-Introspection must be enabled for Vala bindings])
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  AM_PROG_VALAC([0.10.0])
 | 
					 | 
				
			||||||
  have_vala=yes
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  AC_PATH_PROG(VALAC, valac, valac)
 | 
					 | 
				
			||||||
  AC_SUBST(VALAC)
 | 
					 | 
				
			||||||
  AC_SUBST(VALAFLAGS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  AC_PATH_PROG([VAPIGEN], [vapigen], [false])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if test "x$VAPIGEN" = "xfalse"; then
 | 
					 | 
				
			||||||
    enable_vala=no
 | 
					 | 
				
			||||||
    AC_MSG_WARN([vapigen not found. Was vala compiled with --enable-vapigen?])
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  AC_SUBST(VAPIGEN)
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
AC_MSG_RESULT($enable_vala)
 | 
					 | 
				
			||||||
AM_CONDITIONAL(ENABLE_VALA, [test x$enable_vala = xyes])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl libcanberra
 | 
					 | 
				
			||||||
AC_MSG_CHECKING([whether you enable libcanberra])
 | 
					 | 
				
			||||||
AC_ARG_ENABLE(libcanberra,
 | 
					 | 
				
			||||||
              AS_HELP_STRING([--enable-libcanberra=no/yes],
 | 
					 | 
				
			||||||
                             [Enable libcanberra user interface default=no]),
 | 
					 | 
				
			||||||
              enable_libcanberra=$enableval,
 | 
					 | 
				
			||||||
              enable_libcanberra=yes)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if test x$enable_libcanberra = xyes; then
 | 
					 | 
				
			||||||
  PKG_CHECK_MODULES([LIBCANBERRA], [libcanberra-gtk3], , enable_libcanberra=no)
 | 
					 | 
				
			||||||
  if test x$enable_libcanberra = xyes; then
 | 
					 | 
				
			||||||
    AC_DEFINE([HAVE_LIBCANBERRA], [1], [Define if libcanberra is found])
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
fi
 | 
					 | 
				
			||||||
AM_CONDITIONAL(ENABLE_LIBCANBERRA, [test x$enable_libcanberra = xyes])
 | 
					 | 
				
			||||||
AC_MSG_RESULT($enable_libcanberra)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
GTK_DOC_CHECK([1.14],[--flavour no-tmpl])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dnl define GETTEXT_* variables
 | 
					 | 
				
			||||||
GETTEXT_PACKAGE=$PACKAGE
 | 
					 | 
				
			||||||
AC_SUBST(GETTEXT_PACKAGE)
 | 
					 | 
				
			||||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define to the read-only architecture-independent data directory.])
 | 
					 | 
				
			||||||
AM_GLIB_GNU_GETTEXT
 | 
					 | 
				
			||||||
AM_GLIB_DEFINE_LOCALEDIR(EEKBOARD_LOCALEDIR)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_CONFIG_HEADERS([config.h])
 | 
					 | 
				
			||||||
AC_CONFIG_FILES([Makefile
 | 
					 | 
				
			||||||
eek/Makefile
 | 
					 | 
				
			||||||
eekboard/Makefile
 | 
					 | 
				
			||||||
src/Makefile
 | 
					 | 
				
			||||||
tests/Makefile
 | 
					 | 
				
			||||||
bindings/Makefile
 | 
					 | 
				
			||||||
bindings/vala/Makefile
 | 
					 | 
				
			||||||
docs/Makefile
 | 
					 | 
				
			||||||
docs/reference/Makefile
 | 
					 | 
				
			||||||
docs/reference/eek/Makefile
 | 
					 | 
				
			||||||
docs/reference/eekboard/Makefile
 | 
					 | 
				
			||||||
po/Makefile.in
 | 
					 | 
				
			||||||
data/Makefile
 | 
					 | 
				
			||||||
data/icons/Makefile
 | 
					 | 
				
			||||||
data/icons/16x16/Makefile
 | 
					 | 
				
			||||||
data/icons/22x22/Makefile
 | 
					 | 
				
			||||||
data/icons/24x24/Makefile
 | 
					 | 
				
			||||||
data/icons/32x32/Makefile
 | 
					 | 
				
			||||||
data/icons/48x48/Makefile
 | 
					 | 
				
			||||||
data/icons/scalable/Makefile
 | 
					 | 
				
			||||||
data/themes/Makefile
 | 
					 | 
				
			||||||
data/keyboards/Makefile
 | 
					 | 
				
			||||||
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([
 | 
					 | 
				
			||||||
Build options:
 | 
					 | 
				
			||||||
  Version                   $VERSION
 | 
					 | 
				
			||||||
  Install prefix            $prefix
 | 
					 | 
				
			||||||
  Build shared libs         $enable_shared
 | 
					 | 
				
			||||||
  Build static libs         $enable_static
 | 
					 | 
				
			||||||
  CFLAGS                    $CFLAGS
 | 
					 | 
				
			||||||
  Build Vala binding        $enable_vala
 | 
					 | 
				
			||||||
  Sound support             $enable_libcanberra
 | 
					 | 
				
			||||||
  Build document            $enable_gtk_doc
 | 
					 | 
				
			||||||
  Focus listeners           $focus_listeners
 | 
					 | 
				
			||||||
  Keystroke listeners       $keystroke_listeners
 | 
					 | 
				
			||||||
])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@ -1,35 +0,0 @@
 | 
				
			|||||||
SUBDIRS = icons themes keyboards
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@GSETTINGS_RULES@
 | 
					 | 
				
			||||||
@INTLTOOL_XML_NOMERGE_RULE@
 | 
					 | 
				
			||||||
gsettings_schemas_in_files = org.fedorahosted.eekboard.gschema.xml.in
 | 
					 | 
				
			||||||
gsettings_SCHEMAS = $(gsettings_schemas_in_files:.gschema.xml.in=.gschema.xml)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
servicedir       = $(datadir)/dbus-1/services
 | 
					 | 
				
			||||||
service_in_files = eekboard-server.service.in
 | 
					 | 
				
			||||||
service_DATA     = $(service_in_files:.service.in=.service)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(service_DATA): $(service_in_files) Makefile
 | 
					 | 
				
			||||||
	$(AM_V_GEN) sed -e "s|\@bindir\@|$(bindir)|" $< > $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
desktopdir = $(datadir)/applications
 | 
					 | 
				
			||||||
desktop_in_files = eekboard.desktop.in
 | 
					 | 
				
			||||||
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if ENABLE_ATSPI
 | 
					 | 
				
			||||||
autostartdir	 = $(sysconfdir)/xdg/autostart
 | 
					 | 
				
			||||||
autostart_in_files = eekboard-autostart.desktop.in
 | 
					 | 
				
			||||||
autostart_DATA   = $(autostart_in_files:.desktop.in=.desktop)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@INTLTOOL_DESKTOP_RULE@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLEANFILES = $(service_DATA) $(desktop_DATA) $(gsettings_SCHEMAS)
 | 
					 | 
				
			||||||
EXTRA_DIST = $(service_in_files) $(desktop_in_files) $(gsettings_schemas_in_files)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if ENABLE_ATSPI
 | 
					 | 
				
			||||||
CLEANFILES += $(autostart_DATA)
 | 
					 | 
				
			||||||
EXTRA_DIST += $(autostart_in_files)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,17 +0,0 @@
 | 
				
			|||||||
size = 16x16
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
 | 
					 | 
				
			||||||
dist_icon_DATA = eekboard.png
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-data-hook:
 | 
					 | 
				
			||||||
	@-if test -z "$(DESTDIR)"; then			\
 | 
					 | 
				
			||||||
		echo "Updating Gtk icon cache.";	\
 | 
					 | 
				
			||||||
		$(gtk_update_icon_cache);		\
 | 
					 | 
				
			||||||
	else						\
 | 
					 | 
				
			||||||
		echo "*** Icon cache not updated.  After install, run this:"; \
 | 
					 | 
				
			||||||
		echo "***   $(gtk_update_icon_cache)";	\
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 606 B  | 
@ -1,17 +0,0 @@
 | 
				
			|||||||
size = 22x22
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
 | 
					 | 
				
			||||||
dist_icon_DATA = eekboard.png
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-data-hook:
 | 
					 | 
				
			||||||
	@-if test -z "$(DESTDIR)"; then			\
 | 
					 | 
				
			||||||
		echo "Updating Gtk icon cache.";	\
 | 
					 | 
				
			||||||
		$(gtk_update_icon_cache);		\
 | 
					 | 
				
			||||||
	else						\
 | 
					 | 
				
			||||||
		echo "*** Icon cache not updated.  After install, run this:"; \
 | 
					 | 
				
			||||||
		echo "***   $(gtk_update_icon_cache)";	\
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 892 B  | 
@ -1,17 +0,0 @@
 | 
				
			|||||||
size = 24x24
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
 | 
					 | 
				
			||||||
dist_icon_DATA = eekboard.png
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-data-hook:
 | 
					 | 
				
			||||||
	@-if test -z "$(DESTDIR)"; then			\
 | 
					 | 
				
			||||||
		echo "Updating Gtk icon cache.";	\
 | 
					 | 
				
			||||||
		$(gtk_update_icon_cache);		\
 | 
					 | 
				
			||||||
	else						\
 | 
					 | 
				
			||||||
		echo "*** Icon cache not updated.  After install, run this:"; \
 | 
					 | 
				
			||||||
		echo "***   $(gtk_update_icon_cache)";	\
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 957 B  | 
@ -1,17 +0,0 @@
 | 
				
			|||||||
size = 32x32
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
 | 
					 | 
				
			||||||
dist_icon_DATA = eekboard.png
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-data-hook:
 | 
					 | 
				
			||||||
	@-if test -z "$(DESTDIR)"; then			\
 | 
					 | 
				
			||||||
		echo "Updating Gtk icon cache.";	\
 | 
					 | 
				
			||||||
		$(gtk_update_icon_cache);		\
 | 
					 | 
				
			||||||
	else						\
 | 
					 | 
				
			||||||
		echo "*** Icon cache not updated.  After install, run this:"; \
 | 
					 | 
				
			||||||
		echo "***   $(gtk_update_icon_cache)";	\
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 1.5 KiB  | 
@ -1,17 +0,0 @@
 | 
				
			|||||||
size = 48x48
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
icondir = $(datadir)/icons/hicolor/$(size)/apps
 | 
					 | 
				
			||||||
dist_icon_DATA = eekboard.png
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-data-hook:
 | 
					 | 
				
			||||||
	@-if test -z "$(DESTDIR)"; then			\
 | 
					 | 
				
			||||||
		echo "Updating Gtk icon cache.";	\
 | 
					 | 
				
			||||||
		$(gtk_update_icon_cache);		\
 | 
					 | 
				
			||||||
	else						\
 | 
					 | 
				
			||||||
		echo "*** Icon cache not updated.  After install, run this:"; \
 | 
					 | 
				
			||||||
		echo "***   $(gtk_update_icon_cache)";	\
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 2.7 KiB  | 
@ -1,3 +0,0 @@
 | 
				
			|||||||
SUBDIRS = 16x16 22x22 24x24 32x32 48x48 scalable
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,15 +0,0 @@
 | 
				
			|||||||
icondir = $(datadir)/icons/hicolor/scalable/apps
 | 
					 | 
				
			||||||
dist_icon_DATA = eekboard.svg
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install-data-hook:
 | 
					 | 
				
			||||||
	@-if test -z "$(DESTDIR)"; then			\
 | 
					 | 
				
			||||||
		echo "Updating Gtk icon cache.";	\
 | 
					 | 
				
			||||||
		$(gtk_update_icon_cache);		\
 | 
					 | 
				
			||||||
	else						\
 | 
					 | 
				
			||||||
		echo "*** Icon cache not updated.  After install, run this:"; \
 | 
					 | 
				
			||||||
		echo "***   $(gtk_update_icon_cache)";	\
 | 
					 | 
				
			||||||
	fi
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| 
		 Before Width: | Height: | Size: 472 KiB  | 
@ -1,40 +0,0 @@
 | 
				
			|||||||
keyboardsdir = $(pkgdatadir)/keyboards
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
nobase_dist_keyboards_DATA =			\
 | 
					 | 
				
			||||||
	keyboards.xml				\
 | 
					 | 
				
			||||||
	geometry/compact.xml			\
 | 
					 | 
				
			||||||
	symbols/ar.xml				\
 | 
					 | 
				
			||||||
	symbols/be.xml				\
 | 
					 | 
				
			||||||
	symbols/fa.xml				\
 | 
					 | 
				
			||||||
	symbols/he.xml				\
 | 
					 | 
				
			||||||
	symbols/ja-kana.xml			\
 | 
					 | 
				
			||||||
	symbols/kk.xml				\
 | 
					 | 
				
			||||||
	symbols/ks.xml				\
 | 
					 | 
				
			||||||
	symbols/my.xml				\
 | 
					 | 
				
			||||||
	symbols/ru.xml				\
 | 
					 | 
				
			||||||
	symbols/th.xml				\
 | 
					 | 
				
			||||||
	symbols/ua.xml				\
 | 
					 | 
				
			||||||
	symbols/ug.xml				\
 | 
					 | 
				
			||||||
	symbols/us.xml				\
 | 
					 | 
				
			||||||
	symbols/zh-bopomofo.xml			\
 | 
					 | 
				
			||||||
	$(inscript_symbols)			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
inscript_symbols =				\
 | 
					 | 
				
			||||||
	symbols/as-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/bn-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/gu-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/hi-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/kn-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/ks-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/mai-inscript.xml		\
 | 
					 | 
				
			||||||
	symbols/ml-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/mr-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/or-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/pa-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/sd-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/ta-inscript.xml			\
 | 
					 | 
				
			||||||
	symbols/te-inscript.xml			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
<?xml version="1.0"?>
 | 
					<?xml version="1.0"?>
 | 
				
			||||||
<geometry version="0.90">
 | 
					<geometry version="0.90">
 | 
				
			||||||
  <bounds x="0.000000" y="0.000000" width="410.0000" height="296.5853"/>
 | 
					  <bounds x="0.000000" y="0.000000" width="426.0000" height="296.5853"/>
 | 
				
			||||||
  <section angle="0">
 | 
					  <section angle="0">
 | 
				
			||||||
    <bounds x="0" y="0" width="608.7804" height="201.3658"/>
 | 
					    <bounds x="0" y="0" width="608.7804" height="201.3658"/>
 | 
				
			||||||
    <row orientation="1">
 | 
					    <row orientation="1">
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +0,0 @@
 | 
				
			|||||||
themedir = $(pkgdatadir)/themes
 | 
					 | 
				
			||||||
dist_theme_DATA = default.css
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,21 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SUBDIRS = reference
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,21 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SUBDIRS = eek eekboard
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,133 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Process this file with automake to produce Makefile.in
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# We require automake 1.6 at least.
 | 
					 | 
				
			||||||
AUTOMAKE_OPTIONS = 1.6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This is a blank Makefile.am for using gtk-doc.
 | 
					 | 
				
			||||||
# Copy this to your project's API docs directory and modify the variables to
 | 
					 | 
				
			||||||
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
 | 
					 | 
				
			||||||
# of using the various options.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# The name of the module, e.g. 'glib'.
 | 
					 | 
				
			||||||
DOC_MODULE=eek
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
 | 
					 | 
				
			||||||
#DOC_MODULE_VERSION=2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# The top-level SGML file. You can change this if you want to.
 | 
					 | 
				
			||||||
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# The directory containing the source code. Relative to $(srcdir).
 | 
					 | 
				
			||||||
# gtk-doc will search all .c & .h files beneath here for inline comments
 | 
					 | 
				
			||||||
# documenting the functions and macros.
 | 
					 | 
				
			||||||
# e.g. DOC_SOURCE_DIR=../../../gtk
 | 
					 | 
				
			||||||
DOC_SOURCE_DIR=../../../eek
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
 | 
					 | 
				
			||||||
SCANGOBJ_OPTIONS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-scan.
 | 
					 | 
				
			||||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
 | 
					 | 
				
			||||||
SCAN_OPTIONS=--rebuild-types --deprecated-guards="EEK_DISABLE_DEPRECATED"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-mkdb.
 | 
					 | 
				
			||||||
# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
 | 
					 | 
				
			||||||
MKDB_OPTIONS=--sgml-mode --output-format=xml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-mktmpl
 | 
					 | 
				
			||||||
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
 | 
					 | 
				
			||||||
MKTMPL_OPTIONS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-mkhtml
 | 
					 | 
				
			||||||
MKHTML_OPTIONS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-fixref. Not normally needed.
 | 
					 | 
				
			||||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
 | 
					 | 
				
			||||||
FIXXREF_OPTIONS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Used for dependencies. The docs will be rebuilt if any of these change.
 | 
					 | 
				
			||||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
 | 
					 | 
				
			||||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
 | 
					 | 
				
			||||||
HFILE_GLOB=$(top_srcdir)/eek/*.h
 | 
					 | 
				
			||||||
CFILE_GLOB=$(top_srcdir)/eek/*.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
 | 
					 | 
				
			||||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
 | 
					 | 
				
			||||||
EXTRA_HFILES=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Header files to ignore when scanning. Use base file name, no paths
 | 
					 | 
				
			||||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
 | 
					 | 
				
			||||||
IGNORE_HFILES = \
 | 
					 | 
				
			||||||
	config.h \
 | 
					 | 
				
			||||||
	eek-renderer.h \
 | 
					 | 
				
			||||||
	eek-gtk-renderer.h \
 | 
					 | 
				
			||||||
	eek-theme.h \
 | 
					 | 
				
			||||||
	eek-theme-node.h \
 | 
					 | 
				
			||||||
	eek-enumtypes.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Images to copy into HTML directory.
 | 
					 | 
				
			||||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
 | 
					 | 
				
			||||||
HTML_IMAGES=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
 | 
					 | 
				
			||||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
 | 
					 | 
				
			||||||
content_files=eek-overview.xml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
 | 
					 | 
				
			||||||
# These files must be listed here *and* in content_files
 | 
					 | 
				
			||||||
# e.g. expand_content_files=running.sgml
 | 
					 | 
				
			||||||
expand_content_files=eek-overview.xml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
 | 
					 | 
				
			||||||
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
 | 
					 | 
				
			||||||
# signals and properties.
 | 
					 | 
				
			||||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
 | 
					 | 
				
			||||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
 | 
					 | 
				
			||||||
GTKDOC_CFLAGS = $(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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
 | 
					 | 
				
			||||||
include $(top_srcdir)/gtk-doc.make
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Other files to distribute
 | 
					 | 
				
			||||||
# e.g. EXTRA_DIST += version.xml.in
 | 
					 | 
				
			||||||
EXTRA_DIST +=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Files not to distribute
 | 
					 | 
				
			||||||
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
 | 
					 | 
				
			||||||
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
 | 
					 | 
				
			||||||
#DISTCLEANFILES +=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Comment this out if you want your docs-status tested during 'make check'
 | 
					 | 
				
			||||||
if ENABLE_GTK_DOC
 | 
					 | 
				
			||||||
#TESTS_ENVIRONMENT = cd $(srcsrc) &&
 | 
					 | 
				
			||||||
#TESTS = $(GTKDOC_CHECK)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/gtk-doc.mk
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,122 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
## Process this file with automake to produce Makefile.in
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# We require automake 1.6 at least.
 | 
					 | 
				
			||||||
AUTOMAKE_OPTIONS = 1.6
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This is a blank Makefile.am for using gtk-doc.
 | 
					 | 
				
			||||||
# Copy this to your project's API docs directory and modify the variables to
 | 
					 | 
				
			||||||
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
 | 
					 | 
				
			||||||
# of using the various options.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# The name of the module, e.g. 'glib'.
 | 
					 | 
				
			||||||
DOC_MODULE=eekboard
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
 | 
					 | 
				
			||||||
#DOC_MODULE_VERSION=2
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# The top-level SGML file. You can change this if you want to.
 | 
					 | 
				
			||||||
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# The directory containing the source code. Relative to $(srcdir).
 | 
					 | 
				
			||||||
# gtk-doc will search all .c & .h files beneath here for inline comments
 | 
					 | 
				
			||||||
# documenting the functions and macros.
 | 
					 | 
				
			||||||
# e.g. DOC_SOURCE_DIR=../../../gtk
 | 
					 | 
				
			||||||
DOC_SOURCE_DIR=../../../eekboard
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
 | 
					 | 
				
			||||||
SCANGOBJ_OPTIONS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-scan.
 | 
					 | 
				
			||||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
 | 
					 | 
				
			||||||
SCAN_OPTIONS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-mkdb.
 | 
					 | 
				
			||||||
# e.g. MKDB_OPTIONS=--sgml-mode --output-format=xml
 | 
					 | 
				
			||||||
MKDB_OPTIONS=--sgml-mode --output-format=xml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-mktmpl
 | 
					 | 
				
			||||||
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
 | 
					 | 
				
			||||||
MKTMPL_OPTIONS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-mkhtml
 | 
					 | 
				
			||||||
MKHTML_OPTIONS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra options to supply to gtkdoc-fixref. Not normally needed.
 | 
					 | 
				
			||||||
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
 | 
					 | 
				
			||||||
FIXXREF_OPTIONS=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Used for dependencies. The docs will be rebuilt if any of these change.
 | 
					 | 
				
			||||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
 | 
					 | 
				
			||||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
 | 
					 | 
				
			||||||
HFILE_GLOB=$(top_srcdir)/eekboard/*.h
 | 
					 | 
				
			||||||
CFILE_GLOB=$(top_srcdir)/eekboard/*.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
 | 
					 | 
				
			||||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
 | 
					 | 
				
			||||||
EXTRA_HFILES=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Header files to ignore when scanning. Use base file name, no paths
 | 
					 | 
				
			||||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
 | 
					 | 
				
			||||||
IGNORE_HFILES=config.h eekboard.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Images to copy into HTML directory.
 | 
					 | 
				
			||||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
 | 
					 | 
				
			||||||
HTML_IMAGES=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
 | 
					 | 
				
			||||||
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
 | 
					 | 
				
			||||||
# content_files=eekboard-overview.xml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
 | 
					 | 
				
			||||||
# These files must be listed here *and* in content_files
 | 
					 | 
				
			||||||
# e.g. expand_content_files=running.sgml
 | 
					 | 
				
			||||||
# expand_content_files=eekboard-overview.xml
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
 | 
					 | 
				
			||||||
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
 | 
					 | 
				
			||||||
# signals and properties.
 | 
					 | 
				
			||||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
 | 
					 | 
				
			||||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
 | 
					 | 
				
			||||||
GTKDOC_CFLAGS = $(GIO2_CFLAGS)
 | 
					 | 
				
			||||||
GTKDOC_LIBS = $(top_builddir)/eekboard/libeekboard.la $(GIO2_LIBS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
 | 
					 | 
				
			||||||
include $(top_srcdir)/gtk-doc.make
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Other files to distribute
 | 
					 | 
				
			||||||
# e.g. EXTRA_DIST += version.xml.in
 | 
					 | 
				
			||||||
# EXTRA_DIST +=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Files not to distribute
 | 
					 | 
				
			||||||
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
 | 
					 | 
				
			||||||
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
 | 
					 | 
				
			||||||
#DISTCLEANFILES +=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# Comment this out if you want your docs-status tested during 'make check'
 | 
					 | 
				
			||||||
if ENABLE_GTK_DOC
 | 
					 | 
				
			||||||
#TESTS_ENVIRONMENT = cd $(srcsrc) &&
 | 
					 | 
				
			||||||
#TESTS = $(GTKDOC_CHECK)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/gtk-doc.mk
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
							
								
								
									
										298
									
								
								eek/Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										298
									
								
								eek/Makefile.am
									
									
									
									
									
								
							@ -1,298 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NULL =
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lib_LTLIBRARIES =				\
 | 
					 | 
				
			||||||
	libeek.la				\
 | 
					 | 
				
			||||||
	libeek-gtk.la				\
 | 
					 | 
				
			||||||
	libeek-xkl.la				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_public_headers =				\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-layout.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-element.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-container.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-keyboard.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-section.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-key.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-symbol.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-keysym.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-text.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-symbol-matrix.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-types.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-xml.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-xml-layout.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-serializable.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-theme.h			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek.h				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_private_headers =			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-renderer.h		\
 | 
					 | 
				
			||||||
	$(libeek_keysym_headers)		\
 | 
					 | 
				
			||||||
	$(builddir)/eek-marshalers.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-theme-context.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-theme-private.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-theme-node.h		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_sources =				\
 | 
					 | 
				
			||||||
	$(srcdir)/eek.c				\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-layout.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-element.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-container.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-keyboard.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-section.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-key.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-symbol-matrix.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-symbol.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-keysym.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-text.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-types.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-serializable.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-xml.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-xml-layout.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-renderer.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-keyboard-drawing.c	\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-theme.c			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-theme-context.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-theme-node.c		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_keysym_headers =					\
 | 
					 | 
				
			||||||
	$(builddir)/eek-special-keysym-entries.h	\
 | 
					 | 
				
			||||||
	$(builddir)/eek-unicode-keysym-entries.h	\
 | 
					 | 
				
			||||||
	$(builddir)/eek-xkeysym-keysym-entries.h	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_enumtypes_sources =			\
 | 
					 | 
				
			||||||
	$(builddir)/eek-enumtypes.c		\
 | 
					 | 
				
			||||||
	$(builddir)/eek-enumtypes.h		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_marshalers_sources =			\
 | 
					 | 
				
			||||||
	$(builddir)/eek-marshalers.c		\
 | 
					 | 
				
			||||||
	$(builddir)/eek-marshalers.h		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BUILT_SOURCES =					\
 | 
					 | 
				
			||||||
	$(libeek_keysym_headers)		\
 | 
					 | 
				
			||||||
	$(libeek_enumtypes_sources)		\
 | 
					 | 
				
			||||||
	$(libeek_marshalers_sources)		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_la_SOURCES =				\
 | 
					 | 
				
			||||||
	$(libeek_sources)			\
 | 
					 | 
				
			||||||
	$(builddir)/eek-enumtypes.c		\
 | 
					 | 
				
			||||||
	$(builddir)/eek-marshalers.c		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_la_CFLAGS =					\
 | 
					 | 
				
			||||||
	-DEEK_COMPILATION=1				\
 | 
					 | 
				
			||||||
	-DKEYBOARDSDIR=\"$(pkgdatadir)/keyboards\"	\
 | 
					 | 
				
			||||||
	$(GIO2_CFLAGS)					\
 | 
					 | 
				
			||||||
	$(PANGOCAIRO_CFLAGS)				\
 | 
					 | 
				
			||||||
	$(LIBCROCO_CFLAGS)				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_la_LIBADD =				\
 | 
					 | 
				
			||||||
	$(GIO2_LIBS)				\
 | 
					 | 
				
			||||||
	$(PANGOCAIRO_LIBS)			\
 | 
					 | 
				
			||||||
	$(LIBCROCO_LIBS)			\
 | 
					 | 
				
			||||||
	-lm					\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeek_gtk_public_headers =			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-gtk-keyboard.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-gtk.h			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
libeek_gtk_private_headers =			\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-gtk-renderer.h		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
libeek_gtk_sources =				\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-gtk-keyboard.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eek-gtk-renderer.c		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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
 | 
					 | 
				
			||||||
	$(AM_V_GEN) $(PYTHON) $(srcdir)/gen-keysym-entries.py \
 | 
					 | 
				
			||||||
		special_keysym_entries \
 | 
					 | 
				
			||||||
		< $< > $@
 | 
					 | 
				
			||||||
eek-unicode-keysym-entries.h: unicode-keysym-entries.txt
 | 
					 | 
				
			||||||
	$(AM_V_GEN) $(PYTHON) $(srcdir)/gen-keysym-entries.py \
 | 
					 | 
				
			||||||
		unicode_keysym_entries \
 | 
					 | 
				
			||||||
		< $< > $@
 | 
					 | 
				
			||||||
eek-xkeysym-keysym-entries.h: xkeysym-keysym-entries.txt
 | 
					 | 
				
			||||||
	$(AM_V_GEN) $(PYTHON) $(srcdir)/gen-keysym-entries.py \
 | 
					 | 
				
			||||||
		xkeysym_keysym_entries \
 | 
					 | 
				
			||||||
		< $< > $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eek-enumtypes.h: $(libeek_public_headers) eek-enumtypes.h.template
 | 
					 | 
				
			||||||
	$(AM_V_GEN) $(GLIB_MKENUMS) \
 | 
					 | 
				
			||||||
		--template $(srcdir)/eek-enumtypes.h.template \
 | 
					 | 
				
			||||||
		$(libeek_public_headers) > eek-enumtypes.h.tmp && \
 | 
					 | 
				
			||||||
		mv eek-enumtypes.h.tmp eek-enumtypes.h
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eek-enumtypes.c: $(libeek_public_headers) eek-enumtypes.c.template
 | 
					 | 
				
			||||||
	$(AM_V_GEN) $(GLIB_MKENUMS) \
 | 
					 | 
				
			||||||
		--template $(srcdir)/eek-enumtypes.c.template \
 | 
					 | 
				
			||||||
		$(libeek_public_headers) > eek-enumtypes.c.tmp && \
 | 
					 | 
				
			||||||
		mv eek-enumtypes.c.tmp eek-enumtypes.c
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# gen marshal
 | 
					 | 
				
			||||||
eek-marshalers.h: eek-marshalers.list
 | 
					 | 
				
			||||||
	$(AM_V_GEN) $(GLIB_GENMARSHAL) \
 | 
					 | 
				
			||||||
		--prefix=_eek_marshal $(srcdir)/eek-marshalers.list \
 | 
					 | 
				
			||||||
		--header --internal > $@.tmp && \
 | 
					 | 
				
			||||||
	mv $@.tmp $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eek-marshalers.c: eek-marshalers.list eek-marshalers.h
 | 
					 | 
				
			||||||
	$(AM_V_GEN) (echo "#include \"eek-marshalers.h\""; \
 | 
					 | 
				
			||||||
	$(GLIB_GENMARSHAL) --prefix=_eek_marshal \
 | 
					 | 
				
			||||||
		$(srcdir)/eek-marshalers.list --body --internal) > $@.tmp && \
 | 
					 | 
				
			||||||
	mv $@.tmp $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
					 | 
				
			||||||
pkgconfig_DATA =				\
 | 
					 | 
				
			||||||
	eek-$(EEK_API_VERSION).pc		\
 | 
					 | 
				
			||||||
	eek-gtk-$(EEK_API_VERSION).pc		\
 | 
					 | 
				
			||||||
	eek-xkl-$(EEK_API_VERSION).pc		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLEANFILES =
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
DISTCLEANFILES =				\
 | 
					 | 
				
			||||||
	$(BUILT_SOURCES)			\
 | 
					 | 
				
			||||||
	$(pkgconfig_DATA)			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EXTRA_DIST =					\
 | 
					 | 
				
			||||||
	gen-keysym-entries.py			\
 | 
					 | 
				
			||||||
	special-keysym-entries.txt		\
 | 
					 | 
				
			||||||
	unicode-keysym-entries.txt		\
 | 
					 | 
				
			||||||
	xkeysym-keysym-entries.txt		\
 | 
					 | 
				
			||||||
	eek-enumtypes.h.template		\
 | 
					 | 
				
			||||||
	eek-enumtypes.c.template		\
 | 
					 | 
				
			||||||
	eek-marshalers.list			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(INTROSPECTION_MAKEFILE)
 | 
					 | 
				
			||||||
INTROSPECTION_GIRS =
 | 
					 | 
				
			||||||
INTROSPECTION_SCANNER_ARGS = --add-include-path=$(builddir)
 | 
					 | 
				
			||||||
INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if HAVE_INTROSPECTION
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Eek@EEK_LIBRARY_SUFFIX@.gir: libeek.la
 | 
					 | 
				
			||||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS =	\
 | 
					 | 
				
			||||||
	--identifier-prefix=Eek			\
 | 
					 | 
				
			||||||
	--symbol-prefix=eek			\
 | 
					 | 
				
			||||||
	--pkg=glib-2.0				\
 | 
					 | 
				
			||||||
	--pkg-export=eek-$(EEK_API_VERSION)	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 Gio-2.0
 | 
					 | 
				
			||||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_la_CFLAGS)
 | 
					 | 
				
			||||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek.la
 | 
					 | 
				
			||||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES =		\
 | 
					 | 
				
			||||||
	$(libeek_sources)			\
 | 
					 | 
				
			||||||
	$(libeek_public_headers)		\
 | 
					 | 
				
			||||||
	$(builddir)/eek-enumtypes.h		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EekGtk@EEK_LIBRARY_SUFFIX@.gir: libeek-gtk.la Eek@EEK_LIBRARY_SUFFIX@.gir
 | 
					 | 
				
			||||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS =	\
 | 
					 | 
				
			||||||
	--identifier-prefix=Eek			\
 | 
					 | 
				
			||||||
	--symbol-prefix=eek			\
 | 
					 | 
				
			||||||
	--pkg-export=eek-gtk-$(EEK_API_VERSION)	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES =	\
 | 
					 | 
				
			||||||
	GObject-2.0				\
 | 
					 | 
				
			||||||
	Gtk-@GTK_API_VERSION@			\
 | 
					 | 
				
			||||||
	Eek@EEK_LIBRARY_SUFFIX@			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeek_gtk_la_CFLAGS)
 | 
					 | 
				
			||||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeek-gtk.la
 | 
					 | 
				
			||||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_FILES =	\
 | 
					 | 
				
			||||||
	$(libeek_gtk_sources)			\
 | 
					 | 
				
			||||||
	$(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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INTROSPECTION_GIRS +=				\
 | 
					 | 
				
			||||||
	Eek@EEK_LIBRARY_SUFFIX@.gir		\
 | 
					 | 
				
			||||||
	EekGtk@EEK_LIBRARY_SUFFIX@.gir		\
 | 
					 | 
				
			||||||
	EekXkl@EEK_LIBRARY_SUFFIX@.gir		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
girdir = $(datadir)/gir-1.0
 | 
					 | 
				
			||||||
gir_DATA = $(INTROSPECTION_GIRS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typelibdir = $(libdir)/girepository-1.0
 | 
					 | 
				
			||||||
typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLEANFILES += $(gir_DATA) $(typelib_DATA)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -40,23 +40,19 @@ enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static guint signals[LAST_SIGNAL] = { 0, };
 | 
					static guint signals[LAST_SIGNAL] = { 0, };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_ABSTRACT_TYPE (EekContainer, eek_container, EEK_TYPE_ELEMENT);
 | 
					typedef struct _EekContainerPrivate
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEK_CONTAINER_GET_PRIVATE(obj)                                  \
 | 
					 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_CONTAINER, EekContainerPrivate))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekContainerPrivate
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GList *head;
 | 
					    GList *head;
 | 
				
			||||||
    GList *last;
 | 
					    GList *last;
 | 
				
			||||||
};
 | 
					} EekContainerPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (EekContainer, eek_container, EEK_TYPE_ELEMENT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_container_real_add_child (EekContainer *self,
 | 
					eek_container_real_add_child (EekContainer *self,
 | 
				
			||||||
                              EekElement   *child)
 | 
					                              EekElement   *child)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
 | 
					    EekContainerPrivate *priv = eek_container_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_if_fail (EEK_IS_ELEMENT(child));
 | 
					    g_return_if_fail (EEK_IS_ELEMENT(child));
 | 
				
			||||||
    g_object_ref (child);
 | 
					    g_object_ref (child);
 | 
				
			||||||
@ -75,7 +71,7 @@ static void
 | 
				
			|||||||
eek_container_real_remove_child (EekContainer *self,
 | 
					eek_container_real_remove_child (EekContainer *self,
 | 
				
			||||||
                                 EekElement   *child)
 | 
					                                 EekElement   *child)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
 | 
					    EekContainerPrivate *priv = eek_container_get_instance_private (self);
 | 
				
			||||||
    GList *head;
 | 
					    GList *head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_if_fail (EEK_IS_ELEMENT(child));
 | 
					    g_return_if_fail (EEK_IS_ELEMENT(child));
 | 
				
			||||||
@ -94,7 +90,7 @@ eek_container_real_foreach_child (EekContainer *self,
 | 
				
			|||||||
                                  EekCallback   callback,
 | 
					                                  EekCallback   callback,
 | 
				
			||||||
                                  gpointer      user_data)
 | 
					                                  gpointer      user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
 | 
					    EekContainerPrivate *priv = eek_container_get_instance_private (self);
 | 
				
			||||||
    GList *head;
 | 
					    GList *head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (head = priv->head; head; head = g_list_next (head))
 | 
					    for (head = priv->head; head; head = g_list_next (head))
 | 
				
			||||||
@ -106,7 +102,7 @@ eek_container_real_find (EekContainer *self,
 | 
				
			|||||||
                         EekCompareFunc func,
 | 
					                         EekCompareFunc func,
 | 
				
			||||||
                         gpointer user_data)
 | 
					                         gpointer user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(self);
 | 
					    EekContainerPrivate *priv = eek_container_get_instance_private (self);
 | 
				
			||||||
    GList *head;
 | 
					    GList *head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    head = g_list_find_custom (priv->head, user_data, (GCompareFunc)func);
 | 
					    head = g_list_find_custom (priv->head, user_data, (GCompareFunc)func);
 | 
				
			||||||
@ -118,7 +114,8 @@ eek_container_real_find (EekContainer *self,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_container_dispose (GObject *object)
 | 
					eek_container_dispose (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekContainerPrivate *priv = EEK_CONTAINER_GET_PRIVATE(object);
 | 
					    EekContainer        *self = EEK_CONTAINER (object);
 | 
				
			||||||
 | 
					    EekContainerPrivate *priv = eek_container_get_instance_private (self);
 | 
				
			||||||
    GList *head;
 | 
					    GList *head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (head = priv->head; head; head = priv->head) {
 | 
					    for (head = priv->head; head; head = priv->head) {
 | 
				
			||||||
@ -134,9 +131,6 @@ eek_container_class_init (EekContainerClass *klass)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekContainerPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    klass->add_child = eek_container_real_add_child;
 | 
					    klass->add_child = eek_container_real_add_child;
 | 
				
			||||||
    klass->remove_child = eek_container_real_remove_child;
 | 
					    klass->remove_child = eek_container_real_remove_child;
 | 
				
			||||||
    klass->foreach_child = eek_container_real_foreach_child;
 | 
					    klass->foreach_child = eek_container_real_foreach_child;
 | 
				
			||||||
@ -189,7 +183,7 @@ eek_container_class_init (EekContainerClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_container_init (EekContainer *self)
 | 
					eek_container_init (EekContainer *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEK_CONTAINER_GET_PRIVATE(self);
 | 
					    /* void */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
				
			|||||||
@ -30,14 +30,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_CONTAINER (eek_container_get_type())
 | 
					#define EEK_TYPE_CONTAINER (eek_container_get_type())
 | 
				
			||||||
#define EEK_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_CONTAINER, EekContainer))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekContainer, eek_container, EEK, CONTAINER, EekElement)
 | 
				
			||||||
#define EEK_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_CONTAINER, EekContainerClass))
 | 
					 | 
				
			||||||
#define EEK_IS_CONTAINER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_CONTAINER))
 | 
					 | 
				
			||||||
#define EEK_IS_CONTAINER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_CONTAINER))
 | 
					 | 
				
			||||||
#define EEK_CONTAINER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_CONTAINER, EekContainerClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekContainerClass EekContainerClass;
 | 
					 | 
				
			||||||
typedef struct _EekContainerPrivate EekContainerPrivate;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * EekCallback:
 | 
					 * EekCallback:
 | 
				
			||||||
@ -50,14 +43,6 @@ typedef struct _EekContainerPrivate EekContainerPrivate;
 | 
				
			|||||||
typedef void (*EekCallback) (EekElement *element, gpointer user_data);
 | 
					typedef void (*EekCallback) (EekElement *element, gpointer user_data);
 | 
				
			||||||
typedef gint (*EekCompareFunc) (EekElement *element, gpointer user_data);
 | 
					typedef gint (*EekCompareFunc) (EekElement *element, gpointer user_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekContainer
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    EekElement parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekContainerPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * EekContainerClass:
 | 
					 * EekContainerClass:
 | 
				
			||||||
 * @foreach_child: virtual function for iterating over the container's children
 | 
					 * @foreach_child: virtual function for iterating over the container's children
 | 
				
			||||||
 | 
				
			|||||||
@ -52,20 +52,16 @@ enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static guint signals[LAST_SIGNAL] = { 0, };
 | 
					static guint signals[LAST_SIGNAL] = { 0, };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_ABSTRACT_TYPE (EekElement, eek_element, G_TYPE_OBJECT);
 | 
					typedef struct _EekElementPrivate
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEK_ELEMENT_GET_PRIVATE(obj)                                  \
 | 
					 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_ELEMENT, EekElementPrivate))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekElementPrivate
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    gchar *name;
 | 
					    gchar *name;
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    EekElement *parent;
 | 
					    EekElement *parent;
 | 
				
			||||||
    gint group;
 | 
					    gint group;
 | 
				
			||||||
    gint level;
 | 
					    gint level;
 | 
				
			||||||
};
 | 
					} EekElementPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (EekElement, eek_element, G_TYPE_OBJECT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_element_real_symbol_index_changed (EekElement *self,
 | 
					eek_element_real_symbol_index_changed (EekElement *self,
 | 
				
			||||||
@ -78,7 +74,8 @@ eek_element_real_symbol_index_changed (EekElement *self,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_element_finalize (GObject *object)
 | 
					eek_element_finalize (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekElementPrivate *priv = EEK_ELEMENT_GET_PRIVATE(object);
 | 
					    EekElement        *self = EEK_ELEMENT (object);
 | 
				
			||||||
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (priv->name);
 | 
					    g_free (priv->name);
 | 
				
			||||||
    G_OBJECT_CLASS (eek_element_parent_class)->finalize (object);
 | 
					    G_OBJECT_CLASS (eek_element_parent_class)->finalize (object);
 | 
				
			||||||
@ -146,9 +143,6 @@ eek_element_class_init (EekElementClass *klass)
 | 
				
			|||||||
    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec        *pspec;
 | 
					    GParamSpec        *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekElementPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /* signals */
 | 
					    /* signals */
 | 
				
			||||||
    klass->symbol_index_changed = eek_element_real_symbol_index_changed;
 | 
					    klass->symbol_index_changed = eek_element_real_symbol_index_changed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -238,9 +232,8 @@ eek_element_class_init (EekElementClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_element_init (EekElement *self)
 | 
					eek_element_init (EekElement *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekElementPrivate *priv;
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = self->priv = EEK_ELEMENT_GET_PRIVATE(self);
 | 
					 | 
				
			||||||
    priv->group = -1;
 | 
					    priv->group = -1;
 | 
				
			||||||
    priv->level = -1;
 | 
					    priv->level = -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -259,10 +252,12 @@ eek_element_set_parent (EekElement *element,
 | 
				
			|||||||
    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
					    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
				
			||||||
    g_return_if_fail (parent == NULL || EEK_IS_ELEMENT(parent));
 | 
					    g_return_if_fail (parent == NULL || EEK_IS_ELEMENT(parent));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (element->priv->parent == parent)
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->parent == parent)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (element->priv->parent != NULL) {
 | 
					    if (priv->parent != NULL) {
 | 
				
			||||||
        /* release self-reference acquired when setting parent */
 | 
					        /* release self-reference acquired when setting parent */
 | 
				
			||||||
        g_object_unref (element);
 | 
					        g_object_unref (element);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -271,7 +266,7 @@ eek_element_set_parent (EekElement *element,
 | 
				
			|||||||
        g_object_ref (element);
 | 
					        g_object_ref (element);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    element->priv->parent = parent;
 | 
					    priv->parent = parent;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -285,7 +280,10 @@ EekElement *
 | 
				
			|||||||
eek_element_get_parent (EekElement *element)
 | 
					eek_element_get_parent (EekElement *element)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL);
 | 
					    g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL);
 | 
				
			||||||
    return element->priv->parent;
 | 
					
 | 
				
			||||||
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->parent;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -300,8 +298,11 @@ eek_element_set_name (EekElement  *element,
 | 
				
			|||||||
                      const gchar *name)
 | 
					                      const gchar *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
					    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
				
			||||||
    g_free (element->priv->name);
 | 
					
 | 
				
			||||||
    element->priv->name = g_strdup (name);
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_free (priv->name);
 | 
				
			||||||
 | 
					    priv->name = g_strdup (name);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -315,7 +316,10 @@ const gchar *
 | 
				
			|||||||
eek_element_get_name (EekElement  *element)
 | 
					eek_element_get_name (EekElement  *element)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL);
 | 
					    g_return_val_if_fail (EEK_IS_ELEMENT(element), NULL);
 | 
				
			||||||
    return element->priv->name;
 | 
					
 | 
				
			||||||
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->name;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -332,7 +336,10 @@ eek_element_set_bounds (EekElement  *element,
 | 
				
			|||||||
                        EekBounds   *bounds)
 | 
					                        EekBounds   *bounds)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
					    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
				
			||||||
    memcpy (&element->priv->bounds, bounds, sizeof(EekBounds));
 | 
					
 | 
				
			||||||
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy (&priv->bounds, bounds, sizeof(EekBounds));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -350,7 +357,10 @@ eek_element_get_bounds (EekElement  *element,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
					    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
				
			||||||
    g_return_if_fail (bounds != NULL);
 | 
					    g_return_if_fail (bounds != NULL);
 | 
				
			||||||
    memcpy (bounds, &element->priv->bounds, sizeof(EekBounds));
 | 
					
 | 
				
			||||||
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy (bounds, &priv->bounds, sizeof(EekBounds));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -486,11 +496,14 @@ eek_element_set_group (EekElement *element,
 | 
				
			|||||||
                       gint        group)
 | 
					                       gint        group)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
					    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
				
			||||||
    if (element->priv->group != group) {
 | 
					
 | 
				
			||||||
        element->priv->group = group;
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->group != group) {
 | 
				
			||||||
 | 
					        priv->group = group;
 | 
				
			||||||
        g_object_notify (G_OBJECT(element), "group");
 | 
					        g_object_notify (G_OBJECT(element), "group");
 | 
				
			||||||
        g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0,
 | 
					        g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0,
 | 
				
			||||||
                       group, element->priv->level);
 | 
					                       group, priv->level);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -509,11 +522,14 @@ eek_element_set_level (EekElement *element,
 | 
				
			|||||||
                       gint        level)
 | 
					                       gint        level)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
					    g_return_if_fail (EEK_IS_ELEMENT(element));
 | 
				
			||||||
    if (element->priv->level != level) {
 | 
					
 | 
				
			||||||
        element->priv->level = level;
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->level != level) {
 | 
				
			||||||
 | 
					        priv->level = level;
 | 
				
			||||||
        g_object_notify (G_OBJECT(element), "level");
 | 
					        g_object_notify (G_OBJECT(element), "level");
 | 
				
			||||||
        g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0,
 | 
					        g_signal_emit (element, signals[SYMBOL_INDEX_CHANGED], 0,
 | 
				
			||||||
                       element->priv->group, level);
 | 
					                       priv->group, level);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -530,7 +546,10 @@ gint
 | 
				
			|||||||
eek_element_get_group (EekElement *element)
 | 
					eek_element_get_group (EekElement *element)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_ELEMENT(element), -1);
 | 
					    g_return_val_if_fail (EEK_IS_ELEMENT(element), -1);
 | 
				
			||||||
    return element->priv->group;
 | 
					
 | 
				
			||||||
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->group;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -546,5 +565,8 @@ gint
 | 
				
			|||||||
eek_element_get_level (EekElement *element)
 | 
					eek_element_get_level (EekElement *element)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_ELEMENT(element), -1);
 | 
					    g_return_val_if_fail (EEK_IS_ELEMENT(element), -1);
 | 
				
			||||||
    return element->priv->level;
 | 
					
 | 
				
			||||||
 | 
					    EekElementPrivate *priv = eek_element_get_instance_private (element);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->level;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -30,22 +30,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
#define EEK_TYPE_ELEMENT (eek_element_get_type())
 | 
					#define EEK_TYPE_ELEMENT (eek_element_get_type())
 | 
				
			||||||
#define EEK_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_ELEMENT, EekElement))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekElement, eek_element, EEK, ELEMENT, GObject)
 | 
				
			||||||
#define EEK_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_ELEMENT, EekElementClass))
 | 
					 | 
				
			||||||
#define EEK_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_ELEMENT))
 | 
					 | 
				
			||||||
#define EEK_IS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_ELEMENT))
 | 
					 | 
				
			||||||
#define EEK_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_ELEMENT, EekElementClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekElementClass   EekElementClass;
 | 
					 | 
				
			||||||
typedef struct _EekElementPrivate EekElementPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekElement
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    GObject parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekElementPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekElementClass
 | 
					struct _EekElementClass
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -31,6 +31,7 @@
 | 
				
			|||||||
#include <canberra-gtk.h>
 | 
					#include <canberra-gtk.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <math.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eek-gtk-keyboard.h"
 | 
					#include "eek-gtk-keyboard.h"
 | 
				
			||||||
@ -46,18 +47,13 @@ enum {
 | 
				
			|||||||
    PROP_LAST
 | 
					    PROP_LAST
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEK_GTK_KEYBOARD_GET_PRIVATE(obj)                                  \
 | 
					 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_GTK_KEYBOARD, EekGtkKeyboardPrivate))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* since 2.91.5 GDK_DRAWABLE was removed and gdk_cairo_create takes
 | 
					/* since 2.91.5 GDK_DRAWABLE was removed and gdk_cairo_create takes
 | 
				
			||||||
   GdkWindow as the argument */
 | 
					   GdkWindow as the argument */
 | 
				
			||||||
#ifndef GDK_DRAWABLE
 | 
					#ifndef GDK_DRAWABLE
 | 
				
			||||||
#define GDK_DRAWABLE(x) (x)
 | 
					#define GDK_DRAWABLE(x) (x)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekGtkKeyboardPrivate
 | 
					typedef struct _EekGtkKeyboardPrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRenderer *renderer;
 | 
					    EekRenderer *renderer;
 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
@ -65,7 +61,11 @@ struct _EekGtkKeyboardPrivate
 | 
				
			|||||||
    gulong key_unlocked_handler;
 | 
					    gulong key_unlocked_handler;
 | 
				
			||||||
    gulong symbol_index_changed_handler;
 | 
					    gulong symbol_index_changed_handler;
 | 
				
			||||||
    EekTheme *theme;
 | 
					    EekTheme *theme;
 | 
				
			||||||
};
 | 
					
 | 
				
			||||||
 | 
					    GdkEventSequence *sequence; // unowned reference
 | 
				
			||||||
 | 
					} EekGtkKeyboardPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekGtkKeyboard, eek_gtk_keyboard, GTK_TYPE_DRAWING_AREA)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void       on_key_pressed          (EekKey      *key,
 | 
					static void       on_key_pressed          (EekKey      *key,
 | 
				
			||||||
                                           EekGtkKeyboard *self);
 | 
					                                           EekGtkKeyboard *self);
 | 
				
			||||||
@ -106,7 +106,8 @@ static gboolean
 | 
				
			|||||||
eek_gtk_keyboard_real_draw (GtkWidget *self,
 | 
					eek_gtk_keyboard_real_draw (GtkWidget *self,
 | 
				
			||||||
                            cairo_t   *cr)
 | 
					                            cairo_t   *cr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv =
 | 
				
			||||||
 | 
						    eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
 | 
				
			||||||
    GtkAllocation allocation;
 | 
					    GtkAllocation allocation;
 | 
				
			||||||
    GList *list, *head;
 | 
					    GList *list, *head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -148,7 +149,8 @@ static void
 | 
				
			|||||||
eek_gtk_keyboard_real_size_allocate (GtkWidget     *self,
 | 
					eek_gtk_keyboard_real_size_allocate (GtkWidget     *self,
 | 
				
			||||||
                                     GtkAllocation *allocation)
 | 
					                                     GtkAllocation *allocation)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv =
 | 
				
			||||||
 | 
						    eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->renderer)
 | 
					    if (priv->renderer)
 | 
				
			||||||
        eek_renderer_set_allocation_size (priv->renderer,
 | 
					        eek_renderer_set_allocation_size (priv->renderer,
 | 
				
			||||||
@ -161,7 +163,7 @@ eek_gtk_keyboard_real_size_allocate (GtkWidget     *self,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void depress(EekGtkKeyboard *self,
 | 
					static void depress(EekGtkKeyboard *self,
 | 
				
			||||||
                    gdouble x, gdouble y, guint32 time) {
 | 
					                    gdouble x, gdouble y, guint32 time) {
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
    EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y);
 | 
					    EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y);
 | 
				
			||||||
    if (key) {
 | 
					    if (key) {
 | 
				
			||||||
        eek_keyboard_press_key(priv->keyboard, key, time);
 | 
					        eek_keyboard_press_key(priv->keyboard, key, time);
 | 
				
			||||||
@ -171,7 +173,7 @@ static void depress(EekGtkKeyboard *self,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void drag(EekGtkKeyboard *self,
 | 
					static void drag(EekGtkKeyboard *self,
 | 
				
			||||||
                 gdouble x, gdouble y, guint32 time) {
 | 
					                 gdouble x, gdouble y, guint32 time) {
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
    EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y);
 | 
					    EekKey *key = eek_renderer_find_key_by_position (priv->renderer, x, y);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (key) {
 | 
					    if (key) {
 | 
				
			||||||
@ -197,7 +199,7 @@ static void drag(EekGtkKeyboard *self,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void release(EekGtkKeyboard *self, guint32 time) {
 | 
					static void release(EekGtkKeyboard *self, guint32 time) {
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GList *list = eek_keyboard_get_pressed_keys (priv->keyboard);
 | 
					    GList *list = eek_keyboard_get_pressed_keys (priv->keyboard);
 | 
				
			||||||
    for (GList *head = list; head; head = g_list_next (head)) {
 | 
					    for (GList *head = list; head; head = g_list_next (head)) {
 | 
				
			||||||
@ -242,20 +244,23 @@ eek_gtk_keyboard_real_motion_notify_event (GtkWidget      *self,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// Only one touch stream at a time allowed. Others will be completely ignored.
 | 
					// Only one touch stream at a time allowed. Others will be completely ignored.
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
handle_touch_event (GtkWidget      *widget,
 | 
					handle_touch_event (GtkWidget     *widget,
 | 
				
			||||||
                    GdkEventTouch *event) {
 | 
					                    GdkEventTouch *event)
 | 
				
			||||||
    EekGtkKeyboard *self = EEK_GTK_KEYBOARD(widget);
 | 
					{
 | 
				
			||||||
 | 
					    EekGtkKeyboard        *self = EEK_GTK_KEYBOARD (widget);
 | 
				
			||||||
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (event->type == GDK_TOUCH_BEGIN) {
 | 
					    if (event->type == GDK_TOUCH_BEGIN) {
 | 
				
			||||||
        if (self->sequence) {
 | 
					        if (priv->sequence) {
 | 
				
			||||||
            // Ignore second and following touch points
 | 
					            // Ignore second and following touch points
 | 
				
			||||||
            return FALSE;
 | 
					            return FALSE;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        self->sequence = event->sequence;
 | 
					        priv->sequence = event->sequence;
 | 
				
			||||||
        depress(self, event->x, event->y, event->time);
 | 
					        depress(self, event->x, event->y, event->time);
 | 
				
			||||||
        return TRUE;
 | 
					        return TRUE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (self->sequence != event->sequence) {
 | 
					    if (priv->sequence != event->sequence) {
 | 
				
			||||||
        return FALSE;
 | 
					        return FALSE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -265,16 +270,16 @@ handle_touch_event (GtkWidget      *widget,
 | 
				
			|||||||
    if (event->type == GDK_TOUCH_END || event->type == GDK_TOUCH_CANCEL) {
 | 
					    if (event->type == GDK_TOUCH_END || event->type == GDK_TOUCH_CANCEL) {
 | 
				
			||||||
        // TODO: can the event have different coords than the previous update event?
 | 
					        // TODO: can the event have different coords than the previous update event?
 | 
				
			||||||
        release(self, event->time);
 | 
					        release(self, event->time);
 | 
				
			||||||
        self->sequence = NULL;
 | 
					        priv->sequence = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_gtk_keyboard_real_unmap (GtkWidget *self)
 | 
					eek_gtk_keyboard_real_unmap (GtkWidget *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv =
 | 
				
			||||||
 | 
						    eek_gtk_keyboard_get_instance_private (EEK_GTK_KEYBOARD (self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->keyboard) {
 | 
					    if (priv->keyboard) {
 | 
				
			||||||
        GList *list, *head;
 | 
					        GList *list, *head;
 | 
				
			||||||
@ -301,7 +306,9 @@ eek_gtk_keyboard_real_query_tooltip (GtkWidget  *widget,
 | 
				
			|||||||
                                     gboolean    keyboard_tooltip,
 | 
					                                     gboolean    keyboard_tooltip,
 | 
				
			||||||
                                     GtkTooltip *tooltip)
 | 
					                                     GtkTooltip *tooltip)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
					    EekGtkKeyboard        *self = EEK_GTK_KEYBOARD (widget);
 | 
				
			||||||
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EekKey *key;
 | 
					    EekKey *key;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    key = eek_renderer_find_key_by_position (priv->renderer,
 | 
					    key = eek_renderer_find_key_by_position (priv->renderer,
 | 
				
			||||||
@ -322,7 +329,7 @@ static void
 | 
				
			|||||||
eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
 | 
					eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
 | 
				
			||||||
                               EekKeyboard    *keyboard)
 | 
					                               EekKeyboard    *keyboard)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
    priv->keyboard = g_object_ref (keyboard);
 | 
					    priv->keyboard = g_object_ref (keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv->key_locked_handler =
 | 
					    priv->key_locked_handler =
 | 
				
			||||||
@ -358,7 +365,8 @@ eek_gtk_keyboard_set_property (GObject      *object,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_gtk_keyboard_dispose (GObject *object)
 | 
					eek_gtk_keyboard_dispose (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(object);
 | 
					    EekGtkKeyboard        *self = EEK_GTK_KEYBOARD (object);
 | 
				
			||||||
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->renderer) {
 | 
					    if (priv->renderer) {
 | 
				
			||||||
        g_object_unref (priv->renderer);
 | 
					        g_object_unref (priv->renderer);
 | 
				
			||||||
@ -407,9 +415,6 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
 | 
				
			|||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec *pspec;
 | 
					    GParamSpec *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekGtkKeyboardPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    widget_class->realize = eek_gtk_keyboard_real_realize;
 | 
					    widget_class->realize = eek_gtk_keyboard_real_realize;
 | 
				
			||||||
    widget_class->unmap = eek_gtk_keyboard_real_unmap;
 | 
					    widget_class->unmap = eek_gtk_keyboard_real_unmap;
 | 
				
			||||||
    widget_class->draw = eek_gtk_keyboard_real_draw;
 | 
					    widget_class->draw = eek_gtk_keyboard_real_draw;
 | 
				
			||||||
@ -440,7 +445,7 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_gtk_keyboard_init (EekGtkKeyboard *self)
 | 
					eek_gtk_keyboard_init (EekGtkKeyboard *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    /* void */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -479,23 +484,67 @@ magnify_bounds (GtkWidget *self,
 | 
				
			|||||||
    large_bounds->y = CLAMP(y, 0, allocation.height - large_bounds->height);
 | 
					    large_bounds->y = CLAMP(y, 0, allocation.height - large_bounds->height);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Alleviate the asymmetry between drawing a pressed key and a released key,
 | 
				
			||||||
 | 
					 * and consistently draw to the exact same area.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * By saving the dirty rectangle we can limit drawing of the backbuffer to
 | 
				
			||||||
 | 
					 * the screen as well, eg gdk_window_invalidate_rect() instead of
 | 
				
			||||||
 | 
					 * gtk_widget_queue_draw() which redraws the entire widget.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * b1 is mandatory, b2 is optional
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static GdkRectangle
 | 
				
			||||||
 | 
					clip_bounds_to_dirty_rectangle (cairo_t *cr, EekBounds *b1, EekBounds *b2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (b2)
 | 
				
			||||||
 | 
					        cairo_rectangle (cr, b2->x, b2->y, b2->width, b2->height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cairo_rectangle (cr, b1->x, b1->y, b1->width, b1->height);
 | 
				
			||||||
 | 
					    cairo_clip (cr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					     * save the clipped region to a bounding box so we can limit
 | 
				
			||||||
 | 
					     * the drawing of the backbuffer to the screen to the same area
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    cairo_rectangle_t bbox;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cairo_clip_extents (cr, &bbox.x, &bbox.y, &bbox.width, &bbox.height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* convert double to int, making sure r strictly covers bbox to avoid
 | 
				
			||||||
 | 
					     * artefacts. floor() is unnecessary, ceil() is not */
 | 
				
			||||||
 | 
					    GdkRectangle r = {
 | 
				
			||||||
 | 
					        floor (bbox.x),
 | 
				
			||||||
 | 
					        floor (bbox.y),
 | 
				
			||||||
 | 
					        ceil  (bbox.width),
 | 
				
			||||||
 | 
					        ceil  (bbox.height)
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
render_pressed_key (GtkWidget *widget,
 | 
					render_pressed_key (GtkWidget *widget,
 | 
				
			||||||
                    EekKey    *key)
 | 
					                    EekKey    *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
					    EekGtkKeyboard        *self = EEK_GTK_KEYBOARD (widget);
 | 
				
			||||||
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
    EekBounds bounds, large_bounds;
 | 
					    EekBounds bounds, large_bounds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GdkWindow         *window  = gtk_widget_get_window (widget);
 | 
				
			||||||
 | 
					    cairo_region_t    *region  = gdk_window_get_clip_region (window);
 | 
				
			||||||
 | 
					    GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
 | 
				
			||||||
 | 
					    cairo_t           *cr      = gdk_drawing_context_get_cairo_context (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
 | 
					    eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
 | 
				
			||||||
    magnify_bounds (widget, &bounds, &large_bounds, 1.5);
 | 
					    magnify_bounds (widget, &bounds, &large_bounds, 1.5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GdkWindow *window = GDK_DRAWABLE (gtk_widget_get_window (widget));
 | 
					    /*
 | 
				
			||||||
    cairo_region_t *region = gdk_window_get_clip_region (window);
 | 
					     * clip to limit drawing to backbuffer and save clip region to dirty_rect
 | 
				
			||||||
 | 
					     * to limit redrawing of the backbuffer to the same area
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    GdkRectangle dirty_rect = clip_bounds_to_dirty_rectangle (cr, &bounds, &large_bounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GdkDrawingContext *context = gdk_window_begin_draw_frame(
 | 
					 | 
				
			||||||
        window, region
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
    cairo_t *cr = gdk_drawing_context_get_cairo_context(context);
 | 
					 | 
				
			||||||
    cairo_save (cr);
 | 
					    cairo_save (cr);
 | 
				
			||||||
    cairo_translate (cr, bounds.x, bounds.y);
 | 
					    cairo_translate (cr, bounds.x, bounds.y);
 | 
				
			||||||
    eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
 | 
					    eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
 | 
				
			||||||
@ -506,60 +555,83 @@ render_pressed_key (GtkWidget *widget,
 | 
				
			|||||||
    eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE);
 | 
					    eek_renderer_render_key (priv->renderer, cr, key, 1.5, TRUE);
 | 
				
			||||||
    cairo_restore (cr);
 | 
					    cairo_restore (cr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gdk_window_end_draw_frame(window, context);
 | 
					    gdk_window_end_draw_frame (window, context);
 | 
				
			||||||
    cairo_region_destroy(region);
 | 
					
 | 
				
			||||||
 | 
					    cairo_region_destroy (region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* force immediate drawing of the backbuffer to the screen */
 | 
				
			||||||
 | 
					    gdk_window_invalidate_rect (window, &dirty_rect, FALSE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
render_locked_key (GtkWidget *widget,
 | 
					render_locked_key (GtkWidget *widget,
 | 
				
			||||||
                   EekKey    *key)
 | 
					                   EekKey    *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
					    EekGtkKeyboard        *self = EEK_GTK_KEYBOARD (widget);
 | 
				
			||||||
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    cairo_t *cr;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget)));
 | 
					    GdkWindow         *window  = gtk_widget_get_window (widget);
 | 
				
			||||||
 | 
					    cairo_region_t    *region  = gdk_window_get_clip_region (window);
 | 
				
			||||||
 | 
					    GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
 | 
				
			||||||
 | 
					    cairo_t           *cr      = gdk_drawing_context_get_cairo_context (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
 | 
					    eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /*
 | 
				
			||||||
 | 
					     * clip to limit drawing to backbuffer and save clip region to dirty_rect
 | 
				
			||||||
 | 
					     * to limit redrawing of the backbuffer to the same area
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    GdkRectangle dirty_rect = clip_bounds_to_dirty_rectangle (cr, &bounds, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cairo_translate (cr, bounds.x, bounds.y);
 | 
					    cairo_translate (cr, bounds.x, bounds.y);
 | 
				
			||||||
    eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
 | 
					    eek_renderer_render_key (priv->renderer, cr, key, 1.0, TRUE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cairo_destroy (cr);
 | 
					    gdk_window_end_draw_frame (window, context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cairo_region_destroy (region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* force immediate drawing of the backbuffer to the screen */
 | 
				
			||||||
 | 
					    gdk_window_invalidate_rect (window, &dirty_rect, FALSE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
render_released_key (GtkWidget *widget,
 | 
					render_released_key (GtkWidget *widget,
 | 
				
			||||||
                     EekKey    *key)
 | 
					                     EekKey    *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
					    EekGtkKeyboard        *self = EEK_GTK_KEYBOARD (widget);
 | 
				
			||||||
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
    EekBounds bounds, large_bounds;
 | 
					    EekBounds bounds, large_bounds;
 | 
				
			||||||
    cairo_t *cr;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cr = gdk_cairo_create (GDK_DRAWABLE (gtk_widget_get_window (widget)));
 | 
					    GdkWindow         *window  = gtk_widget_get_window (widget);
 | 
				
			||||||
 | 
					    cairo_region_t    *region  = gdk_window_get_clip_region (window);
 | 
				
			||||||
 | 
					    GdkDrawingContext *context = gdk_window_begin_draw_frame (window, region);
 | 
				
			||||||
 | 
					    cairo_t           *cr      = gdk_drawing_context_get_cairo_context (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
 | 
					    eek_renderer_get_key_bounds (priv->renderer, key, &bounds, TRUE);
 | 
				
			||||||
    magnify_bounds (widget, &bounds, &large_bounds, 2.0);
 | 
					    magnify_bounds (widget, &bounds, &large_bounds, 1.5);
 | 
				
			||||||
    cairo_rectangle (cr,
 | 
					
 | 
				
			||||||
                     large_bounds.x,
 | 
					    /*
 | 
				
			||||||
                     large_bounds.y,
 | 
					     * clip to limit drawing to backbuffer and save clip region to dirty_rect
 | 
				
			||||||
                     large_bounds.width,
 | 
					     * to limit redrawing of the backbuffer to the same area
 | 
				
			||||||
                     large_bounds.height);
 | 
					     */
 | 
				
			||||||
    cairo_rectangle (cr,
 | 
					    GdkRectangle dirty_rect = clip_bounds_to_dirty_rectangle(cr, &bounds, &large_bounds);
 | 
				
			||||||
                     bounds.x,
 | 
					 | 
				
			||||||
                     bounds.y,
 | 
					 | 
				
			||||||
                     bounds.width,
 | 
					 | 
				
			||||||
                     bounds.height);
 | 
					 | 
				
			||||||
    cairo_clip (cr);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_renderer_render_keyboard (priv->renderer, cr);
 | 
					    eek_renderer_render_keyboard (priv->renderer, cr);
 | 
				
			||||||
    cairo_destroy (cr);
 | 
					
 | 
				
			||||||
 | 
					    gdk_window_end_draw_frame (window, context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    cairo_region_destroy (region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* force immediate drawing of the backbuffer to the screen */
 | 
				
			||||||
 | 
					    gdk_window_invalidate_rect (window, &dirty_rect, FALSE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_key_pressed (EekKey      *key,
 | 
					on_key_pressed (EekKey      *key,
 | 
				
			||||||
                EekGtkKeyboard *self)
 | 
					                EekGtkKeyboard *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* renderer may have not been set yet if the widget is a popup */
 | 
					    /* renderer may have not been set yet if the widget is a popup */
 | 
				
			||||||
    if (!priv->renderer)
 | 
					    if (!priv->renderer)
 | 
				
			||||||
@ -580,7 +652,7 @@ static void
 | 
				
			|||||||
on_key_released (EekKey      *key,
 | 
					on_key_released (EekKey      *key,
 | 
				
			||||||
                 EekGtkKeyboard *self)
 | 
					                 EekGtkKeyboard *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* renderer may have not been set yet if the widget is a popup */
 | 
					    /* renderer may have not been set yet if the widget is a popup */
 | 
				
			||||||
    if (!priv->renderer)
 | 
					    if (!priv->renderer)
 | 
				
			||||||
@ -603,7 +675,7 @@ on_key_locked (EekKeyboard *keyboard,
 | 
				
			|||||||
               gpointer     user_data)
 | 
					               gpointer     user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GtkWidget *widget = user_data;
 | 
					    GtkWidget *widget = user_data;
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (user_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* renderer may have not been set yet if the widget is a popup */
 | 
					    /* renderer may have not been set yet if the widget is a popup */
 | 
				
			||||||
    if (!priv->renderer)
 | 
					    if (!priv->renderer)
 | 
				
			||||||
@ -618,7 +690,7 @@ on_key_unlocked (EekKeyboard *keyboard,
 | 
				
			|||||||
                 gpointer     user_data)
 | 
					                 gpointer     user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GtkWidget *widget = user_data;
 | 
					    GtkWidget *widget = user_data;
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(widget);
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (user_data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* renderer may have not been set yet if the widget is a popup */
 | 
					    /* renderer may have not been set yet if the widget is a popup */
 | 
				
			||||||
    if (!priv->renderer)
 | 
					    if (!priv->renderer)
 | 
				
			||||||
@ -642,11 +714,9 @@ void
 | 
				
			|||||||
eek_gtk_keyboard_set_theme (EekGtkKeyboard *keyboard,
 | 
					eek_gtk_keyboard_set_theme (EekGtkKeyboard *keyboard,
 | 
				
			||||||
                            EekTheme       *theme)
 | 
					                            EekTheme       *theme)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_GTK_KEYBOARD(keyboard));
 | 
					    g_return_if_fail (EEK_IS_GTK_KEYBOARD(keyboard));
 | 
				
			||||||
    g_return_if_fail (EEK_IS_THEME(theme));
 | 
					    g_return_if_fail (EEK_IS_THEME(theme));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
 | 
					    EekGtkKeyboardPrivate *priv = eek_gtk_keyboard_get_instance_private (keyboard);
 | 
				
			||||||
    priv->theme = g_object_ref (theme);
 | 
					    priv->theme = g_object_ref (theme);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -32,25 +32,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
#define EEK_TYPE_GTK_KEYBOARD (eek_gtk_keyboard_get_type())
 | 
					#define EEK_TYPE_GTK_KEYBOARD (eek_gtk_keyboard_get_type())
 | 
				
			||||||
#define EEK_GTK_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_GTK_KEYBOARD, EekGtkKeyboard))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekGtkKeyboard, eek_gtk_keyboard, EEK, GTK_KEYBOARD, GtkDrawingArea)
 | 
				
			||||||
#define EEK_GTK_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_GTK_KEYBOARD, EekGtkKeyboardClass))
 | 
					 | 
				
			||||||
#define EEK_IS_GTK_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_GTK_KEYBOARD))
 | 
					 | 
				
			||||||
#define EEK_IS_GTK_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_GTK_KEYBOARD))
 | 
					 | 
				
			||||||
#define EEK_GTK_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_GTK_KEYBOARD, EekGtkKeyboardClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekGtkKeyboard EekGtkKeyboard;
 | 
					 | 
				
			||||||
typedef struct _EekGtkKeyboardClass EekGtkKeyboardClass;
 | 
					 | 
				
			||||||
typedef struct _EekGtkKeyboardPrivate EekGtkKeyboardPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekGtkKeyboard
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    GtkDrawingArea parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    GdkEventSequence *sequence; // unowned reference
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekGtkKeyboardPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekGtkKeyboardClass
 | 
					struct _EekGtkKeyboardClass
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -54,13 +54,7 @@ enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static guint signals[LAST_SIGNAL] = { 0, };
 | 
					static guint signals[LAST_SIGNAL] = { 0, };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE (EekKey, eek_key, EEK_TYPE_ELEMENT);
 | 
					typedef struct _EekKeyPrivate
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEK_KEY_GET_PRIVATE(obj)                                  \
 | 
					 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEY, EekKeyPrivate))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekKeyPrivate
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    guint keycode;
 | 
					    guint keycode;
 | 
				
			||||||
    EekSymbolMatrix *symbol_matrix;
 | 
					    EekSymbolMatrix *symbol_matrix;
 | 
				
			||||||
@ -69,12 +63,14 @@ struct _EekKeyPrivate
 | 
				
			|||||||
    gulong oref; // UI outline reference
 | 
					    gulong oref; // UI outline reference
 | 
				
			||||||
    gboolean is_pressed;
 | 
					    gboolean is_pressed;
 | 
				
			||||||
    gboolean is_locked;
 | 
					    gboolean is_locked;
 | 
				
			||||||
};
 | 
					} EekKeyPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekKey, eek_key, EEK_TYPE_ELEMENT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_key_real_locked (EekKey *self)
 | 
					eek_key_real_locked (EekKey *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv->is_locked = TRUE;
 | 
					    priv->is_locked = TRUE;
 | 
				
			||||||
#if DEBUG
 | 
					#if DEBUG
 | 
				
			||||||
@ -85,7 +81,7 @@ eek_key_real_locked (EekKey *self)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_key_real_unlocked (EekKey *self)
 | 
					eek_key_real_unlocked (EekKey *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(self);
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv->is_locked = FALSE;
 | 
					    priv->is_locked = FALSE;
 | 
				
			||||||
#if DEBUG
 | 
					#if DEBUG
 | 
				
			||||||
@ -96,8 +92,11 @@ eek_key_real_unlocked (EekKey *self)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_key_finalize (GObject *object)
 | 
					eek_key_finalize (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(object);
 | 
					    EekKey        *self = EEK_KEY (object);
 | 
				
			||||||
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_symbol_matrix_free (priv->symbol_matrix);
 | 
					    eek_symbol_matrix_free (priv->symbol_matrix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    G_OBJECT_CLASS (eek_key_parent_class)->finalize (object);
 | 
					    G_OBJECT_CLASS (eek_key_parent_class)->finalize (object);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -174,9 +173,6 @@ eek_key_class_init (EekKeyClass *klass)
 | 
				
			|||||||
    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec        *pspec;
 | 
					    GParamSpec        *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekKeyPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gobject_class->set_property = eek_key_set_property;
 | 
					    gobject_class->set_property = eek_key_set_property;
 | 
				
			||||||
    gobject_class->get_property = eek_key_get_property;
 | 
					    gobject_class->get_property = eek_key_get_property;
 | 
				
			||||||
    gobject_class->finalize     = eek_key_finalize;
 | 
					    gobject_class->finalize     = eek_key_finalize;
 | 
				
			||||||
@ -285,9 +281,7 @@ eek_key_class_init (EekKeyClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_key_init (EekKey *self)
 | 
					eek_key_init (EekKey *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKeyPrivate *priv;
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (self);
 | 
				
			||||||
 | 
					 | 
				
			||||||
    priv = self->priv = EEK_KEY_GET_PRIVATE(self);
 | 
					 | 
				
			||||||
    priv->symbol_matrix = eek_symbol_matrix_new (0, 0);
 | 
					    priv->symbol_matrix = eek_symbol_matrix_new (0, 0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -307,7 +301,10 @@ eek_key_set_keycode (EekKey *key,
 | 
				
			|||||||
                     guint   keycode)
 | 
					                     guint   keycode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_KEY (key));
 | 
					    g_return_if_fail (EEK_IS_KEY (key));
 | 
				
			||||||
    key->priv->keycode = keycode;
 | 
					
 | 
				
			||||||
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->keycode = keycode;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -321,7 +318,10 @@ guint
 | 
				
			|||||||
eek_key_get_keycode (EekKey *key)
 | 
					eek_key_get_keycode (EekKey *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_KEY (key), EEK_INVALID_KEYCODE);
 | 
					    g_return_val_if_fail (EEK_IS_KEY (key), EEK_INVALID_KEYCODE);
 | 
				
			||||||
    return key->priv->keycode;
 | 
					
 | 
				
			||||||
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->keycode;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -337,8 +337,10 @@ eek_key_set_symbol_matrix (EekKey          *key,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_KEY(key));
 | 
					    g_return_if_fail (EEK_IS_KEY(key));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_symbol_matrix_free (key->priv->symbol_matrix);
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
    key->priv->symbol_matrix = eek_symbol_matrix_copy (matrix);
 | 
					
 | 
				
			||||||
 | 
					    eek_symbol_matrix_free (priv->symbol_matrix);
 | 
				
			||||||
 | 
					    priv->symbol_matrix = eek_symbol_matrix_copy (matrix);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -352,7 +354,10 @@ EekSymbolMatrix *
 | 
				
			|||||||
eek_key_get_symbol_matrix (EekKey *key)
 | 
					eek_key_get_symbol_matrix (EekKey *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_KEY(key), NULL);
 | 
					    g_return_val_if_fail (EEK_IS_KEY(key), NULL);
 | 
				
			||||||
    return key->priv->symbol_matrix;
 | 
					
 | 
				
			||||||
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->symbol_matrix;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -440,7 +445,7 @@ eek_key_get_symbol_at_index (EekKey *key,
 | 
				
			|||||||
                             gint    fallback_group,
 | 
					                             gint    fallback_group,
 | 
				
			||||||
                             gint    fallback_level)
 | 
					                             gint    fallback_level)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKeyPrivate *priv = EEK_KEY_GET_PRIVATE(key);
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
    gint num_symbols;
 | 
					    gint num_symbols;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_val_if_fail (fallback_group >= 0, NULL);
 | 
					    g_return_val_if_fail (fallback_group >= 0, NULL);
 | 
				
			||||||
@ -492,12 +497,14 @@ eek_key_set_index (EekKey *key,
 | 
				
			|||||||
    g_return_if_fail (0 <= column);
 | 
					    g_return_if_fail (0 <= column);
 | 
				
			||||||
    g_return_if_fail (0 <= row);
 | 
					    g_return_if_fail (0 <= row);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (key->priv->column != column) {
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
        key->priv->column = column;
 | 
					
 | 
				
			||||||
 | 
					    if (priv->column != column) {
 | 
				
			||||||
 | 
					        priv->column = column;
 | 
				
			||||||
        g_object_notify (G_OBJECT(key), "column");
 | 
					        g_object_notify (G_OBJECT(key), "column");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (key->priv->row != row) {
 | 
					    if (priv->row != row) {
 | 
				
			||||||
        key->priv->row = row;
 | 
					        priv->row = row;
 | 
				
			||||||
        g_object_notify (G_OBJECT(key), "row");
 | 
					        g_object_notify (G_OBJECT(key), "row");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -518,10 +525,12 @@ eek_key_get_index (EekKey *key,
 | 
				
			|||||||
    g_return_if_fail (EEK_IS_KEY(key));
 | 
					    g_return_if_fail (EEK_IS_KEY(key));
 | 
				
			||||||
    g_return_if_fail (column != NULL || row != NULL);
 | 
					    g_return_if_fail (column != NULL || row != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (column != NULL)
 | 
					    if (column != NULL)
 | 
				
			||||||
        *column = key->priv->column;
 | 
					        *column = priv->column;
 | 
				
			||||||
    if (row != NULL)
 | 
					    if (row != NULL)
 | 
				
			||||||
        *row = key->priv->row;
 | 
					        *row = priv->row;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -536,8 +545,11 @@ eek_key_set_oref (EekKey *key,
 | 
				
			|||||||
                  guint   oref)
 | 
					                  guint   oref)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_KEY(key));
 | 
					    g_return_if_fail (EEK_IS_KEY(key));
 | 
				
			||||||
    if (key->priv->oref != oref) {
 | 
					
 | 
				
			||||||
        key->priv->oref = oref;
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->oref != oref) {
 | 
				
			||||||
 | 
					        priv->oref = oref;
 | 
				
			||||||
        g_object_notify (G_OBJECT(key), "oref");
 | 
					        g_object_notify (G_OBJECT(key), "oref");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -553,7 +565,10 @@ guint
 | 
				
			|||||||
eek_key_get_oref (EekKey *key)
 | 
					eek_key_get_oref (EekKey *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_KEY (key), 0);
 | 
					    g_return_val_if_fail (EEK_IS_KEY (key), 0);
 | 
				
			||||||
    return key->priv->oref;
 | 
					
 | 
				
			||||||
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->oref;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -566,7 +581,10 @@ gboolean
 | 
				
			|||||||
eek_key_is_pressed (EekKey *key)
 | 
					eek_key_is_pressed (EekKey *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_KEY(key), FALSE);
 | 
					    g_return_val_if_fail (EEK_IS_KEY(key), FALSE);
 | 
				
			||||||
    return key->priv->is_pressed;
 | 
					
 | 
				
			||||||
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->is_pressed;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -579,11 +597,17 @@ gboolean
 | 
				
			|||||||
eek_key_is_locked (EekKey *key)
 | 
					eek_key_is_locked (EekKey *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_KEY(key), FALSE);
 | 
					    g_return_val_if_fail (EEK_IS_KEY(key), FALSE);
 | 
				
			||||||
    return key->priv->is_locked;
 | 
					
 | 
				
			||||||
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->is_locked;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void eek_key_set_pressed(EekKey *key, gboolean value)
 | 
					void eek_key_set_pressed(EekKey *key, gboolean value)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_KEY(key));
 | 
					    g_return_if_fail (EEK_IS_KEY(key));
 | 
				
			||||||
    key->priv->is_pressed = value;
 | 
					
 | 
				
			||||||
 | 
					    EekKeyPrivate *priv = eek_key_get_instance_private (key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->is_pressed = value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -31,31 +31,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_KEY (eek_key_get_type())
 | 
					#define EEK_TYPE_KEY (eek_key_get_type())
 | 
				
			||||||
#define EEK_KEY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_KEY, EekKey))
 | 
					G_DECLARE_DERIVABLE_TYPE(EekKey, eek_key, EEK, KEY, EekElement)
 | 
				
			||||||
#define EEK_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_KEY, EekKeyClass))
 | 
					 | 
				
			||||||
#define EEK_IS_KEY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_KEY))
 | 
					 | 
				
			||||||
#define EEK_IS_KEY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_KEY))
 | 
					 | 
				
			||||||
#define EEK_KEY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_KEY, EekKeyClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekKeyClass EekKeyClass;
 | 
					 | 
				
			||||||
typedef struct _EekKeyPrivate EekKeyPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * EekKey:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Contains information about the state of a key.
 | 
					 | 
				
			||||||
 * TODO: rewrite as a plain struct
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The #EekKey structure contains only private data and should only be
 | 
					 | 
				
			||||||
 * accessed using the provided API.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct _EekKey
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    EekElement parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekKeyPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * EekKeyClass:
 | 
					 * EekKeyClass:
 | 
				
			||||||
 | 
				
			|||||||
@ -55,8 +55,6 @@ enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static guint signals[LAST_SIGNAL] = { 0, };
 | 
					static guint signals[LAST_SIGNAL] = { 0, };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE (EekKeyboard, eek_keyboard, EEK_TYPE_CONTAINER);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEK_KEYBOARD_GET_PRIVATE(obj)                                  \
 | 
					#define EEK_KEYBOARD_GET_PRIVATE(obj)                                  \
 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEYBOARD, EekKeyboardPrivate))
 | 
					    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEYBOARD, EekKeyboardPrivate))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -75,6 +73,8 @@ struct _EekKeyboardPrivate
 | 
				
			|||||||
    EekModifierType alt_gr_mask;
 | 
					    EekModifierType alt_gr_mask;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekKeyboard, eek_keyboard, EEK_TYPE_CONTAINER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_BOXED_TYPE(EekModifierKey, eek_modifier_key,
 | 
					G_DEFINE_BOXED_TYPE(EekModifierKey, eek_modifier_key,
 | 
				
			||||||
                    eek_modifier_key_copy, eek_modifier_key_free);
 | 
					                    eek_modifier_key_copy, eek_modifier_key_free);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -390,9 +390,6 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
 | 
				
			|||||||
    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec        *pspec;
 | 
					    GParamSpec        *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekKeyboardPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    klass->create_section = eek_keyboard_real_create_section;
 | 
					    klass->create_section = eek_keyboard_real_create_section;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* signals */
 | 
					    /* signals */
 | 
				
			||||||
 | 
				
			|||||||
@ -50,9 +50,10 @@
 | 
				
			|||||||
#define EEK_KEYSYM_Hyper_L 0xffed
 | 
					#define EEK_KEYSYM_Hyper_L 0xffed
 | 
				
			||||||
#define EEK_KEYSYM_Hyper_R 0xffee
 | 
					#define EEK_KEYSYM_Hyper_R 0xffee
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekKeysymPrivate {
 | 
					typedef struct _EekKeysymPrivate
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    guint xkeysym;
 | 
					    guint xkeysym;
 | 
				
			||||||
};
 | 
					} EekKeysymPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekKeysymEntry {
 | 
					struct _EekKeysymEntry {
 | 
				
			||||||
    guint xkeysym;
 | 
					    guint xkeysym;
 | 
				
			||||||
@ -68,12 +69,11 @@ typedef struct _EekKeysymEntry EekKeysymEntry;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void eek_serializable_iface_init (EekSerializableIface *iface);
 | 
					static void eek_serializable_iface_init (EekSerializableIface *iface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE_WITH_CODE (EekKeysym, eek_keysym, EEK_TYPE_SYMBOL,
 | 
					G_DEFINE_TYPE_EXTENDED (EekKeysym, eek_keysym, EEK_TYPE_SYMBOL,
 | 
				
			||||||
                         G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
 | 
								0, /* GTypeFlags */
 | 
				
			||||||
                                                eek_serializable_iface_init));
 | 
								G_ADD_PRIVATE (EekKeysym)
 | 
				
			||||||
 | 
					                        G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
 | 
				
			||||||
#define EEK_KEYSYM_GET_PRIVATE(obj)                                  \
 | 
					                                               eek_serializable_iface_init))
 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_KEYSYM, EekKeysymPrivate))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static EekSerializableIface *eek_keysym_parent_serializable_iface;
 | 
					static EekSerializableIface *eek_keysym_parent_serializable_iface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -81,7 +81,8 @@ static void
 | 
				
			|||||||
eek_keysym_real_serialize (EekSerializable *self,
 | 
					eek_keysym_real_serialize (EekSerializable *self,
 | 
				
			||||||
                           GVariantBuilder *builder)
 | 
					                           GVariantBuilder *builder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKeysymPrivate *priv = EEK_KEYSYM_GET_PRIVATE(self);
 | 
					    EekKeysymPrivate *priv = eek_keysym_get_instance_private (
 | 
				
			||||||
 | 
							    EEK_KEYSYM(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_keysym_parent_serializable_iface->serialize (self, builder);
 | 
					    eek_keysym_parent_serializable_iface->serialize (self, builder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -93,7 +94,8 @@ eek_keysym_real_deserialize (EekSerializable *self,
 | 
				
			|||||||
                             GVariant        *variant,
 | 
					                             GVariant        *variant,
 | 
				
			||||||
                             gsize            index)
 | 
					                             gsize            index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKeysymPrivate *priv = EEK_KEYSYM_GET_PRIVATE(self);
 | 
					    EekKeysymPrivate *priv = eek_keysym_get_instance_private (
 | 
				
			||||||
 | 
							    EEK_KEYSYM(self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    index = eek_keysym_parent_serializable_iface->deserialize (self,
 | 
					    index = eek_keysym_parent_serializable_iface->deserialize (self,
 | 
				
			||||||
                                                               variant,
 | 
					                                                               variant,
 | 
				
			||||||
@ -200,15 +202,13 @@ get_modifier_mask (guint xkeysym)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_keysym_class_init (EekKeysymClass *klass)
 | 
					eek_keysym_class_init (EekKeysymClass *klass)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    /* void */
 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_type_class_add_private (gobject_class, sizeof (EekKeysymPrivate));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_keysym_init (EekKeysym *self)
 | 
					eek_keysym_init (EekKeysym *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEK_KEYSYM_GET_PRIVATE(self);
 | 
					    /* void */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -291,7 +291,7 @@ eek_keysym_new_with_modifier (guint           xkeysym,
 | 
				
			|||||||
        g_slice_free (EekKeysymEntry, unichar_entry);
 | 
					        g_slice_free (EekKeysymEntry, unichar_entry);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_KEYSYM_GET_PRIVATE(keysym);
 | 
					    priv = eek_keysym_get_instance_private (keysym);
 | 
				
			||||||
    priv->xkeysym = xkeysym;
 | 
					    priv->xkeysym = xkeysym;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return keysym;
 | 
					    return keysym;
 | 
				
			||||||
@ -345,6 +345,6 @@ eek_keysym_get_xkeysym (EekKeysym *keysym)
 | 
				
			|||||||
    EekKeysymPrivate *priv;
 | 
					    EekKeysymPrivate *priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_assert (EEK_IS_KEYSYM(keysym));
 | 
					    g_assert (EEK_IS_KEYSYM(keysym));
 | 
				
			||||||
    priv = EEK_KEYSYM_GET_PRIVATE(keysym);
 | 
					    priv = eek_keysym_get_instance_private (keysym);
 | 
				
			||||||
    return priv->xkeysym;
 | 
					    return priv->xkeysym;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -38,27 +38,7 @@ G_BEGIN_DECLS
 | 
				
			|||||||
#define EEK_INVALID_KEYSYM (0)
 | 
					#define EEK_INVALID_KEYSYM (0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_KEYSYM (eek_keysym_get_type())
 | 
					#define EEK_TYPE_KEYSYM (eek_keysym_get_type())
 | 
				
			||||||
#define EEK_KEYSYM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_KEYSYM, EekKeysym))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekKeysym, eek_keysym, EEK, KEYSYM, EekSymbol)
 | 
				
			||||||
#define EEK_KEYSYM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_KEYSYM, EekKeysymClass))
 | 
					 | 
				
			||||||
#define EEK_IS_KEYSYM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_KEYSYM))
 | 
					 | 
				
			||||||
#define EEK_IS_KEYSYM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_KEYSYM))
 | 
					 | 
				
			||||||
#define EEK_KEYSYM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_KEYSYM, EekKeysymClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekKeysymClass EekKeysymClass;
 | 
					 | 
				
			||||||
typedef struct _EekKeysymPrivate EekKeysymPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * EekKeysym:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The #EekKeysym structure contains only private data and should only
 | 
					 | 
				
			||||||
 * be accessed using the provided API.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct _EekKeysym {
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    EekSymbol parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekKeysymPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekKeysymClass {
 | 
					struct _EekKeysymClass {
 | 
				
			||||||
    /*< private >*/
 | 
					    /*< private >*/
 | 
				
			||||||
 | 
				
			|||||||
@ -34,7 +34,7 @@
 | 
				
			|||||||
#include "eek-keyboard.h"
 | 
					#include "eek-keyboard.h"
 | 
				
			||||||
#include "eekboard/eekboard-context-service.h"
 | 
					#include "eekboard/eekboard-context-service.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_ABSTRACT_TYPE (EekLayout, eek_layout, G_TYPE_OBJECT);
 | 
					G_DEFINE_ABSTRACT_TYPE (EekLayout, eek_layout, G_TYPE_OBJECT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_layout_class_init (EekLayoutClass *klass)
 | 
					eek_layout_class_init (EekLayoutClass *klass)
 | 
				
			||||||
 | 
				
			|||||||
@ -31,20 +31,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_LAYOUT (eek_layout_get_type())
 | 
					#define EEK_TYPE_LAYOUT (eek_layout_get_type())
 | 
				
			||||||
#define EEK_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_LAYOUT, EekLayout))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekLayout, eek_layout, EEK, LAYOUT, GObject)
 | 
				
			||||||
#define EEK_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_LAYOUT, EekLayoutClass))
 | 
					 | 
				
			||||||
#define EEK_IS_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_LAYOUT))
 | 
					 | 
				
			||||||
#define EEK_IS_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_LAYOUT))
 | 
					 | 
				
			||||||
#define EEK_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_LAYOUT, EekLayoutClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekLayoutClass EekLayoutClass;
 | 
					 | 
				
			||||||
typedef struct _EekLayout EekLayout;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekLayout
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    GObject parent;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * EekLayoutClass:
 | 
					 * EekLayoutClass:
 | 
				
			||||||
 | 
				
			|||||||
@ -36,12 +36,7 @@ enum {
 | 
				
			|||||||
    PROP_LAST
 | 
					    PROP_LAST
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE (EekRenderer, eek_renderer, G_TYPE_OBJECT);
 | 
					typedef struct _EekRendererPrivate
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEK_RENDERER_GET_PRIVATE(obj)                                  \
 | 
					 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_RENDERER, EekRendererPrivate))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekRendererPrivate
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
    PangoContext *pcontext;
 | 
					    PangoContext *pcontext;
 | 
				
			||||||
@ -62,7 +57,9 @@ struct _EekRendererPrivate
 | 
				
			|||||||
    gulong symbol_index_changed_handler;
 | 
					    gulong symbol_index_changed_handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EekTheme *theme;
 | 
					    EekTheme *theme;
 | 
				
			||||||
};
 | 
					} EekRendererPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekRenderer, eek_renderer, G_TYPE_OBJECT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const EekColor DEFAULT_FOREGROUND_COLOR = {0.3, 0.3, 0.3, 1.0};
 | 
					static const EekColor DEFAULT_FOREGROUND_COLOR = {0.3, 0.3, 0.3, 1.0};
 | 
				
			||||||
static const EekColor DEFAULT_BACKGROUND_COLOR = {1.0, 1.0, 1.0, 1.0};
 | 
					static const EekColor DEFAULT_BACKGROUND_COLOR = {1.0, 1.0, 1.0, 1.0};
 | 
				
			||||||
@ -106,7 +103,7 @@ create_keyboard_surface_key_callback (EekElement *element,
 | 
				
			|||||||
                                      gpointer    user_data)
 | 
					                                      gpointer    user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    CreateKeyboardSurfaceCallbackData *data = user_data;
 | 
					    CreateKeyboardSurfaceCallbackData *data = user_data;
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(data->renderer);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (data->renderer);
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cairo_save (data->cr);
 | 
					    cairo_save (data->cr);
 | 
				
			||||||
@ -129,7 +126,7 @@ create_keyboard_surface_section_callback (EekElement *element,
 | 
				
			|||||||
                                          gpointer    user_data)
 | 
					                                          gpointer    user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    CreateKeyboardSurfaceCallbackData *data = user_data;
 | 
					    CreateKeyboardSurfaceCallbackData *data = user_data;
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(data->renderer);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (data->renderer);
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    gint angle;
 | 
					    gint angle;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -151,7 +148,7 @@ create_keyboard_surface_section_callback (EekElement *element,
 | 
				
			|||||||
static cairo_surface_t *
 | 
					static cairo_surface_t *
 | 
				
			||||||
create_keyboard_surface (EekRenderer *renderer)
 | 
					create_keyboard_surface (EekRenderer *renderer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(renderer);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    cairo_surface_t *keyboard_surface;
 | 
					    cairo_surface_t *keyboard_surface;
 | 
				
			||||||
    CreateKeyboardSurfaceCallbackData data;
 | 
					    CreateKeyboardSurfaceCallbackData data;
 | 
				
			||||||
@ -202,7 +199,7 @@ render_key_outline (EekRenderer *renderer,
 | 
				
			|||||||
                    EekKey      *key,
 | 
					                    EekKey      *key,
 | 
				
			||||||
                    gboolean     active)
 | 
					                    gboolean     active)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(renderer);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
    EekOutline *outline;
 | 
					    EekOutline *outline;
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    guint oref;
 | 
					    guint oref;
 | 
				
			||||||
@ -246,7 +243,9 @@ render_key_outline (EekRenderer *renderer,
 | 
				
			|||||||
        border_color.alpha = foreground.alpha;
 | 
					        border_color.alpha = foreground.alpha;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eek_element_get_bounds(EEK_ELEMENT(key), &bounds);
 | 
				
			||||||
    outline = eek_outline_copy (outline);
 | 
					    outline = eek_outline_copy (outline);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (guint i = 0; i < outline->num_points; i++) {
 | 
					    for (guint i = 0; i < outline->num_points; i++) {
 | 
				
			||||||
        outline->points[i].x *= priv->scale;
 | 
					        outline->points[i].x *= priv->scale;
 | 
				
			||||||
        outline->points[i].y *= priv->scale;
 | 
					        outline->points[i].y *= priv->scale;
 | 
				
			||||||
@ -351,7 +350,7 @@ static void
 | 
				
			|||||||
calculate_font_size_key_callback (EekElement *element, gpointer user_data)
 | 
					calculate_font_size_key_callback (EekElement *element, gpointer user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    CalculateFontSizeCallbackData *data = user_data;
 | 
					    CalculateFontSizeCallbackData *data = user_data;
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(data->renderer);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (data->renderer);
 | 
				
			||||||
    gdouble sx, sy;
 | 
					    gdouble sx, sy;
 | 
				
			||||||
    PangoFontDescription *font;
 | 
					    PangoFontDescription *font;
 | 
				
			||||||
    PangoRectangle extents = { 0, };
 | 
					    PangoRectangle extents = { 0, };
 | 
				
			||||||
@ -411,7 +410,7 @@ calculate_font_size (EekRenderer                *renderer,
 | 
				
			|||||||
                     const PangoFontDescription *base_font,
 | 
					                     const PangoFontDescription *base_font,
 | 
				
			||||||
                     gboolean                    ascii)
 | 
					                     gboolean                    ascii)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(renderer);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
    CalculateFontSizeCallbackData data;
 | 
					    CalculateFontSizeCallbackData data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    data.size = G_MAXDOUBLE;
 | 
					    data.size = G_MAXDOUBLE;
 | 
				
			||||||
@ -430,7 +429,7 @@ render_key (EekRenderer *self,
 | 
				
			|||||||
            EekKey      *key,
 | 
					            EekKey      *key,
 | 
				
			||||||
            gboolean     active)
 | 
					            gboolean     active)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
 | 
				
			||||||
    EekOutline *outline;
 | 
					    EekOutline *outline;
 | 
				
			||||||
    cairo_surface_t *outline_surface;
 | 
					    cairo_surface_t *outline_surface;
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
@ -603,7 +602,7 @@ eek_renderer_real_render_key_label (EekRenderer *self,
 | 
				
			|||||||
                                    PangoLayout *layout,
 | 
					                                    PangoLayout *layout,
 | 
				
			||||||
                                    EekKey      *key)
 | 
					                                    EekKey      *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
 | 
				
			||||||
    EekSymbol *symbol;
 | 
					    EekSymbol *symbol;
 | 
				
			||||||
    EekSymbolCategory category;
 | 
					    EekSymbolCategory category;
 | 
				
			||||||
    const gchar *label;
 | 
					    const gchar *label;
 | 
				
			||||||
@ -696,7 +695,7 @@ static void
 | 
				
			|||||||
eek_renderer_real_render_keyboard (EekRenderer *self,
 | 
					eek_renderer_real_render_keyboard (EekRenderer *self,
 | 
				
			||||||
                                   cairo_t     *cr)
 | 
					                                   cairo_t     *cr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
 | 
				
			||||||
    cairo_pattern_t *source;
 | 
					    cairo_pattern_t *source;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_if_fail (priv->keyboard);
 | 
					    g_return_if_fail (priv->keyboard);
 | 
				
			||||||
@ -718,7 +717,8 @@ eek_renderer_set_property (GObject      *object,
 | 
				
			|||||||
                           const GValue *value,
 | 
					                           const GValue *value,
 | 
				
			||||||
                           GParamSpec   *pspec)
 | 
					                           GParamSpec   *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (
 | 
				
			||||||
 | 
							    EEK_RENDERER(object));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_KEYBOARD:
 | 
					    case PROP_KEYBOARD:
 | 
				
			||||||
@ -746,7 +746,8 @@ eek_renderer_get_property (GObject    *object,
 | 
				
			|||||||
                           GValue     *value,
 | 
					                           GValue     *value,
 | 
				
			||||||
                           GParamSpec *pspec)
 | 
					                           GParamSpec *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (
 | 
				
			||||||
 | 
							    EEK_RENDERER(object));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_KEYBOARD:
 | 
					    case PROP_KEYBOARD:
 | 
				
			||||||
@ -761,7 +762,8 @@ eek_renderer_get_property (GObject    *object,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_renderer_dispose (GObject *object)
 | 
					eek_renderer_dispose (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
 | 
					    EekRenderer        *self = EEK_RENDERER (object);
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->keyboard) {
 | 
					    if (priv->keyboard) {
 | 
				
			||||||
        if (g_signal_handler_is_connected (priv->keyboard,
 | 
					        if (g_signal_handler_is_connected (priv->keyboard,
 | 
				
			||||||
@ -785,7 +787,9 @@ eek_renderer_dispose (GObject *object)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_renderer_finalize (GObject *object)
 | 
					eek_renderer_finalize (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
 | 
					    EekRenderer        *self = EEK_RENDERER(object);
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_hash_table_destroy (priv->outline_surface_cache);
 | 
					    g_hash_table_destroy (priv->outline_surface_cache);
 | 
				
			||||||
    g_hash_table_destroy (priv->active_outline_surface_cache);
 | 
					    g_hash_table_destroy (priv->active_outline_surface_cache);
 | 
				
			||||||
    pango_font_description_free (priv->ascii_font);
 | 
					    pango_font_description_free (priv->ascii_font);
 | 
				
			||||||
@ -799,9 +803,6 @@ eek_renderer_class_init (EekRendererClass *klass)
 | 
				
			|||||||
    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec        *pspec;
 | 
					    GParamSpec        *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekRendererPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    klass->render_key_label = eek_renderer_real_render_key_label;
 | 
					    klass->render_key_label = eek_renderer_real_render_key_label;
 | 
				
			||||||
    klass->render_key_outline = eek_renderer_real_render_key_outline;
 | 
					    klass->render_key_outline = eek_renderer_real_render_key_outline;
 | 
				
			||||||
    klass->render_key = eek_renderer_real_render_key;
 | 
					    klass->render_key = eek_renderer_real_render_key;
 | 
				
			||||||
@ -834,9 +835,8 @@ eek_renderer_class_init (EekRendererClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_renderer_init (EekRenderer *self)
 | 
					eek_renderer_init (EekRenderer *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv;
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = self->priv = EEK_RENDERER_GET_PRIVATE(self);
 | 
					 | 
				
			||||||
    priv->keyboard = NULL;
 | 
					    priv->keyboard = NULL;
 | 
				
			||||||
    priv->pcontext = NULL;
 | 
					    priv->pcontext = NULL;
 | 
				
			||||||
    priv->default_foreground_color = DEFAULT_FOREGROUND_COLOR;
 | 
					    priv->default_foreground_color = DEFAULT_FOREGROUND_COLOR;
 | 
				
			||||||
@ -863,15 +863,17 @@ eek_renderer_init (EekRenderer *self)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
invalidate (EekRenderer *renderer)
 | 
					invalidate (EekRenderer *renderer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (renderer->priv->outline_surface_cache)
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
        g_hash_table_remove_all (renderer->priv->outline_surface_cache);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (renderer->priv->active_outline_surface_cache)
 | 
					    if (priv->outline_surface_cache)
 | 
				
			||||||
        g_hash_table_remove_all (renderer->priv->active_outline_surface_cache);
 | 
					        g_hash_table_remove_all (priv->outline_surface_cache);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (renderer->priv->keyboard_surface) {
 | 
					    if (priv->active_outline_surface_cache)
 | 
				
			||||||
        cairo_surface_destroy (renderer->priv->keyboard_surface);
 | 
					        g_hash_table_remove_all (priv->active_outline_surface_cache);
 | 
				
			||||||
        renderer->priv->keyboard_surface = NULL;
 | 
					
 | 
				
			||||||
 | 
					    if (priv->keyboard_surface) {
 | 
				
			||||||
 | 
					        cairo_surface_destroy (priv->keyboard_surface);
 | 
				
			||||||
 | 
					        priv->keyboard_surface = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -906,10 +908,12 @@ eek_renderer_set_allocation_size (EekRenderer *renderer,
 | 
				
			|||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
				
			||||||
    g_return_if_fail (width > 0.0 && height > 0.0);
 | 
					    g_return_if_fail (width > 0.0 && height > 0.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    renderer->priv->allocation_width = width;
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
    renderer->priv->allocation_height = height;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(renderer->priv->keyboard), &bounds);
 | 
					    priv->allocation_width = width;
 | 
				
			||||||
 | 
					    priv->allocation_height = height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (bounds.height * width / bounds.width <= height)
 | 
					    if (bounds.height * width / bounds.width <= height)
 | 
				
			||||||
        scale = width / bounds.width;
 | 
					        scale = width / bounds.width;
 | 
				
			||||||
@ -922,8 +926,8 @@ eek_renderer_set_allocation_size (EekRenderer *renderer,
 | 
				
			|||||||
            scale = bounds.height / height;
 | 
					            scale = bounds.height / height;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (scale != renderer->priv->scale) {
 | 
					    if (scale != priv->scale) {
 | 
				
			||||||
        renderer->priv->scale = scale;
 | 
					        priv->scale = scale;
 | 
				
			||||||
        invalidate (renderer);
 | 
					        invalidate (renderer);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -937,11 +941,13 @@ eek_renderer_get_size (EekRenderer *renderer,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(renderer->priv->keyboard), &bounds);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
 | 
				
			||||||
    if (width)
 | 
					    if (width)
 | 
				
			||||||
        *width = bounds.width * renderer->priv->scale;
 | 
					        *width = bounds.width * priv->scale;
 | 
				
			||||||
    if (height)
 | 
					    if (height)
 | 
				
			||||||
        *height = bounds.height * renderer->priv->scale;
 | 
					        *height = bounds.height * priv->scale;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@ -960,20 +966,22 @@ eek_renderer_get_key_bounds (EekRenderer *renderer,
 | 
				
			|||||||
    g_return_if_fail (EEK_IS_KEY(key));
 | 
					    g_return_if_fail (EEK_IS_KEY(key));
 | 
				
			||||||
    g_return_if_fail (bounds != NULL);
 | 
					    g_return_if_fail (bounds != NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    section = eek_element_get_parent (EEK_ELEMENT(key));
 | 
					    section = eek_element_get_parent (EEK_ELEMENT(key));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(key), bounds);
 | 
					    eek_element_get_bounds (EEK_ELEMENT(key), bounds);
 | 
				
			||||||
    eek_element_get_bounds (section, §ion_bounds);
 | 
					    eek_element_get_bounds (section, §ion_bounds);
 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(renderer->priv->keyboard),
 | 
					    eek_element_get_bounds (EEK_ELEMENT(priv->keyboard),
 | 
				
			||||||
                            &keyboard_bounds);
 | 
					                            &keyboard_bounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!rotate) {
 | 
					    if (!rotate) {
 | 
				
			||||||
        bounds->x += keyboard_bounds.x + section_bounds.x;
 | 
					        bounds->x += keyboard_bounds.x + section_bounds.x;
 | 
				
			||||||
        bounds->y += keyboard_bounds.y + section_bounds.y;
 | 
					        bounds->y += keyboard_bounds.y + section_bounds.y;
 | 
				
			||||||
        bounds->x *= renderer->priv->scale;
 | 
					        bounds->x *= priv->scale;
 | 
				
			||||||
        bounds->y *= renderer->priv->scale;
 | 
					        bounds->y *= priv->scale;
 | 
				
			||||||
        bounds->width *= renderer->priv->scale;
 | 
					        bounds->width *= priv->scale;
 | 
				
			||||||
        bounds->height *= renderer->priv->scale;
 | 
					        bounds->height *= priv->scale;
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    points[0].x = bounds->x;
 | 
					    points[0].x = bounds->x;
 | 
				
			||||||
@ -1005,24 +1013,30 @@ eek_renderer_get_key_bounds (EekRenderer *renderer,
 | 
				
			|||||||
    bounds->y = keyboard_bounds.y + section_bounds.y + min.y;
 | 
					    bounds->y = keyboard_bounds.y + section_bounds.y + min.y;
 | 
				
			||||||
    bounds->width = (max.x - min.x);
 | 
					    bounds->width = (max.x - min.x);
 | 
				
			||||||
    bounds->height = (max.y - min.y);
 | 
					    bounds->height = (max.y - min.y);
 | 
				
			||||||
    bounds->x *= renderer->priv->scale;
 | 
					    bounds->x *= priv->scale;
 | 
				
			||||||
    bounds->y *= renderer->priv->scale;
 | 
					    bounds->y *= priv->scale;
 | 
				
			||||||
    bounds->width *= renderer->priv->scale;
 | 
					    bounds->width *= priv->scale;
 | 
				
			||||||
    bounds->height *= renderer->priv->scale;
 | 
					    bounds->height *= priv->scale;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gdouble
 | 
					gdouble
 | 
				
			||||||
eek_renderer_get_scale (EekRenderer *renderer)
 | 
					eek_renderer_get_scale (EekRenderer *renderer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_RENDERER(renderer), 0);
 | 
					    g_return_val_if_fail (EEK_IS_RENDERER(renderer), 0);
 | 
				
			||||||
    return renderer->priv->scale;
 | 
					
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->scale;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PangoLayout *
 | 
					PangoLayout *
 | 
				
			||||||
eek_renderer_create_pango_layout (EekRenderer  *renderer)
 | 
					eek_renderer_create_pango_layout (EekRenderer  *renderer)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
 | 
					    g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
 | 
				
			||||||
    return pango_layout_new (renderer->priv->pcontext);
 | 
					
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return pango_layout_new (priv->pcontext);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@ -1100,7 +1114,9 @@ eek_renderer_set_default_foreground_color (EekRenderer    *renderer,
 | 
				
			|||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
				
			||||||
    g_return_if_fail (color);
 | 
					    g_return_if_fail (color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memcpy (&renderer->priv->default_foreground_color, color, sizeof(EekColor));
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy (&priv->default_foreground_color, color, sizeof(EekColor));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@ -1110,7 +1126,9 @@ eek_renderer_set_default_background_color (EekRenderer    *renderer,
 | 
				
			|||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
				
			||||||
    g_return_if_fail (color);
 | 
					    g_return_if_fail (color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    memcpy (&renderer->priv->default_background_color, color, sizeof(EekColor));
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memcpy (&priv->default_background_color, color, sizeof(EekColor));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@ -1123,11 +1141,13 @@ eek_renderer_get_foreground_color (EekRenderer *renderer,
 | 
				
			|||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
				
			||||||
    g_return_if_fail (color);
 | 
					    g_return_if_fail (color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
 | 
					    theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
 | 
				
			||||||
    if (theme_node)
 | 
					    if (theme_node)
 | 
				
			||||||
        eek_theme_node_get_foreground_color (theme_node, color);
 | 
					        eek_theme_node_get_foreground_color (theme_node, color);
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        memcpy (color, &renderer->priv->default_foreground_color,
 | 
					        memcpy (color, &priv->default_foreground_color,
 | 
				
			||||||
                sizeof(EekColor));
 | 
					                sizeof(EekColor));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1141,11 +1161,13 @@ eek_renderer_get_background_color (EekRenderer *renderer,
 | 
				
			|||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
				
			||||||
    g_return_if_fail (color);
 | 
					    g_return_if_fail (color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
 | 
					    theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
 | 
				
			||||||
    if (theme_node)
 | 
					    if (theme_node)
 | 
				
			||||||
        eek_theme_node_get_background_color (theme_node, color);
 | 
					        eek_theme_node_get_background_color (theme_node, color);
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        memcpy (color, &renderer->priv->default_background_color,
 | 
					        memcpy (color, &priv->default_background_color,
 | 
				
			||||||
                sizeof(EekColor));
 | 
					                sizeof(EekColor));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1208,12 +1230,14 @@ find_key_by_position_key_callback (EekElement *element,
 | 
				
			|||||||
    points[3].x = points[0].x;
 | 
					    points[3].x = points[0].x;
 | 
				
			||||||
    points[3].y = points[2].y;
 | 
					    points[3].y = points[2].y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (data->renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (i = 0; i < G_N_ELEMENTS(points); i++) {
 | 
					    for (i = 0; i < G_N_ELEMENTS(points); i++) {
 | 
				
			||||||
        eek_point_rotate (&points[i], data->angle);
 | 
					        eek_point_rotate (&points[i], data->angle);
 | 
				
			||||||
        points[i].x += data->origin.x;
 | 
					        points[i].x += data->origin.x;
 | 
				
			||||||
        points[i].y += data->origin.y;
 | 
					        points[i].y += data->origin.y;
 | 
				
			||||||
        points[i].x *= data->renderer->priv->scale;
 | 
					        points[i].x *= priv->scale;
 | 
				
			||||||
        points[i].y *= data->renderer->priv->scale;
 | 
					        points[i].y *= priv->scale;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    b1 = sign (&data->point, &points[0], &points[1]) < 0.0;
 | 
					    b1 = sign (&data->point, &points[0], &points[1]) < 0.0;
 | 
				
			||||||
@ -1268,12 +1292,14 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
 | 
					    g_return_val_if_fail (EEK_IS_RENDERER(renderer), NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(renderer->priv->keyboard), &bounds);
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (x < bounds.x * renderer->priv->scale ||
 | 
					    eek_element_get_bounds (EEK_ELEMENT(priv->keyboard), &bounds);
 | 
				
			||||||
        y < bounds.y * renderer->priv->scale ||
 | 
					
 | 
				
			||||||
        x > bounds.width * renderer->priv->scale ||
 | 
					    if (x < bounds.x * priv->scale ||
 | 
				
			||||||
        y > bounds.height * renderer->priv->scale)
 | 
					        y < bounds.y * priv->scale ||
 | 
				
			||||||
 | 
					        x > bounds.width * priv->scale ||
 | 
				
			||||||
 | 
					        y > bounds.height * priv->scale)
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    data.point.x = x;
 | 
					    data.point.x = x;
 | 
				
			||||||
@ -1283,7 +1309,7 @@ eek_renderer_find_key_by_position (EekRenderer *renderer,
 | 
				
			|||||||
    data.key = NULL;
 | 
					    data.key = NULL;
 | 
				
			||||||
    data.renderer = renderer;
 | 
					    data.renderer = renderer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_container_find (EEK_CONTAINER(renderer->priv->keyboard),
 | 
					    eek_container_find (EEK_CONTAINER(priv->keyboard),
 | 
				
			||||||
                        find_key_by_position_section_callback,
 | 
					                        find_key_by_position_section_callback,
 | 
				
			||||||
                        &data);
 | 
					                        &data);
 | 
				
			||||||
    return data.key;
 | 
					    return data.key;
 | 
				
			||||||
@ -1303,9 +1329,11 @@ create_theme_node_key_callback (EekElement *element,
 | 
				
			|||||||
    CreateThemeNodeData *data = user_data;
 | 
					    CreateThemeNodeData *data = user_data;
 | 
				
			||||||
    EekThemeNode *theme_node;
 | 
					    EekThemeNode *theme_node;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (data->renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    theme_node = eek_theme_node_new (data->context,
 | 
					    theme_node = eek_theme_node_new (data->context,
 | 
				
			||||||
                                     data->parent,
 | 
					                                     data->parent,
 | 
				
			||||||
                                     data->renderer->priv->theme,
 | 
					                                     priv->theme,
 | 
				
			||||||
                                     EEK_TYPE_KEY,
 | 
					                                     EEK_TYPE_KEY,
 | 
				
			||||||
                                     eek_element_get_name (element),
 | 
					                                     eek_element_get_name (element),
 | 
				
			||||||
                                     "key",
 | 
					                                     "key",
 | 
				
			||||||
@ -1318,7 +1346,7 @@ create_theme_node_key_callback (EekElement *element,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    theme_node = eek_theme_node_new (data->context,
 | 
					    theme_node = eek_theme_node_new (data->context,
 | 
				
			||||||
                                     data->parent,
 | 
					                                     data->parent,
 | 
				
			||||||
                                     data->renderer->priv->theme,
 | 
					                                     priv->theme,
 | 
				
			||||||
                                     EEK_TYPE_KEY,
 | 
					                                     EEK_TYPE_KEY,
 | 
				
			||||||
                                     eek_element_get_name (element),
 | 
					                                     eek_element_get_name (element),
 | 
				
			||||||
                                     "key",
 | 
					                                     "key",
 | 
				
			||||||
@ -1337,9 +1365,11 @@ create_theme_node_section_callback (EekElement *element,
 | 
				
			|||||||
    CreateThemeNodeData *data = user_data;
 | 
					    CreateThemeNodeData *data = user_data;
 | 
				
			||||||
    EekThemeNode *theme_node, *parent;
 | 
					    EekThemeNode *theme_node, *parent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (data->renderer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    theme_node = eek_theme_node_new (data->context,
 | 
					    theme_node = eek_theme_node_new (data->context,
 | 
				
			||||||
                                     data->parent,
 | 
					                                     data->parent,
 | 
				
			||||||
                                     data->renderer->priv->theme,
 | 
					                                     priv->theme,
 | 
				
			||||||
                                     EEK_TYPE_SECTION,
 | 
					                                     EEK_TYPE_SECTION,
 | 
				
			||||||
                                     eek_element_get_name (element),
 | 
					                                     eek_element_get_name (element),
 | 
				
			||||||
                                     "section",
 | 
					                                     "section",
 | 
				
			||||||
@ -1368,22 +1398,25 @@ eek_renderer_set_theme (EekRenderer *renderer,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
					    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
				
			||||||
    g_return_if_fail (EEK_IS_THEME(theme));
 | 
					    g_return_if_fail (EEK_IS_THEME(theme));
 | 
				
			||||||
    g_return_if_fail (renderer->priv->keyboard);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (renderer->priv->theme)
 | 
					    EekRendererPrivate *priv = eek_renderer_get_instance_private (renderer);
 | 
				
			||||||
        g_object_unref (renderer->priv->theme);
 | 
					
 | 
				
			||||||
    renderer->priv->theme = g_object_ref (theme);
 | 
					    g_return_if_fail (priv->keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->theme)
 | 
				
			||||||
 | 
					        g_object_unref (priv->theme);
 | 
				
			||||||
 | 
					    priv->theme = g_object_ref (theme);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    theme_context = eek_theme_context_new ();
 | 
					    theme_context = eek_theme_context_new ();
 | 
				
			||||||
    theme_node = eek_theme_node_new (theme_context,
 | 
					    theme_node = eek_theme_node_new (theme_context,
 | 
				
			||||||
                                     NULL,
 | 
					                                     NULL,
 | 
				
			||||||
                                     renderer->priv->theme,
 | 
					                                     priv->theme,
 | 
				
			||||||
                                     EEK_TYPE_KEYBOARD,
 | 
					                                     EEK_TYPE_KEYBOARD,
 | 
				
			||||||
                                     "keyboard",
 | 
					                                     "keyboard",
 | 
				
			||||||
                                     "keyboard",
 | 
					                                     "keyboard",
 | 
				
			||||||
                                     NULL,
 | 
					                                     NULL,
 | 
				
			||||||
                                     NULL);
 | 
					                                     NULL);
 | 
				
			||||||
    g_object_set_data_full (G_OBJECT(renderer->priv->keyboard),
 | 
					    g_object_set_data_full (G_OBJECT(priv->keyboard),
 | 
				
			||||||
                            "theme-node",
 | 
					                            "theme-node",
 | 
				
			||||||
                            theme_node,
 | 
					                            theme_node,
 | 
				
			||||||
                            (GDestroyNotify)g_object_unref);
 | 
					                            (GDestroyNotify)g_object_unref);
 | 
				
			||||||
@ -1391,7 +1424,7 @@ eek_renderer_set_theme (EekRenderer *renderer,
 | 
				
			|||||||
    data.context = theme_context;
 | 
					    data.context = theme_context;
 | 
				
			||||||
    data.parent = theme_node;
 | 
					    data.parent = theme_node;
 | 
				
			||||||
    data.renderer = renderer;
 | 
					    data.renderer = renderer;
 | 
				
			||||||
    eek_container_foreach_child (EEK_CONTAINER(renderer->priv->keyboard),
 | 
					    eek_container_foreach_child (EEK_CONTAINER(priv->keyboard),
 | 
				
			||||||
                                 create_theme_node_section_callback,
 | 
					                                 create_theme_node_section_callback,
 | 
				
			||||||
                                 &data);
 | 
					                                 &data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -31,21 +31,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_RENDERER (eek_renderer_get_type())
 | 
					#define EEK_TYPE_RENDERER (eek_renderer_get_type())
 | 
				
			||||||
#define EEK_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_RENDERER, EekRenderer))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekRenderer, eek_renderer, EEK, RENDERER, GObject)
 | 
				
			||||||
#define EEK_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_RENDERER, EekRendererClass))
 | 
					 | 
				
			||||||
#define EEK_IS_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_RENDERER))
 | 
					 | 
				
			||||||
#define EEK_IS_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_RENDERER))
 | 
					 | 
				
			||||||
#define EEK_RENDERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_RENDERER, EekRendererClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekRenderer EekRenderer;
 | 
					 | 
				
			||||||
typedef struct _EekRendererClass EekRendererClass;
 | 
					 | 
				
			||||||
typedef struct _EekRendererPrivate EekRendererPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekRenderer {
 | 
					 | 
				
			||||||
    GObject parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekRendererPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekRendererClass
 | 
					struct _EekRendererClass
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -1,17 +1,17 @@
 | 
				
			|||||||
/* 
 | 
					/*
 | 
				
			||||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
					 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
				
			||||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
					 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
				
			||||||
 * 
 | 
					 *
 | 
				
			||||||
 * This library is free software; you can redistribute it and/or
 | 
					 * This library is free software; you can redistribute it and/or
 | 
				
			||||||
 * modify it under the terms of the GNU Lesser General Public License
 | 
					 * modify it under the terms of the GNU Lesser General Public License
 | 
				
			||||||
 * as published by the Free Software Foundation; either version 2 of
 | 
					 * as published by the Free Software Foundation; either version 2 of
 | 
				
			||||||
 * the License, or (at your option) any later version.
 | 
					 * the License, or (at your option) any later version.
 | 
				
			||||||
 * 
 | 
					 *
 | 
				
			||||||
 * This library is distributed in the hope that it will be useful, but
 | 
					 * This library is distributed in the hope that it will be useful, but
 | 
				
			||||||
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 * WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
					 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
				
			||||||
 * Lesser General Public License for more details.
 | 
					 * Lesser General Public License for more details.
 | 
				
			||||||
 * 
 | 
					 *
 | 
				
			||||||
 * You should have received a copy of the GNU Lesser General Public
 | 
					 * You should have received a copy of the GNU Lesser General Public
 | 
				
			||||||
 * License along with this library; if not, write to the Free Software
 | 
					 * License along with this library; if not, write to the Free Software
 | 
				
			||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
@ -52,11 +52,6 @@ enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static guint signals[LAST_SIGNAL] = { 0, };
 | 
					static guint signals[LAST_SIGNAL] = { 0, };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE (EekSection, eek_section, EEK_TYPE_CONTAINER);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEK_SECTION_GET_PRIVATE(obj)                           \
 | 
					 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_SECTION, EekSectionPrivate))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekRow
 | 
					struct _EekRow
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    gint num_columns;
 | 
					    gint num_columns;
 | 
				
			||||||
@ -65,17 +60,19 @@ struct _EekRow
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct _EekRow EekRow;
 | 
					typedef struct _EekRow EekRow;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekSectionPrivate
 | 
					typedef struct _EekSectionPrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    gint angle;
 | 
					    gint angle;
 | 
				
			||||||
    GSList *rows;
 | 
					    GSList *rows;
 | 
				
			||||||
    EekModifierType modifiers;
 | 
					    EekModifierType modifiers;
 | 
				
			||||||
};
 | 
					} EekSectionPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekSection, eek_section, EEK_TYPE_CONTAINER)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gint
 | 
					static gint
 | 
				
			||||||
eek_section_real_get_n_rows (EekSection *self)
 | 
					eek_section_real_get_n_rows (EekSection *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSectionPrivate *priv = EEK_SECTION_GET_PRIVATE(self);
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return g_slist_length (priv->rows);
 | 
					    return g_slist_length (priv->rows);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -85,7 +82,7 @@ eek_section_real_add_row (EekSection    *self,
 | 
				
			|||||||
                          gint           num_columns,
 | 
					                          gint           num_columns,
 | 
				
			||||||
                          EekOrientation orientation)
 | 
					                          EekOrientation orientation)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSectionPrivate *priv = EEK_SECTION_GET_PRIVATE(self);
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (self);
 | 
				
			||||||
    EekRow *row;
 | 
					    EekRow *row;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    row = g_slice_new (EekRow);
 | 
					    row = g_slice_new (EekRow);
 | 
				
			||||||
@ -100,7 +97,7 @@ eek_section_real_get_row (EekSection     *self,
 | 
				
			|||||||
                          gint           *num_columns,
 | 
					                          gint           *num_columns,
 | 
				
			||||||
                          EekOrientation *orientation)
 | 
					                          EekOrientation *orientation)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSectionPrivate *priv = EEK_SECTION_GET_PRIVATE(self);
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (self);
 | 
				
			||||||
    EekRow *row;
 | 
					    EekRow *row;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    row = g_slist_nth_data (priv->rows, index);
 | 
					    row = g_slist_nth_data (priv->rows, index);
 | 
				
			||||||
@ -129,7 +126,7 @@ static EekKey *
 | 
				
			|||||||
eek_section_real_create_key (EekSection *self,
 | 
					eek_section_real_create_key (EekSection *self,
 | 
				
			||||||
                             guint       keycode,
 | 
					                             guint       keycode,
 | 
				
			||||||
                             gint        column_index,
 | 
					                             gint        column_index,
 | 
				
			||||||
                             guint        row_index)
 | 
					                             gint        row_index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekKey *key;
 | 
					    EekKey *key;
 | 
				
			||||||
    gint num_rows;
 | 
					    gint num_rows;
 | 
				
			||||||
@ -138,7 +135,9 @@ eek_section_real_create_key (EekSection *self,
 | 
				
			|||||||
    num_rows = eek_section_get_n_rows (self);
 | 
					    num_rows = eek_section_get_n_rows (self);
 | 
				
			||||||
    g_return_val_if_fail (0 <= row_index && row_index < num_rows, NULL);
 | 
					    g_return_val_if_fail (0 <= row_index && row_index < num_rows, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    row = g_slist_nth_data (self->priv->rows, row_index);
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    row = g_slist_nth_data (priv->rows, row_index);
 | 
				
			||||||
    if (row->num_columns < column_index + 1)
 | 
					    if (row->num_columns < column_index + 1)
 | 
				
			||||||
        row->num_columns = column_index + 1;
 | 
					        row->num_columns = column_index + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -158,7 +157,7 @@ eek_section_real_create_key (EekSection *self,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
set_level_from_modifiers (EekSection *self)
 | 
					set_level_from_modifiers (EekSection *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSectionPrivate *priv = EEK_SECTION_GET_PRIVATE(self);
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (self);
 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
    EekModifierType num_lock_mask;
 | 
					    EekModifierType num_lock_mask;
 | 
				
			||||||
    gint level = -1;
 | 
					    gint level = -1;
 | 
				
			||||||
@ -173,7 +172,7 @@ set_level_from_modifiers (EekSection *self)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_section_real_key_pressed (EekSection *self, EekKey *key)
 | 
					eek_section_real_key_pressed (EekSection *self, EekKey *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSectionPrivate *priv = EEK_SECTION_GET_PRIVATE(self);
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (self);
 | 
				
			||||||
    EekSymbol *symbol;
 | 
					    EekSymbol *symbol;
 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
    EekModifierBehavior behavior;
 | 
					    EekModifierBehavior behavior;
 | 
				
			||||||
@ -195,7 +194,7 @@ eek_section_real_key_pressed (EekSection *self, EekKey *key)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_section_real_key_released (EekSection *self, EekKey *key)
 | 
					eek_section_real_key_released (EekSection *self, EekKey *key)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSectionPrivate *priv = EEK_SECTION_GET_PRIVATE(self);
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (self);
 | 
				
			||||||
    EekSymbol *symbol;
 | 
					    EekSymbol *symbol;
 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
    EekModifierBehavior behavior;
 | 
					    EekModifierBehavior behavior;
 | 
				
			||||||
@ -225,7 +224,8 @@ eek_section_real_key_released (EekSection *self, EekKey *key)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_section_finalize (GObject *object)
 | 
					eek_section_finalize (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSectionPrivate *priv = EEK_SECTION_GET_PRIVATE(object);
 | 
					    EekSection        *self = EEK_SECTION (object);
 | 
				
			||||||
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (self);
 | 
				
			||||||
    GSList *head;
 | 
					    GSList *head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (head = priv->rows; head; head = g_slist_next (head))
 | 
					    for (head = priv->rows; head; head = g_slist_next (head))
 | 
				
			||||||
@ -291,8 +291,6 @@ eek_section_class_init (EekSectionClass *klass)
 | 
				
			|||||||
    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass      *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec        *pspec;
 | 
					    GParamSpec        *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class, sizeof (EekSectionPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    klass->get_n_rows = eek_section_real_get_n_rows;
 | 
					    klass->get_n_rows = eek_section_real_get_n_rows;
 | 
				
			||||||
    klass->add_row = eek_section_real_add_row;
 | 
					    klass->add_row = eek_section_real_add_row;
 | 
				
			||||||
    klass->get_row = eek_section_real_get_row;
 | 
					    klass->get_row = eek_section_real_get_row;
 | 
				
			||||||
@ -367,7 +365,7 @@ eek_section_class_init (EekSectionClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_section_init (EekSection *self)
 | 
					eek_section_init (EekSection *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEK_SECTION_GET_PRIVATE (self);
 | 
					    /* void */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -382,8 +380,11 @@ eek_section_set_angle (EekSection  *section,
 | 
				
			|||||||
                       gint         angle)
 | 
					                       gint         angle)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEK_IS_SECTION(section));
 | 
					    g_return_if_fail (EEK_IS_SECTION(section));
 | 
				
			||||||
    if (section->priv->angle != angle) {
 | 
					
 | 
				
			||||||
        section->priv->angle = angle;
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (section);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->angle != angle) {
 | 
				
			||||||
 | 
					        priv->angle = angle;
 | 
				
			||||||
        g_object_notify (G_OBJECT(section), "angle");
 | 
					        g_object_notify (G_OBJECT(section), "angle");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -398,7 +399,10 @@ gint
 | 
				
			|||||||
eek_section_get_angle (EekSection *section)
 | 
					eek_section_get_angle (EekSection *section)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_SECTION(section), -1);
 | 
					    g_return_val_if_fail (EEK_IS_SECTION(section), -1);
 | 
				
			||||||
    return section->priv->angle;
 | 
					
 | 
				
			||||||
 | 
					    EekSectionPrivate *priv = eek_section_get_instance_private (section);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->angle;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -529,7 +533,7 @@ static void keycounter (EekElement *element, gpointer user_data) {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const double keyspacing = 3.0;
 | 
					const double keyspacing = 4.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void keyplacer(EekElement *element, gpointer user_data) {
 | 
					static void keyplacer(EekElement *element, gpointer user_data) {
 | 
				
			||||||
    double *current_offset = user_data;
 | 
					    double *current_offset = user_data;
 | 
				
			||||||
 | 
				
			|||||||
@ -32,28 +32,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_SECTION (eek_section_get_type())
 | 
					#define EEK_TYPE_SECTION (eek_section_get_type())
 | 
				
			||||||
#define EEK_SECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_SECTION, EekSection))
 | 
					G_DECLARE_DERIVABLE_TYPE(EekSection, eek_section, EEK, SECTION, EekContainer)
 | 
				
			||||||
#define EEK_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_SECTION, EekSectionClass))
 | 
					 | 
				
			||||||
#define EEK_IS_SECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_SECTION))
 | 
					 | 
				
			||||||
#define EEK_IS_SECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_SECTION))
 | 
					 | 
				
			||||||
#define EEK_SECTION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_SECTION, EekSectionClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekSectionClass EekSectionClass;
 | 
					 | 
				
			||||||
typedef struct _EekSectionPrivate EekSectionPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * EekSection:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The #EekSection structure contains only private data and should
 | 
					 | 
				
			||||||
 * only be accessed using the provided API.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct _EekSection
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    EekContainer parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekSectionPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * EekSectionClass:
 | 
					 * EekSectionClass:
 | 
				
			||||||
 | 
				
			|||||||
@ -44,29 +44,31 @@ enum {
 | 
				
			|||||||
    PROP_LAST
 | 
					    PROP_LAST
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekSymbolPrivate {
 | 
					typedef struct _EekSymbolPrivate
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    gchar *name;
 | 
					    gchar *name;
 | 
				
			||||||
    gchar *label;
 | 
					    gchar *label;
 | 
				
			||||||
    EekSymbolCategory category;
 | 
					    EekSymbolCategory category;
 | 
				
			||||||
    EekModifierType modifier_mask;
 | 
					    EekModifierType modifier_mask;
 | 
				
			||||||
    gchar *icon_name;
 | 
					    gchar *icon_name;
 | 
				
			||||||
    gchar *tooltip;
 | 
					    gchar *tooltip;
 | 
				
			||||||
};
 | 
					} EekSymbolPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void eek_serializable_iface_init (EekSerializableIface *iface);
 | 
					static void eek_serializable_iface_init (EekSerializableIface *iface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE_WITH_CODE (EekSymbol, eek_symbol, G_TYPE_OBJECT,
 | 
					G_DEFINE_TYPE_EXTENDED (EekSymbol,
 | 
				
			||||||
                         G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
 | 
								eek_symbol,
 | 
				
			||||||
                                                eek_serializable_iface_init));
 | 
								G_TYPE_OBJECT,
 | 
				
			||||||
 | 
								0, /* GTypeFlags */
 | 
				
			||||||
#define EEK_SYMBOL_GET_PRIVATE(obj)                                  \
 | 
								G_ADD_PRIVATE (EekSymbol)
 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_SYMBOL, EekSymbolPrivate))
 | 
					                        G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
 | 
				
			||||||
 | 
					                                               eek_serializable_iface_init))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_symbol_real_serialize (EekSerializable *self,
 | 
					eek_symbol_real_serialize (EekSerializable *self,
 | 
				
			||||||
                           GVariantBuilder *builder)
 | 
					                           GVariantBuilder *builder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv = EEK_SYMBOL_GET_PRIVATE(self);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (EEK_SYMBOL (self));
 | 
				
			||||||
#define NOTNULL(s) ((s) != NULL ? (s) : "")
 | 
					#define NOTNULL(s) ((s) != NULL ? (s) : "")
 | 
				
			||||||
    g_variant_builder_add (builder, "s", NOTNULL(priv->name));
 | 
					    g_variant_builder_add (builder, "s", NOTNULL(priv->name));
 | 
				
			||||||
    g_variant_builder_add (builder, "s", NOTNULL(priv->label));
 | 
					    g_variant_builder_add (builder, "s", NOTNULL(priv->label));
 | 
				
			||||||
@ -82,7 +84,7 @@ eek_symbol_real_deserialize (EekSerializable *self,
 | 
				
			|||||||
                             GVariant        *variant,
 | 
					                             GVariant        *variant,
 | 
				
			||||||
                             gsize            index)
 | 
					                             gsize            index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv = EEK_SYMBOL_GET_PRIVATE(self);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (EEK_SYMBOL (self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_variant_get_child (variant, index++, "s", &priv->name);
 | 
					    g_variant_get_child (variant, index++, "s", &priv->name);
 | 
				
			||||||
    g_variant_get_child (variant, index++, "s", &priv->label);
 | 
					    g_variant_get_child (variant, index++, "s", &priv->label);
 | 
				
			||||||
@ -172,7 +174,8 @@ eek_symbol_get_property (GObject    *object,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_symbol_finalize (GObject *object)
 | 
					eek_symbol_finalize (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv = EEK_SYMBOL_GET_PRIVATE(object);
 | 
					    EekSymbol        *self = EEK_SYMBOL (object);
 | 
				
			||||||
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (priv->name);
 | 
					    g_free (priv->name);
 | 
				
			||||||
    g_free (priv->label);
 | 
					    g_free (priv->label);
 | 
				
			||||||
@ -187,8 +190,6 @@ eek_symbol_class_init (EekSymbolClass *klass)
 | 
				
			|||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec *pspec;
 | 
					    GParamSpec *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class, sizeof (EekSymbolPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gobject_class->set_property = eek_symbol_set_property;
 | 
					    gobject_class->set_property = eek_symbol_set_property;
 | 
				
			||||||
    gobject_class->get_property = eek_symbol_get_property;
 | 
					    gobject_class->get_property = eek_symbol_get_property;
 | 
				
			||||||
    gobject_class->finalize = eek_symbol_finalize;
 | 
					    gobject_class->finalize = eek_symbol_finalize;
 | 
				
			||||||
@ -241,9 +242,8 @@ eek_symbol_class_init (EekSymbolClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_symbol_init (EekSymbol *self)
 | 
					eek_symbol_init (EekSymbol *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = self->priv = EEK_SYMBOL_GET_PRIVATE(self);
 | 
					 | 
				
			||||||
    priv->category = EEK_SYMBOL_CATEGORY_UNKNOWN;
 | 
					    priv->category = EEK_SYMBOL_CATEGORY_UNKNOWN;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -270,11 +270,10 @@ void
 | 
				
			|||||||
eek_symbol_set_name (EekSymbol   *symbol,
 | 
					eek_symbol_set_name (EekSymbol   *symbol,
 | 
				
			||||||
                     const gchar *name)
 | 
					                     const gchar *name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
					    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (priv->name);
 | 
					    g_free (priv->name);
 | 
				
			||||||
    priv->name = g_strdup (name);
 | 
					    priv->name = g_strdup (name);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -288,11 +287,10 @@ eek_symbol_set_name (EekSymbol   *symbol,
 | 
				
			|||||||
const gchar *
 | 
					const gchar *
 | 
				
			||||||
eek_symbol_get_name (EekSymbol *symbol)
 | 
					eek_symbol_get_name (EekSymbol *symbol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL);
 | 
					    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->name == NULL || *priv->name == '\0')
 | 
					    if (priv->name == NULL || *priv->name == '\0')
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    return priv->name;
 | 
					    return priv->name;
 | 
				
			||||||
@ -309,11 +307,10 @@ void
 | 
				
			|||||||
eek_symbol_set_label (EekSymbol   *symbol,
 | 
					eek_symbol_set_label (EekSymbol   *symbol,
 | 
				
			||||||
                      const gchar *label)
 | 
					                      const gchar *label)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
					    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (priv->label);
 | 
					    g_free (priv->label);
 | 
				
			||||||
    priv->label = g_strdup (label);
 | 
					    priv->label = g_strdup (label);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -327,11 +324,10 @@ eek_symbol_set_label (EekSymbol   *symbol,
 | 
				
			|||||||
const gchar *
 | 
					const gchar *
 | 
				
			||||||
eek_symbol_get_label (EekSymbol *symbol)
 | 
					eek_symbol_get_label (EekSymbol *symbol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL);
 | 
					    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->label == NULL || *priv->label == '\0')
 | 
					    if (priv->label == NULL || *priv->label == '\0')
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    return priv->label;
 | 
					    return priv->label;
 | 
				
			||||||
@ -348,11 +344,10 @@ void
 | 
				
			|||||||
eek_symbol_set_category (EekSymbol        *symbol,
 | 
					eek_symbol_set_category (EekSymbol        *symbol,
 | 
				
			||||||
                         EekSymbolCategory category)
 | 
					                         EekSymbolCategory category)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
					    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv->category = category;
 | 
					    priv->category = category;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -365,11 +360,10 @@ eek_symbol_set_category (EekSymbol        *symbol,
 | 
				
			|||||||
EekSymbolCategory
 | 
					EekSymbolCategory
 | 
				
			||||||
eek_symbol_get_category (EekSymbol *symbol)
 | 
					eek_symbol_get_category (EekSymbol *symbol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), EEK_SYMBOL_CATEGORY_UNKNOWN);
 | 
					    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), EEK_SYMBOL_CATEGORY_UNKNOWN);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return priv->category;
 | 
					    return priv->category;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -384,11 +378,10 @@ void
 | 
				
			|||||||
eek_symbol_set_modifier_mask (EekSymbol      *symbol,
 | 
					eek_symbol_set_modifier_mask (EekSymbol      *symbol,
 | 
				
			||||||
                              EekModifierType mask)
 | 
					                              EekModifierType mask)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
					    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv->modifier_mask = mask;
 | 
					    priv->modifier_mask = mask;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -401,11 +394,10 @@ eek_symbol_set_modifier_mask (EekSymbol      *symbol,
 | 
				
			|||||||
EekModifierType
 | 
					EekModifierType
 | 
				
			||||||
eek_symbol_get_modifier_mask (EekSymbol *symbol)
 | 
					eek_symbol_get_modifier_mask (EekSymbol *symbol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), 0);
 | 
					    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return priv->modifier_mask;
 | 
					    return priv->modifier_mask;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -433,11 +425,10 @@ void
 | 
				
			|||||||
eek_symbol_set_icon_name (EekSymbol   *symbol,
 | 
					eek_symbol_set_icon_name (EekSymbol   *symbol,
 | 
				
			||||||
                          const gchar *icon_name)
 | 
					                          const gchar *icon_name)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
					    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (priv->icon_name);
 | 
					    g_free (priv->icon_name);
 | 
				
			||||||
    priv->icon_name = g_strdup (icon_name);
 | 
					    priv->icon_name = g_strdup (icon_name);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -451,11 +442,10 @@ eek_symbol_set_icon_name (EekSymbol   *symbol,
 | 
				
			|||||||
const gchar *
 | 
					const gchar *
 | 
				
			||||||
eek_symbol_get_icon_name (EekSymbol *symbol)
 | 
					eek_symbol_get_icon_name (EekSymbol *symbol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL);
 | 
					    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->icon_name == NULL || *priv->icon_name == '\0')
 | 
					    if (priv->icon_name == NULL || *priv->icon_name == '\0')
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    return priv->icon_name;
 | 
					    return priv->icon_name;
 | 
				
			||||||
@ -472,11 +462,10 @@ void
 | 
				
			|||||||
eek_symbol_set_tooltip (EekSymbol   *symbol,
 | 
					eek_symbol_set_tooltip (EekSymbol   *symbol,
 | 
				
			||||||
                        const gchar *tooltip)
 | 
					                        const gchar *tooltip)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
					    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (priv->tooltip);
 | 
					    g_free (priv->tooltip);
 | 
				
			||||||
    priv->tooltip = g_strdup (tooltip);
 | 
					    priv->tooltip = g_strdup (tooltip);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -490,11 +479,10 @@ eek_symbol_set_tooltip (EekSymbol   *symbol,
 | 
				
			|||||||
const gchar *
 | 
					const gchar *
 | 
				
			||||||
eek_symbol_get_tooltip (EekSymbol *symbol)
 | 
					eek_symbol_get_tooltip (EekSymbol *symbol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL);
 | 
					    g_return_val_if_fail (EEK_IS_SYMBOL(symbol), NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = EEK_SYMBOL_GET_PRIVATE(symbol);
 | 
					    EekSymbolPrivate *priv = eek_symbol_get_instance_private (symbol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->tooltip == NULL || *priv->tooltip == '\0')
 | 
					    if (priv->tooltip == NULL || *priv->tooltip == '\0')
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    return priv->tooltip;
 | 
					    return priv->tooltip;
 | 
				
			||||||
 | 
				
			|||||||
@ -59,27 +59,7 @@ typedef enum {
 | 
				
			|||||||
} EekSymbolCategory;
 | 
					} EekSymbolCategory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_SYMBOL (eek_symbol_get_type())
 | 
					#define EEK_TYPE_SYMBOL (eek_symbol_get_type())
 | 
				
			||||||
#define EEK_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_SYMBOL, EekSymbol))
 | 
					G_DECLARE_DERIVABLE_TYPE(EekSymbol, eek_symbol, EEK, SYMBOL, GObject)
 | 
				
			||||||
#define EEK_SYMBOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_SYMBOL, EekSymbolClass))
 | 
					 | 
				
			||||||
#define EEK_IS_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_SYMBOL))
 | 
					 | 
				
			||||||
#define EEK_IS_SYMBOL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_SYMBOL))
 | 
					 | 
				
			||||||
#define EEK_SYMBOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_SYMBOL, EekSymbolClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekSymbolClass EekSymbolClass;
 | 
					 | 
				
			||||||
typedef struct _EekSymbolPrivate EekSymbolPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * EekSymbol:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The #EekSymbol structure contains only private data and should only
 | 
					 | 
				
			||||||
 * be accessed using the provided API.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct _EekSymbol {
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    GObject parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekSymbolPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * EekSymbolClass:
 | 
					 * EekSymbolClass:
 | 
				
			||||||
 | 
				
			|||||||
@ -36,18 +36,20 @@ enum {
 | 
				
			|||||||
    PROP_LAST
 | 
					    PROP_LAST
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekTextPrivate {
 | 
					typedef struct _EekTextPrivate
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
    gchar *text;
 | 
					    gchar *text;
 | 
				
			||||||
};
 | 
					} EekTextPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void eek_serializable_iface_init (EekSerializableIface *iface);
 | 
					static void eek_serializable_iface_init (EekSerializableIface *iface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE_WITH_CODE (EekText, eek_text, EEK_TYPE_SYMBOL,
 | 
					G_DEFINE_TYPE_EXTENDED (EekText,
 | 
				
			||||||
                         G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
 | 
								eek_text,
 | 
				
			||||||
                                                eek_serializable_iface_init));
 | 
								EEK_TYPE_SYMBOL,
 | 
				
			||||||
 | 
								0, /* GTypeFlags */
 | 
				
			||||||
#define EEK_TEXT_GET_PRIVATE(obj)                                  \
 | 
								G_ADD_PRIVATE (EekText)
 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_TEXT, EekTextPrivate))
 | 
					                        G_IMPLEMENT_INTERFACE (EEK_TYPE_SERIALIZABLE,
 | 
				
			||||||
 | 
					                                               eek_serializable_iface_init))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static EekSerializableIface *eek_text_parent_serializable_iface;
 | 
					static EekSerializableIface *eek_text_parent_serializable_iface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -55,7 +57,7 @@ static void
 | 
				
			|||||||
eek_text_real_serialize (EekSerializable *self,
 | 
					eek_text_real_serialize (EekSerializable *self,
 | 
				
			||||||
                         GVariantBuilder *builder)
 | 
					                         GVariantBuilder *builder)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekTextPrivate *priv = EEK_TEXT_GET_PRIVATE(self);
 | 
					    EekTextPrivate *priv = eek_text_get_instance_private (EEK_TEXT (self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_text_parent_serializable_iface->serialize (self, builder);
 | 
					    eek_text_parent_serializable_iface->serialize (self, builder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -67,7 +69,7 @@ eek_text_real_deserialize (EekSerializable *self,
 | 
				
			|||||||
                           GVariant        *variant,
 | 
					                           GVariant        *variant,
 | 
				
			||||||
                           gsize            index)
 | 
					                           gsize            index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekTextPrivate *priv = EEK_TEXT_GET_PRIVATE(self);
 | 
					    EekTextPrivate *priv = eek_text_get_instance_private (EEK_TEXT (self));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    index = eek_text_parent_serializable_iface->deserialize (self,
 | 
					    index = eek_text_parent_serializable_iface->deserialize (self,
 | 
				
			||||||
                                                             variant,
 | 
					                                                             variant,
 | 
				
			||||||
@ -93,7 +95,9 @@ eek_text_set_property (GObject      *object,
 | 
				
			|||||||
                       const GValue *value,
 | 
					                       const GValue *value,
 | 
				
			||||||
                       GParamSpec   *pspec)
 | 
					                       GParamSpec   *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekTextPrivate *priv = EEK_TEXT_GET_PRIVATE(object);
 | 
					    EekText        *self = EEK_TEXT (object);
 | 
				
			||||||
 | 
					    EekTextPrivate *priv = eek_text_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_TEXT:
 | 
					    case PROP_TEXT:
 | 
				
			||||||
        g_free (priv->text);
 | 
					        g_free (priv->text);
 | 
				
			||||||
@ -107,11 +111,13 @@ eek_text_set_property (GObject      *object,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_text_get_property (GObject    *object,
 | 
					eek_text_get_property (GObject    *object,
 | 
				
			||||||
                         guint       prop_id,
 | 
					                       guint       prop_id,
 | 
				
			||||||
                         GValue     *value,
 | 
					                       GValue     *value,
 | 
				
			||||||
                         GParamSpec *pspec)
 | 
					                       GParamSpec *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekTextPrivate *priv = EEK_TEXT_GET_PRIVATE(object);
 | 
					    EekText        *self = EEK_TEXT (object);
 | 
				
			||||||
 | 
					    EekTextPrivate *priv = eek_text_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_TEXT:
 | 
					    case PROP_TEXT:
 | 
				
			||||||
        g_value_set_string (value, priv->text);
 | 
					        g_value_set_string (value, priv->text);
 | 
				
			||||||
@ -125,7 +131,8 @@ eek_text_get_property (GObject    *object,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_text_finalize (GObject *object)
 | 
					eek_text_finalize (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekTextPrivate *priv = EEK_TEXT_GET_PRIVATE(object);
 | 
					    EekText        *self = EEK_TEXT (object);
 | 
				
			||||||
 | 
					    EekTextPrivate *priv = eek_text_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (priv->text);
 | 
					    g_free (priv->text);
 | 
				
			||||||
    G_OBJECT_CLASS (eek_text_parent_class)->finalize (object);
 | 
					    G_OBJECT_CLASS (eek_text_parent_class)->finalize (object);
 | 
				
			||||||
@ -137,8 +144,6 @@ eek_text_class_init (EekTextClass *klass)
 | 
				
			|||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec *pspec;
 | 
					    GParamSpec *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class, sizeof (EekTextPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gobject_class->set_property = eek_text_set_property;
 | 
					    gobject_class->set_property = eek_text_set_property;
 | 
				
			||||||
    gobject_class->get_property = eek_text_get_property;
 | 
					    gobject_class->get_property = eek_text_get_property;
 | 
				
			||||||
    gobject_class->finalize = eek_text_finalize;
 | 
					    gobject_class->finalize = eek_text_finalize;
 | 
				
			||||||
@ -154,7 +159,7 @@ eek_text_class_init (EekTextClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_text_init (EekText *self)
 | 
					eek_text_init (EekText *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEK_TEXT_GET_PRIVATE(self);
 | 
					    /* void */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EekText *
 | 
					EekText *
 | 
				
			||||||
@ -176,7 +181,7 @@ eek_text_new (const gchar *text)
 | 
				
			|||||||
const gchar *
 | 
					const gchar *
 | 
				
			||||||
eek_text_get_text (EekText *text)
 | 
					eek_text_get_text (EekText *text)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekTextPrivate *priv = EEK_TEXT_GET_PRIVATE(text);
 | 
					    EekTextPrivate *priv = eek_text_get_instance_private (text);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return priv->text;
 | 
					    return priv->text;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -30,27 +30,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_TEXT (eek_text_get_type())
 | 
					#define EEK_TYPE_TEXT (eek_text_get_type())
 | 
				
			||||||
#define EEK_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_TEXT, EekText))
 | 
					G_DECLARE_DERIVABLE_TYPE(EekText, eek_text, EEK, TEXT, EekSymbol)
 | 
				
			||||||
#define EEK_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_TEXT, EekTextClass))
 | 
					 | 
				
			||||||
#define EEK_IS_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_TEXT))
 | 
					 | 
				
			||||||
#define EEK_IS_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_TEXT))
 | 
					 | 
				
			||||||
#define EEK_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_TEXT, EekTextClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekTextClass EekTextClass;
 | 
					 | 
				
			||||||
typedef struct _EekTextPrivate EekTextPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * EekText:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The #EekText structure contains only private data and should only
 | 
					 | 
				
			||||||
 * be accessed using the provided API.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct _EekText {
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    EekSymbol parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekTextPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekTextClass {
 | 
					struct _EekTextClass {
 | 
				
			||||||
    /*< private >*/
 | 
					    /*< private >*/
 | 
				
			||||||
 | 
				
			|||||||
@ -89,9 +89,6 @@ static void eek_theme_node_finalize           (GObject                 *object);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static const EekColor BLACK_COLOR = { 0, 0, 0, 0xff };
 | 
					static const EekColor BLACK_COLOR = { 0, 0, 0, 0xff };
 | 
				
			||||||
static const EekColor TRANSPARENT_COLOR = { 0, 0, 0, 0 };
 | 
					static const EekColor TRANSPARENT_COLOR = { 0, 0, 0, 0 };
 | 
				
			||||||
static const EekColor DEFAULT_SUCCESS_COLOR = { 0x4e, 0x9a, 0x06, 0xff };
 | 
					 | 
				
			||||||
static const EekColor DEFAULT_WARNING_COLOR = { 0xf5, 0x79, 0x3e, 0xff };
 | 
					 | 
				
			||||||
static const EekColor DEFAULT_ERROR_COLOR = { 0xcc, 0x00, 0x00, 0xff };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eek_theme_node_init (EekThemeNode *self)
 | 
					eek_theme_node_init (EekThemeNode *self)
 | 
				
			||||||
 | 
				
			|||||||
@ -52,20 +52,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void initable_iface_init (GInitableIface *initable_iface);
 | 
					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 {
 | 
					enum {
 | 
				
			||||||
    PROP_0,
 | 
					    PROP_0,
 | 
				
			||||||
    PROP_DISPLAY,
 | 
					    PROP_DISPLAY,
 | 
				
			||||||
    PROP_LAST
 | 
					    PROP_LAST
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekXkbLayoutPrivate
 | 
					typedef struct _EekXkbLayoutPrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /* Configuration names that should synch'ed to the symbolic names
 | 
					    /* Configuration names that should synch'ed to the symbolic names
 | 
				
			||||||
       in priv->xkb->names.  Since we use GLib's memory allocator,
 | 
					       in priv->xkb->names.  Since we use GLib's memory allocator,
 | 
				
			||||||
@ -82,7 +75,13 @@ struct _EekXkbLayoutPrivate
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    gint scale_numerator;
 | 
					    gint scale_numerator;
 | 
				
			||||||
    gint scale_denominator;
 | 
					    gint scale_denominator;
 | 
				
			||||||
};
 | 
					} EekXkbLayoutPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_EXTENDED (EekXkbLayout, eek_xkb_layout, EEK_TYPE_LAYOUT,
 | 
				
			||||||
 | 
								0, /* GTypeFlags */
 | 
				
			||||||
 | 
								G_ADD_PRIVATE(EekXkbLayout)
 | 
				
			||||||
 | 
					                        G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
 | 
				
			||||||
 | 
					                                               initable_iface_init))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static guint    find_keycode             (EekXkbLayout *layout,
 | 
					static guint    find_keycode             (EekXkbLayout *layout,
 | 
				
			||||||
                                          gchar        *key_name);
 | 
					                                          gchar        *key_name);
 | 
				
			||||||
@ -101,7 +100,7 @@ G_INLINE_FUNC gint
 | 
				
			|||||||
xkb_to_pixmap_coord (EekXkbLayout *layout,
 | 
					xkb_to_pixmap_coord (EekXkbLayout *layout,
 | 
				
			||||||
                     gint          n)
 | 
					                     gint          n)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
    return n * priv->scale_numerator / priv->scale_denominator;
 | 
					    return n * priv->scale_numerator / priv->scale_denominator;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -109,7 +108,7 @@ G_INLINE_FUNC gdouble
 | 
				
			|||||||
xkb_to_pixmap_double (EekXkbLayout *layout,
 | 
					xkb_to_pixmap_double (EekXkbLayout *layout,
 | 
				
			||||||
                     gdouble       d)
 | 
					                     gdouble       d)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
    return d * priv->scale_numerator / priv->scale_denominator;
 | 
					    return d * priv->scale_numerator / priv->scale_denominator;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -127,7 +126,7 @@ create_key (EekXkbLayout *layout,
 | 
				
			|||||||
    XkbBoundsRec *xkbbounds;
 | 
					    XkbBoundsRec *xkbbounds;
 | 
				
			||||||
    XkbShapeRec *xkbshape;
 | 
					    XkbShapeRec *xkbshape;
 | 
				
			||||||
    XkbOutlineRec *xkboutline;
 | 
					    XkbOutlineRec *xkboutline;
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
    EekKey *key;
 | 
					    EekKey *key;
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    EekSymbolMatrix *matrix = NULL;
 | 
					    EekSymbolMatrix *matrix = NULL;
 | 
				
			||||||
@ -237,7 +236,7 @@ create_section (EekXkbLayout  *layout,
 | 
				
			|||||||
                XkbSectionRec *xkbsection)
 | 
					                XkbSectionRec *xkbsection)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    XkbGeometryRec *xkbgeometry;
 | 
					    XkbGeometryRec *xkbgeometry;
 | 
				
			||||||
    EekXkbLayoutPrivate *priv;
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
    EekSection *section;
 | 
					    EekSection *section;
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    gchar *name;
 | 
					    gchar *name;
 | 
				
			||||||
@ -249,7 +248,6 @@ create_section (EekXkbLayout  *layout,
 | 
				
			|||||||
    bounds.width = xkb_to_pixmap_coord(layout, xkbsection->width);
 | 
					    bounds.width = xkb_to_pixmap_coord(layout, xkbsection->width);
 | 
				
			||||||
    bounds.height = xkb_to_pixmap_coord(layout, xkbsection->height);
 | 
					    bounds.height = xkb_to_pixmap_coord(layout, xkbsection->height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    priv = layout->priv;
 | 
					 | 
				
			||||||
    xkbgeometry = priv->xkb->geom;
 | 
					    xkbgeometry = priv->xkb->geom;
 | 
				
			||||||
    section = eek_keyboard_create_section (keyboard);
 | 
					    section = eek_keyboard_create_section (keyboard);
 | 
				
			||||||
    name = XGetAtomName (priv->display, xkbsection->name);
 | 
					    name = XGetAtomName (priv->display, xkbsection->name);
 | 
				
			||||||
@ -293,7 +291,7 @@ create_section (EekXkbLayout  *layout,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
create_keyboard (EekXkbLayout *layout, EekKeyboard *keyboard)
 | 
					create_keyboard (EekXkbLayout *layout, EekKeyboard *keyboard)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
    XkbGeometryRec *xkbgeometry;
 | 
					    XkbGeometryRec *xkbgeometry;
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    gint i;
 | 
					    gint i;
 | 
				
			||||||
@ -337,7 +335,8 @@ eek_xkb_layout_real_create_keyboard (EekboardContextService *manager,
 | 
				
			|||||||
    eek_element_set_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
					    eek_element_set_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* resolve modifiers dynamically assigned at run time */
 | 
					    /* resolve modifiers dynamically assigned at run time */
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (
 | 
				
			||||||
 | 
							    EEK_XKB_LAYOUT(self));
 | 
				
			||||||
    eek_keyboard_set_num_lock_mask (keyboard,
 | 
					    eek_keyboard_set_num_lock_mask (keyboard,
 | 
				
			||||||
                                    XkbKeysymToModifiers (priv->display,
 | 
					                                    XkbKeysymToModifiers (priv->display,
 | 
				
			||||||
                                                          XK_Num_Lock));
 | 
					                                                          XK_Num_Lock));
 | 
				
			||||||
@ -358,7 +357,8 @@ eek_xkb_layout_real_create_keyboard (EekboardContextService *manager,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_xkb_layout_finalize (GObject *object)
 | 
					eek_xkb_layout_finalize (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = EEK_XKB_LAYOUT_GET_PRIVATE (object);
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (
 | 
				
			||||||
 | 
							    EEK_XKB_LAYOUT (object));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (priv->names.keycodes);
 | 
					    g_free (priv->names.keycodes);
 | 
				
			||||||
    g_free (priv->names.geometry);
 | 
					    g_free (priv->names.geometry);
 | 
				
			||||||
@ -374,10 +374,11 @@ eek_xkb_layout_set_property (GObject      *object,
 | 
				
			|||||||
                             GParamSpec   *pspec)
 | 
					                             GParamSpec   *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
 | 
					    EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
 | 
				
			||||||
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_DISPLAY:
 | 
					    case PROP_DISPLAY:
 | 
				
			||||||
        layout->priv->display = g_value_get_pointer (value);
 | 
					        priv->display = g_value_get_pointer (value);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
					        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
@ -392,10 +393,11 @@ eek_xkb_layout_get_property (GObject    *object,
 | 
				
			|||||||
                             GParamSpec *pspec)
 | 
					                             GParamSpec *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
 | 
					    EekXkbLayout *layout = EEK_XKB_LAYOUT (object);
 | 
				
			||||||
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_DISPLAY:
 | 
					    case PROP_DISPLAY:
 | 
				
			||||||
        g_value_set_pointer (value, layout->priv->display);
 | 
					        g_value_set_pointer (value, priv->display);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
					        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
@ -410,8 +412,6 @@ eek_xkb_layout_class_init (EekXkbLayoutClass *klass)
 | 
				
			|||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec *pspec;
 | 
					    GParamSpec *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class, sizeof (EekXkbLayoutPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    layout_class->create_keyboard = eek_xkb_layout_real_create_keyboard;
 | 
					    layout_class->create_keyboard = eek_xkb_layout_real_create_keyboard;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gobject_class->finalize = eek_xkb_layout_finalize;
 | 
					    gobject_class->finalize = eek_xkb_layout_finalize;
 | 
				
			||||||
@ -429,14 +429,14 @@ eek_xkb_layout_class_init (EekXkbLayoutClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_xkb_layout_init (EekXkbLayout *self)
 | 
					eek_xkb_layout_init (EekXkbLayout *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEK_XKB_LAYOUT_GET_PRIVATE (self);
 | 
					    /* void */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
get_names_from_server (EekXkbLayout *layout,
 | 
					get_names_from_server (EekXkbLayout *layout,
 | 
				
			||||||
                       GError      **error)
 | 
					                       GError      **error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
    gchar *name;
 | 
					    gchar *name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    XkbGetNames (priv->display, XkbAllNamesMask, priv->xkb);
 | 
					    XkbGetNames (priv->display, XkbAllNamesMask, priv->xkb);
 | 
				
			||||||
@ -516,19 +516,21 @@ eek_xkb_layout_set_names (EekXkbLayout         *layout,
 | 
				
			|||||||
                          XkbComponentNamesRec *names,
 | 
					                          XkbComponentNamesRec *names,
 | 
				
			||||||
                          GError              **error)
 | 
					                          GError              **error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (g_strcmp0 (names->keycodes, layout->priv->names.keycodes)) {
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
        g_free (layout->priv->names.keycodes);
 | 
					
 | 
				
			||||||
        layout->priv->names.keycodes = g_strdup (names->keycodes);
 | 
					    if (g_strcmp0 (names->keycodes, priv->names.keycodes)) {
 | 
				
			||||||
 | 
					        g_free (priv->names.keycodes);
 | 
				
			||||||
 | 
					        priv->names.keycodes = g_strdup (names->keycodes);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (g_strcmp0 (names->geometry, layout->priv->names.geometry)) {
 | 
					    if (g_strcmp0 (names->geometry, priv->names.geometry)) {
 | 
				
			||||||
        g_free (layout->priv->names.geometry);
 | 
					        g_free (priv->names.geometry);
 | 
				
			||||||
        layout->priv->names.geometry = g_strdup (names->geometry);
 | 
					        priv->names.geometry = g_strdup (names->geometry);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (g_strcmp0 (names->symbols, layout->priv->names.symbols)) {
 | 
					    if (g_strcmp0 (names->symbols, priv->names.symbols)) {
 | 
				
			||||||
        g_free (layout->priv->names.symbols);
 | 
					        g_free (priv->names.symbols);
 | 
				
			||||||
        layout->priv->names.symbols = g_strdup (names->symbols);
 | 
					        priv->names.symbols = g_strdup (names->symbols);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return get_keyboard_from_server (layout, error);
 | 
					    return get_keyboard_from_server (layout, error);
 | 
				
			||||||
@ -538,7 +540,7 @@ static gboolean
 | 
				
			|||||||
get_keyboard_from_server (EekXkbLayout *layout,
 | 
					get_keyboard_from_server (EekXkbLayout *layout,
 | 
				
			||||||
                          GError      **error)
 | 
					                          GError      **error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->xkb) {
 | 
					    if (priv->xkb) {
 | 
				
			||||||
        XkbFreeKeyboard (priv->xkb, 0, True);
 | 
					        XkbFreeKeyboard (priv->xkb, 0, True);
 | 
				
			||||||
@ -589,7 +591,7 @@ find_keycode (EekXkbLayout *layout, gchar *key_name)
 | 
				
			|||||||
    XkbKeyAliasPtr palias;
 | 
					    XkbKeyAliasPtr palias;
 | 
				
			||||||
    guint is_name_matched;
 | 
					    guint is_name_matched;
 | 
				
			||||||
    gchar *src, *dst;
 | 
					    gchar *src, *dst;
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!priv->xkb)
 | 
					    if (!priv->xkb)
 | 
				
			||||||
        return EEK_INVALID_KEYCODE;
 | 
					        return EEK_INVALID_KEYCODE;
 | 
				
			||||||
@ -642,7 +644,7 @@ setup_scaling (EekXkbLayout *layout,
 | 
				
			|||||||
               gdouble       width,
 | 
					               gdouble       width,
 | 
				
			||||||
               gdouble       height)
 | 
					               gdouble       height)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXkbLayoutPrivate *priv = layout->priv;
 | 
					    EekXkbLayoutPrivate *priv = eek_xkb_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_if_fail (priv->xkb);
 | 
					    g_return_if_fail (priv->xkb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -31,23 +31,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_XKB_LAYOUT (eek_xkb_layout_get_type())
 | 
					#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))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekXkbLayout, eek_xkb_layout, EEK, XKB_LAYOUT, EekLayout)
 | 
				
			||||||
#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
 | 
					struct _EekXkbLayoutClass
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -42,13 +42,6 @@ static GInitableIface *parent_initable_iface;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void initable_iface_init (GInitableIface *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 {
 | 
					enum {
 | 
				
			||||||
    PROP_0,
 | 
					    PROP_0,
 | 
				
			||||||
    PROP_MODEL,
 | 
					    PROP_MODEL,
 | 
				
			||||||
@ -58,11 +51,17 @@ enum {
 | 
				
			|||||||
    PROP_LAST
 | 
					    PROP_LAST
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekXklLayoutPrivate
 | 
					typedef struct _EekXklLayoutPrivate
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    XklEngine *engine;
 | 
					    XklEngine *engine;
 | 
				
			||||||
    XklConfigRec *config;
 | 
					    XklConfigRec *config;
 | 
				
			||||||
};
 | 
					} EekXklLayoutPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_EXTENDED (EekXklLayout, eek_xkl_layout, EEK_TYPE_XKB_LAYOUT,
 | 
				
			||||||
 | 
								0, /* GTypeFlags */
 | 
				
			||||||
 | 
								G_ADD_PRIVATE (EekXklLayout)
 | 
				
			||||||
 | 
					                        G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
 | 
				
			||||||
 | 
					                                               initable_iface_init))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* from gnome-keyboard-properties-xkbpv.c:
 | 
					/* from gnome-keyboard-properties-xkbpv.c:
 | 
				
			||||||
 *  BAD STYLE: Taken from xklavier_private_xkb.h
 | 
					 *  BAD STYLE: Taken from xklavier_private_xkb.h
 | 
				
			||||||
@ -83,7 +82,8 @@ static gboolean set_xkb_component_names (EekXklLayout *layout,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_xkl_layout_dispose (GObject *object)
 | 
					eek_xkl_layout_dispose (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (object);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (
 | 
				
			||||||
 | 
							    EEK_XKL_LAYOUT (object));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->config) {
 | 
					    if (priv->config) {
 | 
				
			||||||
        g_object_unref (priv->config);
 | 
					        g_object_unref (priv->config);
 | 
				
			||||||
@ -157,8 +157,6 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
 | 
				
			|||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec *pspec;
 | 
					    GParamSpec *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class, sizeof (EekXklLayoutPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gobject_class->dispose = eek_xkl_layout_dispose;
 | 
					    gobject_class->dispose = eek_xkl_layout_dispose;
 | 
				
			||||||
    gobject_class->set_property = eek_xkl_layout_set_property;
 | 
					    gobject_class->set_property = eek_xkl_layout_set_property;
 | 
				
			||||||
    gobject_class->get_property = eek_xkl_layout_get_property;
 | 
					    gobject_class->get_property = eek_xkl_layout_get_property;
 | 
				
			||||||
@ -215,7 +213,7 @@ eek_xkl_layout_class_init (EekXklLayoutClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_xkl_layout_init (EekXklLayout *self)
 | 
					eek_xkl_layout_init (EekXklLayout *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEK_XKL_LAYOUT_GET_PRIVATE (self);
 | 
					    /* void */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -266,7 +264,7 @@ gboolean
 | 
				
			|||||||
eek_xkl_layout_set_config (EekXklLayout *layout,
 | 
					eek_xkl_layout_set_config (EekXklLayout *layout,
 | 
				
			||||||
                           XklConfigRec *config)
 | 
					                           XklConfigRec *config)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
    XklConfigRec *c;
 | 
					    XklConfigRec *c;
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -329,7 +327,7 @@ gboolean
 | 
				
			|||||||
eek_xkl_layout_set_model (EekXklLayout *layout,
 | 
					eek_xkl_layout_set_model (EekXklLayout *layout,
 | 
				
			||||||
                          const gchar  *model)
 | 
					                          const gchar  *model)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
    XklConfigRec *config;
 | 
					    XklConfigRec *config;
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@ -357,7 +355,7 @@ gboolean
 | 
				
			|||||||
eek_xkl_layout_set_layouts (EekXklLayout *layout,
 | 
					eek_xkl_layout_set_layouts (EekXklLayout *layout,
 | 
				
			||||||
                            gchar       **layouts)
 | 
					                            gchar       **layouts)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
    XklConfigRec *config;
 | 
					    XklConfigRec *config;
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -385,7 +383,7 @@ gboolean
 | 
				
			|||||||
eek_xkl_layout_set_variants (EekXklLayout *layout,
 | 
					eek_xkl_layout_set_variants (EekXklLayout *layout,
 | 
				
			||||||
                             gchar       **variants)
 | 
					                             gchar       **variants)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
    XklConfigRec *config;
 | 
					    XklConfigRec *config;
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -413,7 +411,7 @@ gboolean
 | 
				
			|||||||
eek_xkl_layout_set_options (EekXklLayout *layout,
 | 
					eek_xkl_layout_set_options (EekXklLayout *layout,
 | 
				
			||||||
                            gchar       **options)
 | 
					                            gchar       **options)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
    XklConfigRec *config;
 | 
					    XklConfigRec *config;
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -497,7 +495,7 @@ eek_xkl_layout_disable_option (EekXklLayout *layout,
 | 
				
			|||||||
gchar *
 | 
					gchar *
 | 
				
			||||||
eek_xkl_layout_get_model (EekXklLayout *layout)
 | 
					eek_xkl_layout_get_model (EekXklLayout *layout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_val_if_fail (priv, NULL);
 | 
					    g_return_val_if_fail (priv, NULL);
 | 
				
			||||||
    return g_strdup (priv->config->model);
 | 
					    return g_strdup (priv->config->model);
 | 
				
			||||||
@ -513,7 +511,7 @@ eek_xkl_layout_get_model (EekXklLayout *layout)
 | 
				
			|||||||
gchar **
 | 
					gchar **
 | 
				
			||||||
eek_xkl_layout_get_layouts (EekXklLayout *layout)
 | 
					eek_xkl_layout_get_layouts (EekXklLayout *layout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_val_if_fail (priv, NULL);
 | 
					    g_return_val_if_fail (priv, NULL);
 | 
				
			||||||
    return g_strdupv (priv->config->layouts);
 | 
					    return g_strdupv (priv->config->layouts);
 | 
				
			||||||
@ -529,7 +527,7 @@ eek_xkl_layout_get_layouts (EekXklLayout *layout)
 | 
				
			|||||||
gchar **
 | 
					gchar **
 | 
				
			||||||
eek_xkl_layout_get_variants (EekXklLayout *layout)
 | 
					eek_xkl_layout_get_variants (EekXklLayout *layout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_val_if_fail (priv, NULL);
 | 
					    g_return_val_if_fail (priv, NULL);
 | 
				
			||||||
    return g_strdupv (priv->config->variants);
 | 
					    return g_strdupv (priv->config->variants);
 | 
				
			||||||
@ -545,7 +543,7 @@ eek_xkl_layout_get_variants (EekXklLayout *layout)
 | 
				
			|||||||
gchar **
 | 
					gchar **
 | 
				
			||||||
eek_xkl_layout_get_options (EekXklLayout *layout)
 | 
					eek_xkl_layout_get_options (EekXklLayout *layout)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = EEK_XKL_LAYOUT_GET_PRIVATE (layout);
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_val_if_fail (priv, NULL);
 | 
					    g_return_val_if_fail (priv, NULL);
 | 
				
			||||||
    return g_strdupv (priv->config->options);
 | 
					    return g_strdupv (priv->config->options);
 | 
				
			||||||
@ -554,7 +552,7 @@ eek_xkl_layout_get_options (EekXklLayout *layout)
 | 
				
			|||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
set_xkb_component_names (EekXklLayout *layout, XklConfigRec *config)
 | 
					set_xkb_component_names (EekXklLayout *layout, XklConfigRec *config)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayoutPrivate *priv = layout->priv;
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
    XkbComponentNamesRec names;
 | 
					    XkbComponentNamesRec names;
 | 
				
			||||||
    gboolean retval = FALSE;
 | 
					    gboolean retval = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -628,21 +626,22 @@ initable_init (GInitable    *initable,
 | 
				
			|||||||
               GError      **error)
 | 
					               GError      **error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXklLayout *layout = EEK_XKL_LAYOUT (initable);
 | 
					    EekXklLayout *layout = EEK_XKL_LAYOUT (initable);
 | 
				
			||||||
 | 
					    EekXklLayoutPrivate *priv = eek_xkl_layout_get_instance_private (layout);
 | 
				
			||||||
    Display *display;
 | 
					    Display *display;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!parent_initable_iface->init (initable, cancellable, error))
 | 
					    if (!parent_initable_iface->init (initable, cancellable, error))
 | 
				
			||||||
        return FALSE;
 | 
					        return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    layout->priv->config = xkl_config_rec_new ();
 | 
					    priv->config = xkl_config_rec_new ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_object_get (G_OBJECT (initable),
 | 
					    g_object_get (G_OBJECT (initable),
 | 
				
			||||||
                  "display", &display,
 | 
					                  "display", &display,
 | 
				
			||||||
                  NULL);
 | 
					                  NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    layout->priv->engine = xkl_engine_get_instance (display);
 | 
					    priv->engine = xkl_engine_get_instance (display);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!xkl_config_rec_get_from_server (layout->priv->config,
 | 
					    if (!xkl_config_rec_get_from_server (priv->config,
 | 
				
			||||||
                                         layout->priv->engine)) {
 | 
					                                         priv->engine)) {
 | 
				
			||||||
        g_set_error (error,
 | 
					        g_set_error (error,
 | 
				
			||||||
                     EEK_ERROR,
 | 
					                     EEK_ERROR,
 | 
				
			||||||
                     EEK_ERROR_LAYOUT_ERROR,
 | 
					                     EEK_ERROR_LAYOUT_ERROR,
 | 
				
			||||||
@ -650,7 +649,7 @@ initable_init (GInitable    *initable,
 | 
				
			|||||||
        return FALSE;
 | 
					        return FALSE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    set_xkb_component_names (layout, layout->priv->config);
 | 
					    set_xkb_component_names (layout, priv->config);
 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -31,23 +31,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_XKL_LAYOUT (eek_xkl_layout_get_type())
 | 
					#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))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekXklLayout, eek_xkl_layout, EEK, XKL_LAYOUT, EekLayout)
 | 
				
			||||||
#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
 | 
					struct _EekXklLayoutClass
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -43,19 +43,18 @@ enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void initable_iface_init (GInitableIface *initable_iface);
 | 
					static void initable_iface_init (GInitableIface *initable_iface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE_WITH_CODE (EekXmlLayout, eek_xml_layout, EEK_TYPE_LAYOUT,
 | 
					typedef struct _EekXmlLayoutPrivate
 | 
				
			||||||
                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
 | 
					 | 
				
			||||||
                                                initable_iface_init));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEK_XML_LAYOUT_GET_PRIVATE(obj)                                  \
 | 
					 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEK_TYPE_XML_LAYOUT, EekXmlLayoutPrivate))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekXmlLayoutPrivate
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    gchar *id;
 | 
					    gchar *id;
 | 
				
			||||||
    gchar *keyboards_dir;
 | 
					    gchar *keyboards_dir;
 | 
				
			||||||
    EekXmlKeyboardDesc *desc;
 | 
					    EekXmlKeyboardDesc *desc;
 | 
				
			||||||
};
 | 
					} EekXmlLayoutPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_EXTENDED (EekXmlLayout, eek_xml_layout, EEK_TYPE_LAYOUT,
 | 
				
			||||||
 | 
								0, /* GTypeFlags */
 | 
				
			||||||
 | 
								G_ADD_PRIVATE(EekXmlLayout)
 | 
				
			||||||
 | 
					                        G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
 | 
				
			||||||
 | 
					                                               initable_iface_init))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_BOXED_TYPE(EekXmlKeyboardDesc, eek_xml_keyboard_desc, eek_xml_keyboard_desc_copy, eek_xml_keyboard_desc_free);
 | 
					G_DEFINE_BOXED_TYPE(EekXmlKeyboardDesc, eek_xml_keyboard_desc, eek_xml_keyboard_desc_copy, eek_xml_keyboard_desc_free);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -903,6 +902,7 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
 | 
				
			|||||||
                                     gdouble    initial_height)
 | 
					                                     gdouble    initial_height)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXmlLayout *layout = EEK_XML_LAYOUT (self);
 | 
					    EekXmlLayout *layout = EEK_XML_LAYOUT (self);
 | 
				
			||||||
 | 
					    EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (layout);
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Create an empty keyboard to which geometry and symbols
 | 
					    /* Create an empty keyboard to which geometry and symbols
 | 
				
			||||||
@ -911,8 +911,8 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
 | 
				
			|||||||
    keyboard->manager = manager;
 | 
					    keyboard->manager = manager;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Read geometry information. */
 | 
					    /* Read geometry information. */
 | 
				
			||||||
    gchar *filename = g_strdup_printf ("%s.xml", layout->priv->desc->geometry);
 | 
					    gchar *filename = g_strdup_printf ("%s.xml", priv->desc->geometry);
 | 
				
			||||||
    gchar *path = g_build_filename (layout->priv->keyboards_dir, "geometry", filename, NULL);
 | 
					    gchar *path = g_build_filename (priv->keyboards_dir, "geometry", filename, NULL);
 | 
				
			||||||
    g_free (filename);
 | 
					    g_free (filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GError *error = NULL;
 | 
					    GError *error = NULL;
 | 
				
			||||||
@ -921,7 +921,7 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
 | 
				
			|||||||
    if (!retval) {
 | 
					    if (!retval) {
 | 
				
			||||||
        g_object_unref (keyboard);
 | 
					        g_object_unref (keyboard);
 | 
				
			||||||
        g_warning ("can't parse geometry file %s: %s",
 | 
					        g_warning ("can't parse geometry file %s: %s",
 | 
				
			||||||
                   layout->priv->desc->geometry,
 | 
					                   priv->desc->geometry,
 | 
				
			||||||
                   error->message);
 | 
					                   error->message);
 | 
				
			||||||
        g_error_free (error);
 | 
					        g_error_free (error);
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
@ -929,8 +929,8 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* Read symbols information. */
 | 
					    /* Read symbols information. */
 | 
				
			||||||
    GList *loaded = NULL;
 | 
					    GList *loaded = NULL;
 | 
				
			||||||
    retval = parse_symbols_with_prerequisites (layout->priv->keyboards_dir,
 | 
					    retval = parse_symbols_with_prerequisites (priv->keyboards_dir,
 | 
				
			||||||
                                               layout->priv->desc->symbols,
 | 
					                                               priv->desc->symbols,
 | 
				
			||||||
                                               keyboard,
 | 
					                                               keyboard,
 | 
				
			||||||
                                               &loaded,
 | 
					                                               &loaded,
 | 
				
			||||||
                                               &error);
 | 
					                                               &error);
 | 
				
			||||||
@ -938,7 +938,7 @@ eek_xml_layout_real_create_keyboard (EekboardContextService *manager,
 | 
				
			|||||||
    if (!retval) {
 | 
					    if (!retval) {
 | 
				
			||||||
        g_object_unref (keyboard);
 | 
					        g_object_unref (keyboard);
 | 
				
			||||||
        g_warning ("can't parse symbols file %s: %s",
 | 
					        g_warning ("can't parse symbols file %s: %s",
 | 
				
			||||||
                   layout->priv->desc->symbols,
 | 
					                   priv->desc->symbols,
 | 
				
			||||||
                   error->message);
 | 
					                   error->message);
 | 
				
			||||||
        g_error_free (error);
 | 
					        g_error_free (error);
 | 
				
			||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
@ -961,10 +961,12 @@ eek_xml_layout_set_property (GObject      *object,
 | 
				
			|||||||
                             GParamSpec   *pspec)
 | 
					                             GParamSpec   *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXmlLayout *layout = EEK_XML_LAYOUT (object);
 | 
					    EekXmlLayout *layout = EEK_XML_LAYOUT (object);
 | 
				
			||||||
 | 
					    EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_ID:
 | 
					    case PROP_ID:
 | 
				
			||||||
        g_free (layout->priv->id);
 | 
					        g_free (priv->id);
 | 
				
			||||||
        layout->priv->id = g_value_dup_string (value);
 | 
					        priv->id = g_value_dup_string (value);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
					        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
@ -979,9 +981,11 @@ eek_xml_layout_get_property (GObject    *object,
 | 
				
			|||||||
                             GParamSpec *pspec)
 | 
					                             GParamSpec *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXmlLayout *layout = EEK_XML_LAYOUT (object);
 | 
					    EekXmlLayout *layout = EEK_XML_LAYOUT (object);
 | 
				
			||||||
 | 
					    EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (layout);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_ID:
 | 
					    case PROP_ID:
 | 
				
			||||||
        g_value_set_string (value, layout->priv->id);
 | 
					        g_value_set_string (value, priv->id);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
					        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
@ -992,7 +996,8 @@ eek_xml_layout_get_property (GObject    *object,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_xml_layout_finalize (GObject *object)
 | 
					eek_xml_layout_finalize (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXmlLayoutPrivate *priv = EEK_XML_LAYOUT_GET_PRIVATE (object);
 | 
					    EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (
 | 
				
			||||||
 | 
							    EEK_XML_LAYOUT (object));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (priv->id);
 | 
					    g_free (priv->id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1011,8 +1016,6 @@ eek_xml_layout_class_init (EekXmlLayoutClass *klass)
 | 
				
			|||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec *pspec;
 | 
					    GParamSpec *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class, sizeof (EekXmlLayoutPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    layout_class->create_keyboard = eek_xml_layout_real_create_keyboard;
 | 
					    layout_class->create_keyboard = eek_xml_layout_real_create_keyboard;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gobject_class->set_property = eek_xml_layout_set_property;
 | 
					    gobject_class->set_property = eek_xml_layout_set_property;
 | 
				
			||||||
@ -1031,7 +1034,7 @@ eek_xml_layout_class_init (EekXmlLayoutClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eek_xml_layout_init (EekXmlLayout *self)
 | 
					eek_xml_layout_init (EekXmlLayout *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEK_XML_LAYOUT_GET_PRIVATE (self);
 | 
					    /* void */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EekLayout *
 | 
					EekLayout *
 | 
				
			||||||
@ -1050,16 +1053,17 @@ initable_init (GInitable    *initable,
 | 
				
			|||||||
               GError      **error)
 | 
					               GError      **error)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekXmlLayout *layout = EEK_XML_LAYOUT (initable);
 | 
					    EekXmlLayout *layout = EEK_XML_LAYOUT (initable);
 | 
				
			||||||
 | 
					    EekXmlLayoutPrivate *priv = eek_xml_layout_get_instance_private (layout);
 | 
				
			||||||
    GList *keyboards, *p;
 | 
					    GList *keyboards, *p;
 | 
				
			||||||
    gchar *path;
 | 
					    gchar *path;
 | 
				
			||||||
    EekXmlKeyboardDesc *desc;
 | 
					    EekXmlKeyboardDesc *desc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    layout->priv->keyboards_dir = (gchar *) g_getenv ("EEKBOARD_KEYBOARDSDIR");
 | 
					    priv->keyboards_dir = (gchar *) g_getenv ("EEKBOARD_KEYBOARDSDIR");
 | 
				
			||||||
    if (layout->priv->keyboards_dir == NULL)
 | 
					    if (priv->keyboards_dir == NULL)
 | 
				
			||||||
        layout->priv->keyboards_dir = KEYBOARDSDIR;
 | 
					        priv->keyboards_dir = KEYBOARDSDIR;
 | 
				
			||||||
    layout->priv->keyboards_dir = g_strdup (layout->priv->keyboards_dir);
 | 
					    priv->keyboards_dir = g_strdup (priv->keyboards_dir);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    path = g_build_filename (layout->priv->keyboards_dir, "keyboards.xml", NULL);
 | 
					    path = g_build_filename (priv->keyboards_dir, "keyboards.xml", NULL);
 | 
				
			||||||
    keyboards = parse_keyboards (path, error);
 | 
					    keyboards = parse_keyboards (path, error);
 | 
				
			||||||
    g_free (path);
 | 
					    g_free (path);
 | 
				
			||||||
    if (error && *error)
 | 
					    if (error && *error)
 | 
				
			||||||
@ -1067,7 +1071,7 @@ initable_init (GInitable    *initable,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    for (p = keyboards; p; p = p->next) {
 | 
					    for (p = keyboards; p; p = p->next) {
 | 
				
			||||||
        desc = p->data;
 | 
					        desc = p->data;
 | 
				
			||||||
        if (g_strcmp0 (desc->id, layout->priv->id) == 0)
 | 
					        if (g_strcmp0 (desc->id, priv->id) == 0)
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (p == NULL) {
 | 
					    if (p == NULL) {
 | 
				
			||||||
@ -1075,12 +1079,12 @@ initable_init (GInitable    *initable,
 | 
				
			|||||||
                     EEK_ERROR,
 | 
					                     EEK_ERROR,
 | 
				
			||||||
                     EEK_ERROR_LAYOUT_ERROR,
 | 
					                     EEK_ERROR_LAYOUT_ERROR,
 | 
				
			||||||
                     "no such keyboard %s",
 | 
					                     "no such keyboard %s",
 | 
				
			||||||
                     layout->priv->id);
 | 
					                     priv->id);
 | 
				
			||||||
        return FALSE;
 | 
					        return FALSE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    keyboards = g_list_remove_link (keyboards, p);
 | 
					    keyboards = g_list_remove_link (keyboards, p);
 | 
				
			||||||
    layout->priv->desc = p->data;
 | 
					    priv->desc = p->data;
 | 
				
			||||||
    g_list_free_1 (p);
 | 
					    g_list_free_1 (p);
 | 
				
			||||||
    g_list_free_full (keyboards, (GDestroyNotify) keyboard_desc_free);
 | 
					    g_list_free_full (keyboards, (GDestroyNotify) keyboard_desc_free);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -29,29 +29,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEK_TYPE_XML_LAYOUT (eek_xml_layout_get_type())
 | 
					#define EEK_TYPE_XML_LAYOUT (eek_xml_layout_get_type())
 | 
				
			||||||
#define EEK_XML_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEK_TYPE_XML_LAYOUT, EekXmlLayout))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekXmlLayout, eek_xml_layout, EEK, XML_LAYOUT, EekLayout)
 | 
				
			||||||
#define EEK_XML_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEK_TYPE_XML_LAYOUT, EekXmlLayoutClass))
 | 
					 | 
				
			||||||
#define EEK_IS_XML_LAYOUT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEK_TYPE_XML_LAYOUT))
 | 
					 | 
				
			||||||
#define EEK_IS_XML_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEK_TYPE_XML_LAYOUT))
 | 
					 | 
				
			||||||
#define EEK_XML_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEK_TYPE_XML_LAYOUT, EekXmlLayoutClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekXmlLayout        EekXmlLayout;
 | 
					 | 
				
			||||||
typedef struct _EekXmlLayoutClass   EekXmlLayoutClass;
 | 
					 | 
				
			||||||
typedef struct _EekXmlLayoutPrivate EekXmlLayoutPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * EekXmlLayout:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The #EekXmlLayout structure contains only private data and should
 | 
					 | 
				
			||||||
 * only be accessed using the provided API.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct _EekXmlLayout
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    EekLayout parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekXmlLayoutPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * EekXmlLayoutClass:
 | 
					 * EekXmlLayoutClass:
 | 
				
			||||||
 | 
				
			|||||||
@ -38,9 +38,5 @@
 | 
				
			|||||||
void
 | 
					void
 | 
				
			||||||
eek_init (void)
 | 
					eek_init (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_type_init ();
 | 
					    /* void */
 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_type_class_ref (EEK_TYPE_SYMBOL);
 | 
					 | 
				
			||||||
    g_type_class_ref (EEK_TYPE_KEYSYM);
 | 
					 | 
				
			||||||
    g_type_class_ref (EEK_TYPE_TEXT);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,136 +0,0 @@
 | 
				
			|||||||
# Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
 | 
					 | 
				
			||||||
# Copyright (C) 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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
NULL =
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
lib_LTLIBRARIES = libeekboard.la
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeekboard_headers =				\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-service.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-context-service.h	\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-client.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-context.h		\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-xklutil.h		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeekboard_private_headers =			\
 | 
					 | 
				
			||||||
	$(builddir)/eekboard-marshalers.h	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeekboard_sources =				\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-service.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-context-service.c	\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-client.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-context.c		\
 | 
					 | 
				
			||||||
	$(srcdir)/eekboard-xklutil.c		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeekboard_marshalers_sources =		\
 | 
					 | 
				
			||||||
	$(builddir)/eekboard-marshalers.c	\
 | 
					 | 
				
			||||||
	$(builddir)/eekboard-marshalers.h	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BUILT_SOURCES =					\
 | 
					 | 
				
			||||||
	$(libeekboard_marshalers_sources)	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeekboard_la_SOURCES =			\
 | 
					 | 
				
			||||||
	$(libeekboard_sources)			\
 | 
					 | 
				
			||||||
	$(builddir)/eekboard-marshalers.c	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libeekboard_la_CFLAGS =					\
 | 
					 | 
				
			||||||
	-DEEKBOARD_COMPILATION=1			\
 | 
					 | 
				
			||||||
	-DKEYBOARDDIR=\"$(pkgdatadir)/keyboards\"	\
 | 
					 | 
				
			||||||
	-I$(top_srcdir)					\
 | 
					 | 
				
			||||||
	$(GIO2_CFLAGS)					\
 | 
					 | 
				
			||||||
	$(LIBXKLAVIER_CFLAGS)				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
libeekboard_la_LIBADD =				\
 | 
					 | 
				
			||||||
	$(top_builddir)/eek/libeek.la		\
 | 
					 | 
				
			||||||
	$(top_builddir)/eek/libeek-xkl.la	\
 | 
					 | 
				
			||||||
	$(GIO2_LIBS)				\
 | 
					 | 
				
			||||||
	$(LIBXKLAVIER_LIBS)			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard
 | 
					 | 
				
			||||||
eekboard_HEADERS = $(libeekboard_headers)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
					 | 
				
			||||||
pkgconfig_DATA =				\
 | 
					 | 
				
			||||||
	eekboard-$(EEK_API_VERSION).pc		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
DISTCLEANFILES =				\
 | 
					 | 
				
			||||||
	$(BUILT_SOURCES)			\
 | 
					 | 
				
			||||||
	$(pkgconfig_DATA)			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLEANFILES =
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
EXTRA_DIST = eekboard-marshalers.list
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# gen marshal
 | 
					 | 
				
			||||||
eekboard-marshalers.h: eekboard-marshalers.list
 | 
					 | 
				
			||||||
	$(AM_V_GEN) $(GLIB_GENMARSHAL) \
 | 
					 | 
				
			||||||
		--prefix=_eekboard_marshal \
 | 
					 | 
				
			||||||
		$(srcdir)/eekboard-marshalers.list --header --internal \
 | 
					 | 
				
			||||||
		> $@.tmp && \
 | 
					 | 
				
			||||||
	mv $@.tmp $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard-marshalers.c: eekboard-marshalers.list eekboard-marshalers.h
 | 
					 | 
				
			||||||
	$(AM_V_GEN) (echo "#include \"eekboard-marshalers.h\""; \
 | 
					 | 
				
			||||||
	$(GLIB_GENMARSHAL) \
 | 
					 | 
				
			||||||
		--prefix=_eekboard_marshal \
 | 
					 | 
				
			||||||
		$(srcdir)/eekboard-marshalers.list --body --internal) \
 | 
					 | 
				
			||||||
		> $@.tmp && \
 | 
					 | 
				
			||||||
	mv $@.tmp $@
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(INTROSPECTION_MAKEFILE)
 | 
					 | 
				
			||||||
INTROSPECTION_GIRS =
 | 
					 | 
				
			||||||
INTROSPECTION_SCANNER_ARGS =			\
 | 
					 | 
				
			||||||
	--add-include-path=$(builddir)		\
 | 
					 | 
				
			||||||
	--add-include-path=$(top_builddir)/eek	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
INTROSPECTION_COMPILER_ARGS =			\
 | 
					 | 
				
			||||||
	--includedir=$(builddir)		\
 | 
					 | 
				
			||||||
	--includedir=$(top_builddir)/eek	\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if HAVE_INTROSPECTION
 | 
					 | 
				
			||||||
Eekboard@EEK_LIBRARY_SUFFIX@.gir: libeekboard.la
 | 
					 | 
				
			||||||
Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS =	\
 | 
					 | 
				
			||||||
	--identifier-prefix=Eekboard			\
 | 
					 | 
				
			||||||
	--symbol-prefix=eekboard			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = Eek@EEK_LIBRARY_SUFFIX@
 | 
					 | 
				
			||||||
Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_CFLAGS = $(libeekboard_la_CFLAGS)
 | 
					 | 
				
			||||||
Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_LIBS = libeekboard.la
 | 
					 | 
				
			||||||
Eekboard@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeekboard_sources) $(libeekboard_headers)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INTROSPECTION_GIRS += Eekboard@EEK_LIBRARY_SUFFIX@.gir
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
girdir = $(datadir)/gir-1.0
 | 
					 | 
				
			||||||
gir_DATA = $(INTROSPECTION_GIRS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typelibdir = $(libdir)/girepository-1.0
 | 
					 | 
				
			||||||
typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
CLEANFILES += $(gir_DATA) $(typelib_DATA)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -36,15 +36,12 @@ enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static guint signals[LAST_SIGNAL] = { 0, };
 | 
					static guint signals[LAST_SIGNAL] = { 0, };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE (EekboardClient, eekboard_client, G_TYPE_DBUS_PROXY);
 | 
					typedef struct _EekboardClientPrivate
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEKBOARD_CLIENT_GET_PRIVATE(obj)                                \
 | 
					 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEKBOARD_TYPE_CLIENT, EekboardClientPrivate))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekboardClientPrivate
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GHashTable *context_hash;
 | 
					    GHashTable *context_hash;
 | 
				
			||||||
};
 | 
					} EekboardClientPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekboardClient, eekboard_client, G_TYPE_DBUS_PROXY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void send_destroy_context (EekboardClient  *client,
 | 
					static void send_destroy_context (EekboardClient  *client,
 | 
				
			||||||
                                  EekboardContext *context,
 | 
					                                  EekboardContext *context,
 | 
				
			||||||
@ -53,7 +50,7 @@ static void send_destroy_context (EekboardClient  *client,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_client_real_destroyed (EekboardClient *self)
 | 
					eekboard_client_real_destroyed (EekboardClient *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardClientPrivate *priv = EEKBOARD_CLIENT_GET_PRIVATE(self);
 | 
					    EekboardClientPrivate *priv = eekboard_client_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // g_debug ("eekboard_client_real_destroyed");
 | 
					    // g_debug ("eekboard_client_real_destroyed");
 | 
				
			||||||
    g_hash_table_remove_all (priv->context_hash);
 | 
					    g_hash_table_remove_all (priv->context_hash);
 | 
				
			||||||
@ -63,7 +60,7 @@ static void
 | 
				
			|||||||
eekboard_client_dispose (GObject *object)
 | 
					eekboard_client_dispose (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardClient *client = EEKBOARD_CLIENT(object);
 | 
					    EekboardClient *client = EEKBOARD_CLIENT(object);
 | 
				
			||||||
    EekboardClientPrivate *priv = EEKBOARD_CLIENT_GET_PRIVATE(client);
 | 
					    EekboardClientPrivate *priv = eekboard_client_get_instance_private (client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->context_hash) {
 | 
					    if (priv->context_hash) {
 | 
				
			||||||
        GHashTableIter iter;
 | 
					        GHashTableIter iter;
 | 
				
			||||||
@ -86,9 +83,6 @@ eekboard_client_class_init (EekboardClientClass *klass)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekboardClientPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    klass->destroyed = eekboard_client_real_destroyed;
 | 
					    klass->destroyed = eekboard_client_real_destroyed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gobject_class->dispose = eekboard_client_dispose;
 | 
					    gobject_class->dispose = eekboard_client_dispose;
 | 
				
			||||||
@ -115,8 +109,9 @@ eekboard_client_class_init (EekboardClientClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_client_init (EekboardClient *self)
 | 
					eekboard_client_init (EekboardClient *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEKBOARD_CLIENT_GET_PRIVATE(self);
 | 
					    EekboardClientPrivate *priv = eekboard_client_get_instance_private (self);
 | 
				
			||||||
    self->priv->context_hash =
 | 
					
 | 
				
			||||||
 | 
					    priv->context_hash =
 | 
				
			||||||
        g_hash_table_new_full (g_str_hash,
 | 
					        g_hash_table_new_full (g_str_hash,
 | 
				
			||||||
                               g_str_equal,
 | 
					                               g_str_equal,
 | 
				
			||||||
                               (GDestroyNotify)g_free,
 | 
					                               (GDestroyNotify)g_free,
 | 
				
			||||||
@ -189,7 +184,9 @@ on_context_destroyed (EekboardContext *context,
 | 
				
			|||||||
                      gpointer         user_data)
 | 
					                      gpointer         user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardClient *client = user_data;
 | 
					    EekboardClient *client = user_data;
 | 
				
			||||||
    g_hash_table_remove (client->priv->context_hash,
 | 
					    EekboardClientPrivate *priv = eekboard_client_get_instance_private (client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_hash_table_remove (priv->context_hash,
 | 
				
			||||||
                         g_dbus_proxy_get_object_path (G_DBUS_PROXY(context)));
 | 
					                         g_dbus_proxy_get_object_path (G_DBUS_PROXY(context)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -239,7 +236,9 @@ eekboard_client_create_context (EekboardClient *client,
 | 
				
			|||||||
        return NULL;
 | 
					        return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_hash_table_insert (client->priv->context_hash,
 | 
					    EekboardClientPrivate *priv = eekboard_client_get_instance_private (client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_hash_table_insert (priv->context_hash,
 | 
				
			||||||
                         g_strdup (object_path),
 | 
					                         g_strdup (object_path),
 | 
				
			||||||
                         g_object_ref (context));
 | 
					                         g_object_ref (context));
 | 
				
			||||||
    g_signal_connect (context, "destroyed",
 | 
					    g_signal_connect (context, "destroyed",
 | 
				
			||||||
@ -284,9 +283,11 @@ eekboard_client_push_context (EekboardClient  *client,
 | 
				
			|||||||
    g_return_if_fail (EEKBOARD_IS_CLIENT(client));
 | 
					    g_return_if_fail (EEKBOARD_IS_CLIENT(client));
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekboardClientPrivate *priv = eekboard_client_get_instance_private (client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object_path = g_dbus_proxy_get_object_path (G_DBUS_PROXY(context));
 | 
					    object_path = g_dbus_proxy_get_object_path (G_DBUS_PROXY(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    context = g_hash_table_lookup (client->priv->context_hash,
 | 
					    context = g_hash_table_lookup (priv->context_hash,
 | 
				
			||||||
                                   object_path);
 | 
					                                   object_path);
 | 
				
			||||||
    if (!context)
 | 
					    if (!context)
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@ -394,8 +395,10 @@ eekboard_client_destroy_context (EekboardClient  *client,
 | 
				
			|||||||
    g_return_if_fail (EEKBOARD_IS_CLIENT(client));
 | 
					    g_return_if_fail (EEKBOARD_IS_CLIENT(client));
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    EekboardClientPrivate *priv = eekboard_client_get_instance_private (client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    object_path = g_dbus_proxy_get_object_path (G_DBUS_PROXY(context));
 | 
					    object_path = g_dbus_proxy_get_object_path (G_DBUS_PROXY(context));
 | 
				
			||||||
    g_hash_table_remove (client->priv->context_hash, object_path);
 | 
					    g_hash_table_remove (priv->context_hash, object_path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    send_destroy_context (client, context, cancellable);
 | 
					    send_destroy_context (client, context, cancellable);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -26,22 +26,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEKBOARD_TYPE_CLIENT (eekboard_client_get_type())
 | 
					#define EEKBOARD_TYPE_CLIENT (eekboard_client_get_type())
 | 
				
			||||||
#define EEKBOARD_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEKBOARD_TYPE_CLIENT, EekboardClient))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekboardClient, eekboard_client, EEKBOARD, CLIENT, GDBusProxy)
 | 
				
			||||||
#define EEKBOARD_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEKBOARD_TYPE_CLIENT, EekboardClientClass))
 | 
					 | 
				
			||||||
#define EEKBOARD_IS_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEKBOARD_TYPE_CLIENT))
 | 
					 | 
				
			||||||
#define EEKBOARD_IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEKBOARD_TYPE_CLIENT))
 | 
					 | 
				
			||||||
#define EEKBOARD_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEKBOARD_TYPE_CLIENT, EekboardClientClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekboardClient EekboardClient;
 | 
					 | 
				
			||||||
typedef struct _EekboardClientClass EekboardClientClass;
 | 
					 | 
				
			||||||
typedef struct _EekboardClientPrivate EekboardClientPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekboardClient {
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    GDBusProxy parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekboardClientPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekboardClientClass {
 | 
					struct _EekboardClientClass {
 | 
				
			||||||
    /*< private >*/
 | 
					    /*< private >*/
 | 
				
			||||||
 | 
				
			|||||||
@ -82,9 +82,9 @@ struct _EekboardContextServicePrivate {
 | 
				
			|||||||
    GSettings *settings;
 | 
					    GSettings *settings;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE (EekboardContextService, eekboard_context_service, G_TYPE_OBJECT);
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekboardContextService, eekboard_context_service, G_TYPE_OBJECT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Display *display = NULL;
 | 
					/*static Display *display = NULL; */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static EekKeyboard *
 | 
					static EekKeyboard *
 | 
				
			||||||
eekboard_context_service_real_create_keyboard (EekboardContextService *self,
 | 
					eekboard_context_service_real_create_keyboard (EekboardContextService *self,
 | 
				
			||||||
@ -356,9 +356,6 @@ eekboard_context_service_class_init (EekboardContextServiceClass *klass)
 | 
				
			|||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec *pspec;
 | 
					    GParamSpec *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekboardContextServicePrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    klass->create_keyboard = eekboard_context_service_real_create_keyboard;
 | 
					    klass->create_keyboard = eekboard_context_service_real_create_keyboard;
 | 
				
			||||||
    klass->show_keyboard = eekboard_context_service_real_show_keyboard;
 | 
					    klass->show_keyboard = eekboard_context_service_real_show_keyboard;
 | 
				
			||||||
    klass->hide_keyboard = eekboard_context_service_real_hide_keyboard;
 | 
					    klass->hide_keyboard = eekboard_context_service_real_hide_keyboard;
 | 
				
			||||||
@ -483,51 +480,6 @@ eekboard_context_service_init (EekboardContextService *self)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean on_repeat_timeout (EekboardContextService *context);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean
 | 
					 | 
				
			||||||
on_repeat_timeout (EekboardContextService *context)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    guint delay = 500; // ms
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // hardcoding; needs to connect to yet another settings path because
 | 
					 | 
				
			||||||
    // org.gnome.desktop.input-sources doesn't control repeating
 | 
					 | 
				
			||||||
    //g_settings_get (context->priv->settings, "repeat-interval", "u", &delay);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    context->priv->repeat_timeout_id =
 | 
					 | 
				
			||||||
        g_timeout_add (delay,
 | 
					 | 
				
			||||||
                       (GSourceFunc)on_repeat_timeout,
 | 
					 | 
				
			||||||
                       context);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return FALSE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean
 | 
					 | 
				
			||||||
on_repeat_timeout_init (EekboardContextService *context)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    /* FIXME: clear modifiers for further key repeat; better not
 | 
					 | 
				
			||||||
       depend on modifier behavior is LATCH */
 | 
					 | 
				
			||||||
    eek_keyboard_set_modifiers (context->priv->keyboard, 0);
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    /* reschedule repeat timeout only when "repeat" option is set */
 | 
					 | 
				
			||||||
    /* TODO: org.gnome.desktop.input-sources doesn't have repeat info.
 | 
					 | 
				
			||||||
     * In addition, repeat is only useful when the keyboard is not in text
 | 
					 | 
				
			||||||
     * input mode */
 | 
					 | 
				
			||||||
    /*
 | 
					 | 
				
			||||||
    if (g_settings_get_boolean (context->priv->settings, "repeat")) {
 | 
					 | 
				
			||||||
        guint delay;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        g_settings_get (context->priv->settings, "repeat-interval", "u", &delay);
 | 
					 | 
				
			||||||
        context->priv->repeat_timeout_id =
 | 
					 | 
				
			||||||
            g_timeout_add (delay,
 | 
					 | 
				
			||||||
                           (GSourceFunc)on_repeat_timeout,
 | 
					 | 
				
			||||||
                           context);
 | 
					 | 
				
			||||||
    } else */
 | 
					 | 
				
			||||||
        context->priv->repeat_timeout_id = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return FALSE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * eekboard_context_service_enable:
 | 
					 * eekboard_context_service_enable:
 | 
				
			||||||
 * @context: an #EekboardContextService
 | 
					 * @context: an #EekboardContextService
 | 
				
			||||||
@ -569,7 +521,9 @@ eekboard_context_service_show_keyboard (EekboardContextService *context)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context)->show_keyboard (context);
 | 
					    if (!context->priv->visible) {
 | 
				
			||||||
 | 
					        EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context)->show_keyboard (context);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
@ -577,7 +531,9 @@ eekboard_context_service_hide_keyboard (EekboardContextService *context)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context)->hide_keyboard (context);
 | 
					    if (context->priv->visible) {
 | 
				
			||||||
 | 
					        EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context)->hide_keyboard (context);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 | 
				
			|||||||
@ -49,18 +49,15 @@ enum {
 | 
				
			|||||||
    PROP_LAST
 | 
					    PROP_LAST
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE (EekboardContext, eekboard_context, G_TYPE_DBUS_PROXY);
 | 
					typedef struct _EekboardContextPrivate
 | 
				
			||||||
 | 
					 | 
				
			||||||
#define EEKBOARD_CONTEXT_GET_PRIVATE(obj)                               \
 | 
					 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEKBOARD_TYPE_CONTEXT, EekboardContextPrivate))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekboardContextPrivate
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    gboolean visible;
 | 
					    gboolean visible;
 | 
				
			||||||
    gboolean enabled;
 | 
					    gboolean enabled;
 | 
				
			||||||
    gboolean fullscreen;
 | 
					    gboolean fullscreen;
 | 
				
			||||||
    gint group;
 | 
					    gint group;
 | 
				
			||||||
};
 | 
					} EekboardContextPrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekboardContext, eekboard_context, G_TYPE_DBUS_PROXY)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_context_real_g_signal (GDBusProxy  *self,
 | 
					eekboard_context_real_g_signal (GDBusProxy  *self,
 | 
				
			||||||
@ -69,6 +66,7 @@ eekboard_context_real_g_signal (GDBusProxy  *self,
 | 
				
			|||||||
                                GVariant    *parameters)
 | 
					                                GVariant    *parameters)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardContext *context = EEKBOARD_CONTEXT (self);
 | 
					    EekboardContext *context = EEKBOARD_CONTEXT (self);
 | 
				
			||||||
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (g_strcmp0 (signal_name, "Enabled") == 0) {
 | 
					    if (g_strcmp0 (signal_name, "Enabled") == 0) {
 | 
				
			||||||
        g_signal_emit (context, signals[ENABLED], 0);
 | 
					        g_signal_emit (context, signals[ENABLED], 0);
 | 
				
			||||||
@ -111,8 +109,8 @@ eekboard_context_real_g_signal (GDBusProxy  *self,
 | 
				
			|||||||
        gboolean visible = FALSE;
 | 
					        gboolean visible = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        g_variant_get (parameters, "(b)", &visible);
 | 
					        g_variant_get (parameters, "(b)", &visible);
 | 
				
			||||||
        if (visible != context->priv->visible) {
 | 
					        if (visible != priv->visible) {
 | 
				
			||||||
            context->priv->visible = visible;
 | 
					            priv->visible = visible;
 | 
				
			||||||
            g_object_notify (G_OBJECT(context), "visible");
 | 
					            g_object_notify (G_OBJECT(context), "visible");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@ -122,8 +120,8 @@ eekboard_context_real_g_signal (GDBusProxy  *self,
 | 
				
			|||||||
        gint group = 0;
 | 
					        gint group = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        g_variant_get (parameters, "(i)", &group);
 | 
					        g_variant_get (parameters, "(i)", &group);
 | 
				
			||||||
        if (group != context->priv->group) {
 | 
					        if (group != priv->group) {
 | 
				
			||||||
            context->priv->group = group;
 | 
					            priv->group = group;
 | 
				
			||||||
            /* g_object_notify (G_OBJECT(context), "group"); */
 | 
					            /* g_object_notify (G_OBJECT(context), "group"); */
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
@ -135,13 +133,17 @@ eekboard_context_real_g_signal (GDBusProxy  *self,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_context_real_enabled (EekboardContext *self)
 | 
					eekboard_context_real_enabled (EekboardContext *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv->enabled = TRUE;
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->enabled = TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_context_real_disabled (EekboardContext *self)
 | 
					eekboard_context_real_disabled (EekboardContext *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv->enabled = FALSE;
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->enabled = FALSE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -164,9 +166,11 @@ eekboard_context_get_property (GObject    *object,
 | 
				
			|||||||
                               GParamSpec *pspec)
 | 
					                               GParamSpec *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardContext *context = EEKBOARD_CONTEXT(object);
 | 
					    EekboardContext *context = EEKBOARD_CONTEXT(object);
 | 
				
			||||||
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_VISIBLE:
 | 
					    case PROP_VISIBLE:
 | 
				
			||||||
        g_value_set_boolean (value, context->priv->visible);
 | 
					        g_value_set_boolean (value, priv->visible);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
					        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
@ -181,9 +185,6 @@ eekboard_context_class_init (EekboardContextClass *klass)
 | 
				
			|||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec        *pspec;
 | 
					    GParamSpec        *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekboardContextPrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    klass->enabled = eekboard_context_real_enabled;
 | 
					    klass->enabled = eekboard_context_real_enabled;
 | 
				
			||||||
    klass->disabled = eekboard_context_real_disabled;
 | 
					    klass->disabled = eekboard_context_real_disabled;
 | 
				
			||||||
    klass->destroyed = eekboard_context_real_destroyed;
 | 
					    klass->destroyed = eekboard_context_real_destroyed;
 | 
				
			||||||
@ -288,7 +289,7 @@ eekboard_context_class_init (EekboardContextClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_context_init (EekboardContext *self)
 | 
					eekboard_context_init (EekboardContext *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEKBOARD_CONTEXT_GET_PRIVATE(self);
 | 
					    /* void */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -485,7 +486,9 @@ eekboard_context_set_group (EekboardContext *context,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (context->priv->group != group) {
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->group != group) {
 | 
				
			||||||
        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
					        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
				
			||||||
                           "SetGroup",
 | 
					                           "SetGroup",
 | 
				
			||||||
                           g_variant_new ("(i)", group),
 | 
					                           g_variant_new ("(i)", group),
 | 
				
			||||||
@ -509,7 +512,10 @@ eekboard_context_get_group (EekboardContext *context,
 | 
				
			|||||||
                            GCancellable    *cancellable)
 | 
					                            GCancellable    *cancellable)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEKBOARD_IS_CONTEXT(context), 0);
 | 
					    g_return_val_if_fail (EEKBOARD_IS_CONTEXT(context), 0);
 | 
				
			||||||
    return context->priv->group;
 | 
					
 | 
				
			||||||
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->group;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -526,7 +532,9 @@ eekboard_context_show_keyboard (EekboardContext *context,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (context->priv->enabled) {
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->enabled) {
 | 
				
			||||||
        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
					        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
				
			||||||
                           "ShowKeyboard",
 | 
					                           "ShowKeyboard",
 | 
				
			||||||
                           NULL,
 | 
					                           NULL,
 | 
				
			||||||
@ -551,7 +559,9 @@ eekboard_context_hide_keyboard (EekboardContext *context,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (context->priv->enabled) {
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->enabled) {
 | 
				
			||||||
        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
					        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
				
			||||||
                           "HideKeyboard",
 | 
					                           "HideKeyboard",
 | 
				
			||||||
                           NULL,
 | 
					                           NULL,
 | 
				
			||||||
@ -578,7 +588,9 @@ eekboard_context_press_keycode (EekboardContext *context,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (context->priv->enabled) {
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->enabled) {
 | 
				
			||||||
        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
					        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
				
			||||||
                           "PressKeycode",
 | 
					                           "PressKeycode",
 | 
				
			||||||
                           g_variant_new ("(u)", keycode),
 | 
					                           g_variant_new ("(u)", keycode),
 | 
				
			||||||
@ -605,7 +617,9 @@ eekboard_context_release_keycode (EekboardContext *context,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (context->priv->enabled) {
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->enabled) {
 | 
				
			||||||
        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
					        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
				
			||||||
                           "ReleaseKeycode",
 | 
					                           "ReleaseKeycode",
 | 
				
			||||||
                           g_variant_new ("(u)", keycode),
 | 
					                           g_variant_new ("(u)", keycode),
 | 
				
			||||||
@ -627,7 +641,10 @@ gboolean
 | 
				
			|||||||
eekboard_context_is_visible (EekboardContext *context)
 | 
					eekboard_context_is_visible (EekboardContext *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEKBOARD_IS_CONTEXT(context), FALSE);
 | 
					    g_return_val_if_fail (EEKBOARD_IS_CONTEXT(context), FALSE);
 | 
				
			||||||
    return context->priv->enabled && context->priv->visible;
 | 
					
 | 
				
			||||||
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->enabled && priv->visible;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -644,7 +661,10 @@ eekboard_context_set_enabled (EekboardContext *context,
 | 
				
			|||||||
                              gboolean         enabled)
 | 
					                              gboolean         enabled)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
				
			||||||
    context->priv->enabled = enabled;
 | 
					
 | 
				
			||||||
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    priv->enabled = enabled;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -657,7 +677,10 @@ gboolean
 | 
				
			|||||||
eekboard_context_is_enabled (EekboardContext *context)
 | 
					eekboard_context_is_enabled (EekboardContext *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_val_if_fail (EEKBOARD_IS_CONTEXT(context), FALSE);
 | 
					    g_return_val_if_fail (EEKBOARD_IS_CONTEXT(context), FALSE);
 | 
				
			||||||
    return context->priv->enabled;
 | 
					
 | 
				
			||||||
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return priv->enabled;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -674,7 +697,10 @@ eekboard_context_set_fullscreen (EekboardContext *context,
 | 
				
			|||||||
                                 GCancellable    *cancellable)
 | 
					                                 GCancellable    *cancellable)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
					    g_return_if_fail (EEKBOARD_IS_CONTEXT(context));
 | 
				
			||||||
    if (context->priv->fullscreen != fullscreen) {
 | 
					
 | 
				
			||||||
 | 
					    EekboardContextPrivate *priv = eekboard_context_get_instance_private (context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->fullscreen != fullscreen) {
 | 
				
			||||||
        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
					        g_dbus_proxy_call (G_DBUS_PROXY(context),
 | 
				
			||||||
                           "SetFullscreen",
 | 
					                           "SetFullscreen",
 | 
				
			||||||
                           g_variant_new ("(b)", fullscreen),
 | 
					                           g_variant_new ("(b)", fullscreen),
 | 
				
			||||||
 | 
				
			|||||||
@ -28,28 +28,7 @@
 | 
				
			|||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEKBOARD_TYPE_CONTEXT (eekboard_context_get_type())
 | 
					#define EEKBOARD_TYPE_CONTEXT (eekboard_context_get_type())
 | 
				
			||||||
#define EEKBOARD_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEKBOARD_TYPE_CONTEXT, EekboardContext))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekboardContext, eekboard_context, EEKBOARD, CONTEXT, GDBusProxy)
 | 
				
			||||||
#define EEKBOARD_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEKBOARD_TYPE_CONTEXT, EekboardContextClass))
 | 
					 | 
				
			||||||
#define EEKBOARD_IS_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEKBOARD_TYPE_CONTEXT))
 | 
					 | 
				
			||||||
#define EEKBOARD_IS_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEKBOARD_TYPE_CONTEXT))
 | 
					 | 
				
			||||||
#define EEKBOARD_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEKBOARD_TYPE_CONTEXT, EekboardContextClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekboardContext EekboardContext;
 | 
					 | 
				
			||||||
typedef struct _EekboardContextClass EekboardContextClass;
 | 
					 | 
				
			||||||
typedef struct _EekboardContextPrivate EekboardContextPrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * EekboardContext:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The #EekboardContext structure contains only private data and
 | 
					 | 
				
			||||||
 * should only be accessed using the provided API.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct _EekboardContext {
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    GDBusProxy parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekboardContextPrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * EekboardContextClass:
 | 
					 * EekboardContextClass:
 | 
				
			||||||
 | 
				
			|||||||
@ -50,10 +50,8 @@ enum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static guint signals[LAST_SIGNAL] = { 0, };
 | 
					static guint signals[LAST_SIGNAL] = { 0, };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEKBOARD_SERVICE_GET_PRIVATE(obj)                               \
 | 
					typedef struct _EekboardServicePrivate
 | 
				
			||||||
    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEKBOARD_TYPE_SERVICE, EekboardServicePrivate))
 | 
					{
 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _EekboardServicePrivate {
 | 
					 | 
				
			||||||
    GDBusConnection *connection;
 | 
					    GDBusConnection *connection;
 | 
				
			||||||
    SmPuriOSK0 *dbus_interface;
 | 
					    SmPuriOSK0 *dbus_interface;
 | 
				
			||||||
    GDBusNodeInfo *introspection_data;
 | 
					    GDBusNodeInfo *introspection_data;
 | 
				
			||||||
@ -61,9 +59,9 @@ struct _EekboardServicePrivate {
 | 
				
			|||||||
    char *object_path;
 | 
					    char *object_path;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EekboardContextService *context; // unowned reference
 | 
					    EekboardContextService *context; // unowned reference
 | 
				
			||||||
};
 | 
					} EekboardServicePrivate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
G_DEFINE_TYPE (EekboardService, eekboard_service, G_TYPE_OBJECT);
 | 
					G_DEFINE_TYPE_WITH_PRIVATE (EekboardService, eekboard_service, G_TYPE_OBJECT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_service_set_property (GObject      *object,
 | 
					eekboard_service_set_property (GObject      *object,
 | 
				
			||||||
@ -72,19 +70,20 @@ eekboard_service_set_property (GObject      *object,
 | 
				
			|||||||
                               GParamSpec   *pspec)
 | 
					                               GParamSpec   *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
					    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
				
			||||||
 | 
					    EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
 | 
				
			||||||
    GDBusConnection *connection;
 | 
					    GDBusConnection *connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_OBJECT_PATH:
 | 
					    case PROP_OBJECT_PATH:
 | 
				
			||||||
        if (service->priv->object_path)
 | 
					        if (priv->object_path)
 | 
				
			||||||
            g_free (service->priv->object_path);
 | 
					            g_free (priv->object_path);
 | 
				
			||||||
        service->priv->object_path = g_value_dup_string (value);
 | 
					        priv->object_path = g_value_dup_string (value);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case PROP_CONNECTION:
 | 
					    case PROP_CONNECTION:
 | 
				
			||||||
        connection = g_value_get_object (value);
 | 
					        connection = g_value_get_object (value);
 | 
				
			||||||
        if (service->priv->connection)
 | 
					        if (priv->connection)
 | 
				
			||||||
            g_object_unref (service->priv->connection);
 | 
					            g_object_unref (priv->connection);
 | 
				
			||||||
        service->priv->connection = g_object_ref (connection);
 | 
					        priv->connection = g_object_ref (connection);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
					        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
@ -99,13 +98,14 @@ eekboard_service_get_property (GObject    *object,
 | 
				
			|||||||
                               GParamSpec *pspec)
 | 
					                               GParamSpec *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
					    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
				
			||||||
 | 
					    EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_OBJECT_PATH:
 | 
					    case PROP_OBJECT_PATH:
 | 
				
			||||||
        g_value_set_string (value, service->priv->object_path);
 | 
					        g_value_set_string (value, priv->object_path);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    case PROP_CONNECTION:
 | 
					    case PROP_CONNECTION:
 | 
				
			||||||
        g_value_set_object (value, service->priv->connection);
 | 
					        g_value_set_object (value, priv->connection);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
					        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
				
			||||||
@ -117,20 +117,22 @@ static void
 | 
				
			|||||||
eekboard_service_dispose (GObject *object)
 | 
					eekboard_service_dispose (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
					    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
				
			||||||
    if (service->priv->connection) {
 | 
					    EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
 | 
				
			||||||
        if (service->priv->registration_id > 0) {
 | 
					
 | 
				
			||||||
            g_dbus_connection_unregister_object (service->priv->connection,
 | 
					    if (priv->connection) {
 | 
				
			||||||
                                                 service->priv->registration_id);
 | 
					        if (priv->registration_id > 0) {
 | 
				
			||||||
            service->priv->registration_id = 0;
 | 
					            g_dbus_connection_unregister_object (priv->connection,
 | 
				
			||||||
 | 
					                                                 priv->registration_id);
 | 
				
			||||||
 | 
					            priv->registration_id = 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        g_object_unref (service->priv->connection);
 | 
					        g_object_unref (priv->connection);
 | 
				
			||||||
        service->priv->connection = NULL;
 | 
					        priv->connection = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (service->priv->introspection_data) {
 | 
					    if (priv->introspection_data) {
 | 
				
			||||||
        g_dbus_node_info_unref (service->priv->introspection_data);
 | 
					        g_dbus_node_info_unref (priv->introspection_data);
 | 
				
			||||||
        service->priv->introspection_data = NULL;
 | 
					        priv->introspection_data = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    G_OBJECT_CLASS (eekboard_service_parent_class)->dispose (object);
 | 
					    G_OBJECT_CLASS (eekboard_service_parent_class)->dispose (object);
 | 
				
			||||||
@ -140,8 +142,9 @@ static void
 | 
				
			|||||||
eekboard_service_finalize (GObject *object)
 | 
					eekboard_service_finalize (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
					    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
				
			||||||
 | 
					    EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_free (service->priv->object_path);
 | 
					    g_free (priv->object_path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    G_OBJECT_CLASS (eekboard_service_parent_class)->finalize (object);
 | 
					    G_OBJECT_CLASS (eekboard_service_parent_class)->finalize (object);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -150,11 +153,13 @@ static gboolean
 | 
				
			|||||||
handle_set_visible(SmPuriOSK0 *object, GDBusMethodInvocation *invocation,
 | 
					handle_set_visible(SmPuriOSK0 *object, GDBusMethodInvocation *invocation,
 | 
				
			||||||
                   gboolean arg_visible, gpointer user_data) {
 | 
					                   gboolean arg_visible, gpointer user_data) {
 | 
				
			||||||
    EekboardService *service = user_data;
 | 
					    EekboardService *service = user_data;
 | 
				
			||||||
    if (service->priv->context) {
 | 
					    EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (priv->context) {
 | 
				
			||||||
        if (arg_visible) {
 | 
					        if (arg_visible) {
 | 
				
			||||||
            eekboard_context_service_show_keyboard (service->priv->context);
 | 
					            eekboard_context_service_show_keyboard (priv->context);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            eekboard_context_service_hide_keyboard (service->priv->context);
 | 
					            eekboard_context_service_hide_keyboard (priv->context);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    sm_puri_osk0_complete_set_visible(object, invocation);
 | 
					    sm_puri_osk0_complete_set_visible(object, invocation);
 | 
				
			||||||
@ -165,18 +170,19 @@ static void
 | 
				
			|||||||
eekboard_service_constructed (GObject *object)
 | 
					eekboard_service_constructed (GObject *object)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
					    EekboardService *service = EEKBOARD_SERVICE(object);
 | 
				
			||||||
 | 
					    EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    service->priv->dbus_interface = sm_puri_osk0_skeleton_new();
 | 
					    priv->dbus_interface = sm_puri_osk0_skeleton_new();
 | 
				
			||||||
    sm_puri_osk0_set_visible(service->priv->dbus_interface, FALSE); // TODO: use actual value
 | 
					    sm_puri_osk0_set_visible(priv->dbus_interface, FALSE); // TODO: use actual value
 | 
				
			||||||
    g_signal_connect(service->priv->dbus_interface, "handle-set-visible",
 | 
					    g_signal_connect(priv->dbus_interface, "handle-set-visible",
 | 
				
			||||||
                     G_CALLBACK(handle_set_visible), service);
 | 
					                     G_CALLBACK(handle_set_visible), service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (service->priv->connection && service->priv->object_path) {
 | 
					    if (priv->connection && priv->object_path) {
 | 
				
			||||||
        GError *error = NULL;
 | 
					        GError *error = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(service->priv->dbus_interface),
 | 
					        if (!g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(priv->dbus_interface),
 | 
				
			||||||
                                              service->priv->connection,
 | 
					                                              priv->connection,
 | 
				
			||||||
                                              service->priv->object_path,
 | 
					                                              priv->object_path,
 | 
				
			||||||
                                              &error)) {
 | 
					                                              &error)) {
 | 
				
			||||||
            g_warning("Error registering dbus object: %s\n", error->message);
 | 
					            g_warning("Error registering dbus object: %s\n", error->message);
 | 
				
			||||||
            g_clear_error(&error);
 | 
					            g_clear_error(&error);
 | 
				
			||||||
@ -190,9 +196,6 @@ eekboard_service_class_init (EekboardServiceClass *klass)
 | 
				
			|||||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
					    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
				
			||||||
    GParamSpec *pspec;
 | 
					    GParamSpec *pspec;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_type_class_add_private (gobject_class,
 | 
					 | 
				
			||||||
                              sizeof (EekboardServicePrivate));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    klass->create_context = NULL;
 | 
					    klass->create_context = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gobject_class->constructed = eekboard_service_constructed;
 | 
					    gobject_class->constructed = eekboard_service_constructed;
 | 
				
			||||||
@ -250,8 +253,9 @@ eekboard_service_class_init (EekboardServiceClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_service_init (EekboardService *self)
 | 
					eekboard_service_init (EekboardService *self)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    self->priv = EEKBOARD_SERVICE_GET_PRIVATE(self);
 | 
					    EekboardServicePrivate *priv = eekboard_service_get_instance_private (self);
 | 
				
			||||||
    self->priv->context = NULL;
 | 
					
 | 
				
			||||||
 | 
					    priv->context = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@ -271,7 +275,9 @@ eekboard_service_new (GDBusConnection *connection,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
eekboard_service_set_context(EekboardService *service,
 | 
					eekboard_service_set_context(EekboardService *service,
 | 
				
			||||||
 | 
					                             EekboardContextService *context)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                             EekboardContextService *context) {
 | 
					    priv->context = context;
 | 
				
			||||||
    service->priv->context = context;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -28,30 +28,7 @@ G_BEGIN_DECLS
 | 
				
			|||||||
#define EEKBOARD_SERVICE_INTERFACE "sm.puri.OSK0"
 | 
					#define EEKBOARD_SERVICE_INTERFACE "sm.puri.OSK0"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EEKBOARD_TYPE_SERVICE (eekboard_service_get_type())
 | 
					#define EEKBOARD_TYPE_SERVICE (eekboard_service_get_type())
 | 
				
			||||||
#define EEKBOARD_SERVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEKBOARD_TYPE_SERVICE, EekboardService))
 | 
					G_DECLARE_DERIVABLE_TYPE (EekboardService, eekboard_service, EEKBOARD, SERVICE, GObject)
 | 
				
			||||||
#define EEKBOARD_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEKBOARD_TYPE_SERVICE, EekboardServiceClass))
 | 
					 | 
				
			||||||
#define EEKBOARD_IS_SERVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEKBOARD_TYPE_SERVICE))
 | 
					 | 
				
			||||||
#define EEKBOARD_IS_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEKBOARD_TYPE_SERVICE))
 | 
					 | 
				
			||||||
#define EEKBOARD_SERVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEKBOARD_TYPE_SERVICE, EekboardServiceClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _EekboardService EekboardService;
 | 
					 | 
				
			||||||
typedef struct _EekboardServiceClass EekboardServiceClass;
 | 
					 | 
				
			||||||
typedef struct _EekboardServicePrivate EekboardServicePrivate;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * EekboardService:
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * Manages DBus interaction.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The #EekboardService structure contains only private data and
 | 
					 | 
				
			||||||
 * should only be accessed using the provided API.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct _EekboardService {
 | 
					 | 
				
			||||||
    /*< private >*/
 | 
					 | 
				
			||||||
    GObject parent;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    EekboardServicePrivate *priv;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * EekboardServiceClass:
 | 
					 * EekboardServiceClass:
 | 
				
			||||||
 | 
				
			|||||||
@ -78,11 +78,12 @@ replace_keycode (SeatEmitter *emitter,
 | 
				
			|||||||
                 guint   keycode,
 | 
					                 guint   keycode,
 | 
				
			||||||
                 guint  *keysym)
 | 
					                 guint  *keysym)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GdkDisplay *display = gdk_display_get_default ();
 | 
					/*  GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
    //Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
 | 
					    Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
 | 
				
			||||||
    guint old_keysym;
 | 
					    guint old_keysym;
 | 
				
			||||||
    int keysyms_per_keycode;
 | 
					    int keysyms_per_keycode;
 | 
				
			||||||
    KeySym *syms;
 | 
					    KeySym *syms;
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
return TRUE; // FIXME: no xkb allocated at the moment, pretending all is fine
 | 
					return TRUE; // FIXME: no xkb allocated at the moment, pretending all is fine
 | 
				
			||||||
    g_return_val_if_fail (emitter->xkb->min_key_code <= keycode &&
 | 
					    g_return_val_if_fail (emitter->xkb->min_key_code <= keycode &&
 | 
				
			||||||
                          keycode <= emitter->xkb->max_key_code,
 | 
					                          keycode <= emitter->xkb->max_key_code,
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +0,0 @@
 | 
				
			|||||||
SUBDIRS = simple-client
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,3 +0,0 @@
 | 
				
			|||||||
EXTRA_DIST = simple-client
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
							
								
								
									
										218
									
								
								git.mk
									
									
									
									
									
								
							
							
						
						
									
										218
									
								
								git.mk
									
									
									
									
									
								
							@ -1,218 +0,0 @@
 | 
				
			|||||||
# git.mk
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Copyright 2009, Red Hat, Inc.
 | 
					 | 
				
			||||||
# Copyright 2010,2011 Behdad Esfahbod
 | 
					 | 
				
			||||||
# Written by Behdad Esfahbod
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Copying and distribution of this file, with or without modification,
 | 
					 | 
				
			||||||
# is permitted in any medium without royalty provided the copyright
 | 
					 | 
				
			||||||
# notice and this notice are preserved.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# The canonical source for this file is https://github.com/behdad/git.mk.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# To use in your project, import this file in your git repo's toplevel,
 | 
					 | 
				
			||||||
# then do "make -f git.mk".  This modifies all Makefile.am files in
 | 
					 | 
				
			||||||
# your project to -include git.mk.  Remember to add that line to new
 | 
					 | 
				
			||||||
# Makefile.am files you create in your project, or just rerun the
 | 
					 | 
				
			||||||
# "make -f git.mk".
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This enables automatic .gitignore generation.  If you need to ignore
 | 
					 | 
				
			||||||
# more files, add them to the GITIGNOREFILES variable in your Makefile.am.
 | 
					 | 
				
			||||||
# But think twice before doing that.  If a file has to be in .gitignore,
 | 
					 | 
				
			||||||
# chances are very high that it's a generated file and should be in one
 | 
					 | 
				
			||||||
# of MOSTLYCLEANFILES, CLEANFILES, DISTCLEANFILES, or MAINTAINERCLEANFILES.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# The only case that you need to manually add a file to GITIGNOREFILES is
 | 
					 | 
				
			||||||
# when remove files in one of mostlyclean-local, clean-local, distclean-local,
 | 
					 | 
				
			||||||
# or maintainer-clean-local make targets.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Note that for files like editor backup, etc, there are better places to
 | 
					 | 
				
			||||||
# ignore them.  See "man gitignore".
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# If "make maintainer-clean" removes the files but they are not recognized
 | 
					 | 
				
			||||||
# by this script (that is, if "git status" shows untracked files still), send
 | 
					 | 
				
			||||||
# me the output of "git status" as well as your Makefile.am and Makefile for
 | 
					 | 
				
			||||||
# the directories involved and I'll diagnose.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# For a list of toplevel files that should be in MAINTAINERCLEANFILES, see
 | 
					 | 
				
			||||||
# Makefile.am.sample in the git.mk git repo.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# Don't EXTRA_DIST this file.  It is supposed to only live in git clones,
 | 
					 | 
				
			||||||
# not tarballs.  It serves no useful purpose in tarballs and clutters the
 | 
					 | 
				
			||||||
# build dir.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# This file knows how to handle autoconf, automake, libtool, gtk-doc,
 | 
					 | 
				
			||||||
# gnome-doc-utils, yelp.m4, mallard, intltool, gsettings, dejagnu.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# KNOWN ISSUES:
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
# - Recursive configure doesn't work as $(top_srcdir)/git.mk inside the
 | 
					 | 
				
			||||||
#   submodule doesn't find us.  If you have configure.{in,ac} files in
 | 
					 | 
				
			||||||
#   subdirs, add a proxy git.mk file in those dirs that simply does:
 | 
					 | 
				
			||||||
#   "include $(top_srcdir)/../git.mk".  Add more ..'s to your taste.
 | 
					 | 
				
			||||||
#   And add those files to git.  See vte/gnome-pty-helper/git.mk for
 | 
					 | 
				
			||||||
#   example.
 | 
					 | 
				
			||||||
#
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
git-all: git-mk-install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
git-mk-install:
 | 
					 | 
				
			||||||
	@echo Installing git makefile
 | 
					 | 
				
			||||||
	@any_failed=; \
 | 
					 | 
				
			||||||
		find "`test -z "$(top_srcdir)" && echo . || echo "$(top_srcdir)"`" -name Makefile.am | while read x; do \
 | 
					 | 
				
			||||||
		if grep 'include .*/git.mk' $$x >/dev/null; then \
 | 
					 | 
				
			||||||
			echo $$x already includes git.mk; \
 | 
					 | 
				
			||||||
		else \
 | 
					 | 
				
			||||||
			failed=; \
 | 
					 | 
				
			||||||
			echo "Updating $$x"; \
 | 
					 | 
				
			||||||
			{ cat $$x; \
 | 
					 | 
				
			||||||
			  echo ''; \
 | 
					 | 
				
			||||||
			  echo '-include $$(top_srcdir)/git.mk'; \
 | 
					 | 
				
			||||||
			} > $$x.tmp || failed=1; \
 | 
					 | 
				
			||||||
			if test x$$failed = x; then \
 | 
					 | 
				
			||||||
				mv $$x.tmp $$x || failed=1; \
 | 
					 | 
				
			||||||
			fi; \
 | 
					 | 
				
			||||||
			if test x$$failed = x; then : else \
 | 
					 | 
				
			||||||
				echo Failed updating $$x; >&2 \
 | 
					 | 
				
			||||||
				any_failed=1; \
 | 
					 | 
				
			||||||
			fi; \
 | 
					 | 
				
			||||||
	fi; done; test -z "$$any_failed"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: git-all git-mk-install
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
### .gitignore generation
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
$(srcdir)/.gitignore: Makefile.am $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
	$(AM_V_GEN) \
 | 
					 | 
				
			||||||
	{ \
 | 
					 | 
				
			||||||
		if test "x$(DOC_MODULE)" = x -o "x$(DOC_MAIN_SGML_FILE)" = x; then :; else \
 | 
					 | 
				
			||||||
			for x in \
 | 
					 | 
				
			||||||
				$(DOC_MODULE)-decl-list.txt \
 | 
					 | 
				
			||||||
				$(DOC_MODULE)-decl.txt \
 | 
					 | 
				
			||||||
				tmpl/$(DOC_MODULE)-unused.sgml \
 | 
					 | 
				
			||||||
				"tmpl/*.bak" \
 | 
					 | 
				
			||||||
				xml html \
 | 
					 | 
				
			||||||
			; do echo /$$x; done; \
 | 
					 | 
				
			||||||
		fi; \
 | 
					 | 
				
			||||||
		if test "x$(DOC_MODULE)$(DOC_ID)" = x -o "x$(DOC_LINGUAS)" = x; then :; else \
 | 
					 | 
				
			||||||
			for lc in $(DOC_LINGUAS); do \
 | 
					 | 
				
			||||||
				for x in \
 | 
					 | 
				
			||||||
					$(if $(DOC_MODULE),$(DOC_MODULE).xml) \
 | 
					 | 
				
			||||||
					$(DOC_PAGES) \
 | 
					 | 
				
			||||||
					$(DOC_INCLUDES) \
 | 
					 | 
				
			||||||
				; do echo /$$lc/$$x; done; \
 | 
					 | 
				
			||||||
			done; \
 | 
					 | 
				
			||||||
			for x in \
 | 
					 | 
				
			||||||
				$(_DOC_OMF_ALL) \
 | 
					 | 
				
			||||||
				$(_DOC_DSK_ALL) \
 | 
					 | 
				
			||||||
				$(_DOC_HTML_ALL) \
 | 
					 | 
				
			||||||
				$(_DOC_MOFILES) \
 | 
					 | 
				
			||||||
				$(DOC_H_FILE) \
 | 
					 | 
				
			||||||
				"*/.xml2po.mo" \
 | 
					 | 
				
			||||||
				"*/*.omf.out" \
 | 
					 | 
				
			||||||
			; do echo /$$x; done; \
 | 
					 | 
				
			||||||
		fi; \
 | 
					 | 
				
			||||||
		if test "x$(HELP_ID)" = x -o "x$(HELP_LINGUAS)" = x; then :; else \
 | 
					 | 
				
			||||||
			for lc in $(HELP_LINGUAS); do \
 | 
					 | 
				
			||||||
				for x in \
 | 
					 | 
				
			||||||
					$(HELP_FILES) \
 | 
					 | 
				
			||||||
					"$$lc.stamp" \
 | 
					 | 
				
			||||||
					"$$lc.mo" \
 | 
					 | 
				
			||||||
				; do echo /$$lc/$$x; done; \
 | 
					 | 
				
			||||||
			done; \
 | 
					 | 
				
			||||||
		fi; \
 | 
					 | 
				
			||||||
		if test "x$(gsettings_SCHEMAS)" = x; then :; else \
 | 
					 | 
				
			||||||
			for x in \
 | 
					 | 
				
			||||||
				$(gsettings_SCHEMAS:.xml=.valid) \
 | 
					 | 
				
			||||||
				$(gsettings__enum_file) \
 | 
					 | 
				
			||||||
			; do echo /$$x; done; \
 | 
					 | 
				
			||||||
		fi; \
 | 
					 | 
				
			||||||
		if test -f $(srcdir)/po/Makefile.in.in; then \
 | 
					 | 
				
			||||||
			for x in \
 | 
					 | 
				
			||||||
				po/Makefile.in.in \
 | 
					 | 
				
			||||||
				po/Makefile.in \
 | 
					 | 
				
			||||||
				po/Makefile \
 | 
					 | 
				
			||||||
				po/POTFILES \
 | 
					 | 
				
			||||||
				po/stamp-it \
 | 
					 | 
				
			||||||
				po/.intltool-merge-cache \
 | 
					 | 
				
			||||||
				"po/*.gmo" \
 | 
					 | 
				
			||||||
				"po/*.mo" \
 | 
					 | 
				
			||||||
				po/$(GETTEXT_PACKAGE).pot \
 | 
					 | 
				
			||||||
				intltool-extract.in \
 | 
					 | 
				
			||||||
				intltool-merge.in \
 | 
					 | 
				
			||||||
				intltool-update.in \
 | 
					 | 
				
			||||||
			; do echo /$$x; done; \
 | 
					 | 
				
			||||||
		fi; \
 | 
					 | 
				
			||||||
		if test -f $(srcdir)/configure; then \
 | 
					 | 
				
			||||||
			for x in \
 | 
					 | 
				
			||||||
				autom4te.cache \
 | 
					 | 
				
			||||||
				configure \
 | 
					 | 
				
			||||||
				config.h \
 | 
					 | 
				
			||||||
				stamp-h1 \
 | 
					 | 
				
			||||||
				libtool \
 | 
					 | 
				
			||||||
				config.lt \
 | 
					 | 
				
			||||||
			; do echo /$$x; done; \
 | 
					 | 
				
			||||||
		fi; \
 | 
					 | 
				
			||||||
		if test "x$(DEJATOOL)" = x; then :; else \
 | 
					 | 
				
			||||||
			for x in \
 | 
					 | 
				
			||||||
				$(DEJATOOL) \
 | 
					 | 
				
			||||||
			; do echo /$$x.sum; echo /$$x.log; done; \
 | 
					 | 
				
			||||||
			echo /site.exp; \
 | 
					 | 
				
			||||||
		fi; \
 | 
					 | 
				
			||||||
		for x in \
 | 
					 | 
				
			||||||
			.gitignore \
 | 
					 | 
				
			||||||
			$(GITIGNOREFILES) \
 | 
					 | 
				
			||||||
			$(CLEANFILES) \
 | 
					 | 
				
			||||||
			$(PROGRAMS) \
 | 
					 | 
				
			||||||
			$(check_PROGRAMS) \
 | 
					 | 
				
			||||||
			$(EXTRA_PROGRAMS) \
 | 
					 | 
				
			||||||
			$(LTLIBRARIES) \
 | 
					 | 
				
			||||||
			so_locations \
 | 
					 | 
				
			||||||
			.libs _libs \
 | 
					 | 
				
			||||||
			$(MOSTLYCLEANFILES) \
 | 
					 | 
				
			||||||
			"*.$(OBJEXT)" \
 | 
					 | 
				
			||||||
			"*.lo" \
 | 
					 | 
				
			||||||
			$(DISTCLEANFILES) \
 | 
					 | 
				
			||||||
			$(am__CONFIG_DISTCLEAN_FILES) \
 | 
					 | 
				
			||||||
			$(CONFIG_CLEAN_FILES) \
 | 
					 | 
				
			||||||
			TAGS ID GTAGS GRTAGS GSYMS GPATH tags \
 | 
					 | 
				
			||||||
			"*.tab.c" \
 | 
					 | 
				
			||||||
			$(MAINTAINERCLEANFILES) \
 | 
					 | 
				
			||||||
			$(BUILT_SOURCES) \
 | 
					 | 
				
			||||||
			$(DEPDIR) \
 | 
					 | 
				
			||||||
			Makefile \
 | 
					 | 
				
			||||||
			Makefile.in \
 | 
					 | 
				
			||||||
			"*.orig" \
 | 
					 | 
				
			||||||
			"*.rej" \
 | 
					 | 
				
			||||||
			"*.bak" \
 | 
					 | 
				
			||||||
			"*~" \
 | 
					 | 
				
			||||||
			".*.sw[nop]" \
 | 
					 | 
				
			||||||
			".dirstamp" \
 | 
					 | 
				
			||||||
		; do echo /$$x; done; \
 | 
					 | 
				
			||||||
	} | \
 | 
					 | 
				
			||||||
	sed "s@^/`echo "$(srcdir)" | sed 's/\(.\)/[\1]/g'`/@/@" | \
 | 
					 | 
				
			||||||
	sed 's@/[.]/@/@g' | \
 | 
					 | 
				
			||||||
	LC_ALL=C sort | uniq > $@.tmp && \
 | 
					 | 
				
			||||||
	mv $@.tmp $@;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
all: $(srcdir)/.gitignore gitignore-recurse-maybe
 | 
					 | 
				
			||||||
gitignore-recurse-maybe:
 | 
					 | 
				
			||||||
	@if test "x$(SUBDIRS)" = "x$(DIST_SUBDIRS)"; then :; else \
 | 
					 | 
				
			||||||
		$(MAKE) $(AM_MAKEFLAGS) gitignore-recurse; \
 | 
					 | 
				
			||||||
	fi;
 | 
					 | 
				
			||||||
gitignore-recurse:
 | 
					 | 
				
			||||||
	@for subdir in $(DIST_SUBDIRS); do \
 | 
					 | 
				
			||||||
	  case " $(SUBDIRS) " in \
 | 
					 | 
				
			||||||
	    *" $$subdir "*) :;; \
 | 
					 | 
				
			||||||
	    *) test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) .gitignore gitignore-recurse || echo "Skipping $$subdir");; \
 | 
					 | 
				
			||||||
	  esac; \
 | 
					 | 
				
			||||||
	done
 | 
					 | 
				
			||||||
gitignore: $(srcdir)/.gitignore gitignore-recurse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
maintainer-clean: gitignore-clean
 | 
					 | 
				
			||||||
gitignore-clean:
 | 
					 | 
				
			||||||
	-rm -f $(srcdir)/.gitignore
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
.PHONY: gitignore-clean gitignore gitignore-recurse gitignore-recurse-maybe
 | 
					 | 
				
			||||||
@ -1,96 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bin_PROGRAMS =					\
 | 
					 | 
				
			||||||
	eekboard				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
libexec_PROGRAMS =				\
 | 
					 | 
				
			||||||
	eekboard-setup				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_CFLAGS =					\
 | 
					 | 
				
			||||||
	-I$(top_srcdir)					\
 | 
					 | 
				
			||||||
	$(GIO2_CFLAGS)					\
 | 
					 | 
				
			||||||
	$(GTK_CFLAGS)					\
 | 
					 | 
				
			||||||
	$(XKB_CFLAGS)					\
 | 
					 | 
				
			||||||
	$(LIBXKLAVIER_CFLAGS)				\
 | 
					 | 
				
			||||||
	-DLIBEXECDIR=\"$(libexecdir)\"			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if ENABLE_XTEST
 | 
					 | 
				
			||||||
eekboard_CFLAGS += $(XTEST_CFLAGS)
 | 
					 | 
				
			||||||
eekboard_LDADD += $(XTEST_LIBS)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if ENABLE_ATSPI
 | 
					 | 
				
			||||||
eekboard_CFLAGS += $(ATSPI2_CFLAGS)
 | 
					 | 
				
			||||||
eekboard_LDADD += $(ATSPI2_LIBS)
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_headers =				\
 | 
					 | 
				
			||||||
	client.h				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_SOURCES =				\
 | 
					 | 
				
			||||||
	client.c				\
 | 
					 | 
				
			||||||
	client-main.c				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_setup_CFLAGS = \
 | 
					 | 
				
			||||||
	-I$(top_srcdir)					\
 | 
					 | 
				
			||||||
	$(GIO2_CFLAGS)					\
 | 
					 | 
				
			||||||
	$(GTK_CFLAGS)					\
 | 
					 | 
				
			||||||
	$(XKB_CFLAGS)					\
 | 
					 | 
				
			||||||
	$(LIBXKLAVIER_CFLAGS)				\
 | 
					 | 
				
			||||||
	-DPKGDATADIR=\"$(pkgdatadir)\"			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_setup_headers =			\
 | 
					 | 
				
			||||||
	preferences-dialog.h			\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_setup_SOURCES =			\
 | 
					 | 
				
			||||||
	preferences-dialog.c			\
 | 
					 | 
				
			||||||
	setup-main.c				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
eekboard_setup_LDADD =				\
 | 
					 | 
				
			||||||
	$(top_builddir)/eek/libeek.la		\
 | 
					 | 
				
			||||||
	$(GIO2_LIBS)				\
 | 
					 | 
				
			||||||
	$(GTK_LIBS)				\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
dist_pkgdata_DATA = preferences-dialog.ui
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
noinst_HEADERS =				\
 | 
					 | 
				
			||||||
	$(eekboard_headers)			\
 | 
					 | 
				
			||||||
	$(eekboard_setup_headers)		\
 | 
					 | 
				
			||||||
	$(NULL)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
@ -1,320 +0,0 @@
 | 
				
			|||||||
/* 
 | 
					 | 
				
			||||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
					 | 
				
			||||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
					 | 
				
			||||||
 * 
 | 
					 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
 * (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
 * GNU General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifdef HAVE_CONFIG_H
 | 
					 | 
				
			||||||
#include "config.h"
 | 
					 | 
				
			||||||
#endif  /* HAVE_CONFIG_H */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					 | 
				
			||||||
#include <dbus/dbus.h>
 | 
					 | 
				
			||||||
#include <atspi/atspi.h>
 | 
					 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					 | 
				
			||||||
#ifdef HAVE_IBUS
 | 
					 | 
				
			||||||
#include <ibus.h>
 | 
					 | 
				
			||||||
#endif  /* HAVE_IBUS */
 | 
					 | 
				
			||||||
#include <gtk/gtk.h>
 | 
					 | 
				
			||||||
#include <glib/gi18n.h>
 | 
					 | 
				
			||||||
#include "eekboard/eekboard-client.h"
 | 
					 | 
				
			||||||
#include "client.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean opt_system = FALSE;
 | 
					 | 
				
			||||||
static gboolean opt_session = FALSE;
 | 
					 | 
				
			||||||
static gchar *opt_address = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean opt_focus = FALSE;
 | 
					 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					 | 
				
			||||||
static gboolean opt_keystroke = FALSE;
 | 
					 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gchar *opt_keyboards = NULL;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean opt_fullscreen = FALSE;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const GOptionEntry options[] = {
 | 
					 | 
				
			||||||
    {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system,
 | 
					 | 
				
			||||||
     N_("Connect to the system bus")},
 | 
					 | 
				
			||||||
    {"session", 'e', 0, G_OPTION_ARG_NONE, &opt_session,
 | 
					 | 
				
			||||||
     N_("Connect to the session bus")},
 | 
					 | 
				
			||||||
    {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address,
 | 
					 | 
				
			||||||
     N_("Connect to the given D-Bus address")},
 | 
					 | 
				
			||||||
#if ENABLE_FOCUS_LISTENER
 | 
					 | 
				
			||||||
    {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
 | 
					 | 
				
			||||||
     N_("Listen focus change events")},
 | 
					 | 
				
			||||||
#endif  /* ENABLE_FOCUS_LISTENER */
 | 
					 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					 | 
				
			||||||
    {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
 | 
					 | 
				
			||||||
     N_("Listen keystroke events with AT-SPI")},
 | 
					 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					 | 
				
			||||||
    {"keyboards", 'k', 0, G_OPTION_ARG_STRING, &opt_keyboards,
 | 
					 | 
				
			||||||
     N_("Specify keyboards (comma separated)")},
 | 
					 | 
				
			||||||
    {"fullscreen", 'F', 0, G_OPTION_ARG_NONE, &opt_fullscreen,
 | 
					 | 
				
			||||||
     N_("Create window in fullscreen mode")},
 | 
					 | 
				
			||||||
    {NULL}
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_context_destroyed (EekboardContext *context,
 | 
					 | 
				
			||||||
                      gpointer         user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    gtk_main_quit ();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
on_destroyed (EekboardClient *eekboard,
 | 
					 | 
				
			||||||
              gpointer          user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    gtk_main_quit ();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum FocusListenerType {
 | 
					 | 
				
			||||||
    FOCUS_NONE,
 | 
					 | 
				
			||||||
    FOCUS_ATSPI,
 | 
					 | 
				
			||||||
    FOCUS_IBUS
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean
 | 
					 | 
				
			||||||
set_keyboards (SeatEmitter              *client,
 | 
					 | 
				
			||||||
               const gchar * const *keyboards)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    if (g_strv_length ((gchar **)keyboards) == 0) {
 | 
					 | 
				
			||||||
        if (!client_enable_xkl (client)) {
 | 
					 | 
				
			||||||
            g_printerr ("Can't register xklavier event listeners\n");
 | 
					 | 
				
			||||||
            return FALSE;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        if (!client_set_keyboards (client, keyboards)) {
 | 
					 | 
				
			||||||
            gchar *str = g_strjoinv (", ", (gchar **)keyboards);
 | 
					 | 
				
			||||||
            g_printerr ("Can't set keyboards \"%s\"\n", str);
 | 
					 | 
				
			||||||
            g_free (str);
 | 
					 | 
				
			||||||
            return FALSE;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return TRUE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int
 | 
					 | 
				
			||||||
main (int argc, char **argv)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    SeatEmitter *client = NULL;
 | 
					 | 
				
			||||||
    EekboardClient *eekboard;
 | 
					 | 
				
			||||||
    EekboardContext *context;
 | 
					 | 
				
			||||||
    GBusType bus_type;
 | 
					 | 
				
			||||||
    GDBusConnection *connection;
 | 
					 | 
				
			||||||
    GError *error;
 | 
					 | 
				
			||||||
    GOptionContext *option_context;
 | 
					 | 
				
			||||||
    gint focus;
 | 
					 | 
				
			||||||
    GSettings *settings = NULL;
 | 
					 | 
				
			||||||
    gchar **keyboards = NULL;
 | 
					 | 
				
			||||||
    gint retval = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!gtk_init_check (&argc, &argv)) {
 | 
					 | 
				
			||||||
        g_printerr ("Can't init GTK\n");
 | 
					 | 
				
			||||||
        exit (1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    eek_init ();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    option_context = g_option_context_new ("eekboard-desktop-client");
 | 
					 | 
				
			||||||
    g_option_context_add_main_entries (option_context, options, NULL);
 | 
					 | 
				
			||||||
    g_option_context_parse (option_context, &argc, &argv, NULL);
 | 
					 | 
				
			||||||
    g_option_context_free (option_context);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (opt_system)
 | 
					 | 
				
			||||||
        bus_type = G_BUS_TYPE_SYSTEM;
 | 
					 | 
				
			||||||
    else if (opt_address)
 | 
					 | 
				
			||||||
        bus_type = G_BUS_TYPE_NONE;
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
        bus_type = G_BUS_TYPE_SESSION;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    switch (bus_type) {
 | 
					 | 
				
			||||||
    case G_BUS_TYPE_SYSTEM:
 | 
					 | 
				
			||||||
        error = NULL;
 | 
					 | 
				
			||||||
        connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error);
 | 
					 | 
				
			||||||
        if (connection == NULL) {
 | 
					 | 
				
			||||||
            g_printerr ("Can't connect to the system bus: %s\n",
 | 
					 | 
				
			||||||
                        error->message);
 | 
					 | 
				
			||||||
            g_error_free (error);
 | 
					 | 
				
			||||||
            exit (1);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case G_BUS_TYPE_SESSION:
 | 
					 | 
				
			||||||
        error = NULL;
 | 
					 | 
				
			||||||
        connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
 | 
					 | 
				
			||||||
        if (connection == NULL) {
 | 
					 | 
				
			||||||
            g_printerr ("Can't connect to the session bus: %s\n",
 | 
					 | 
				
			||||||
                        error->message);
 | 
					 | 
				
			||||||
            g_error_free (error);
 | 
					 | 
				
			||||||
            exit (1);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    case G_BUS_TYPE_NONE:
 | 
					 | 
				
			||||||
        error = NULL;
 | 
					 | 
				
			||||||
        connection = g_dbus_connection_new_for_address_sync (opt_address,
 | 
					 | 
				
			||||||
                                                             0,
 | 
					 | 
				
			||||||
                                                             NULL,
 | 
					 | 
				
			||||||
                                                             NULL,
 | 
					 | 
				
			||||||
                                                             &error);
 | 
					 | 
				
			||||||
        if (connection == NULL) {
 | 
					 | 
				
			||||||
            g_printerr ("Can't connect to the bus at %s: %s\n",
 | 
					 | 
				
			||||||
                        opt_address,
 | 
					 | 
				
			||||||
                        error->message);
 | 
					 | 
				
			||||||
            g_error_free (error);
 | 
					 | 
				
			||||||
            exit (1);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    default:
 | 
					 | 
				
			||||||
        g_assert_not_reached ();
 | 
					 | 
				
			||||||
        break;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    client = client_new (connection);
 | 
					 | 
				
			||||||
    g_object_unref (connection);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (client == NULL) {
 | 
					 | 
				
			||||||
        g_printerr ("Can't create a client\n");
 | 
					 | 
				
			||||||
        exit (1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    settings = g_settings_new ("org.fedorahosted.eekboard");
 | 
					 | 
				
			||||||
    focus = FOCUS_NONE;
 | 
					 | 
				
			||||||
    if (opt_focus) {
 | 
					 | 
				
			||||||
        gchar *focus_listener = g_settings_get_string (settings,
 | 
					 | 
				
			||||||
                                                       "focus-listener");
 | 
					 | 
				
			||||||
        const struct {
 | 
					 | 
				
			||||||
            const gchar *name;
 | 
					 | 
				
			||||||
            enum FocusListenerType type;
 | 
					 | 
				
			||||||
        } focus_listeners[] = {
 | 
					 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					 | 
				
			||||||
            { "atspi", FOCUS_ATSPI },
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#ifdef HAVE_IBUS
 | 
					 | 
				
			||||||
            { "ibus", FOCUS_IBUS },
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
            { NULL }
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        gint i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        focus = FOCUS_NONE;
 | 
					 | 
				
			||||||
        for (i = 0; focus_listeners[i].name; i++) {
 | 
					 | 
				
			||||||
            if (g_strcmp0 (focus_listener, focus_listeners[i].name) == 0)
 | 
					 | 
				
			||||||
                focus = focus_listeners[i].type;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        if (focus == FOCUS_NONE) {
 | 
					 | 
				
			||||||
            g_printerr ("Unknown focus listener \"%s\".  "
 | 
					 | 
				
			||||||
                        "Try \"atspi\" or \"ibus\"\n", focus_listener);
 | 
					 | 
				
			||||||
            retval = 1;
 | 
					 | 
				
			||||||
            goto out;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					 | 
				
			||||||
    if (focus == FOCUS_ATSPI || opt_keystroke) {
 | 
					 | 
				
			||||||
        GSettings *desktop_settings =
 | 
					 | 
				
			||||||
            g_settings_new ("org.gnome.desktop.interface");
 | 
					 | 
				
			||||||
        gboolean accessibility_enabled =
 | 
					 | 
				
			||||||
            g_settings_get_boolean (desktop_settings, "toolkit-accessibility");
 | 
					 | 
				
			||||||
        g_object_unref (desktop_settings);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (accessibility_enabled) {
 | 
					 | 
				
			||||||
            if (atspi_init () != 0) {
 | 
					 | 
				
			||||||
                g_printerr ("Can't init AT-SPI 2\n");
 | 
					 | 
				
			||||||
                retval = 1;
 | 
					 | 
				
			||||||
                goto out;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (focus == FOCUS_ATSPI &&
 | 
					 | 
				
			||||||
                !client_enable_atspi_focus (client)) {
 | 
					 | 
				
			||||||
                g_printerr ("Can't register AT-SPI focus change event listeners\n");
 | 
					 | 
				
			||||||
                retval = 1;
 | 
					 | 
				
			||||||
                goto out;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (opt_keystroke &&
 | 
					 | 
				
			||||||
                !client_enable_atspi_keystroke (client)) {
 | 
					 | 
				
			||||||
                g_printerr ("Can't register AT-SPI keystroke event listeners\n");
 | 
					 | 
				
			||||||
                retval = 1;
 | 
					 | 
				
			||||||
                goto out;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            g_printerr ("Desktop accessibility support is disabled\n");
 | 
					 | 
				
			||||||
            retval = 1;
 | 
					 | 
				
			||||||
            goto out;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef HAVE_IBUS
 | 
					 | 
				
			||||||
    if (focus == FOCUS_IBUS) {
 | 
					 | 
				
			||||||
        ibus_init ();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!client_enable_ibus_focus (client)) {
 | 
					 | 
				
			||||||
            g_printerr ("Can't register IBus focus change event listeners\n");
 | 
					 | 
				
			||||||
            retval = 1;
 | 
					 | 
				
			||||||
            goto out;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif  /* HAVE_IBUS */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
//#ifdef HAVE_XTEST
 | 
					 | 
				
			||||||
    if (!client_enable_xtest (client)) {
 | 
					 | 
				
			||||||
        g_printerr ("Can't init xtest\n");
 | 
					 | 
				
			||||||
        g_object_unref (client);
 | 
					 | 
				
			||||||
        exit (1);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
//#endif  /* HAVE_XTEST */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!opt_focus) {
 | 
					 | 
				
			||||||
        g_object_get (client, "context", &context, NULL);
 | 
					 | 
				
			||||||
        g_signal_connect (context, "destroyed",
 | 
					 | 
				
			||||||
                          G_CALLBACK(on_context_destroyed), NULL);
 | 
					 | 
				
			||||||
        g_object_unref (context);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (opt_fullscreen ||
 | 
					 | 
				
			||||||
        g_settings_get_boolean (settings, "start-fullscreen")) {
 | 
					 | 
				
			||||||
        g_object_get (client, "context", &context, NULL);
 | 
					 | 
				
			||||||
        eekboard_context_set_fullscreen (context, TRUE, NULL);
 | 
					 | 
				
			||||||
        g_object_unref (context);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_object_get (client, "eekboard", &eekboard, NULL);
 | 
					 | 
				
			||||||
    g_signal_connect (eekboard, "destroyed",
 | 
					 | 
				
			||||||
                      G_CALLBACK(on_destroyed), NULL);
 | 
					 | 
				
			||||||
    g_object_unref (eekboard);
 | 
					 | 
				
			||||||
    
 | 
					 | 
				
			||||||
    if (opt_keyboards != NULL) {
 | 
					 | 
				
			||||||
        keyboards = g_strsplit (opt_keyboards, ",", -1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (!set_keyboards (client, (const gchar * const *)keyboards)) {
 | 
					 | 
				
			||||||
            g_strfreev (keyboards);
 | 
					 | 
				
			||||||
            retval = 1;
 | 
					 | 
				
			||||||
            goto out;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        g_strfreev (keyboards);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gtk_main ();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 out:
 | 
					 | 
				
			||||||
    if (client)
 | 
					 | 
				
			||||||
        g_object_unref (client);
 | 
					 | 
				
			||||||
    if (settings)
 | 
					 | 
				
			||||||
        g_object_unref (settings);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return retval;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										1166
									
								
								src/client.c
									
									
									
									
									
								
							
							
						
						
									
										1166
									
								
								src/client.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										55
									
								
								src/client.h
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								src/client.h
									
									
									
									
									
								
							@ -1,55 +0,0 @@
 | 
				
			|||||||
/* 
 | 
					 | 
				
			||||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
					 | 
				
			||||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
					 | 
				
			||||||
 * 
 | 
					 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
 * (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
 * GNU General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifndef CLIENT_H
 | 
					 | 
				
			||||||
#define CLIENT_H 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <gio/gio.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
G_BEGIN_DECLS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define TYPE_CLIENT (client_get_type())
 | 
					 | 
				
			||||||
#define CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_CLIENT, Client))
 | 
					 | 
				
			||||||
#define CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_CLIENT, ClientClass))
 | 
					 | 
				
			||||||
#define IS_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_CLIENT))
 | 
					 | 
				
			||||||
#define IS_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_CLIENT))
 | 
					 | 
				
			||||||
#define CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_CLIENT, ClientClass))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _Client SeatEmitter;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
SeatEmitter  *client_new                     (GDBusConnection     *connection);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gboolean client_set_keyboards           (SeatEmitter              *client,
 | 
					 | 
				
			||||||
                                         const gchar * const *keyboard);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gboolean client_enable_xkl              (SeatEmitter              *client);
 | 
					 | 
				
			||||||
void     client_disable_xkl             (SeatEmitter              *client);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gboolean client_enable_atspi_focus      (SeatEmitter              *client);
 | 
					 | 
				
			||||||
void     client_disable_atspi_focus     (SeatEmitter              *client);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gboolean client_enable_atspi_keystroke  (SeatEmitter              *client);
 | 
					 | 
				
			||||||
void     client_disable_atspi_keystroke (SeatEmitter              *client);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gboolean client_enable_xtest            (SeatEmitter              *client);
 | 
					 | 
				
			||||||
void     client_disable_xtest           (SeatEmitter              *client);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
gboolean client_enable_ibus_focus       (SeatEmitter              *client);
 | 
					 | 
				
			||||||
void     client_disable_ibus_focus      (SeatEmitter              *client);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
G_END_DECLS
 | 
					 | 
				
			||||||
#endif  /* CLIENT_H */
 | 
					 | 
				
			||||||
@ -5,8 +5,8 @@
 | 
				
			|||||||
#include "eekboard/eekboard-context-service.h"
 | 
					#include "eekboard/eekboard-context-service.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void imservice_handle_text_change_cause(void *data, struct zwp_input_method_v2 *input_method) {}
 | 
					void imservice_handle_text_change_cause(void *data, struct zwp_input_method_v2 *input_method, uint32_t cause) {}
 | 
				
			||||||
void imservice_handle_content_type(void *data, struct zwp_input_method_v2 *input_method) {}
 | 
					void imservice_handle_content_type(void *data, struct zwp_input_method_v2 *input_method, uint32_t hint, uint32_t purpose) {}
 | 
				
			||||||
void imservice_handle_unavailable(void *data, struct zwp_input_method_v2 *input_method) {}
 | 
					void imservice_handle_unavailable(void *data, struct zwp_input_method_v2 *input_method) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,415 +0,0 @@
 | 
				
			|||||||
/* 
 | 
					 | 
				
			||||||
 * Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
 | 
					 | 
				
			||||||
 * Copyright (C) 2011 Red Hat, Inc.
 | 
					 | 
				
			||||||
 * 
 | 
					 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
 * (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
 * GNU General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifdef HAVE_CONFIG_H
 | 
					 | 
				
			||||||
#include "config.h"
 | 
					 | 
				
			||||||
#endif  /* HAVE_CONFIG_H */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <gtk/gtk.h>
 | 
					 | 
				
			||||||
#include "preferences-dialog.h"
 | 
					 | 
				
			||||||
#include <eek/eek.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
struct _PreferencesDialog {
 | 
					 | 
				
			||||||
    GtkWidget *dialog;
 | 
					 | 
				
			||||||
    GtkWidget *repeat_toggle;
 | 
					 | 
				
			||||||
    GtkWidget *repeat_delay_scale;
 | 
					 | 
				
			||||||
    GtkWidget *repeat_speed_scale;
 | 
					 | 
				
			||||||
    GtkWidget *auto_hide_toggle;
 | 
					 | 
				
			||||||
    GtkWidget *auto_hide_delay_scale;
 | 
					 | 
				
			||||||
    GtkWidget *selected_keyboards_treeview;
 | 
					 | 
				
			||||||
    GtkWidget *up_button;
 | 
					 | 
				
			||||||
    GtkWidget *down_button;
 | 
					 | 
				
			||||||
    GtkWidget *add_button;
 | 
					 | 
				
			||||||
    GtkWidget *remove_button;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    GtkWidget *new_keyboard_dialog;
 | 
					 | 
				
			||||||
    GtkWidget *available_keyboards_treeview;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    GList *available_keyboards;
 | 
					 | 
				
			||||||
    GSettings *settings;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gboolean
 | 
					 | 
				
			||||||
get_rate (GValue   *value,
 | 
					 | 
				
			||||||
          GVariant *variant,
 | 
					 | 
				
			||||||
          gpointer  user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    int rate;
 | 
					 | 
				
			||||||
    gdouble fraction;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    rate = g_variant_get_uint32 (variant);
 | 
					 | 
				
			||||||
    fraction = 1.0 / ((gdouble) rate / 1000.0);
 | 
					 | 
				
			||||||
    g_value_set_double (value, fraction);
 | 
					 | 
				
			||||||
    return TRUE;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static GVariant *
 | 
					 | 
				
			||||||
set_rate (const GValue       *value,
 | 
					 | 
				
			||||||
          const GVariantType *expected_type,
 | 
					 | 
				
			||||||
          gpointer            user_data)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    gdouble rate;
 | 
					 | 
				
			||||||
    int msecs;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    rate = g_value_get_double (value);
 | 
					 | 
				
			||||||
    msecs = (1 / rate) * 1000;
 | 
					 | 
				
			||||||
    return g_variant_new_uint32 (msecs);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
add_keyboard_to_treeview (GtkTreeView *treeview,
 | 
					 | 
				
			||||||
                          const gchar *id,
 | 
					 | 
				
			||||||
                          const gchar *longname)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    GtkTreeModel *model = gtk_tree_view_get_model (treeview);
 | 
					 | 
				
			||||||
    GtkTreeIter iter;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (gtk_tree_model_get_iter_first (model, &iter)) {
 | 
					 | 
				
			||||||
        do {
 | 
					 | 
				
			||||||
            gchar *_id;
 | 
					 | 
				
			||||||
            gtk_tree_model_get (model, &iter, 0, &_id, -1);
 | 
					 | 
				
			||||||
            if (g_strcmp0 (id, _id) == 0) {
 | 
					 | 
				
			||||||
                g_free (_id);
 | 
					 | 
				
			||||||
                return;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            g_free (_id);
 | 
					 | 
				
			||||||
        } while (gtk_tree_model_iter_next (model, &iter));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gtk_list_store_append (GTK_LIST_STORE(model),
 | 
					 | 
				
			||||||
                           &iter);
 | 
					 | 
				
			||||||
    gtk_list_store_set (GTK_LIST_STORE(model),
 | 
					 | 
				
			||||||
                        &iter,
 | 
					 | 
				
			||||||
                        0, id,
 | 
					 | 
				
			||||||
                        1, longname,
 | 
					 | 
				
			||||||
                        -1);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
add_keyboard (GtkWidget *button, PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    gint retval = gtk_dialog_run (GTK_DIALOG(dialog->new_keyboard_dialog));
 | 
					 | 
				
			||||||
    if (retval == GTK_RESPONSE_OK) {
 | 
					 | 
				
			||||||
        GtkTreeSelection *selection;
 | 
					 | 
				
			||||||
        GtkTreeModel *model;
 | 
					 | 
				
			||||||
        GList *rows, *p;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog->available_keyboards_treeview));
 | 
					 | 
				
			||||||
        rows = gtk_tree_selection_get_selected_rows (selection, &model);
 | 
					 | 
				
			||||||
        for (p = rows; p; p = p->next) {
 | 
					 | 
				
			||||||
            GtkTreeIter iter;
 | 
					 | 
				
			||||||
            if (gtk_tree_model_get_iter (model, &iter, p->data)) {
 | 
					 | 
				
			||||||
                gchar *id, *longname;
 | 
					 | 
				
			||||||
                gtk_tree_model_get (model, &iter, 0, &id, 1, &longname, -1);
 | 
					 | 
				
			||||||
                add_keyboard_to_treeview (GTK_TREE_VIEW(dialog->selected_keyboards_treeview),
 | 
					 | 
				
			||||||
                                          id,
 | 
					 | 
				
			||||||
                                          longname);
 | 
					 | 
				
			||||||
                g_free (id);
 | 
					 | 
				
			||||||
                g_free (longname);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    gtk_widget_hide (dialog->new_keyboard_dialog);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
remove_keyboard (GtkWidget *button, PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    GtkTreeSelection *selection;
 | 
					 | 
				
			||||||
    GtkTreeModel *model;
 | 
					 | 
				
			||||||
    GList *rows, *p;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog->selected_keyboards_treeview));
 | 
					 | 
				
			||||||
    rows = gtk_tree_selection_get_selected_rows (selection, &model);
 | 
					 | 
				
			||||||
    for (p = rows; p; p = p->next) {
 | 
					 | 
				
			||||||
        GtkTreeIter iter;
 | 
					 | 
				
			||||||
        if (gtk_tree_model_get_iter (model, &iter, p->data))
 | 
					 | 
				
			||||||
            gtk_list_store_remove (GTK_LIST_STORE(model), &iter);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
up_keyboard (GtkWidget *button, PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    GtkTreeSelection *selection;
 | 
					 | 
				
			||||||
    GtkTreeModel *model;
 | 
					 | 
				
			||||||
    GtkTreeIter iter;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog->selected_keyboards_treeview));
 | 
					 | 
				
			||||||
    if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
 | 
					 | 
				
			||||||
        GtkTreeIter prev = iter;
 | 
					 | 
				
			||||||
        if (gtk_tree_model_iter_previous (model, &prev))
 | 
					 | 
				
			||||||
            gtk_list_store_swap (GTK_LIST_STORE(model), &iter, &prev);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
down_keyboard (GtkWidget *button, PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    GtkTreeSelection *selection;
 | 
					 | 
				
			||||||
    GtkTreeModel *model;
 | 
					 | 
				
			||||||
    GtkTreeIter iter;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog->selected_keyboards_treeview));
 | 
					 | 
				
			||||||
    if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
 | 
					 | 
				
			||||||
        GtkTreeIter next = iter;
 | 
					 | 
				
			||||||
        if (gtk_tree_model_iter_next (model, &next))
 | 
					 | 
				
			||||||
            gtk_list_store_swap (GTK_LIST_STORE(model), &iter, &next);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
selection_changed_cb (GtkTreeSelection *selection, PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    gint count = gtk_tree_selection_count_selected_rows (selection);
 | 
					 | 
				
			||||||
    if (count > 0) {
 | 
					 | 
				
			||||||
        gtk_widget_set_sensitive (dialog->remove_button, TRUE);
 | 
					 | 
				
			||||||
        gtk_widget_set_sensitive (dialog->up_button, TRUE);
 | 
					 | 
				
			||||||
        gtk_widget_set_sensitive (dialog->down_button, TRUE);
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
        gtk_widget_set_sensitive (dialog->remove_button, FALSE);
 | 
					 | 
				
			||||||
        gtk_widget_set_sensitive (dialog->up_button, FALSE);
 | 
					 | 
				
			||||||
        gtk_widget_set_sensitive (dialog->down_button, FALSE);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static gint
 | 
					 | 
				
			||||||
compare_keyboard_id (const EekXmlKeyboardDesc *desc, const char *id)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    return g_strcmp0 (desc->id, id);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
populate_selected_keyboards (PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    gchar **strv, **p;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    strv = g_settings_get_strv (dialog->settings, "keyboards");
 | 
					 | 
				
			||||||
    for (p = strv; *p != NULL; p++) {
 | 
					 | 
				
			||||||
        GList *head = g_list_find_custom (dialog->available_keyboards,
 | 
					 | 
				
			||||||
                                            *p,
 | 
					 | 
				
			||||||
                                            (GCompareFunc) compare_keyboard_id);
 | 
					 | 
				
			||||||
        if (head == NULL) {
 | 
					 | 
				
			||||||
            g_warning ("unknown keyboard %s", *p);
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            EekXmlKeyboardDesc *desc = head->data;
 | 
					 | 
				
			||||||
            add_keyboard_to_treeview (GTK_TREE_VIEW(dialog->selected_keyboards_treeview),
 | 
					 | 
				
			||||||
                                      desc->id,
 | 
					 | 
				
			||||||
                                      desc->longname);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    g_strfreev (strv);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
populate_available_keyboards (PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    GList *p;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for (p = dialog->available_keyboards; p; p = p->next) {
 | 
					 | 
				
			||||||
        EekXmlKeyboardDesc *desc = p->data;
 | 
					 | 
				
			||||||
        add_keyboard_to_treeview (GTK_TREE_VIEW(dialog->available_keyboards_treeview),
 | 
					 | 
				
			||||||
                                  desc->id,
 | 
					 | 
				
			||||||
                                  desc->longname);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
save_keyboards (PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    GtkTreeModel *model;
 | 
					 | 
				
			||||||
    GtkTreeIter iter;
 | 
					 | 
				
			||||||
    GList *list = NULL, *head;
 | 
					 | 
				
			||||||
    gchar **strv, **p;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    model = gtk_tree_view_get_model (GTK_TREE_VIEW(dialog->selected_keyboards_treeview));
 | 
					 | 
				
			||||||
    if (gtk_tree_model_get_iter_first (model, &iter)) {
 | 
					 | 
				
			||||||
        do {
 | 
					 | 
				
			||||||
            gchar *id;
 | 
					 | 
				
			||||||
            gtk_tree_model_get (model, &iter, 0, &id, -1);
 | 
					 | 
				
			||||||
            list = g_list_prepend (list, id);
 | 
					 | 
				
			||||||
        } while (gtk_tree_model_iter_next (model, &iter));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    list = g_list_reverse (list);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    strv = g_new0 (gchar *, g_list_length (list) + 1);
 | 
					 | 
				
			||||||
    for (head = list, p = strv; head; head = head->next, p++) {
 | 
					 | 
				
			||||||
        *p = head->data;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    g_settings_set_strv (dialog->settings,
 | 
					 | 
				
			||||||
                         "keyboards",
 | 
					 | 
				
			||||||
                         (const gchar * const *)strv);
 | 
					 | 
				
			||||||
    g_strfreev (strv);
 | 
					 | 
				
			||||||
    g_list_free (list);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PreferencesDialog *
 | 
					 | 
				
			||||||
preferences_dialog_new (void)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    PreferencesDialog *dialog;
 | 
					 | 
				
			||||||
    gchar *ui_path;
 | 
					 | 
				
			||||||
    GtkBuilder *builder;
 | 
					 | 
				
			||||||
    GObject *object;
 | 
					 | 
				
			||||||
    GError *error;
 | 
					 | 
				
			||||||
    GtkListStore *store;
 | 
					 | 
				
			||||||
    GtkCellRenderer *renderer;
 | 
					 | 
				
			||||||
    GtkTreeViewColumn *column;
 | 
					 | 
				
			||||||
    GtkTreeSelection *selection;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dialog = g_slice_new0 (PreferencesDialog);
 | 
					 | 
				
			||||||
    dialog->settings = g_settings_new ("org.fedorahosted.eekboard");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    builder = gtk_builder_new ();
 | 
					 | 
				
			||||||
    gtk_builder_set_translation_domain (builder, "eekboard");
 | 
					 | 
				
			||||||
    ui_path = g_build_filename (PKGDATADIR,
 | 
					 | 
				
			||||||
                                "preferences-dialog.ui",
 | 
					 | 
				
			||||||
                                NULL);
 | 
					 | 
				
			||||||
    error = NULL;
 | 
					 | 
				
			||||||
    if (gtk_builder_add_from_file (builder, ui_path, &error) == 0) {
 | 
					 | 
				
			||||||
        g_warning ("can't load %s: %s", ui_path, error->message);
 | 
					 | 
				
			||||||
        g_error_free (error);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    g_free (ui_path);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "dialog");
 | 
					 | 
				
			||||||
    dialog->dialog = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "repeat_toggle");
 | 
					 | 
				
			||||||
    dialog->repeat_toggle = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_settings_bind (dialog->settings, "repeat",
 | 
					 | 
				
			||||||
                     dialog->repeat_toggle, "active",
 | 
					 | 
				
			||||||
                     G_SETTINGS_BIND_DEFAULT);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "repeat_delay_scale");
 | 
					 | 
				
			||||||
    dialog->repeat_delay_scale = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_settings_bind (dialog->settings, "repeat-delay",
 | 
					 | 
				
			||||||
                     gtk_range_get_adjustment (GTK_RANGE (dialog->repeat_delay_scale)), "value",
 | 
					 | 
				
			||||||
                     G_SETTINGS_BIND_DEFAULT);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "repeat_speed_scale");
 | 
					 | 
				
			||||||
    dialog->repeat_speed_scale = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_settings_bind_with_mapping (dialog->settings, "repeat-interval",
 | 
					 | 
				
			||||||
                                  gtk_range_get_adjustment (GTK_RANGE (gtk_builder_get_object (builder, "repeat_speed_scale"))), "value",
 | 
					 | 
				
			||||||
                                  G_SETTINGS_BIND_DEFAULT,
 | 
					 | 
				
			||||||
                                  get_rate, set_rate, NULL, NULL);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "auto_hide_toggle");
 | 
					 | 
				
			||||||
    dialog->auto_hide_toggle = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_settings_bind (dialog->settings, "auto-hide",
 | 
					 | 
				
			||||||
                     dialog->auto_hide_toggle, "active",
 | 
					 | 
				
			||||||
                     G_SETTINGS_BIND_DEFAULT);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "auto_hide_delay_scale");
 | 
					 | 
				
			||||||
    dialog->auto_hide_delay_scale = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_settings_bind (dialog->settings, "auto-hide-delay",
 | 
					 | 
				
			||||||
                     gtk_range_get_adjustment (GTK_RANGE (dialog->auto_hide_delay_scale)), "value",
 | 
					 | 
				
			||||||
                     G_SETTINGS_BIND_DEFAULT);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder,
 | 
					 | 
				
			||||||
                                     "selected_keyboards_treeview");
 | 
					 | 
				
			||||||
    dialog->selected_keyboards_treeview = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (object));
 | 
					 | 
				
			||||||
    g_signal_connect (G_OBJECT(selection), "changed",
 | 
					 | 
				
			||||||
                      G_CALLBACK(selection_changed_cb), dialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new ());
 | 
					 | 
				
			||||||
    column = gtk_tree_view_column_new_with_attributes ("Keyboard",
 | 
					 | 
				
			||||||
                                                       renderer,
 | 
					 | 
				
			||||||
                                                       "text",
 | 
					 | 
				
			||||||
                                                       1,
 | 
					 | 
				
			||||||
                                                       NULL);
 | 
					 | 
				
			||||||
    gtk_tree_view_append_column (GTK_TREE_VIEW (object), column);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "up_button");
 | 
					 | 
				
			||||||
    dialog->up_button = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
    g_signal_connect (object, "clicked",
 | 
					 | 
				
			||||||
                      G_CALLBACK(up_keyboard), dialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "down_button");
 | 
					 | 
				
			||||||
    dialog->down_button = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
    g_signal_connect (object, "clicked",
 | 
					 | 
				
			||||||
                      G_CALLBACK(down_keyboard), dialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "add_button");
 | 
					 | 
				
			||||||
    dialog->add_button = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
    g_signal_connect (object, "clicked",
 | 
					 | 
				
			||||||
                      G_CALLBACK(add_keyboard), dialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "remove_button");
 | 
					 | 
				
			||||||
    dialog->remove_button = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
    g_signal_connect (object, "clicked",
 | 
					 | 
				
			||||||
                      G_CALLBACK(remove_keyboard), dialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder, "new_keyboard_dialog");
 | 
					 | 
				
			||||||
    dialog->new_keyboard_dialog = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder,
 | 
					 | 
				
			||||||
                                     "available_keyboards_treeview");
 | 
					 | 
				
			||||||
    dialog->available_keyboards_treeview = GTK_WIDGET(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    renderer = GTK_CELL_RENDERER(gtk_cell_renderer_text_new ());
 | 
					 | 
				
			||||||
    column = gtk_tree_view_column_new_with_attributes ("Keyboard",
 | 
					 | 
				
			||||||
                                                       renderer,
 | 
					 | 
				
			||||||
                                                       "text",
 | 
					 | 
				
			||||||
                                                       1,
 | 
					 | 
				
			||||||
                                                       NULL);
 | 
					 | 
				
			||||||
    gtk_tree_view_append_column (GTK_TREE_VIEW (object), column);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    object = gtk_builder_get_object (builder,
 | 
					 | 
				
			||||||
                                     "available_keyboards_liststore");
 | 
					 | 
				
			||||||
    store = GTK_LIST_STORE(object);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(store),
 | 
					 | 
				
			||||||
                                          1,
 | 
					 | 
				
			||||||
                                          GTK_SORT_ASCENDING);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dialog->available_keyboards = eek_xml_list_keyboards ();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    populate_selected_keyboards (dialog);
 | 
					 | 
				
			||||||
    populate_available_keyboards (dialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_object_unref (builder);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return dialog;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
preferences_dialog_run (PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    gtk_window_present (GTK_WINDOW(dialog->dialog));
 | 
					 | 
				
			||||||
    gtk_dialog_run (GTK_DIALOG(dialog->dialog));
 | 
					 | 
				
			||||||
    save_keyboards (dialog);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void
 | 
					 | 
				
			||||||
preferences_dialog_free (PreferencesDialog *dialog)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    gtk_widget_destroy (dialog->dialog);
 | 
					 | 
				
			||||||
    // gtk_widget_destroy (dialog->new_keyboard_dialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_object_unref (dialog->settings);
 | 
					 | 
				
			||||||
    g_list_free_full (dialog->available_keyboards,
 | 
					 | 
				
			||||||
                      (GDestroyNotify) eek_xml_keyboard_desc_free);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    g_slice_free (PreferencesDialog, dialog);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,32 +0,0 @@
 | 
				
			|||||||
/* 
 | 
					 | 
				
			||||||
 * Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
 | 
					 | 
				
			||||||
 * Copyright (C) 2011 Red Hat, Inc.
 | 
					 | 
				
			||||||
 * 
 | 
					 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
 * (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
 * GNU General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifndef PREFERENCES_DIALOG_H
 | 
					 | 
				
			||||||
#define PREFERENCES_DIALOG_H 1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <glib-object.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
G_BEGIN_DECLS
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct _PreferencesDialog PreferencesDialog;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
PreferencesDialog *preferences_dialog_new  (void);
 | 
					 | 
				
			||||||
void               preferences_dialog_run  (PreferencesDialog *dialog);
 | 
					 | 
				
			||||||
void               preferences_dialog_free (PreferencesDialog *dialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
G_END_DECLS
 | 
					 | 
				
			||||||
#endif  /* PREFERENCES_DIALOG_H */
 | 
					 | 
				
			||||||
@ -1,729 +0,0 @@
 | 
				
			|||||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
					 | 
				
			||||||
<interface>
 | 
					 | 
				
			||||||
  <!-- interface-requires gtk+ 3.0 -->
 | 
					 | 
				
			||||||
  <object class="GtkAction" id="action1">
 | 
					 | 
				
			||||||
    <property name="stock_id">gtk-close</property>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
  <object class="GtkAction" id="action2">
 | 
					 | 
				
			||||||
    <property name="stock_id">gtk-cancel</property>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
  <object class="GtkAction" id="action3">
 | 
					 | 
				
			||||||
    <property name="label" translatable="yes">Select</property>
 | 
					 | 
				
			||||||
    <property name="stock_id">gtk-ok</property>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
  <object class="GtkAdjustment" id="auto_hide_delay_adjustment">
 | 
					 | 
				
			||||||
    <property name="lower">100</property>
 | 
					 | 
				
			||||||
    <property name="upper">2000</property>
 | 
					 | 
				
			||||||
    <property name="value">500</property>
 | 
					 | 
				
			||||||
    <property name="step_increment">10</property>
 | 
					 | 
				
			||||||
    <property name="page_increment">10</property>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
  <object class="GtkListStore" id="available_keyboards_liststore">
 | 
					 | 
				
			||||||
    <columns>
 | 
					 | 
				
			||||||
      <!-- column-name id -->
 | 
					 | 
				
			||||||
      <column type="gchararray"/>
 | 
					 | 
				
			||||||
      <!-- column-name gchararray1 -->
 | 
					 | 
				
			||||||
      <column type="gchararray"/>
 | 
					 | 
				
			||||||
    </columns>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
  <object class="GtkDialog" id="dialog">
 | 
					 | 
				
			||||||
    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
    <property name="border_width">5</property>
 | 
					 | 
				
			||||||
    <property name="title" translatable="yes">Keyboard</property>
 | 
					 | 
				
			||||||
    <property name="modal">True</property>
 | 
					 | 
				
			||||||
    <property name="type_hint">dialog</property>
 | 
					 | 
				
			||||||
    <child internal-child="vbox">
 | 
					 | 
				
			||||||
      <object class="GtkBox" id="dialog-vbox4">
 | 
					 | 
				
			||||||
        <property name="visible">True</property>
 | 
					 | 
				
			||||||
        <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
        <property name="orientation">vertical</property>
 | 
					 | 
				
			||||||
        <property name="spacing">2</property>
 | 
					 | 
				
			||||||
        <child internal-child="action_area">
 | 
					 | 
				
			||||||
          <object class="GtkButtonBox" id="dialog-action_area5">
 | 
					 | 
				
			||||||
            <property name="visible">True</property>
 | 
					 | 
				
			||||||
            <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
            <property name="layout_style">end</property>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <placeholder/>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <placeholder/>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <placeholder/>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <object class="GtkButton" id="button1">
 | 
					 | 
				
			||||||
                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                <property name="receives_default">True</property>
 | 
					 | 
				
			||||||
                <property name="related_action">action1</property>
 | 
					 | 
				
			||||||
              </object>
 | 
					 | 
				
			||||||
              <packing>
 | 
					 | 
				
			||||||
                <property name="expand">False</property>
 | 
					 | 
				
			||||||
                <property name="fill">True</property>
 | 
					 | 
				
			||||||
                <property name="position">3</property>
 | 
					 | 
				
			||||||
              </packing>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
          </object>
 | 
					 | 
				
			||||||
          <packing>
 | 
					 | 
				
			||||||
            <property name="expand">False</property>
 | 
					 | 
				
			||||||
            <property name="fill">True</property>
 | 
					 | 
				
			||||||
            <property name="pack_type">end</property>
 | 
					 | 
				
			||||||
            <property name="position">0</property>
 | 
					 | 
				
			||||||
          </packing>
 | 
					 | 
				
			||||||
        </child>
 | 
					 | 
				
			||||||
        <child>
 | 
					 | 
				
			||||||
          <object class="GtkNotebook" id="keyboard_notebook">
 | 
					 | 
				
			||||||
            <property name="visible">True</property>
 | 
					 | 
				
			||||||
            <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
            <property name="border_width">10</property>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <object class="GtkVBox" id="general_page">
 | 
					 | 
				
			||||||
                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                <property name="border_width">12</property>
 | 
					 | 
				
			||||||
                <property name="spacing">18</property>
 | 
					 | 
				
			||||||
                <child>
 | 
					 | 
				
			||||||
                  <object class="GtkVBox" id="vbox22">
 | 
					 | 
				
			||||||
                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                    <property name="spacing">6</property>
 | 
					 | 
				
			||||||
                    <child>
 | 
					 | 
				
			||||||
                      <object class="GtkLabel" id="label300">
 | 
					 | 
				
			||||||
                        <property name="visible">True</property>
 | 
					 | 
				
			||||||
                        <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                        <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                        <property name="label" translatable="yes">Repeat Keys</property>
 | 
					 | 
				
			||||||
                        <attributes>
 | 
					 | 
				
			||||||
                          <attribute name="weight" value="bold"/>
 | 
					 | 
				
			||||||
                        </attributes>
 | 
					 | 
				
			||||||
                      </object>
 | 
					 | 
				
			||||||
                      <packing>
 | 
					 | 
				
			||||||
                        <property name="expand">False</property>
 | 
					 | 
				
			||||||
                        <property name="fill">False</property>
 | 
					 | 
				
			||||||
                        <property name="position">0</property>
 | 
					 | 
				
			||||||
                      </packing>
 | 
					 | 
				
			||||||
                    </child>
 | 
					 | 
				
			||||||
                    <child>
 | 
					 | 
				
			||||||
                      <object class="GtkHBox" id="hbox19">
 | 
					 | 
				
			||||||
                        <property name="visible">True</property>
 | 
					 | 
				
			||||||
                        <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                        <child>
 | 
					 | 
				
			||||||
                          <object class="GtkLabel" id="label43">
 | 
					 | 
				
			||||||
                            <property name="visible">True</property>
 | 
					 | 
				
			||||||
                            <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                            <property name="label">    </property>
 | 
					 | 
				
			||||||
                          </object>
 | 
					 | 
				
			||||||
                          <packing>
 | 
					 | 
				
			||||||
                            <property name="expand">False</property>
 | 
					 | 
				
			||||||
                            <property name="fill">False</property>
 | 
					 | 
				
			||||||
                            <property name="position">0</property>
 | 
					 | 
				
			||||||
                          </packing>
 | 
					 | 
				
			||||||
                        </child>
 | 
					 | 
				
			||||||
                        <child>
 | 
					 | 
				
			||||||
                          <object class="GtkVBox" id="vbox100">
 | 
					 | 
				
			||||||
                            <property name="visible">True</property>
 | 
					 | 
				
			||||||
                            <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                            <property name="spacing">6</property>
 | 
					 | 
				
			||||||
                            <child>
 | 
					 | 
				
			||||||
                              <object class="GtkCheckButton" id="repeat_toggle">
 | 
					 | 
				
			||||||
                                <property name="label" translatable="yes">Key presses _repeat when key is held down</property>
 | 
					 | 
				
			||||||
                                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                                <property name="receives_default">False</property>
 | 
					 | 
				
			||||||
                                <property name="use_action_appearance">False</property>
 | 
					 | 
				
			||||||
                                <property name="use_underline">True</property>
 | 
					 | 
				
			||||||
                                <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                                <property name="draw_indicator">True</property>
 | 
					 | 
				
			||||||
                              </object>
 | 
					 | 
				
			||||||
                              <packing>
 | 
					 | 
				
			||||||
                                <property name="expand">False</property>
 | 
					 | 
				
			||||||
                                <property name="fill">False</property>
 | 
					 | 
				
			||||||
                                <property name="position">0</property>
 | 
					 | 
				
			||||||
                              </packing>
 | 
					 | 
				
			||||||
                            </child>
 | 
					 | 
				
			||||||
                            <child>
 | 
					 | 
				
			||||||
                              <object class="GtkTable" id="repeat_table">
 | 
					 | 
				
			||||||
                                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                <property name="n_rows">2</property>
 | 
					 | 
				
			||||||
                                <property name="n_columns">4</property>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkLabel" id="repeat_speed_label">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                    <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                                    <property name="label" translatable="yes">_Speed:</property>
 | 
					 | 
				
			||||||
                                    <property name="use_underline">True</property>
 | 
					 | 
				
			||||||
                                    <property name="justify">center</property>
 | 
					 | 
				
			||||||
                                    <property name="mnemonic_widget">repeat_speed_scale</property>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="top_attach">1</property>
 | 
					 | 
				
			||||||
                                    <property name="bottom_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkLabel" id="delay_short_label">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                    <property name="xalign">1</property>
 | 
					 | 
				
			||||||
                                    <property name="xpad">10</property>
 | 
					 | 
				
			||||||
                                    <property name="label" translatable="yes">Short</property>
 | 
					 | 
				
			||||||
                                    <attributes>
 | 
					 | 
				
			||||||
                                      <attribute name="style" value="italic"/>
 | 
					 | 
				
			||||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
					 | 
				
			||||||
                                    </attributes>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="left_attach">1</property>
 | 
					 | 
				
			||||||
                                    <property name="right_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkLabel" id="repeat_slow_label">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                    <property name="xalign">1</property>
 | 
					 | 
				
			||||||
                                    <property name="xpad">10</property>
 | 
					 | 
				
			||||||
                                    <property name="label" translatable="yes">Slow</property>
 | 
					 | 
				
			||||||
                                    <attributes>
 | 
					 | 
				
			||||||
                                      <attribute name="style" value="italic"/>
 | 
					 | 
				
			||||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
					 | 
				
			||||||
                                    </attributes>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="left_attach">1</property>
 | 
					 | 
				
			||||||
                                    <property name="right_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="top_attach">1</property>
 | 
					 | 
				
			||||||
                                    <property name="bottom_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkHScale" id="repeat_delay_scale">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                                    <property name="adjustment">repeat_delay_adjustment</property>
 | 
					 | 
				
			||||||
                                    <property name="draw_value">False</property>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="left_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="right_attach">3</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkHScale" id="repeat_speed_scale">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                                    <property name="adjustment">repeat_speed_adjustment</property>
 | 
					 | 
				
			||||||
                                    <property name="draw_value">False</property>
 | 
					 | 
				
			||||||
                                    <child internal-child="accessible">
 | 
					 | 
				
			||||||
                                      <object class="AtkObject" id="repeat_speed_scale-atkobject">
 | 
					 | 
				
			||||||
                                        <property name="AtkObject::accessible-description" translatable="yes">Repeat keys speed</property>
 | 
					 | 
				
			||||||
                                      </object>
 | 
					 | 
				
			||||||
                                    </child>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="left_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="right_attach">3</property>
 | 
					 | 
				
			||||||
                                    <property name="top_attach">1</property>
 | 
					 | 
				
			||||||
                                    <property name="bottom_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkLabel" id="delay_long_label">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                    <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                                    <property name="label" translatable="yes">Long</property>
 | 
					 | 
				
			||||||
                                    <attributes>
 | 
					 | 
				
			||||||
                                      <attribute name="style" value="italic"/>
 | 
					 | 
				
			||||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
					 | 
				
			||||||
                                    </attributes>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="left_attach">3</property>
 | 
					 | 
				
			||||||
                                    <property name="right_attach">4</property>
 | 
					 | 
				
			||||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkLabel" id="repeat_fast_label">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                    <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                                    <property name="label" translatable="yes">Fast</property>
 | 
					 | 
				
			||||||
                                    <attributes>
 | 
					 | 
				
			||||||
                                      <attribute name="style" value="italic"/>
 | 
					 | 
				
			||||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
					 | 
				
			||||||
                                    </attributes>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="left_attach">3</property>
 | 
					 | 
				
			||||||
                                    <property name="right_attach">4</property>
 | 
					 | 
				
			||||||
                                    <property name="top_attach">1</property>
 | 
					 | 
				
			||||||
                                    <property name="bottom_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkLabel" id="repeat_delay_label">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                    <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                                    <property name="label" translatable="yes">_Delay:</property>
 | 
					 | 
				
			||||||
                                    <property name="use_underline">True</property>
 | 
					 | 
				
			||||||
                                    <property name="justify">center</property>
 | 
					 | 
				
			||||||
                                    <property name="mnemonic_widget">repeat_delay_scale</property>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                              </object>
 | 
					 | 
				
			||||||
                              <packing>
 | 
					 | 
				
			||||||
                                <property name="expand">False</property>
 | 
					 | 
				
			||||||
                                <property name="fill">False</property>
 | 
					 | 
				
			||||||
                                <property name="position">1</property>
 | 
					 | 
				
			||||||
                              </packing>
 | 
					 | 
				
			||||||
                            </child>
 | 
					 | 
				
			||||||
                          </object>
 | 
					 | 
				
			||||||
                          <packing>
 | 
					 | 
				
			||||||
                            <property name="expand">True</property>
 | 
					 | 
				
			||||||
                            <property name="fill">True</property>
 | 
					 | 
				
			||||||
                            <property name="position">1</property>
 | 
					 | 
				
			||||||
                          </packing>
 | 
					 | 
				
			||||||
                        </child>
 | 
					 | 
				
			||||||
                      </object>
 | 
					 | 
				
			||||||
                      <packing>
 | 
					 | 
				
			||||||
                        <property name="expand">False</property>
 | 
					 | 
				
			||||||
                        <property name="fill">False</property>
 | 
					 | 
				
			||||||
                        <property name="position">1</property>
 | 
					 | 
				
			||||||
                      </packing>
 | 
					 | 
				
			||||||
                    </child>
 | 
					 | 
				
			||||||
                  </object>
 | 
					 | 
				
			||||||
                  <packing>
 | 
					 | 
				
			||||||
                    <property name="expand">False</property>
 | 
					 | 
				
			||||||
                    <property name="fill">False</property>
 | 
					 | 
				
			||||||
                    <property name="position">0</property>
 | 
					 | 
				
			||||||
                  </packing>
 | 
					 | 
				
			||||||
                </child>
 | 
					 | 
				
			||||||
                <child>
 | 
					 | 
				
			||||||
                  <object class="GtkVBox" id="vbox230">
 | 
					 | 
				
			||||||
                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                    <property name="spacing">6</property>
 | 
					 | 
				
			||||||
                    <child>
 | 
					 | 
				
			||||||
                      <object class="GtkLabel" id="label5">
 | 
					 | 
				
			||||||
                        <property name="visible">True</property>
 | 
					 | 
				
			||||||
                        <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                        <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                        <property name="label" translatable="yes">Focus following</property>
 | 
					 | 
				
			||||||
                        <attributes>
 | 
					 | 
				
			||||||
                          <attribute name="weight" value="bold"/>
 | 
					 | 
				
			||||||
                        </attributes>
 | 
					 | 
				
			||||||
                      </object>
 | 
					 | 
				
			||||||
                      <packing>
 | 
					 | 
				
			||||||
                        <property name="expand">False</property>
 | 
					 | 
				
			||||||
                        <property name="fill">False</property>
 | 
					 | 
				
			||||||
                        <property name="position">0</property>
 | 
					 | 
				
			||||||
                      </packing>
 | 
					 | 
				
			||||||
                    </child>
 | 
					 | 
				
			||||||
                    <child>
 | 
					 | 
				
			||||||
                      <object class="GtkHBox" id="hbox20">
 | 
					 | 
				
			||||||
                        <property name="visible">True</property>
 | 
					 | 
				
			||||||
                        <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                        <child>
 | 
					 | 
				
			||||||
                          <object class="GtkLabel" id="label44">
 | 
					 | 
				
			||||||
                            <property name="visible">True</property>
 | 
					 | 
				
			||||||
                            <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                            <property name="label">    </property>
 | 
					 | 
				
			||||||
                          </object>
 | 
					 | 
				
			||||||
                          <packing>
 | 
					 | 
				
			||||||
                            <property name="expand">False</property>
 | 
					 | 
				
			||||||
                            <property name="fill">False</property>
 | 
					 | 
				
			||||||
                            <property name="position">0</property>
 | 
					 | 
				
			||||||
                          </packing>
 | 
					 | 
				
			||||||
                        </child>
 | 
					 | 
				
			||||||
                        <child>
 | 
					 | 
				
			||||||
                          <object class="GtkVBox" id="appearances_vbox">
 | 
					 | 
				
			||||||
                            <property name="visible">True</property>
 | 
					 | 
				
			||||||
                            <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                            <property name="spacing">6</property>
 | 
					 | 
				
			||||||
                            <child>
 | 
					 | 
				
			||||||
                              <object class="GtkCheckButton" id="auto_hide_toggle">
 | 
					 | 
				
			||||||
                                <property name="label" translatable="yes">Auto hide window when focus is out</property>
 | 
					 | 
				
			||||||
                                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                                <property name="receives_default">False</property>
 | 
					 | 
				
			||||||
                                <property name="use_action_appearance">False</property>
 | 
					 | 
				
			||||||
                                <property name="use_underline">True</property>
 | 
					 | 
				
			||||||
                                <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                                <property name="draw_indicator">True</property>
 | 
					 | 
				
			||||||
                              </object>
 | 
					 | 
				
			||||||
                              <packing>
 | 
					 | 
				
			||||||
                                <property name="expand">False</property>
 | 
					 | 
				
			||||||
                                <property name="fill">False</property>
 | 
					 | 
				
			||||||
                                <property name="position">0</property>
 | 
					 | 
				
			||||||
                              </packing>
 | 
					 | 
				
			||||||
                            </child>
 | 
					 | 
				
			||||||
                            <child>
 | 
					 | 
				
			||||||
                              <object class="GtkTable" id="table1">
 | 
					 | 
				
			||||||
                                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                <property name="n_columns">4</property>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkLabel" id="auto_hide_delay_label">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                    <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                                    <property name="label" translatable="yes">_Delay:</property>
 | 
					 | 
				
			||||||
                                    <property name="use_underline">True</property>
 | 
					 | 
				
			||||||
                                    <property name="justify">center</property>
 | 
					 | 
				
			||||||
                                    <property name="mnemonic_widget">auto_hide_delay_scale</property>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkLabel" id="auto_hide_delay_short_label">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                    <property name="xalign">1</property>
 | 
					 | 
				
			||||||
                                    <property name="xpad">10</property>
 | 
					 | 
				
			||||||
                                    <property name="label" translatable="yes">Short</property>
 | 
					 | 
				
			||||||
                                    <attributes>
 | 
					 | 
				
			||||||
                                      <attribute name="style" value="italic"/>
 | 
					 | 
				
			||||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
					 | 
				
			||||||
                                    </attributes>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="left_attach">1</property>
 | 
					 | 
				
			||||||
                                    <property name="right_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkHScale" id="auto_hide_delay_scale">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                                    <property name="adjustment">auto_hide_delay_adjustment</property>
 | 
					 | 
				
			||||||
                                    <property name="draw_value">False</property>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="left_attach">2</property>
 | 
					 | 
				
			||||||
                                    <property name="right_attach">3</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                                <child>
 | 
					 | 
				
			||||||
                                  <object class="GtkLabel" id="auto_hide_delay_long_label">
 | 
					 | 
				
			||||||
                                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                                    <property name="xalign">0</property>
 | 
					 | 
				
			||||||
                                    <property name="label" translatable="yes">Long</property>
 | 
					 | 
				
			||||||
                                    <attributes>
 | 
					 | 
				
			||||||
                                      <attribute name="style" value="italic"/>
 | 
					 | 
				
			||||||
                                      <attribute name="scale" value="0.82999999999999996"/>
 | 
					 | 
				
			||||||
                                    </attributes>
 | 
					 | 
				
			||||||
                                  </object>
 | 
					 | 
				
			||||||
                                  <packing>
 | 
					 | 
				
			||||||
                                    <property name="left_attach">3</property>
 | 
					 | 
				
			||||||
                                    <property name="right_attach">4</property>
 | 
					 | 
				
			||||||
                                    <property name="x_options">GTK_SHRINK</property>
 | 
					 | 
				
			||||||
                                    <property name="y_options"></property>
 | 
					 | 
				
			||||||
                                  </packing>
 | 
					 | 
				
			||||||
                                </child>
 | 
					 | 
				
			||||||
                              </object>
 | 
					 | 
				
			||||||
                              <packing>
 | 
					 | 
				
			||||||
                                <property name="expand">False</property>
 | 
					 | 
				
			||||||
                                <property name="fill">False</property>
 | 
					 | 
				
			||||||
                                <property name="position">1</property>
 | 
					 | 
				
			||||||
                              </packing>
 | 
					 | 
				
			||||||
                            </child>
 | 
					 | 
				
			||||||
                          </object>
 | 
					 | 
				
			||||||
                          <packing>
 | 
					 | 
				
			||||||
                            <property name="expand">True</property>
 | 
					 | 
				
			||||||
                            <property name="fill">True</property>
 | 
					 | 
				
			||||||
                            <property name="position">1</property>
 | 
					 | 
				
			||||||
                          </packing>
 | 
					 | 
				
			||||||
                        </child>
 | 
					 | 
				
			||||||
                      </object>
 | 
					 | 
				
			||||||
                      <packing>
 | 
					 | 
				
			||||||
                        <property name="expand">False</property>
 | 
					 | 
				
			||||||
                        <property name="fill">False</property>
 | 
					 | 
				
			||||||
                        <property name="position">1</property>
 | 
					 | 
				
			||||||
                      </packing>
 | 
					 | 
				
			||||||
                    </child>
 | 
					 | 
				
			||||||
                  </object>
 | 
					 | 
				
			||||||
                  <packing>
 | 
					 | 
				
			||||||
                    <property name="expand">False</property>
 | 
					 | 
				
			||||||
                    <property name="fill">False</property>
 | 
					 | 
				
			||||||
                    <property name="position">1</property>
 | 
					 | 
				
			||||||
                  </packing>
 | 
					 | 
				
			||||||
                </child>
 | 
					 | 
				
			||||||
              </object>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
            <child type="tab">
 | 
					 | 
				
			||||||
              <object class="GtkLabel" id="label1">
 | 
					 | 
				
			||||||
                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                <property name="label" translatable="yes">Typing</property>
 | 
					 | 
				
			||||||
              </object>
 | 
					 | 
				
			||||||
              <packing>
 | 
					 | 
				
			||||||
                <property name="tab_fill">False</property>
 | 
					 | 
				
			||||||
              </packing>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <object class="GtkVBox" id="keyboards_page">
 | 
					 | 
				
			||||||
                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                <property name="border_width">12</property>
 | 
					 | 
				
			||||||
                <property name="spacing">18</property>
 | 
					 | 
				
			||||||
                <child>
 | 
					 | 
				
			||||||
                  <object class="GtkTreeView" id="selected_keyboards_treeview">
 | 
					 | 
				
			||||||
                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                    <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                    <property name="model">selected_keyboards_liststore</property>
 | 
					 | 
				
			||||||
                    <property name="headers_visible">False</property>
 | 
					 | 
				
			||||||
                    <property name="headers_clickable">False</property>
 | 
					 | 
				
			||||||
                    <child internal-child="selection">
 | 
					 | 
				
			||||||
                      <object class="GtkTreeSelection" id="treeview-selection2"/>
 | 
					 | 
				
			||||||
                    </child>
 | 
					 | 
				
			||||||
                  </object>
 | 
					 | 
				
			||||||
                  <packing>
 | 
					 | 
				
			||||||
                    <property name="expand">True</property>
 | 
					 | 
				
			||||||
                    <property name="fill">True</property>
 | 
					 | 
				
			||||||
                    <property name="position">0</property>
 | 
					 | 
				
			||||||
                  </packing>
 | 
					 | 
				
			||||||
                </child>
 | 
					 | 
				
			||||||
                <child>
 | 
					 | 
				
			||||||
                  <object class="GtkButtonBox" id="buttonbox1">
 | 
					 | 
				
			||||||
                    <property name="visible">True</property>
 | 
					 | 
				
			||||||
                    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                    <property name="spacing">2</property>
 | 
					 | 
				
			||||||
                    <property name="layout_style">end</property>
 | 
					 | 
				
			||||||
                    <child>
 | 
					 | 
				
			||||||
                      <object class="GtkButton" id="up_button">
 | 
					 | 
				
			||||||
                        <property name="label">gtk-go-up</property>
 | 
					 | 
				
			||||||
                        <property name="visible">True</property>
 | 
					 | 
				
			||||||
                        <property name="sensitive">False</property>
 | 
					 | 
				
			||||||
                        <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                        <property name="receives_default">True</property>
 | 
					 | 
				
			||||||
                        <property name="use_action_appearance">False</property>
 | 
					 | 
				
			||||||
                        <property name="use_stock">True</property>
 | 
					 | 
				
			||||||
                      </object>
 | 
					 | 
				
			||||||
                      <packing>
 | 
					 | 
				
			||||||
                        <property name="expand">False</property>
 | 
					 | 
				
			||||||
                        <property name="fill">True</property>
 | 
					 | 
				
			||||||
                        <property name="position">0</property>
 | 
					 | 
				
			||||||
                      </packing>
 | 
					 | 
				
			||||||
                    </child>
 | 
					 | 
				
			||||||
                    <child>
 | 
					 | 
				
			||||||
                      <object class="GtkButton" id="down_button">
 | 
					 | 
				
			||||||
                        <property name="label">gtk-go-down</property>
 | 
					 | 
				
			||||||
                        <property name="visible">True</property>
 | 
					 | 
				
			||||||
                        <property name="sensitive">False</property>
 | 
					 | 
				
			||||||
                        <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                        <property name="receives_default">True</property>
 | 
					 | 
				
			||||||
                        <property name="use_action_appearance">False</property>
 | 
					 | 
				
			||||||
                        <property name="use_stock">True</property>
 | 
					 | 
				
			||||||
                      </object>
 | 
					 | 
				
			||||||
                      <packing>
 | 
					 | 
				
			||||||
                        <property name="expand">False</property>
 | 
					 | 
				
			||||||
                        <property name="fill">True</property>
 | 
					 | 
				
			||||||
                        <property name="position">1</property>
 | 
					 | 
				
			||||||
                      </packing>
 | 
					 | 
				
			||||||
                    </child>
 | 
					 | 
				
			||||||
                    <child>
 | 
					 | 
				
			||||||
                      <object class="GtkButton" id="add_button">
 | 
					 | 
				
			||||||
                        <property name="label">gtk-add</property>
 | 
					 | 
				
			||||||
                        <property name="visible">True</property>
 | 
					 | 
				
			||||||
                        <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                        <property name="receives_default">True</property>
 | 
					 | 
				
			||||||
                        <property name="use_action_appearance">False</property>
 | 
					 | 
				
			||||||
                        <property name="use_stock">True</property>
 | 
					 | 
				
			||||||
                      </object>
 | 
					 | 
				
			||||||
                      <packing>
 | 
					 | 
				
			||||||
                        <property name="expand">False</property>
 | 
					 | 
				
			||||||
                        <property name="fill">True</property>
 | 
					 | 
				
			||||||
                        <property name="position">2</property>
 | 
					 | 
				
			||||||
                      </packing>
 | 
					 | 
				
			||||||
                    </child>
 | 
					 | 
				
			||||||
                    <child>
 | 
					 | 
				
			||||||
                      <object class="GtkButton" id="remove_button">
 | 
					 | 
				
			||||||
                        <property name="label">gtk-remove</property>
 | 
					 | 
				
			||||||
                        <property name="visible">True</property>
 | 
					 | 
				
			||||||
                        <property name="sensitive">False</property>
 | 
					 | 
				
			||||||
                        <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                        <property name="receives_default">True</property>
 | 
					 | 
				
			||||||
                        <property name="use_action_appearance">False</property>
 | 
					 | 
				
			||||||
                        <property name="use_stock">True</property>
 | 
					 | 
				
			||||||
                      </object>
 | 
					 | 
				
			||||||
                      <packing>
 | 
					 | 
				
			||||||
                        <property name="expand">False</property>
 | 
					 | 
				
			||||||
                        <property name="fill">True</property>
 | 
					 | 
				
			||||||
                        <property name="position">3</property>
 | 
					 | 
				
			||||||
                      </packing>
 | 
					 | 
				
			||||||
                    </child>
 | 
					 | 
				
			||||||
                  </object>
 | 
					 | 
				
			||||||
                  <packing>
 | 
					 | 
				
			||||||
                    <property name="expand">False</property>
 | 
					 | 
				
			||||||
                    <property name="fill">False</property>
 | 
					 | 
				
			||||||
                    <property name="position">1</property>
 | 
					 | 
				
			||||||
                  </packing>
 | 
					 | 
				
			||||||
                </child>
 | 
					 | 
				
			||||||
              </object>
 | 
					 | 
				
			||||||
              <packing>
 | 
					 | 
				
			||||||
                <property name="position">1</property>
 | 
					 | 
				
			||||||
              </packing>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
            <child type="tab">
 | 
					 | 
				
			||||||
              <object class="GtkLabel" id="label2">
 | 
					 | 
				
			||||||
                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
                <property name="label" translatable="yes">Keyboards</property>
 | 
					 | 
				
			||||||
              </object>
 | 
					 | 
				
			||||||
              <packing>
 | 
					 | 
				
			||||||
                <property name="position">1</property>
 | 
					 | 
				
			||||||
                <property name="tab_fill">False</property>
 | 
					 | 
				
			||||||
              </packing>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <placeholder/>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
            <child type="tab">
 | 
					 | 
				
			||||||
              <placeholder/>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
          </object>
 | 
					 | 
				
			||||||
          <packing>
 | 
					 | 
				
			||||||
            <property name="expand">True</property>
 | 
					 | 
				
			||||||
            <property name="fill">True</property>
 | 
					 | 
				
			||||||
            <property name="position">1</property>
 | 
					 | 
				
			||||||
          </packing>
 | 
					 | 
				
			||||||
        </child>
 | 
					 | 
				
			||||||
      </object>
 | 
					 | 
				
			||||||
    </child>
 | 
					 | 
				
			||||||
    <action-widgets>
 | 
					 | 
				
			||||||
      <action-widget response="0">button1</action-widget>
 | 
					 | 
				
			||||||
    </action-widgets>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
  <object class="GtkDialog" id="new_keyboard_dialog">
 | 
					 | 
				
			||||||
    <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
    <property name="border_width">5</property>
 | 
					 | 
				
			||||||
    <property name="default_height">430</property>
 | 
					 | 
				
			||||||
    <property name="destroy_with_parent">True</property>
 | 
					 | 
				
			||||||
    <property name="type_hint">dialog</property>
 | 
					 | 
				
			||||||
    <property name="transient_for">dialog</property>
 | 
					 | 
				
			||||||
    <child internal-child="vbox">
 | 
					 | 
				
			||||||
      <object class="GtkBox" id="dialog-vbox2">
 | 
					 | 
				
			||||||
        <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
        <property name="orientation">vertical</property>
 | 
					 | 
				
			||||||
        <property name="spacing">2</property>
 | 
					 | 
				
			||||||
        <child internal-child="action_area">
 | 
					 | 
				
			||||||
          <object class="GtkButtonBox" id="dialog-action_area2">
 | 
					 | 
				
			||||||
            <property name="can_focus">False</property>
 | 
					 | 
				
			||||||
            <property name="layout_style">end</property>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <object class="GtkButton" id="button2">
 | 
					 | 
				
			||||||
                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                <property name="receives_default">True</property>
 | 
					 | 
				
			||||||
                <property name="related_action">action2</property>
 | 
					 | 
				
			||||||
              </object>
 | 
					 | 
				
			||||||
              <packing>
 | 
					 | 
				
			||||||
                <property name="expand">False</property>
 | 
					 | 
				
			||||||
                <property name="fill">True</property>
 | 
					 | 
				
			||||||
                <property name="position">0</property>
 | 
					 | 
				
			||||||
              </packing>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <object class="GtkButton" id="button3">
 | 
					 | 
				
			||||||
                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                <property name="receives_default">True</property>
 | 
					 | 
				
			||||||
                <property name="related_action">action3</property>
 | 
					 | 
				
			||||||
              </object>
 | 
					 | 
				
			||||||
              <packing>
 | 
					 | 
				
			||||||
                <property name="expand">False</property>
 | 
					 | 
				
			||||||
                <property name="fill">True</property>
 | 
					 | 
				
			||||||
                <property name="position">1</property>
 | 
					 | 
				
			||||||
              </packing>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
          </object>
 | 
					 | 
				
			||||||
          <packing>
 | 
					 | 
				
			||||||
            <property name="expand">False</property>
 | 
					 | 
				
			||||||
            <property name="fill">True</property>
 | 
					 | 
				
			||||||
            <property name="pack_type">end</property>
 | 
					 | 
				
			||||||
            <property name="position">0</property>
 | 
					 | 
				
			||||||
          </packing>
 | 
					 | 
				
			||||||
        </child>
 | 
					 | 
				
			||||||
        <child>
 | 
					 | 
				
			||||||
          <object class="GtkScrolledWindow" id="scrolledwindow1">
 | 
					 | 
				
			||||||
            <property name="visible">True</property>
 | 
					 | 
				
			||||||
            <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
            <property name="shadow_type">in</property>
 | 
					 | 
				
			||||||
            <child>
 | 
					 | 
				
			||||||
              <object class="GtkTreeView" id="available_keyboards_treeview">
 | 
					 | 
				
			||||||
                <property name="visible">True</property>
 | 
					 | 
				
			||||||
                <property name="can_focus">True</property>
 | 
					 | 
				
			||||||
                <property name="model">available_keyboards_liststore</property>
 | 
					 | 
				
			||||||
                <property name="headers_visible">False</property>
 | 
					 | 
				
			||||||
                <property name="headers_clickable">False</property>
 | 
					 | 
				
			||||||
                <child internal-child="selection">
 | 
					 | 
				
			||||||
                  <object class="GtkTreeSelection" id="treeview-selection3"/>
 | 
					 | 
				
			||||||
                </child>
 | 
					 | 
				
			||||||
              </object>
 | 
					 | 
				
			||||||
            </child>
 | 
					 | 
				
			||||||
          </object>
 | 
					 | 
				
			||||||
          <packing>
 | 
					 | 
				
			||||||
            <property name="expand">True</property>
 | 
					 | 
				
			||||||
            <property name="fill">True</property>
 | 
					 | 
				
			||||||
            <property name="position">1</property>
 | 
					 | 
				
			||||||
          </packing>
 | 
					 | 
				
			||||||
        </child>
 | 
					 | 
				
			||||||
      </object>
 | 
					 | 
				
			||||||
    </child>
 | 
					 | 
				
			||||||
    <action-widgets>
 | 
					 | 
				
			||||||
      <action-widget response="0">button2</action-widget>
 | 
					 | 
				
			||||||
      <action-widget response="-5">button3</action-widget>
 | 
					 | 
				
			||||||
    </action-widgets>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
  <object class="GtkAdjustment" id="repeat_delay_adjustment">
 | 
					 | 
				
			||||||
    <property name="lower">100</property>
 | 
					 | 
				
			||||||
    <property name="upper">2000</property>
 | 
					 | 
				
			||||||
    <property name="value">500</property>
 | 
					 | 
				
			||||||
    <property name="step_increment">10</property>
 | 
					 | 
				
			||||||
    <property name="page_increment">10</property>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
  <object class="GtkAdjustment" id="repeat_speed_adjustment">
 | 
					 | 
				
			||||||
    <property name="lower">0.5</property>
 | 
					 | 
				
			||||||
    <property name="upper">50</property>
 | 
					 | 
				
			||||||
    <property name="value">33.299999999999997</property>
 | 
					 | 
				
			||||||
    <property name="step_increment">1</property>
 | 
					 | 
				
			||||||
    <property name="page_increment">1</property>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
  <object class="GtkListStore" id="selected_keyboards_liststore">
 | 
					 | 
				
			||||||
    <columns>
 | 
					 | 
				
			||||||
      <!-- column-name id -->
 | 
					 | 
				
			||||||
      <column type="gchararray"/>
 | 
					 | 
				
			||||||
      <!-- column-name gchararray1 -->
 | 
					 | 
				
			||||||
      <column type="gchararray"/>
 | 
					 | 
				
			||||||
    </columns>
 | 
					 | 
				
			||||||
  </object>
 | 
					 | 
				
			||||||
</interface>
 | 
					 | 
				
			||||||
@ -1,7 +1,7 @@
 | 
				
			|||||||
/* 
 | 
					/*
 | 
				
			||||||
 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
					 * Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
 | 
				
			||||||
 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
					 * Copyright (C) 2010-2011 Red Hat, Inc.
 | 
				
			||||||
 * 
 | 
					 *
 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 * This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 * it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
					 * the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
@ -65,10 +65,10 @@ static void set_dock      (GtkWidget            *widget,
 | 
				
			|||||||
                           GtkAllocation        *allocation);
 | 
					                           GtkAllocation        *allocation);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_monitors_changed (GdkScreen *screen,
 | 
					on_monitors_changed (GdkScreen            *screen,
 | 
				
			||||||
                     gpointer   user_data)
 | 
					                     ServerContextService *context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ServerContextService *context = user_data;
 | 
					 | 
				
			||||||
    if (context->window)
 | 
					    if (context->window)
 | 
				
			||||||
        set_geometry (context);
 | 
					        set_geometry (context);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -87,18 +87,16 @@ on_destroy (GtkWidget *widget, gpointer user_data)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_notify_keyboard (GObject    *object,
 | 
					on_notify_keyboard (GObject              *object,
 | 
				
			||||||
                    GParamSpec *spec,
 | 
					                    GParamSpec           *spec,
 | 
				
			||||||
                    gpointer    user_data)
 | 
					                    ServerContextService *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ServerContextService *context = user_data;
 | 
					 | 
				
			||||||
    const EekKeyboard *keyboard;
 | 
					    const EekKeyboard *keyboard;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
 | 
					    keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!keyboard) {
 | 
					    if (!keyboard)
 | 
				
			||||||
        g_error("Programmer error: keyboard layout was unset!");
 | 
					        g_error("Programmer error: keyboard layout was unset!");
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // The keymap will get set even if the window is hidden.
 | 
					    // The keymap will get set even if the window is hidden.
 | 
				
			||||||
    // It's not perfect,
 | 
					    // It's not perfect,
 | 
				
			||||||
@ -109,8 +107,7 @@ on_notify_keyboard (GObject    *object,
 | 
				
			|||||||
    if (context->window) {
 | 
					    if (context->window) {
 | 
				
			||||||
        if (keyboard == NULL) {
 | 
					        if (keyboard == NULL) {
 | 
				
			||||||
            gtk_widget_hide (context->window);
 | 
					            gtk_widget_hide (context->window);
 | 
				
			||||||
            gtk_widget_destroy (context->widget);
 | 
					            g_clear_pointer (&context->widget, gtk_widget_destroy);
 | 
				
			||||||
            context->widget = NULL;
 | 
					 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            gboolean was_visible = gtk_widget_get_visible (context->window);
 | 
					            gboolean was_visible = gtk_widget_get_visible (context->window);
 | 
				
			||||||
            /* avoid to send KeyboardVisibilityChanged */
 | 
					            /* avoid to send KeyboardVisibilityChanged */
 | 
				
			||||||
@ -125,21 +122,21 @@ on_notify_keyboard (GObject    *object,
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
        
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_notify_fullscreen (GObject    *object,
 | 
					on_notify_fullscreen (GObject              *object,  // <--- context
 | 
				
			||||||
                      GParamSpec *spec,
 | 
					                      GParamSpec           *spec,
 | 
				
			||||||
                      gpointer    user_data)
 | 
					                      ServerContextService *context) // <--- more context
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ServerContextService *context = user_data;
 | 
					 | 
				
			||||||
    if (context->window)
 | 
					    if (context->window)
 | 
				
			||||||
        set_geometry (context);
 | 
					        set_geometry (context);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_notify_visible (GObject *object, GParamSpec *spec, gpointer user_data)
 | 
					on_notify_visible (GObject    *object,            // <--- context
 | 
				
			||||||
 | 
					                   GParamSpec *spec,
 | 
				
			||||||
 | 
					                   ServerContextService *context) // <--- more context
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ServerContextService *context = user_data;
 | 
					 | 
				
			||||||
    gboolean visible;
 | 
					    gboolean visible;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_object_get (object, "visible", &visible, NULL);
 | 
					    g_object_get (object, "visible", &visible, NULL);
 | 
				
			||||||
@ -147,7 +144,7 @@ on_notify_visible (GObject *object, GParamSpec *spec, gpointer user_data)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
set_dock (GtkWidget *widget, GtkAllocation *allocation)
 | 
					set_dock (GtkWidget *widget, GtkAllocation *allocation) // <--- FIXME: this could go
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef HAVE_XDOCK
 | 
					#ifdef HAVE_XDOCK
 | 
				
			||||||
    GdkWindow *window = gtk_widget_get_window (widget);
 | 
					    GdkWindow *window = gtk_widget_get_window (widget);
 | 
				
			||||||
@ -155,7 +152,7 @@ set_dock (GtkWidget *widget, GtkAllocation *allocation)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    /* set window type to dock */
 | 
					    /* set window type to dock */
 | 
				
			||||||
    gdk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DOCK);
 | 
					    gdk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DOCK);
 | 
				
			||||||
  
 | 
					
 | 
				
			||||||
    vals[0] = 0;
 | 
					    vals[0] = 0;
 | 
				
			||||||
    vals[1] = 0;
 | 
					    vals[1] = 0;
 | 
				
			||||||
    vals[2] = 0;
 | 
					    vals[2] = 0;
 | 
				
			||||||
@ -198,15 +195,14 @@ on_size_allocate_set_dock (GtkWidget *widget,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_realize_set_non_maximizable (GtkWidget *widget,
 | 
					on_realize_set_non_maximizable (GtkWidget            *widget,
 | 
				
			||||||
                                gpointer   user_data)
 | 
					                                ServerContextService *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ServerContextService *context = user_data;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_assert (context && context->window == widget);
 | 
					    g_assert (context && context->window == widget);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* make the window not maximizable */
 | 
					    /* make the window not maximizable */
 | 
				
			||||||
    gdk_window_set_functions (gtk_widget_get_window (widget),
 | 
					    gdk_window_set_functions (gtk_widget_get_window (widget), // FIXME: This seems to affect #22
 | 
				
			||||||
                              GDK_FUNC_RESIZE |
 | 
					                              GDK_FUNC_RESIZE |
 | 
				
			||||||
                              GDK_FUNC_MOVE |
 | 
					                              GDK_FUNC_MOVE |
 | 
				
			||||||
                              GDK_FUNC_MINIMIZE |
 | 
					                              GDK_FUNC_MINIMIZE |
 | 
				
			||||||
@ -216,18 +212,16 @@ on_realize_set_non_maximizable (GtkWidget *widget,
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
set_geometry (ServerContextService *context)
 | 
					set_geometry (ServerContextService *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GdkScreen *screen;
 | 
					    GdkScreen   *screen   = gdk_screen_get_default ();
 | 
				
			||||||
    GdkWindow *root;
 | 
					    GdkWindow   *root     = gdk_screen_get_root_window (screen);
 | 
				
			||||||
    gint monitor;
 | 
					    GdkDisplay  *display  = gdk_display_get_default ();
 | 
				
			||||||
 | 
					    GdkMonitor  *monitor  = gdk_display_get_monitor_at_window (display, root);
 | 
				
			||||||
 | 
					    EekKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GdkRectangle rect;
 | 
					    GdkRectangle rect;
 | 
				
			||||||
    const EekKeyboard *keyboard;
 | 
					 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    screen = gdk_screen_get_default ();
 | 
					    gdk_monitor_get_geometry (monitor, &rect);
 | 
				
			||||||
    root = gtk_widget_get_root_window (context->window);
 | 
					 | 
				
			||||||
    monitor = gdk_screen_get_monitor_at_window (screen, root);
 | 
					 | 
				
			||||||
    gdk_screen_get_monitor_geometry (screen, monitor, &rect);
 | 
					 | 
				
			||||||
    keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
 | 
					 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
					    eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_signal_handlers_disconnect_by_func (context->window,
 | 
					    g_signal_handlers_disconnect_by_func (context->window,
 | 
				
			||||||
@ -238,14 +232,14 @@ set_geometry (ServerContextService *context)
 | 
				
			|||||||
                                          context);
 | 
					                                          context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (eekboard_context_service_get_fullscreen (EEKBOARD_CONTEXT_SERVICE(context))) {
 | 
					    if (eekboard_context_service_get_fullscreen (EEKBOARD_CONTEXT_SERVICE(context))) {
 | 
				
			||||||
        gint width = rect.width;
 | 
					        gint width  = rect.width;
 | 
				
			||||||
        gint height = rect.height;
 | 
					        gint height = rect.height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (width > height) {
 | 
					        if (width > height) {
 | 
				
			||||||
            width *= context->size_constraint_landscape[0];
 | 
					            width  *= context->size_constraint_landscape[0];
 | 
				
			||||||
            height *= context->size_constraint_landscape[1];
 | 
					            height *= context->size_constraint_landscape[1];
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            width *= context->size_constraint_portrait[0];
 | 
					            width  *= context->size_constraint_portrait[0];
 | 
				
			||||||
            height *= context->size_constraint_portrait[1];
 | 
					            height *= context->size_constraint_portrait[1];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -282,12 +276,12 @@ set_geometry (ServerContextService *context)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
make_window (ServerContextService *context) {
 | 
					make_window (ServerContextService *context)
 | 
				
			||||||
    if (context->window) {
 | 
					{
 | 
				
			||||||
 | 
					    if (context->window)
 | 
				
			||||||
        g_error("Window already present");
 | 
					        g_error("Window already present");
 | 
				
			||||||
        return;
 | 
					
 | 
				
			||||||
    }
 | 
					    context->window = g_object_new (
 | 
				
			||||||
    context->window = GTK_WIDGET(g_object_new (
 | 
					 | 
				
			||||||
        PHOSH_TYPE_LAYER_SURFACE,
 | 
					        PHOSH_TYPE_LAYER_SURFACE,
 | 
				
			||||||
        "layer-shell", squeek_wayland->layer_shell,
 | 
					        "layer-shell", squeek_wayland->layer_shell,
 | 
				
			||||||
        "wl-output", g_ptr_array_index(squeek_wayland->outputs, 0), // TODO: select output as needed,
 | 
					        "wl-output", g_ptr_array_index(squeek_wayland->outputs, 0), // TODO: select output as needed,
 | 
				
			||||||
@ -300,13 +294,18 @@ make_window (ServerContextService *context) {
 | 
				
			|||||||
        "exclusive-zone", 200,
 | 
					        "exclusive-zone", 200,
 | 
				
			||||||
        //"namespace", "phosh home",
 | 
					        //"namespace", "phosh home",
 | 
				
			||||||
        NULL
 | 
					        NULL
 | 
				
			||||||
    ));
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_signal_connect (context->window, "destroy",
 | 
					    g_signal_connect (context->window, "destroy",
 | 
				
			||||||
                      G_CALLBACK(on_destroy), context);
 | 
					                      G_CALLBACK(on_destroy),
 | 
				
			||||||
 | 
					                      context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    context->notify_visible_handler =
 | 
					    context->notify_visible_handler =
 | 
				
			||||||
        g_signal_connect (context->window, "notify::visible",
 | 
					        g_signal_connect (context->window, "notify::visible",
 | 
				
			||||||
                          G_CALLBACK(on_notify_visible), context);
 | 
					                          G_CALLBACK(on_notify_visible),
 | 
				
			||||||
 | 
					                          context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // FIXME: these properties could all be set in g_object_new()
 | 
				
			||||||
    // The properties below are just to make hacking easier.
 | 
					    // The properties below are just to make hacking easier.
 | 
				
			||||||
    // The way we use layer-shell overrides some,
 | 
					    // The way we use layer-shell overrides some,
 | 
				
			||||||
    // and there's no space in the protocol for others.
 | 
					    // and there's no space in the protocol for others.
 | 
				
			||||||
@ -321,8 +320,9 @@ make_window (ServerContextService *context) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
destroy_window (ServerContextService *context) {
 | 
					destroy_window (ServerContextService *context)
 | 
				
			||||||
    context->window = NULL;
 | 
					{
 | 
				
			||||||
 | 
					    context->window = NULL; // FIXME: doesn't destroy much
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -330,7 +330,7 @@ update_widget (ServerContextService *context)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
    EekBounds bounds;
 | 
					    EekBounds bounds;
 | 
				
			||||||
    gchar *theme_path;
 | 
					    g_autofree gchar *theme_path = g_build_filename (THEMESDIR, "default.css", NULL);
 | 
				
			||||||
    EekTheme *theme;
 | 
					    EekTheme *theme;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (context->widget) {
 | 
					    if (context->widget) {
 | 
				
			||||||
@ -344,12 +344,15 @@ update_widget (ServerContextService *context)
 | 
				
			|||||||
    g_free (theme_path);
 | 
					    g_free (theme_path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
 | 
					    keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds);
 | 
					    eek_element_get_bounds (EEK_ELEMENT(keyboard), &bounds); // <--- FIXME: bounds not used
 | 
				
			||||||
    context->widget = eek_gtk_keyboard_new (keyboard);
 | 
					 | 
				
			||||||
    eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme);
 | 
					 | 
				
			||||||
    g_object_unref (theme);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gtk_widget_set_has_tooltip (context->widget, TRUE);
 | 
					    g_clear_pointer (&context->widget, gtk_widget_destroy);
 | 
				
			||||||
 | 
					    context->widget = eek_gtk_keyboard_new (keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme);
 | 
				
			||||||
 | 
					    g_clear_object (&theme);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gtk_widget_set_has_tooltip (context->widget, TRUE); // <--- FIXME: I've never seen one
 | 
				
			||||||
    gtk_container_add (GTK_CONTAINER(context->window), context->widget);
 | 
					    gtk_container_add (GTK_CONTAINER(context->window), context->widget);
 | 
				
			||||||
    set_geometry (context);
 | 
					    set_geometry (context);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -372,8 +375,9 @@ server_context_service_real_hide_keyboard (EekboardContextService *_context)
 | 
				
			|||||||
    ServerContextService *context = SERVER_CONTEXT_SERVICE(_context);
 | 
					    ServerContextService *context = SERVER_CONTEXT_SERVICE(_context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gtk_widget_hide (context->window);
 | 
					    gtk_widget_hide (context->window);
 | 
				
			||||||
    gtk_container_remove(GTK_CONTAINER(context->window), context->widget);
 | 
					    g_clear_pointer (&context->widget, gtk_widget_destroy);
 | 
				
			||||||
    destroy_window (context);
 | 
					
 | 
				
			||||||
 | 
					    destroy_window (context); // <--- FIXME: looks suspect
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)->
 | 
					    EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)->
 | 
				
			||||||
        hide_keyboard (_context);
 | 
					        hide_keyboard (_context);
 | 
				
			||||||
@ -394,8 +398,7 @@ server_context_service_real_disabled (EekboardContextService *_context)
 | 
				
			|||||||
    ServerContextService *context = SERVER_CONTEXT_SERVICE(_context);
 | 
					    ServerContextService *context = SERVER_CONTEXT_SERVICE(_context);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (context->window) {
 | 
					    if (context->window) {
 | 
				
			||||||
        context->was_visible =
 | 
					        context->was_visible = gtk_widget_get_visible (context->window);
 | 
				
			||||||
            gtk_widget_get_visible (context->window);
 | 
					 | 
				
			||||||
        gtk_widget_hide (context->window);
 | 
					        gtk_widget_hide (context->window);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -439,10 +442,8 @@ server_context_service_dispose (GObject *object)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    ServerContextService *context = SERVER_CONTEXT_SERVICE(object);
 | 
					    ServerContextService *context = SERVER_CONTEXT_SERVICE(object);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (context->window) {
 | 
					    g_clear_pointer (&context->window, gtk_widget_destroy);
 | 
				
			||||||
        gtk_widget_destroy (context->window);
 | 
					    context->widget = NULL;
 | 
				
			||||||
        context->window = NULL;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    G_OBJECT_CLASS (server_context_service_parent_class)->dispose (object);
 | 
					    G_OBJECT_CLASS (server_context_service_parent_class)->dispose (object);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -487,26 +488,25 @@ server_context_service_class_init (ServerContextServiceClass *klass)
 | 
				
			|||||||
static void
 | 
					static void
 | 
				
			||||||
server_context_service_init (ServerContextService *context)
 | 
					server_context_service_init (ServerContextService *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    GdkScreen *screen;
 | 
					    GdkScreen *screen = gdk_screen_get_default ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    screen = gdk_screen_get_default ();
 | 
					 | 
				
			||||||
    g_signal_connect (screen,
 | 
					    g_signal_connect (screen,
 | 
				
			||||||
                      "monitors-changed",
 | 
					                      "monitors-changed",
 | 
				
			||||||
                      G_CALLBACK(on_monitors_changed),
 | 
					                      G_CALLBACK(on_monitors_changed),
 | 
				
			||||||
                      context);
 | 
					                      context);
 | 
				
			||||||
    g_signal_connect (context,
 | 
					    g_signal_connect (context,                              // <--- FIXME; here
 | 
				
			||||||
                      "notify::keyboard",
 | 
					                      "notify::keyboard",
 | 
				
			||||||
                      G_CALLBACK(on_notify_keyboard),
 | 
					                      G_CALLBACK(on_notify_keyboard),
 | 
				
			||||||
                      context);
 | 
					                      context);                             // <--- FIXME: they try to confuse us
 | 
				
			||||||
    g_signal_connect (context,
 | 
					
 | 
				
			||||||
 | 
					    g_signal_connect (context,                              // <--- FIXME; here
 | 
				
			||||||
                      "notify::fullscreen",
 | 
					                      "notify::fullscreen",
 | 
				
			||||||
                      G_CALLBACK(on_notify_fullscreen),
 | 
					                      G_CALLBACK(on_notify_fullscreen),
 | 
				
			||||||
                      context);
 | 
					                      context);                             // <--- FIXME: they try to confuse us
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EekboardContextService *
 | 
					EekboardContextService *
 | 
				
			||||||
server_context_service_new ()
 | 
					server_context_service_new ()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return EEKBOARD_CONTEXT_SERVICE(g_object_new (SERVER_TYPE_CONTEXT_SERVICE,
 | 
					    return EEKBOARD_CONTEXT_SERVICE(g_object_new (SERVER_TYPE_CONTEXT_SERVICE, NULL));
 | 
				
			||||||
                         NULL));
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,41 +0,0 @@
 | 
				
			|||||||
/* 
 | 
					 | 
				
			||||||
 * Copyright (C) 2012 Daiki Ueno <ueno@unixuser.org>
 | 
					 | 
				
			||||||
 * Copyright (C) 2012 Red Hat, Inc.
 | 
					 | 
				
			||||||
 * 
 | 
					 | 
				
			||||||
 * This program is free software: you can redistribute it and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU General Public License as published by
 | 
					 | 
				
			||||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
					 | 
				
			||||||
 * (at your option) any later version.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful,
 | 
					 | 
				
			||||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					 | 
				
			||||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					 | 
				
			||||||
 * GNU General Public License for more details.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU General Public License
 | 
					 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef HAVE_CONFIG_H
 | 
					 | 
				
			||||||
#include <config.h>
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
#include "preferences-dialog.h"
 | 
					 | 
				
			||||||
#include <gtk/gtk.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int
 | 
					 | 
				
			||||||
main (int argc, char **argv)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    PreferencesDialog *dialog;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!gtk_init_check (&argc, &argv)) {
 | 
					 | 
				
			||||||
        g_printerr ("Can't init GTK\n");
 | 
					 | 
				
			||||||
        return EXIT_FAILURE;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dialog = preferences_dialog_new ();
 | 
					 | 
				
			||||||
    preferences_dialog_run (dialog);
 | 
					 | 
				
			||||||
    preferences_dialog_free (dialog);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return EXIT_SUCCESS;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
@ -1,32 +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
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
INCLUDES = -I$(top_srcdir) $(GIO2_CFLAGS) $(GTK_CFLAGS) $(LIBXKLAVIER_CFLAGS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TESTS_ENVIRONMENT = EEKBOARD_KEYBOARDSDIR=$(top_srcdir)/data/keyboards
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
TESTS = eek-simple-test eek-xml-test
 | 
					 | 
				
			||||||
noinst_PROGRAMS = $(TESTS)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
-include $(top_srcdir)/git.mk
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user