Compare commits
	
		
			90 Commits
		
	
	
		
			eekboard-0
			...
			eekboard-1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 20c1f8cbe3 | |||
| f2ee3b4966 | |||
| 57a072746e | |||
| 497f21a5bd | |||
| 099c242ad7 | |||
| 109eff420c | |||
| 0896096a70 | |||
| 2d2aea009e | |||
| 0425b4e094 | |||
| 15c0a9dadf | |||
| e09c563cd8 | |||
| 218a4a50f6 | |||
| 9ab228e8f0 | |||
| b30db118f2 | |||
| cccb4f45cd | |||
| 54c9d6e35d | |||
| da7d11e387 | |||
| d9073183a7 | |||
| 78480f7577 | |||
| 1dbf0d70da | |||
| 44ee2a9913 | |||
| a3a5a51f74 | |||
| 1ae4426ec8 | |||
| 270760bd16 | |||
| 5bb20e44fb | |||
| 26a2ab725e | |||
| 9d73b89a4e | |||
| 606f335496 | |||
| fe9a02e514 | |||
| f76a835e33 | |||
| e199add701 | |||
| a744096dd7 | |||
| 51a18849c0 | |||
| bd303ef10b | |||
| 1e9ec77b65 | |||
| 4b409de5ba | |||
| 66cea3a0b5 | |||
| 0add617834 | |||
| 70b0d95d9b | |||
| cae9c89b64 | |||
| a9d9274e78 | |||
| 2211fb6b1e | |||
| 34569679f0 | |||
| 816e1f0d51 | |||
| de62d74ac5 | |||
| d71c79f268 | |||
| ee948cb2ae | |||
| ba59a850d1 | |||
| b7999842a9 | |||
| 2dd0ae47db | |||
| 926d9346e1 | |||
| ac8764b9b7 | |||
| 4cf3f24fbc | |||
| 0691766a31 | |||
| 77c00a10da | |||
| 8c407ae482 | |||
| 8d2d612547 | |||
| 80dc26b7f4 | |||
| fbe7b9ec1a | |||
| 048fccd6e0 | |||
| 638d41e0b6 | |||
| 4271eb6b3e | |||
| d25bfd8ba7 | |||
| 0739fbf464 | |||
| d1b38f8eb2 | |||
| e6d17fa4cb | |||
| d62b8b49a2 | |||
| 149dd7dc8b | |||
| 0177f96795 | |||
| ec56773dc6 | |||
| 881bf34ec4 | |||
| 6787308061 | |||
| 0cd01bf165 | |||
| 132ae3899f | |||
| 72f84fa4ef | |||
| 16d81f3f71 | |||
| 42a0ea148b | |||
| 2021311a4e | |||
| b64e91dffa | |||
| 57bb7030fb | |||
| 425fe7829b | |||
| aa88315924 | |||
| 39a59fb049 | |||
| e0993a5e55 | |||
| 4eb59ba7ed | |||
| cc9fb31e61 | |||
| c44ebecfb2 | |||
| f60e1d763e | |||
| 5c3cb477ef | |||
| 5fd4005967 | 
							
								
								
									
										12
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -33,6 +33,7 @@ gtk-doc.make
 | 
			
		||||
eek/eek-special-keysym-entries.h
 | 
			
		||||
eek/eek-unicode-keysym-entries.h
 | 
			
		||||
eek/eek-xkeysym-keysym-entries.h
 | 
			
		||||
eek/eek-enumtypes.[ch]
 | 
			
		||||
eek/eek-marshalers.[ch]
 | 
			
		||||
eek/*.pc
 | 
			
		||||
eek/*.gir
 | 
			
		||||
@ -43,12 +44,12 @@ eekboard/*.typelib
 | 
			
		||||
tests/eek-simple-test
 | 
			
		||||
tests/eek-xkb-test
 | 
			
		||||
tests/eek-xml-test
 | 
			
		||||
src/eekboard
 | 
			
		||||
src/eekboard-server
 | 
			
		||||
src/eekboard-client
 | 
			
		||||
src/eekboard-system-client
 | 
			
		||||
src/eekboard-xml
 | 
			
		||||
docs/reference/eek/*.stamp
 | 
			
		||||
docs/reference/eek/*.txt
 | 
			
		||||
docs/reference/eek/eek.types
 | 
			
		||||
!/docs/reference/eek/eek-sections.txt
 | 
			
		||||
docs/reference/eek/xml
 | 
			
		||||
docs/reference/eek/html
 | 
			
		||||
@ -71,4 +72,11 @@ po/*.gmo
 | 
			
		||||
po/Makefile.in.in
 | 
			
		||||
po/POTFILES
 | 
			
		||||
po/stamp-it
 | 
			
		||||
po/.intltool-merge-cache
 | 
			
		||||
bindings/vala/*.vapi
 | 
			
		||||
py-compile
 | 
			
		||||
data/org.fedorahosted.eekboard.gschema.xml
 | 
			
		||||
data/eekboard-server.service
 | 
			
		||||
data/*.desktop
 | 
			
		||||
examples/eekboard-inscript/eekboard-inscript
 | 
			
		||||
examples/simple-client/simple-client
 | 
			
		||||
 | 
			
		||||
@ -17,5 +17,5 @@
 | 
			
		||||
# 02110-1301 USA
 | 
			
		||||
 | 
			
		||||
ACLOCAL_AMFLAGS = -I m4
 | 
			
		||||
SUBDIRS = eek eekboard src tests bindings docs po data
 | 
			
		||||
SUBDIRS = eek eekboard src tests bindings docs po data examples
 | 
			
		||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-introspection
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										45
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								README
									
									
									
									
									
								
							@ -7,8 +7,8 @@ tools to implement desktop virtual keyboards.
 | 
			
		||||
 | 
			
		||||
** Dependencies
 | 
			
		||||
 | 
			
		||||
REQUIRED: GLib2, GTK, GConf2, PangoCairo, libxklavier, libcroco
 | 
			
		||||
OPTIONAL: fakekey, CSPI, Clutter, Clutter-Gtk, Vala, gobject-introspection
 | 
			
		||||
REQUIRED: GLib2, GTK, PangoCairo, libxklavier, libcroco
 | 
			
		||||
OPTIONAL: libXtst, at-spi2-core, IBus, Clutter, Clutter-Gtk, Python, Vala, gobject-introspection
 | 
			
		||||
 | 
			
		||||
** Build from git repo
 | 
			
		||||
 | 
			
		||||
@ -24,9 +24,9 @@ OPTIONAL: fakekey, CSPI, Clutter, Clutter-Gtk, Vala, gobject-introspection
 | 
			
		||||
  $ make
 | 
			
		||||
  $ sudo make install
 | 
			
		||||
 | 
			
		||||
* How to test
 | 
			
		||||
* Using command-line tools
 | 
			
		||||
 | 
			
		||||
eekboard currently includes 4 tools to implement your own virtual
 | 
			
		||||
eekboard currently includes 3 tools to implement your own virtual
 | 
			
		||||
keyboard.
 | 
			
		||||
 | 
			
		||||
** eekboard-server
 | 
			
		||||
@ -38,19 +38,24 @@ do that with:
 | 
			
		||||
 | 
			
		||||
  $ eekboard-server &
 | 
			
		||||
 | 
			
		||||
** eekboard-desktop-client
 | 
			
		||||
** eekboard
 | 
			
		||||
 | 
			
		||||
eekboard-desktop-client is a client of eekboard-server.  It listens
 | 
			
		||||
desktop events (keyboard change, focus in/out, and keystroke) and
 | 
			
		||||
generates key events when some keys are pressed on the on-screen
 | 
			
		||||
keyboard.  It can be started with:
 | 
			
		||||
eekboard is a client of eekboard-server.  It listens desktop events
 | 
			
		||||
(keyboard change, focus in/out, and keystroke) and generates key
 | 
			
		||||
events when some keys are pressed on the on-screen keyboard.  It can
 | 
			
		||||
be started with:
 | 
			
		||||
 | 
			
		||||
  $ eekboard-desktop-client
 | 
			
		||||
  $ eekboard
 | 
			
		||||
 | 
			
		||||
By default it renders current system keyboard layout.  To read custom
 | 
			
		||||
keyboard layout, specify --keyboard option like:
 | 
			
		||||
 | 
			
		||||
  $ eekboard --keyboard /usr/share/eekboard/keyboards/us-qwerty.xml
 | 
			
		||||
 | 
			
		||||
** eekboard-xml
 | 
			
		||||
 | 
			
		||||
eekboard-xml is a tool to manipulate XML keyboard description used by
 | 
			
		||||
eekboard-client tool and in the eekboard library.
 | 
			
		||||
eekboard-xml is a tool to manipulate XML keyboard description read by
 | 
			
		||||
eekboard if --keyboard option is specified.
 | 
			
		||||
 | 
			
		||||
To dump the current system keyboard layout into an XML file:
 | 
			
		||||
 | 
			
		||||
@ -60,16 +65,14 @@ You can display the dumped layout with:
 | 
			
		||||
 | 
			
		||||
  $ eekboard-xml --load keyboard.xml
 | 
			
		||||
 | 
			
		||||
** eekboard-client
 | 
			
		||||
* Using library
 | 
			
		||||
 | 
			
		||||
eekboard-client is a simple test client of eekboard-server.  To upload
 | 
			
		||||
the keyboard description to the server, display it, and listen
 | 
			
		||||
key events.
 | 
			
		||||
eekboard currently includes two libraries.  One is to access
 | 
			
		||||
eekboard-server via D-Bus and another is to manually render on-screen
 | 
			
		||||
keyboards.
 | 
			
		||||
 | 
			
		||||
  $ eekboard-client --set-keyboard keyboard.xml --show-keyboard --listen
 | 
			
		||||
  KeyPressed XXXXX
 | 
			
		||||
  KeyReleased XXXXX
 | 
			
		||||
 | 
			
		||||
* Documentation
 | 
			
		||||
For the former, see
 | 
			
		||||
file:docs/reference/eekboard/html/index.html
 | 
			
		||||
 | 
			
		||||
For the latter, see
 | 
			
		||||
See file:docs/reference/eek/html/index.html
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@ Section = Eek.Section
 | 
			
		||||
Key = Eek.Key
 | 
			
		||||
Symbol = Eek.Symbol
 | 
			
		||||
Keysym = Eek.Keysym
 | 
			
		||||
SymbolMatrix = Eek.SymbolMatrix
 | 
			
		||||
 | 
			
		||||
MODIFIER_BEHAVIOR_NONE, \
 | 
			
		||||
MODIFIER_BEHAVIOR_LOCK, \
 | 
			
		||||
@ -33,6 +34,8 @@ MODIFIER_BEHAVIOR_LATCH = \
 | 
			
		||||
 Eek.ModifierBehavior.LOCK,
 | 
			
		||||
 Eek.ModifierBehavior.LATCH)
 | 
			
		||||
 | 
			
		||||
SymbolCategory = Eek.SymbolCategory
 | 
			
		||||
 | 
			
		||||
CSW = 640
 | 
			
		||||
CSH = 480
 | 
			
		||||
 | 
			
		||||
@ -41,6 +44,7 @@ def XmlKeyboard(path, modifier_behavior=MODIFIER_BEHAVIOR_NONE):
 | 
			
		||||
    layout = Eek.XmlLayout.new(_file.read())
 | 
			
		||||
    keyboard = Eek.Keyboard.new(layout, CSW, CSH)
 | 
			
		||||
    keyboard.set_modifier_behavior(modifier_behavior)
 | 
			
		||||
    keyboard.set_alt_gr_mask(Eek.ModifierType.MOD5_MASK)
 | 
			
		||||
    return keyboard
 | 
			
		||||
 | 
			
		||||
def XklKeyboard(modifier_behavior=MODIFIER_BEHAVIOR_NONE):
 | 
			
		||||
 | 
			
		||||
@ -36,17 +36,38 @@ class Context(gobject.GObject):
 | 
			
		||||
        'key-released': (
 | 
			
		||||
            gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
            gobject.TYPE_NONE,
 | 
			
		||||
            (gobject.TYPE_UINT,))
 | 
			
		||||
            (gobject.TYPE_UINT,)),
 | 
			
		||||
        'destroyed': (
 | 
			
		||||
            gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
            gobject.TYPE_NONE,
 | 
			
		||||
            ()),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    __gproperties__ = {
 | 
			
		||||
        'keyboard-visible': (bool, None, None, False, gobject.PARAM_READWRITE),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, giobject):
 | 
			
		||||
        super(Context, self).__init__()
 | 
			
		||||
        import sys
 | 
			
		||||
        self.__properties = dict()
 | 
			
		||||
        self.__giobject = giobject
 | 
			
		||||
        self.__giobject.connect('enabled', lambda *args: self.emit('enabled'))
 | 
			
		||||
        self.__giobject.connect('disabled', lambda *args: self.emit('disabled'))
 | 
			
		||||
        self.__giobject.connect('key-pressed', lambda *args: self.emit('key-pressed', args[1]))
 | 
			
		||||
        self.__giobject.connect('key-released', lambda *args: self.emit('key-released', args[1]))
 | 
			
		||||
        self.__giobject.connect('destroyed', lambda *args: self.emit('destroyed'))
 | 
			
		||||
        self.__giobject.connect('notify::keyboard-visible', self.__notify_keyboard_visible_cb)
 | 
			
		||||
 | 
			
		||||
    def do_set_property(self, pspec, value):
 | 
			
		||||
        self.__properties[pspec.name] = value
 | 
			
		||||
 | 
			
		||||
    def do_get_property(self, pspec):
 | 
			
		||||
        return self.__properties[pspec.name]
 | 
			
		||||
 | 
			
		||||
    def __notify_keyboard_visible_cb(self, *args):
 | 
			
		||||
        self.set_property('keyboard-visible',
 | 
			
		||||
                          self.__giobject.get_property(args[1].name))
 | 
			
		||||
        self.notify('keyboard-visible')
 | 
			
		||||
 | 
			
		||||
    def get_giobject(self):
 | 
			
		||||
        return self.__giobject
 | 
			
		||||
 | 
			
		||||
@ -22,11 +22,18 @@ from context import Context
 | 
			
		||||
 | 
			
		||||
class Eekboard(gobject.GObject):
 | 
			
		||||
    __gtype_name__ = "PYEekboardEekboard"
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        'destroyed': (
 | 
			
		||||
            gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
            gobject.TYPE_NONE,
 | 
			
		||||
            ())
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        super(Eekboard, self).__init__()
 | 
			
		||||
        self.__connection = Gio.bus_get_sync(Gio.BusType.SESSION, None)
 | 
			
		||||
        self.__eekboard = gi.repository.Eekboard.Eekboard.new(self.__connection, None);
 | 
			
		||||
        self.__eekboard.connect('destroyed', lambda *args: self.emit('destroyed'))
 | 
			
		||||
 | 
			
		||||
    def create_context(self, client_name):
 | 
			
		||||
        context = self.__eekboard.create_context(client_name, None)
 | 
			
		||||
 | 
			
		||||
@ -26,25 +26,49 @@ dist_vapi_DATA = \
 | 
			
		||||
MAINTAINERCLEANFILES = $(dist_vapi_DATA)
 | 
			
		||||
 | 
			
		||||
eek-$(EEK_API_VERSION).vapi:
 | 
			
		||||
	vapigen --library eek-$(EEK_API_VERSION) \
 | 
			
		||||
	$(VAPIGEN_V)$(VAPIGEN) \
 | 
			
		||||
		--library eek-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg gio-2.0 \
 | 
			
		||||
		eek-$(EEK_API_VERSION)/eek-$(EEK_API_VERSION).gi
 | 
			
		||||
 | 
			
		||||
eek-clutter-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
 | 
			
		||||
	vapigen --vapidir=$(builddir) --library eek-clutter-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-$(EEK_API_VERSION) --pkg clutter-1.0 \
 | 
			
		||||
	$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
 | 
			
		||||
		--library eek-clutter-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg clutter-1.0 \
 | 
			
		||||
		--pkg gio-2.0 \
 | 
			
		||||
		--pkg atk \
 | 
			
		||||
		eek-clutter-$(EEK_API_VERSION)/eek-clutter-$(EEK_API_VERSION).gi
 | 
			
		||||
 | 
			
		||||
eek-gtk-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
 | 
			
		||||
	vapigen --vapidir=$(builddir) --library eek-gtk-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-$(EEK_API_VERSION) --pkg gtk+-2.0 \
 | 
			
		||||
	$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
 | 
			
		||||
		--library eek-gtk-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg gtk+-2.0 \
 | 
			
		||||
		eek-gtk-$(EEK_API_VERSION)/eek-gtk-$(EEK_API_VERSION).gi
 | 
			
		||||
 | 
			
		||||
eek-xkb-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
 | 
			
		||||
	vapigen --vapidir=$(builddir) --library eek-xkb-$(EEK_API_VERSION) \
 | 
			
		||||
	$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
 | 
			
		||||
		--library eek-xkb-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg gio-2.0 \
 | 
			
		||||
		eek-xkb-$(EEK_API_VERSION)/eek-xkb-$(EEK_API_VERSION).gi
 | 
			
		||||
 | 
			
		||||
eek-xkl-$(EEK_API_VERSION).vapi: eek-xkb-$(EEK_API_VERSION).vapi
 | 
			
		||||
	vapigen --vapidir=$(builddir) --library eek-xkl-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-$(EEK_API_VERSION) --pkg eek-xkb-$(EEK_API_VERSION) \
 | 
			
		||||
	$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
 | 
			
		||||
		--library eek-xkl-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-xkb-$(EEK_API_VERSION) --pkg gio-2.0 \
 | 
			
		||||
		eek-xkl-$(EEK_API_VERSION)/eek-xkl-$(EEK_API_VERSION).gi
 | 
			
		||||
 | 
			
		||||
eekboard-$(EEK_API_VERSION).vapi:
 | 
			
		||||
	$(VAPIGEN_V)$(VAPIGEN) \
 | 
			
		||||
		--library eekboard-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg eek-$(EEK_API_VERSION) \
 | 
			
		||||
		--pkg gio-2.0 \
 | 
			
		||||
		eek-$(EEK_API_VERSION)/eek-$(EEK_API_VERSION).gi
 | 
			
		||||
 | 
			
		||||
# 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 " $^;
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,16 @@
 | 
			
		||||
include/eek-0.1/eek/eek-layout.h
 | 
			
		||||
include/eek-0.1/eek/eek-element.h
 | 
			
		||||
include/eek-0.1/eek/eek-container.h
 | 
			
		||||
include/eek-0.1/eek/eek-keyboard.h
 | 
			
		||||
include/eek-0.1/eek/eek-section.h
 | 
			
		||||
include/eek-0.1/eek/eek-key.h
 | 
			
		||||
include/eek-0.1/eek/eek-types.h
 | 
			
		||||
include/eek-0.1/eek/eek-keysym.h
 | 
			
		||||
include/eek-0.90/eek/eek-container.h
 | 
			
		||||
include/eek-0.90/eek/eek-element.h
 | 
			
		||||
include/eek-0.90/eek/eek-enumtypes.h
 | 
			
		||||
include/eek-0.90/eek/eek-keyboard.h
 | 
			
		||||
include/eek-0.90/eek/eek-key.h
 | 
			
		||||
include/eek-0.90/eek/eek-keysym.h
 | 
			
		||||
include/eek-0.90/eek/eek-layout.h
 | 
			
		||||
include/eek-0.90/eek/eek-section.h
 | 
			
		||||
include/eek-0.90/eek/eek-serializable.h
 | 
			
		||||
include/eek-0.90/eek/eek-symbol.h
 | 
			
		||||
include/eek-0.90/eek/eek-symbol-matrix.h
 | 
			
		||||
include/eek-0.90/eek/eek-theme.h
 | 
			
		||||
include/eek-0.90/eek/eek-types.h
 | 
			
		||||
include/eek-0.90/eek/eek-xml.h
 | 
			
		||||
include/eek-0.90/eek/eek-xml-layout.h
 | 
			
		||||
lib/libeek.so
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -1,6 +1,2 @@
 | 
			
		||||
include/eek-0.1/eek/eek-clutter-keyboard.h
 | 
			
		||||
include/eek-0.1/eek/eek-clutter-section.h
 | 
			
		||||
include/eek-0.1/eek/eek-clutter-key.h
 | 
			
		||||
include/eek-0.1/eek/eek-clutter-drawing-context.h
 | 
			
		||||
include/eek-0.90/eek/eek-clutter-keyboard.h
 | 
			
		||||
lib/libeek-clutter.so
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,85 +1,28 @@
 | 
			
		||||
<?xml version="1.0"?>
 | 
			
		||||
<api version="1.0">
 | 
			
		||||
	<namespace name="EekClutter">
 | 
			
		||||
		<object name="EekClutterDrawingContext" parent="GInitiallyUnowned" type-name="EekClutterDrawingContext" get-type="eek_clutter_drawing_context_get_type">
 | 
			
		||||
			<method name="get_category_font" symbol="eek_clutter_drawing_context_get_category_font">
 | 
			
		||||
				<return-type type="PangoFontDescription*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekClutterDrawingContext*"/>
 | 
			
		||||
					<parameter name="category" type="EekKeysymCategory"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="get_outline_texture" symbol="eek_clutter_drawing_context_get_outline_texture">
 | 
			
		||||
		<object name="EekClutterKeyboard" parent="ClutterGroup" type-name="EekClutterKeyboard" get-type="eek_clutter_keyboard_get_type">
 | 
			
		||||
			<implements>
 | 
			
		||||
				<interface name="ClutterScriptable"/>
 | 
			
		||||
				<interface name="ClutterAnimatable"/>
 | 
			
		||||
				<interface name="AtkImplementor"/>
 | 
			
		||||
				<interface name="ClutterContainer"/>
 | 
			
		||||
			</implements>
 | 
			
		||||
			<constructor name="new" symbol="eek_clutter_keyboard_new">
 | 
			
		||||
				<return-type type="ClutterActor*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekClutterDrawingContext*"/>
 | 
			
		||||
					<parameter name="outline" type="EekOutline*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<constructor name="new" symbol="eek_clutter_drawing_context_new">
 | 
			
		||||
				<return-type type="EekClutterDrawingContext*"/>
 | 
			
		||||
			</constructor>
 | 
			
		||||
			<method name="set_category_font" symbol="eek_clutter_drawing_context_set_category_font">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekClutterDrawingContext*"/>
 | 
			
		||||
					<parameter name="category" type="EekKeysymCategory"/>
 | 
			
		||||
					<parameter name="fonts" type="PangoFontDescription*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="set_outline_texture" symbol="eek_clutter_drawing_context_set_outline_texture">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekClutterDrawingContext*"/>
 | 
			
		||||
					<parameter name="outline" type="EekOutline*"/>
 | 
			
		||||
					<parameter name="texture" type="ClutterActor*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
		</object>
 | 
			
		||||
		<object name="EekClutterKey" parent="EekKey" type-name="EekClutterKey" get-type="eek_clutter_key_get_type">
 | 
			
		||||
			<method name="get_actor" symbol="eek_clutter_key_get_actor">
 | 
			
		||||
				<return-type type="ClutterActor*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="key" type="EekClutterKey*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<constructor name="new" symbol="eek_clutter_key_new">
 | 
			
		||||
				<return-type type="EekKey*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekClutterDrawingContext*"/>
 | 
			
		||||
					<parameter name="column" type="gint"/>
 | 
			
		||||
					<parameter name="row" type="gint"/>
 | 
			
		||||
					<parameter name="keyboard" type="EekKeyboard*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</constructor>
 | 
			
		||||
		</object>
 | 
			
		||||
		<object name="EekClutterKeyboard" parent="EekKeyboard" type-name="EekClutterKeyboard" get-type="eek_clutter_keyboard_get_type">
 | 
			
		||||
			<method name="get_actor" symbol="eek_clutter_keyboard_get_actor">
 | 
			
		||||
				<return-type type="ClutterActor*"/>
 | 
			
		||||
			<method name="set_theme" symbol="eek_clutter_keyboard_set_theme">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="keyboard" type="EekClutterKeyboard*"/>
 | 
			
		||||
					<parameter name="theme" type="EekTheme*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<constructor name="new" symbol="eek_clutter_keyboard_new">
 | 
			
		||||
				<return-type type="EekKeyboard*"/>
 | 
			
		||||
			</constructor>
 | 
			
		||||
			<property name="keyboard" type="EekKeyboard*" readable="0" writable="1" construct="0" construct-only="1"/>
 | 
			
		||||
		</object>
 | 
			
		||||
		<object name="EekClutterSection" parent="EekSection" type-name="EekClutterSection" get-type="eek_clutter_section_get_type">
 | 
			
		||||
			<method name="get_actor" symbol="eek_clutter_section_get_actor">
 | 
			
		||||
				<return-type type="ClutterActor*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="section" type="EekClutterSection*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<constructor name="new" symbol="eek_clutter_section_new">
 | 
			
		||||
				<return-type type="EekSection*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekClutterDrawingContext*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</constructor>
 | 
			
		||||
		</object>
 | 
			
		||||
		<constant name="EEK_CLUTTER_DRAWING_CONTEXT_H" type="int" value="1"/>
 | 
			
		||||
		<constant name="EEK_CLUTTER_KEYBOARD_H" type="int" value="1"/>
 | 
			
		||||
		<constant name="EEK_CLUTTER_KEY_H" type="int" value="1"/>
 | 
			
		||||
		<constant name="EEK_CLUTTER_SECTION_H" type="int" value="1"/>
 | 
			
		||||
	</namespace>
 | 
			
		||||
</api>
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,2 @@
 | 
			
		||||
include/eek-0.1/eek/eek-gtk-keyboard.h
 | 
			
		||||
include/eek-0.1/eek/eek-gtk.h
 | 
			
		||||
include/eek-0.90/eek/eek-gtk-keyboard.h
 | 
			
		||||
lib/libeek-gtk.so
 | 
			
		||||
 | 
			
		||||
@ -1,18 +1,26 @@
 | 
			
		||||
<?xml version="1.0"?>
 | 
			
		||||
<api version="1.0">
 | 
			
		||||
	<namespace name="EekGtk">
 | 
			
		||||
		<object name="EekGtkKeyboard" parent="EekKeyboard" type-name="EekGtkKeyboard" get-type="eek_gtk_keyboard_get_type">
 | 
			
		||||
			<method name="get_widget" symbol="eek_gtk_keyboard_get_widget">
 | 
			
		||||
		<object name="EekGtkKeyboard" parent="GtkDrawingArea" type-name="EekGtkKeyboard" get-type="eek_gtk_keyboard_get_type">
 | 
			
		||||
			<implements>
 | 
			
		||||
				<interface name="AtkImplementor"/>
 | 
			
		||||
				<interface name="GtkBuildable"/>
 | 
			
		||||
			</implements>
 | 
			
		||||
			<constructor name="new" symbol="eek_gtk_keyboard_new">
 | 
			
		||||
				<return-type type="GtkWidget*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="keyboard" type="EekKeyboard*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</constructor>
 | 
			
		||||
			<method name="set_theme" symbol="eek_gtk_keyboard_set_theme">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="keyboard" type="EekGtkKeyboard*"/>
 | 
			
		||||
					<parameter name="theme" type="EekTheme*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<constructor name="new" symbol="eek_gtk_keyboard_new">
 | 
			
		||||
				<return-type type="EekKeyboard*"/>
 | 
			
		||||
			</constructor>
 | 
			
		||||
			<property name="keyboard" type="EekKeyboard*" readable="0" writable="1" construct="0" construct-only="1"/>
 | 
			
		||||
		</object>
 | 
			
		||||
		<constant name="EEK_GTK_H" type="int" value="1"/>
 | 
			
		||||
		<constant name="EEK_GTK_KEYBOARD_H" type="int" value="1"/>
 | 
			
		||||
	</namespace>
 | 
			
		||||
</api>
 | 
			
		||||
 | 
			
		||||
@ -1,2 +1,2 @@
 | 
			
		||||
include/eek-0.1/eek/eek-xkb-layout.h
 | 
			
		||||
include/eek-0.90/eek/eek-xkb-layout.h
 | 
			
		||||
lib/libeek-xkb.so
 | 
			
		||||
 | 
			
		||||
@ -1,10 +1,7 @@
 | 
			
		||||
<?xml version="1.0"?>
 | 
			
		||||
<api version="1.0">
 | 
			
		||||
	<namespace name="EekXkb">
 | 
			
		||||
		<object name="EekXkbLayout" parent="GInitiallyUnowned" type-name="EekXkbLayout" get-type="eek_xkb_layout_get_type">
 | 
			
		||||
			<implements>
 | 
			
		||||
				<interface name="EekLayout"/>
 | 
			
		||||
			</implements>
 | 
			
		||||
		<object name="EekXkbLayout" parent="EekLayout" type-name="EekXkbLayout" get-type="eek_xkb_layout_get_type">
 | 
			
		||||
			<method name="get_geometry" symbol="eek_xkb_layout_get_geometry">
 | 
			
		||||
				<return-type type="gchar*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
@ -49,6 +46,19 @@
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
-->
 | 
			
		||||
			<method name="set_names_full" symbol="eek_xkb_layout_set_names_full">
 | 
			
		||||
				<return-type type="gboolean"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="layout" type="EekXkbLayout*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="set_names_full_valist" symbol="eek_xkb_layout_set_names_full_valist">
 | 
			
		||||
				<return-type type="gboolean"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="layout" type="EekXkbLayout*"/>
 | 
			
		||||
					<parameter name="var_args" type="va_list"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="set_symbols" symbol="eek_xkb_layout_set_symbols">
 | 
			
		||||
				<return-type type="gboolean"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,2 @@
 | 
			
		||||
include/eek-0.1/eek/eek-xkl-layout.h
 | 
			
		||||
include/eek-0.90/eek/eek-xkl-layout.h
 | 
			
		||||
lib/libeek-xkl.so
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2,9 +2,6 @@
 | 
			
		||||
<api version="1.0">
 | 
			
		||||
	<namespace name="EekXkl">
 | 
			
		||||
		<object name="EekXklLayout" parent="EekXkbLayout" type-name="EekXklLayout" get-type="eek_xkl_layout_get_type">
 | 
			
		||||
			<implements>
 | 
			
		||||
				<interface name="EekLayout"/>
 | 
			
		||||
			</implements>
 | 
			
		||||
			<method name="disable_option" symbol="eek_xkl_layout_disable_option">
 | 
			
		||||
				<return-type type="gboolean"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
@ -53,6 +50,25 @@
 | 
			
		||||
			<constructor name="new" symbol="eek_xkl_layout_new">
 | 
			
		||||
				<return-type type="EekLayout*"/>
 | 
			
		||||
			</constructor>
 | 
			
		||||
<!--
 | 
			
		||||
			<method name="set_config" symbol="eek_xkl_layout_set_config">
 | 
			
		||||
				<return-type type="gboolean"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="layout" type="EekXklLayout*"/>
 | 
			
		||||
					<parameter name="config" type="XklConfigRec*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
-->
 | 
			
		||||
			<method name="set_config_full" symbol="eek_xkl_layout_set_config_full">
 | 
			
		||||
				<return-type type="gboolean"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="layout" type="EekXklLayout*"/>
 | 
			
		||||
					<parameter name="model" type="gchar*"/>
 | 
			
		||||
					<parameter name="layouts" type="gchar**"/>
 | 
			
		||||
					<parameter name="variants" type="gchar**"/>
 | 
			
		||||
					<parameter name="options" type="gchar**"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="set_layouts" symbol="eek_xkl_layout_set_layouts">
 | 
			
		||||
				<return-type type="gboolean"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								bindings/vala/eekboard-0.90/eekboard-0.90.files
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								bindings/vala/eekboard-0.90/eekboard-0.90.files
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
include/eekboard-0.90/eekboard
 | 
			
		||||
lib/libeekboard.so
 | 
			
		||||
							
								
								
									
										194
									
								
								bindings/vala/eekboard-0.90/eekboard-0.90.gi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								bindings/vala/eekboard-0.90/eekboard-0.90.gi
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,194 @@
 | 
			
		||||
<?xml version="1.0"?>
 | 
			
		||||
<api version="1.0">
 | 
			
		||||
	<namespace name="Eekboard">
 | 
			
		||||
		<object name="EekboardContext" parent="GDBusProxy" type-name="EekboardContext" get-type="eekboard_context_get_type">
 | 
			
		||||
			<implements>
 | 
			
		||||
				<interface name="GInitable"/>
 | 
			
		||||
				<interface name="GAsyncInitable"/>
 | 
			
		||||
			</implements>
 | 
			
		||||
			<method name="add_keyboard" symbol="eekboard_context_add_keyboard">
 | 
			
		||||
				<return-type type="guint"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="keyboard" type="EekKeyboard*"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="hide_keyboard" symbol="eekboard_context_hide_keyboard">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="is_enabled" symbol="eekboard_context_is_enabled">
 | 
			
		||||
				<return-type type="gboolean"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="is_keyboard_visible" symbol="eekboard_context_is_keyboard_visible">
 | 
			
		||||
				<return-type type="gboolean"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<constructor name="new" symbol="eekboard_context_new">
 | 
			
		||||
				<return-type type="EekboardContext*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="connection" type="GDBusConnection*"/>
 | 
			
		||||
					<parameter name="object_path" type="gchar*"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</constructor>
 | 
			
		||||
			<method name="press_key" symbol="eekboard_context_press_key">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="keycode" type="guint"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="release_key" symbol="eekboard_context_release_key">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="keycode" type="guint"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="remove_keyboard" symbol="eekboard_context_remove_keyboard">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="keyboard_id" type="guint"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="set_enabled" symbol="eekboard_context_set_enabled">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="enabled" type="gboolean"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="set_fullscreen" symbol="eekboard_context_set_fullscreen">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="fullscreen" type="gboolean"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="set_group" symbol="eekboard_context_set_group">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="group" type="gint"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="set_keyboard" symbol="eekboard_context_set_keyboard">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="keyboard_id" type="guint"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="show_keyboard" symbol="eekboard_context_show_keyboard">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<property name="keyboard-visible" type="gboolean" readable="1" writable="0" construct="0" construct-only="0"/>
 | 
			
		||||
			<signal name="destroyed" when="LAST">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="self" type="EekboardContext*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</signal>
 | 
			
		||||
			<signal name="disabled" when="LAST">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="self" type="EekboardContext*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</signal>
 | 
			
		||||
			<signal name="enabled" when="LAST">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="self" type="EekboardContext*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</signal>
 | 
			
		||||
			<signal name="key-pressed" when="LAST">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="self" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="keycode" type="guint"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</signal>
 | 
			
		||||
			<signal name="key-released" when="LAST">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="self" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="keycode" type="guint"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</signal>
 | 
			
		||||
		</object>
 | 
			
		||||
		<object name="EekboardEekboard" parent="GDBusProxy" type-name="EekboardEekboard" get-type="eekboard_eekboard_get_type">
 | 
			
		||||
			<implements>
 | 
			
		||||
				<interface name="GInitable"/>
 | 
			
		||||
				<interface name="GAsyncInitable"/>
 | 
			
		||||
			</implements>
 | 
			
		||||
			<method name="create_context" symbol="eekboard_eekboard_create_context">
 | 
			
		||||
				<return-type type="EekboardContext*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="eekboard" type="EekboardEekboard*"/>
 | 
			
		||||
					<parameter name="client_name" type="gchar*"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="destroy_context" symbol="eekboard_eekboard_destroy_context">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="eekboard" type="EekboardEekboard*"/>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<constructor name="new" symbol="eekboard_eekboard_new">
 | 
			
		||||
				<return-type type="EekboardEekboard*"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="connection" type="GDBusConnection*"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</constructor>
 | 
			
		||||
			<method name="pop_context" symbol="eekboard_eekboard_pop_context">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="eekboard" type="EekboardEekboard*"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<method name="push_context" symbol="eekboard_eekboard_push_context">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="eekboard" type="EekboardEekboard*"/>
 | 
			
		||||
					<parameter name="context" type="EekboardContext*"/>
 | 
			
		||||
					<parameter name="cancellable" type="GCancellable*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</method>
 | 
			
		||||
			<signal name="destroyed" when="LAST">
 | 
			
		||||
				<return-type type="void"/>
 | 
			
		||||
				<parameters>
 | 
			
		||||
					<parameter name="self" type="EekboardEekboard*"/>
 | 
			
		||||
				</parameters>
 | 
			
		||||
			</signal>
 | 
			
		||||
		</object>
 | 
			
		||||
		<constant name="EEKBOARD_CONTEXT_H" type="int" value="1"/>
 | 
			
		||||
		<constant name="EEKBOARD_EEKBOARD_H" type="int" value="1"/>
 | 
			
		||||
		<constant name="EEKBOARD_H" type="int" value="1"/>
 | 
			
		||||
	</namespace>
 | 
			
		||||
</api>
 | 
			
		||||
							
								
								
									
										1
									
								
								bindings/vala/eekboard-0.90/eekboard-0.90.metadata
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bindings/vala/eekboard-0.90/eekboard-0.90.metadata
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Eekboard cheader_filename="eekboard/eekboard.h"
 | 
			
		||||
							
								
								
									
										1
									
								
								bindings/vala/eekboard-0.90/eekboard-0.90.namespace
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								bindings/vala/eekboard-0.90/eekboard-0.90.namespace
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
Eekboard
 | 
			
		||||
							
								
								
									
										235
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										235
									
								
								configure.ac
									
									
									
									
									
								
							@ -20,7 +20,7 @@ AC_PREREQ(2.63)
 | 
			
		||||
dnl AC_CONFIG_SRCDIR([configure.ac])
 | 
			
		||||
AC_CONFIG_MACRO_DIR([m4])
 | 
			
		||||
 | 
			
		||||
AC_INIT([eekboard], [0.90.4], [ueno@unixuser.org])
 | 
			
		||||
AC_INIT([eekboard], [1.0.1], [ueno@unixuser.org])
 | 
			
		||||
 | 
			
		||||
dnl Init automake
 | 
			
		||||
AM_INIT_AUTOMAKE
 | 
			
		||||
@ -85,18 +85,18 @@ AM_CONDITIONAL([HAVE_GTK_2],[test "$with_gtk" = "2.0"])
 | 
			
		||||
AM_CONDITIONAL([HAVE_GTK_3],[test "$with_gtk" = "3.0"])
 | 
			
		||||
 | 
			
		||||
AM_PATH_GLIB_2_0
 | 
			
		||||
PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= 2.25.4], ,
 | 
			
		||||
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([GCONF2], [gconf-2.0], ,
 | 
			
		||||
  [AC_MSG_ERROR([GConf not found])])
 | 
			
		||||
PKG_CHECK_MODULES([XKB], [x11], ,
 | 
			
		||||
  [AC_MSG_ERROR([XKB support not found])])
 | 
			
		||||
PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], ,
 | 
			
		||||
@ -104,114 +104,192 @@ PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], ,
 | 
			
		||||
PKG_CHECK_MODULES([LIBCROCO], [libcroco-0.6], ,
 | 
			
		||||
  [AC_MSG_ERROR([libcroco not found])])
 | 
			
		||||
 | 
			
		||||
dnl use libfakekey to generate key events
 | 
			
		||||
AC_MSG_CHECKING([whether you enable fakekey])
 | 
			
		||||
AC_ARG_ENABLE(fakekey,
 | 
			
		||||
              AS_HELP_STRING([--enable-fakekey=no/yes],
 | 
			
		||||
                             [Enable fakekey default=yes]),,
 | 
			
		||||
              enable_fakekey=yes)
 | 
			
		||||
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_fakekey = xyes; then
 | 
			
		||||
  PKG_CHECK_MODULES([FAKEKEY], [libfakekey], ,
 | 
			
		||||
    [AC_MSG_ERROR([fakekey not found])])
 | 
			
		||||
  AC_DEFINE([HAVE_FAKEKEY], [1], [Define if fakekey is found])
 | 
			
		||||
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_FAKEKEY, [test x$enable_fakekey = xyes])
 | 
			
		||||
AC_MSG_RESULT($enable_fakekey)
 | 
			
		||||
AM_CONDITIONAL(ENABLE_XTEST, [test x$enable_xtest = xyes])
 | 
			
		||||
AC_MSG_RESULT($enable_xtest)
 | 
			
		||||
 | 
			
		||||
dnl use AT-SPI to capture focus/keystroke events
 | 
			
		||||
AC_MSG_CHECKING([whether you enable AT-SPI event handling])
 | 
			
		||||
AC_ARG_ENABLE(cspi,
 | 
			
		||||
              AS_HELP_STRING([--enable-cspi=no/yes],
 | 
			
		||||
                             [Enable AT-SPI event handling default=yes]),,
 | 
			
		||||
              enable_cspi=yes)
 | 
			
		||||
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_cspi = xyes; then
 | 
			
		||||
  PKG_CHECK_MODULES([CSPI], [cspi-1.0], ,
 | 
			
		||||
    [AC_MSG_ERROR([AT-SPI C not found])])
 | 
			
		||||
  AC_DEFINE([HAVE_CSPI], [1], [Define if CSPI is found])
 | 
			
		||||
if test x$enable_x_dock = xyes; then
 | 
			
		||||
  PKG_CHECK_MODULES([XDOCK], [x], , 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=""
 | 
			
		||||
keystroke_listeners=""
 | 
			
		||||
 | 
			
		||||
focus_listeners=""
 | 
			
		||||
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 dbus-glib-1], , 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])
 | 
			
		||||
 | 
			
		||||
dnl use IBus to capture focus events
 | 
			
		||||
AC_MSG_CHECKING([whether you enable IBus focus tracking])
 | 
			
		||||
AC_ARG_ENABLE(ibus,
 | 
			
		||||
              AS_HELP_STRING([--enable-ibus=no/yes],
 | 
			
		||||
                             [Enable IBus focus tracking default=yes]),
 | 
			
		||||
              enable_ibus=$enableval,
 | 
			
		||||
              enable_ibus=yes)
 | 
			
		||||
 | 
			
		||||
if test x$enable_ibus = xyes; then
 | 
			
		||||
  PKG_CHECK_MODULES([IBUS], [ibus-1.0 >= 1.3.99], , enable_ibus=no)
 | 
			
		||||
  if test x$enable_ibus = xyes; then
 | 
			
		||||
    AC_DEFINE([HAVE_IBUS], [1], [Define if IBus is found])
 | 
			
		||||
    focus_listeners="ibus $focus_listeners"
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
AC_MSG_RESULT($enable_ibus)
 | 
			
		||||
AM_CONDITIONAL(ENABLE_IBUS, [test x$enable_ibus = xyes])
 | 
			
		||||
 | 
			
		||||
if test -n "$focus_listeners"; then
 | 
			
		||||
  AC_DEFINE(ENABLE_FOCUS_LISTENER, [1], [Define if eekboard can follow focus changes])
 | 
			
		||||
fi
 | 
			
		||||
AC_MSG_RESULT($enable_cspi)
 | 
			
		||||
AM_CONDITIONAL(ENABLE_CSPI, [test x$enable_cspi = xyes])
 | 
			
		||||
 | 
			
		||||
dnl Python language binding
 | 
			
		||||
AC_MSG_CHECKING([whether you enable Python language support])
 | 
			
		||||
AC_ARG_ENABLE(python,
 | 
			
		||||
              AS_HELP_STRING([--enable-python=no/yes],
 | 
			
		||||
                             [Enable Python language binding default=yes]),,
 | 
			
		||||
                             [Enable Python language binding default=yes]),
 | 
			
		||||
              enable_python=$enableval,
 | 
			
		||||
              enable_python=yes)
 | 
			
		||||
AC_MSG_RESULT($enable_python)
 | 
			
		||||
AM_CONDITIONAL(ENABLE_PYTHON, [test x$enable_python = xyes])
 | 
			
		||||
 | 
			
		||||
dnl check python unconditionally to re-generate
 | 
			
		||||
dnl eek/*-keysym-labels.txt when maintainer-mode enabled
 | 
			
		||||
AM_PATH_PYTHON([2.5], , enable_python=no)
 | 
			
		||||
 | 
			
		||||
if test x"$enable_python" = x"yes"; then
 | 
			
		||||
    # check python
 | 
			
		||||
    AM_PATH_PYTHON([2.5])
 | 
			
		||||
    AC_PATH_PROG(PYTHON_CONFIG, python$PYTHON_VERSION-config)
 | 
			
		||||
    if test x"$PYTHON_CONFIG" = x""; then
 | 
			
		||||
        AC_PATH_PROG(PYTHON_CONFIG, python-config)
 | 
			
		||||
    fi
 | 
			
		||||
  if test x$enable_python = xyes; then
 | 
			
		||||
    AC_PATH_PROGS(PYTHON_CONFIG, [python$PYTHON_VERSION-config python-config])
 | 
			
		||||
    if test x"$PYTHON_CONFIG" != x""; then
 | 
			
		||||
        PYTHON_CFLAGS=`$PYTHON_CONFIG --includes`
 | 
			
		||||
        PYTHON_LIBS=`$PYTHON_CONFIG --libs`
 | 
			
		||||
      PYTHON_CFLAGS=`$PYTHON_CONFIG --includes`
 | 
			
		||||
      PYTHON_LIBS=`$PYTHON_CONFIG --libs`
 | 
			
		||||
    else
 | 
			
		||||
        PYTHON_CFLAGS=`$PYTHON $srcdir/python-config.py --includes`
 | 
			
		||||
        PYTHON_LIBS=`$PYTHON $srcdir/python-config.py --libs`
 | 
			
		||||
      PYTHON_CFLAGS=`$PYTHON $srcdir/python-config.py --includes`
 | 
			
		||||
      PYTHON_LIBS=`$PYTHON $srcdir/python-config.py --libs`
 | 
			
		||||
    fi
 | 
			
		||||
    PYTHON_INCLUDES="$PYTHON_CFLAGS"
 | 
			
		||||
    AC_SUBST(PYTHON_CFLAGS)
 | 
			
		||||
    AC_SUBST(PYTHON_INCLUDES)
 | 
			
		||||
    AC_SUBST(PYTHON_LIBS)
 | 
			
		||||
else
 | 
			
		||||
    enable_python="no (disabled, use --enable-python to enable)"
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_MSG_RESULT($enable_python)
 | 
			
		||||
AM_CONDITIONAL(ENABLE_PYTHON, [test x$enable_python = xyes])
 | 
			
		||||
 | 
			
		||||
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 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 standalone application
 | 
			
		||||
AC_MSG_CHECKING([whether you enable eekboard])
 | 
			
		||||
AC_ARG_ENABLE(eekboard,
 | 
			
		||||
              AS_HELP_STRING([--enable-eekboard=no/yes],
 | 
			
		||||
                             [Build standalone application "ekboard" default=yes]),,
 | 
			
		||||
              enable_eekboard=yes)
 | 
			
		||||
AC_MSG_RESULT($enable_eekboard)
 | 
			
		||||
AM_CONDITIONAL(ENABLE_EEKBOARD, [test x$enable_eekboard = xyes])
 | 
			
		||||
 | 
			
		||||
dnl Clutter
 | 
			
		||||
AC_MSG_CHECKING([whether you enable Clutter])
 | 
			
		||||
dnl clutter
 | 
			
		||||
AC_MSG_CHECKING([whether you enable clutter])
 | 
			
		||||
AC_ARG_ENABLE(clutter,
 | 
			
		||||
              AS_HELP_STRING([--enable-clutter=no/yes],
 | 
			
		||||
                             [Enable Clutter user interface default=yes]),,
 | 
			
		||||
                             [Enable clutter user interface default=no]),
 | 
			
		||||
              enable_clutter=$enableval,
 | 
			
		||||
              enable_clutter=no)
 | 
			
		||||
AC_MSG_RESULT($enable_clutter)
 | 
			
		||||
 | 
			
		||||
if test x$enable_clutter = xyes; then
 | 
			
		||||
  PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], ,
 | 
			
		||||
    [AC_MSG_ERROR([Clutter not found -- install it or add --disable-clutter])])
 | 
			
		||||
  AC_DEFINE([HAVE_CLUTTER], [1], [Define if Clutter is found])
 | 
			
		||||
  have_clutter_gtk=0
 | 
			
		||||
  need_swap_event_workaround=0
 | 
			
		||||
  PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-1.0], [have_clutter_gtk=1],
 | 
			
		||||
    [PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-0.10 clutter-x11-1.0],
 | 
			
		||||
      [have_clutter_gtk=1; need_swap_event_workaround=1])])
 | 
			
		||||
  AC_DEFINE_UNQUOTED([HAVE_CLUTTER_GTK], $have_clutter_gtk,
 | 
			
		||||
    [Define if Clutter-Gtk is found])
 | 
			
		||||
  AC_DEFINE_UNQUOTED([NEED_SWAP_EVENT_WORKAROUND], $need_swap_event_workaround,
 | 
			
		||||
    [Define if GLX_INTEL_swap_event work around is needed])
 | 
			
		||||
  PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], , enable_clutter=no)
 | 
			
		||||
  if test x$enable_clutter = xyes; then
 | 
			
		||||
    AC_DEFINE([HAVE_CLUTTER], [1], [Define if clutter is found])
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
AM_CONDITIONAL(ENABLE_CLUTTER, [test x$enable_clutter = xyes])
 | 
			
		||||
AC_MSG_RESULT($enable_clutter)
 | 
			
		||||
 | 
			
		||||
dnl clutter-gtk
 | 
			
		||||
if test x$enable_clutter = xyes; then
 | 
			
		||||
  AC_MSG_CHECKING([whether you enable clutter-gtk])
 | 
			
		||||
  AC_ARG_ENABLE(clutter-gtk,
 | 
			
		||||
                AS_HELP_STRING([--enable-clutter-gtk=no/yes],
 | 
			
		||||
                               [Enable clutter user interface default=yes]),
 | 
			
		||||
                enable_clutter_gtk=$enableval,
 | 
			
		||||
                enable_clutter_gtk=yes)
 | 
			
		||||
 | 
			
		||||
  if test x$enable_clutter_gtk = xyes; then
 | 
			
		||||
    PKG_CHECK_MODULES([CLUTTER_GTK], [clutter-gtk-1.0], ,
 | 
			
		||||
      enable_clutter_gtk=no)
 | 
			
		||||
    if test x$enable_clutter_gtk = xyes; then
 | 
			
		||||
      AC_DEFINE([HAVE_CLUTTER_GTK], [1], [Define if Clutter-Gtk is found])
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
  AC_MSG_RESULT($enable_clutter_gtk)
 | 
			
		||||
fi
 | 
			
		||||
AM_CONDITIONAL(ENABLE_CLUTTER_GTK, [test x$enable_clutter_gtk = xyes])
 | 
			
		||||
 | 
			
		||||
GTK_DOC_CHECK([1.14],[--flavour no-tmpl])
 | 
			
		||||
 | 
			
		||||
dnl to re-generate eek/*-keysym-labels.txt
 | 
			
		||||
AC_CHECK_PROGS([PYTHON], [python])
 | 
			
		||||
 | 
			
		||||
dnl define GETTEXT_* variables
 | 
			
		||||
GETTEXT_PACKAGE=$PACKAGE
 | 
			
		||||
AC_SUBST(GETTEXT_PACKAGE)
 | 
			
		||||
@ -219,8 +297,6 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define to the read-only
 | 
			
		||||
AM_GLIB_GNU_GETTEXT
 | 
			
		||||
AM_GLIB_DEFINE_LOCALEDIR(EEKBOARD_LOCALEDIR)
 | 
			
		||||
 | 
			
		||||
GOBJECT_INTROSPECTION_CHECK([0.9.0])
 | 
			
		||||
 | 
			
		||||
AC_CONFIG_HEADERS([config.h])
 | 
			
		||||
AC_CONFIG_FILES([Makefile
 | 
			
		||||
eek/Makefile
 | 
			
		||||
@ -245,6 +321,10 @@ data/icons/32x32/Makefile
 | 
			
		||||
data/icons/48x48/Makefile
 | 
			
		||||
data/icons/scalable/Makefile
 | 
			
		||||
data/themes/Makefile
 | 
			
		||||
data/keyboards/Makefile
 | 
			
		||||
examples/Makefile
 | 
			
		||||
examples/eekboard-inscript/Makefile
 | 
			
		||||
examples/simple-client/Makefile
 | 
			
		||||
eek/eek-${EEK_API_VERSION}.pc
 | 
			
		||||
eek/eek-clutter-${EEK_API_VERSION}.pc
 | 
			
		||||
eek/eek-gtk-${EEK_API_VERSION}.pc
 | 
			
		||||
@ -259,6 +339,11 @@ Build options:
 | 
			
		||||
  Build shared libs         $enable_shared
 | 
			
		||||
  Build static libs         $enable_static
 | 
			
		||||
  CFLAGS                    $CFLAGS
 | 
			
		||||
  Build vala binding        $enable_vala
 | 
			
		||||
  GTK version               $with_gtk
 | 
			
		||||
  Build Clutter UI          $enable_clutter
 | 
			
		||||
  Build Vala binding        $enable_vala
 | 
			
		||||
  Build Python binding      $enable_python
 | 
			
		||||
  Build document            $enable_gtk_doc
 | 
			
		||||
  Focus listeners           $focus_listeners
 | 
			
		||||
  Keystroke listeners       $keystroke_listeners
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
@ -1 +1,34 @@
 | 
			
		||||
SUBDIRS = icons themes
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										6
									
								
								data/eekboard-autostart.desktop.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								data/eekboard-autostart.desktop.in
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Name=Eekboard
 | 
			
		||||
Exec=eekboard -f
 | 
			
		||||
Type=Application
 | 
			
		||||
AutostartCondition=GSettings org.gnome.desktop.a11y.applications screen-keyboard-enabled
 | 
			
		||||
X-GNOME-AutoRestart=true
 | 
			
		||||
@ -1,3 +1,3 @@
 | 
			
		||||
[D-BUS Service]
 | 
			
		||||
Name=com.redhat.Eekboard.Server
 | 
			
		||||
Name=org.fedorahosted.Eekboard.Server
 | 
			
		||||
Exec=@bindir@/eekboard-server
 | 
			
		||||
							
								
								
									
										9
									
								
								data/eekboard.desktop.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								data/eekboard.desktop.in
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Name=Eekboard
 | 
			
		||||
GenericName=Eekboard Virtual Keyboard
 | 
			
		||||
Comment=Virtual Keyboard
 | 
			
		||||
Exec=eekboard
 | 
			
		||||
Icon=eekboard
 | 
			
		||||
Terminal=false
 | 
			
		||||
Type=Application
 | 
			
		||||
Categories=GTK;Utility;
 | 
			
		||||
							
								
								
									
										2
									
								
								data/keyboards/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								data/keyboards/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
keyboarddir = $(pkgdatadir)/keyboards
 | 
			
		||||
dist_keyboard_DATA = us-qwerty.xml
 | 
			
		||||
							
								
								
									
										707
									
								
								data/keyboards/us-qwerty.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										707
									
								
								data/keyboards/us-qwerty.xml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,707 @@
 | 
			
		||||
<?xml version="1.0"?>
 | 
			
		||||
<keyboard version="0.90">
 | 
			
		||||
    <bounds>0.000000,0.000000,410.000000,190.000000</bounds>
 | 
			
		||||
    <section name="Alpha">
 | 
			
		||||
        <bounds>10.000000,50.000000,390.000000,129.000000</bounds>
 | 
			
		||||
        <angle>0</angle>
 | 
			
		||||
        <row>
 | 
			
		||||
            <columns>14</columns>
 | 
			
		||||
            <orientation>1</orientation>
 | 
			
		||||
        </row>
 | 
			
		||||
        <row>
 | 
			
		||||
            <columns>14</columns>
 | 
			
		||||
            <orientation>1</orientation>
 | 
			
		||||
        </row>
 | 
			
		||||
        <row>
 | 
			
		||||
            <columns>13</columns>
 | 
			
		||||
            <orientation>1</orientation>
 | 
			
		||||
        </row>
 | 
			
		||||
        <row>
 | 
			
		||||
            <columns>12</columns>
 | 
			
		||||
            <orientation>1</orientation>
 | 
			
		||||
        </row>
 | 
			
		||||
        <row>
 | 
			
		||||
            <columns>8</columns>
 | 
			
		||||
            <orientation>1</orientation>
 | 
			
		||||
        </row>
 | 
			
		||||
        <key id="keycode105" name="RCTL" column="7" row="4">
 | 
			
		||||
            <bounds>359.000000,104.000000,31.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline10</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65508">Control_R</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode135" name="MENU" column="6" row="4">
 | 
			
		||||
            <bounds>326.000000,104.000000,31.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline10</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65383">Menu</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode134" name="RWIN" column="5" row="4">
 | 
			
		||||
            <bounds>294.000000,104.000000,31.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline10</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65516">Super_R</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode108" name="RALT" column="4" row="4">
 | 
			
		||||
            <bounds>261.000000,104.000000,31.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline10</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65027">ISO_Level3_Shift</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode65" name="SPCE" column="3" row="4">
 | 
			
		||||
            <bounds>106.000000,104.000000,153.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline11</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="32">space</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode64" name="LALT" column="2" row="4">
 | 
			
		||||
            <bounds>73.000000,104.000000,31.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline10</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65513">Alt_L</keysym>
 | 
			
		||||
                <keysym keyval="65511">Meta_L</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode133" name="LWIN" column="1" row="4">
 | 
			
		||||
            <bounds>40.000000,104.000000,31.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline10</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65515">Super_L</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode37" name="LCTL" column="0" row="4">
 | 
			
		||||
            <bounds>2.000000,104.000000,36.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline9</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65507">Control_L</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode62" name="RTSH" column="11" row="3">
 | 
			
		||||
            <bounds>320.000000,78.000000,70.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline8</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65506">Shift_R</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode61" name="AB10" column="10" row="3">
 | 
			
		||||
            <bounds>294.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="47">slash</keysym>
 | 
			
		||||
                <keysym keyval="63">question</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode60" name="AB09" column="9" row="3">
 | 
			
		||||
            <bounds>268.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="46">period</keysym>
 | 
			
		||||
                <keysym keyval="62">greater</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode59" name="AB08" column="8" row="3">
 | 
			
		||||
            <bounds>242.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="44">comma</keysym>
 | 
			
		||||
                <keysym keyval="60">less</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode58" name="AB07" column="7" row="3">
 | 
			
		||||
            <bounds>216.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="109">m</keysym>
 | 
			
		||||
                <keysym keyval="77">M</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode57" name="AB06" column="6" row="3">
 | 
			
		||||
            <bounds>190.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="110">n</keysym>
 | 
			
		||||
                <keysym keyval="78">N</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode56" name="AB05" column="5" row="3">
 | 
			
		||||
            <bounds>164.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="98">b</keysym>
 | 
			
		||||
                <keysym keyval="66">B</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode55" name="AB04" column="4" row="3">
 | 
			
		||||
            <bounds>138.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="118">v</keysym>
 | 
			
		||||
                <keysym keyval="86">V</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode54" name="AB03" column="3" row="3">
 | 
			
		||||
            <bounds>113.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="99">c</keysym>
 | 
			
		||||
                <keysym keyval="67">C</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode53" name="AB02" column="2" row="3">
 | 
			
		||||
            <bounds>87.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="120">x</keysym>
 | 
			
		||||
                <keysym keyval="88">X</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode52" name="AB01" column="1" row="3">
 | 
			
		||||
            <bounds>61.000000,78.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="122">z</keysym>
 | 
			
		||||
                <keysym keyval="90">Z</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode50" name="LFSH" column="0" row="3">
 | 
			
		||||
            <bounds>2.000000,78.000000,57.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline7</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65505">Shift_L</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode36" name="RTRN" column="12" row="2">
 | 
			
		||||
            <bounds>333.000000,53.000000,57.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline6</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65293">Return</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode48" name="AC11" column="11" row="2">
 | 
			
		||||
            <bounds>307.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="39">quoteright</keysym>
 | 
			
		||||
                <keysym keyval="34">quotedbl</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode47" name="AC10" column="10" row="2">
 | 
			
		||||
            <bounds>281.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="59">semicolon</keysym>
 | 
			
		||||
                <keysym keyval="58">colon</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode46" name="AC09" column="9" row="2">
 | 
			
		||||
            <bounds>256.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="108">l</keysym>
 | 
			
		||||
                <keysym keyval="76">L</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode45" name="AC08" column="8" row="2">
 | 
			
		||||
            <bounds>230.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="107">k</keysym>
 | 
			
		||||
                <keysym keyval="75">K</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode44" name="AC07" column="7" row="2">
 | 
			
		||||
            <bounds>204.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="106">j</keysym>
 | 
			
		||||
                <keysym keyval="74">J</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode43" name="AC06" column="6" row="2">
 | 
			
		||||
            <bounds>178.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="104">h</keysym>
 | 
			
		||||
                <keysym keyval="72">H</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode42" name="AC05" column="5" row="2">
 | 
			
		||||
            <bounds>152.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="103">g</keysym>
 | 
			
		||||
                <keysym keyval="71">G</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode41" name="AC04" column="4" row="2">
 | 
			
		||||
            <bounds>126.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="102">f</keysym>
 | 
			
		||||
                <keysym keyval="70">F</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode40" name="AC03" column="3" row="2">
 | 
			
		||||
            <bounds>100.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="100">d</keysym>
 | 
			
		||||
                <keysym keyval="68">D</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode39" name="AC02" column="2" row="2">
 | 
			
		||||
            <bounds>74.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="115">s</keysym>
 | 
			
		||||
                <keysym keyval="83">S</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode38" name="AC01" column="1" row="2">
 | 
			
		||||
            <bounds>49.000000,53.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="97">a</keysym>
 | 
			
		||||
                <keysym keyval="65">A</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode66" name="CAPS" column="0" row="2">
 | 
			
		||||
            <bounds>2.000000,53.000000,44.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline5</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65507">Control_L</keysym>
 | 
			
		||||
                <keysym keyval="65507">Control_L</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode51" name="BKSL" column="13" row="1">
 | 
			
		||||
            <bounds>352.000000,27.000000,38.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline4</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="92">backslash</keysym>
 | 
			
		||||
                <keysym keyval="124">bar</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode35" name="AD12" column="12" row="1">
 | 
			
		||||
            <bounds>326.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="93">bracketright</keysym>
 | 
			
		||||
                <keysym keyval="125">braceright</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode34" name="AD11" column="11" row="1">
 | 
			
		||||
            <bounds>300.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="91">bracketleft</keysym>
 | 
			
		||||
                <keysym keyval="123">braceleft</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode33" name="AD10" column="10" row="1">
 | 
			
		||||
            <bounds>275.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="112">p</keysym>
 | 
			
		||||
                <keysym keyval="80">P</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode32" name="AD09" column="9" row="1">
 | 
			
		||||
            <bounds>249.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="111">o</keysym>
 | 
			
		||||
                <keysym keyval="79">O</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode31" name="AD08" column="8" row="1">
 | 
			
		||||
            <bounds>223.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="105">i</keysym>
 | 
			
		||||
                <keysym keyval="73">I</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode30" name="AD07" column="7" row="1">
 | 
			
		||||
            <bounds>197.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="117">u</keysym>
 | 
			
		||||
                <keysym keyval="85">U</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode29" name="AD06" column="6" row="1">
 | 
			
		||||
            <bounds>171.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="121">y</keysym>
 | 
			
		||||
                <keysym keyval="89">Y</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode28" name="AD05" column="5" row="1">
 | 
			
		||||
            <bounds>145.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="116">t</keysym>
 | 
			
		||||
                <keysym keyval="84">T</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode27" name="AD04" column="4" row="1">
 | 
			
		||||
            <bounds>119.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="114">r</keysym>
 | 
			
		||||
                <keysym keyval="82">R</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode26" name="AD03" column="3" row="1">
 | 
			
		||||
            <bounds>93.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="101">e</keysym>
 | 
			
		||||
                <keysym keyval="69">E</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode25" name="AD02" column="2" row="1">
 | 
			
		||||
            <bounds>68.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="119">w</keysym>
 | 
			
		||||
                <keysym keyval="87">W</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode24" name="AD01" column="1" row="1">
 | 
			
		||||
            <bounds>42.000000,27.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="113">q</keysym>
 | 
			
		||||
                <keysym keyval="81">Q</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode23" name="TAB" column="0" row="1">
 | 
			
		||||
            <bounds>2.000000,27.000000,38.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline3</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65289">Tab</keysym>
 | 
			
		||||
                <keysym keyval="65056">ISO_Left_Tab</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode22" name="BKSP" column="13" row="0">
 | 
			
		||||
            <bounds>339.000000,1.000000,51.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline2</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65288">BackSpace</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode21" name="AE12" column="12" row="0">
 | 
			
		||||
            <bounds>313.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="61">equal</keysym>
 | 
			
		||||
                <keysym keyval="43">plus</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode20" name="AE11" column="11" row="0">
 | 
			
		||||
            <bounds>287.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="45">minus</keysym>
 | 
			
		||||
                <keysym keyval="95">underscore</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode19" name="AE10" column="10" row="0">
 | 
			
		||||
            <bounds>261.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="48">0</keysym>
 | 
			
		||||
                <keysym keyval="41">parenright</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode18" name="AE09" column="9" row="0">
 | 
			
		||||
            <bounds>235.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="57">9</keysym>
 | 
			
		||||
                <keysym keyval="40">parenleft</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode17" name="AE08" column="8" row="0">
 | 
			
		||||
            <bounds>209.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="56">8</keysym>
 | 
			
		||||
                <keysym keyval="42">asterisk</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode16" name="AE07" column="7" row="0">
 | 
			
		||||
            <bounds>183.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="55">7</keysym>
 | 
			
		||||
                <keysym keyval="38">ampersand</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode15" name="AE06" column="6" row="0">
 | 
			
		||||
            <bounds>157.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="54">6</keysym>
 | 
			
		||||
                <keysym keyval="94">asciicircum</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode14" name="AE05" column="5" row="0">
 | 
			
		||||
            <bounds>132.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="53">5</keysym>
 | 
			
		||||
                <keysym keyval="37">percent</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode13" name="AE04" column="4" row="0">
 | 
			
		||||
            <bounds>106.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="52">4</keysym>
 | 
			
		||||
                <keysym keyval="36">dollar</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode12" name="AE03" column="3" row="0">
 | 
			
		||||
            <bounds>80.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="51">3</keysym>
 | 
			
		||||
                <keysym keyval="35">numbersign</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode11" name="AE02" column="2" row="0">
 | 
			
		||||
            <bounds>54.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="50">2</keysym>
 | 
			
		||||
                <keysym keyval="64">at</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode10" name="AE01" column="1" row="0">
 | 
			
		||||
            <bounds>28.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="49">1</keysym>
 | 
			
		||||
                <keysym keyval="33">exclam</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode49" name="TLDE" column="0" row="0">
 | 
			
		||||
            <bounds>2.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="96">quoteleft</keysym>
 | 
			
		||||
                <keysym keyval="126">asciitilde</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
    </section>
 | 
			
		||||
    <section name="Function">
 | 
			
		||||
        <bounds>10.000000,10.000000,410.000000,25.000000</bounds>
 | 
			
		||||
        <angle>0</angle>
 | 
			
		||||
        <row>
 | 
			
		||||
            <columns>16</columns>
 | 
			
		||||
            <orientation>1</orientation>
 | 
			
		||||
        </row>
 | 
			
		||||
        <key id="keycode96" name="FK12" column="12" row="0">
 | 
			
		||||
            <bounds>366.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65481">F12</keysym>
 | 
			
		||||
                <keysym keyval="269024780">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode95" name="FK11" column="11" row="0">
 | 
			
		||||
            <bounds>340.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65480">F11</keysym>
 | 
			
		||||
                <keysym keyval="269024779">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode76" name="FK10" column="10" row="0">
 | 
			
		||||
            <bounds>314.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65479">F10</keysym>
 | 
			
		||||
                <keysym keyval="269024778">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode75" name="FK09" column="9" row="0">
 | 
			
		||||
            <bounds>288.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65478">F9</keysym>
 | 
			
		||||
                <keysym keyval="269024777">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode74" name="FK08" column="8" row="0">
 | 
			
		||||
            <bounds>249.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65477">F8</keysym>
 | 
			
		||||
                <keysym keyval="269024776">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode73" name="FK07" column="7" row="0">
 | 
			
		||||
            <bounds>223.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65476">F7</keysym>
 | 
			
		||||
                <keysym keyval="269024775">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode72" name="FK06" column="6" row="0">
 | 
			
		||||
            <bounds>197.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65475">F6</keysym>
 | 
			
		||||
                <keysym keyval="269024774">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode71" name="FK05" column="5" row="0">
 | 
			
		||||
            <bounds>171.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65474">F5</keysym>
 | 
			
		||||
                <keysym keyval="269024773">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode70" name="FK04" column="4" row="0">
 | 
			
		||||
            <bounds>132.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65473">F4</keysym>
 | 
			
		||||
                <keysym keyval="269024772">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode69" name="FK03" column="3" row="0">
 | 
			
		||||
            <bounds>106.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65472">F3</keysym>
 | 
			
		||||
                <keysym keyval="269024771">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode68" name="FK02" column="2" row="0">
 | 
			
		||||
            <bounds>80.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65471">F2</keysym>
 | 
			
		||||
                <keysym keyval="269024770">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode67" name="FK01" column="1" row="0">
 | 
			
		||||
            <bounds>54.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="2">
 | 
			
		||||
                <keysym keyval="65470">F1</keysym>
 | 
			
		||||
                <keysym keyval="269024769">(null)</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
        <key id="keycode9" name="ESC" column="0" row="0">
 | 
			
		||||
            <bounds>2.000000,1.000000,24.000000,24.000000</bounds>
 | 
			
		||||
            <oref>outline1</oref>
 | 
			
		||||
            <symbols groups="1" levels="1">
 | 
			
		||||
                <keysym keyval="65307">Escape</keysym>
 | 
			
		||||
            </symbols>
 | 
			
		||||
        </key>
 | 
			
		||||
    </section>
 | 
			
		||||
    <outline id="outline1">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>24.000000,0.000000</point>
 | 
			
		||||
        <point>24.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline3">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>38.000000,0.000000</point>
 | 
			
		||||
        <point>38.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline4">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>38.000000,0.000000</point>
 | 
			
		||||
        <point>38.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline5">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>44.000000,0.000000</point>
 | 
			
		||||
        <point>44.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline6">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>57.000000,0.000000</point>
 | 
			
		||||
        <point>57.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline7">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>57.000000,0.000000</point>
 | 
			
		||||
        <point>57.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline8">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>70.000000,0.000000</point>
 | 
			
		||||
        <point>70.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline9">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>36.000000,0.000000</point>
 | 
			
		||||
        <point>36.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline10">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>31.000000,0.000000</point>
 | 
			
		||||
        <point>31.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline11">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>153.000000,0.000000</point>
 | 
			
		||||
        <point>153.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline12">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>24.000000,0.000000</point>
 | 
			
		||||
        <point>24.000000,50.000000</point>
 | 
			
		||||
        <point>0.000000,50.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline13">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>50.000000,0.000000</point>
 | 
			
		||||
        <point>50.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
    <outline id="outline2">
 | 
			
		||||
        <corner-radius>1.000000</corner-radius>
 | 
			
		||||
        <point>0.000000,0.000000</point>
 | 
			
		||||
        <point>51.000000,0.000000</point>
 | 
			
		||||
        <point>51.000000,24.000000</point>
 | 
			
		||||
        <point>0.000000,24.000000</point>
 | 
			
		||||
    </outline>
 | 
			
		||||
</keyboard>
 | 
			
		||||
							
								
								
									
										30
									
								
								data/org.fedorahosted.eekboard.gschema.xml.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								data/org.fedorahosted.eekboard.gschema.xml.in
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
<?xml version="1.0"?>
 | 
			
		||||
<schemalist>
 | 
			
		||||
  <schema id="org.fedorahosted.eekboard" path="/org/fedorahosted/eekboard/">
 | 
			
		||||
    <key name="ui-toolkit" type="s">
 | 
			
		||||
      <default>'gtk'</default>
 | 
			
		||||
      <summary>GUI toolkit used to render keyboard</summary>
 | 
			
		||||
      <description>The name of GUI toolkit (either 'gtk' or 'clutter') used to render keyboard on screen.</description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="focus-listener" type="s">
 | 
			
		||||
      <default>'atspi'</default>
 | 
			
		||||
      <summary>Use the given focus listener</summary>
 | 
			
		||||
      <description>The name of the focus listener (either 'atspi' or 'ibus') used to detect focus events.</description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="auto-hide" type="b">
 | 
			
		||||
      <default>true</default>
 | 
			
		||||
      <summary>Hide keyboard automatically when focus is out</summary>
 | 
			
		||||
      <description>If true, hide keyboard automatically when focus is out.</description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="auto-hide-delay" type="d">
 | 
			
		||||
      <default>0.5</default>
 | 
			
		||||
      <summary>Delay seconds before hiding keyboard</summary>
 | 
			
		||||
      <description>Delay seconds before hiding keyboard.  This is useful when focus listener is enabled.</description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="start-fullscreen" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <summary>Switch to fullscreen mode when startup</summary>
 | 
			
		||||
      <description>If true, switch to fullscreen mode when startup.</description>
 | 
			
		||||
    </key>
 | 
			
		||||
  </schema>
 | 
			
		||||
</schemalist>
 | 
			
		||||
@ -47,7 +47,7 @@ SCANGOBJ_OPTIONS=
 | 
			
		||||
 | 
			
		||||
# Extra options to supply to gtkdoc-scan.
 | 
			
		||||
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
 | 
			
		||||
SCAN_OPTIONS=--rebuild-types
 | 
			
		||||
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
 | 
			
		||||
@ -82,7 +82,8 @@ IGNORE_HFILES = \
 | 
			
		||||
	eek-clutter-renderer.h \
 | 
			
		||||
	eek-clutter-section.h \
 | 
			
		||||
	eek-clutter-key.h \
 | 
			
		||||
	eek-gtk-renderer.h
 | 
			
		||||
	eek-gtk-renderer.h \
 | 
			
		||||
	eek-enumtypes.h
 | 
			
		||||
if !ENABLE_CLUTTER
 | 
			
		||||
IGNORE_HFILES += eek-clutter-keyboard.h eek-clutter.h
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
@ -1,9 +1,8 @@
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-keyboard</FILE>
 | 
			
		||||
<TITLE>EekKeyboard</TITLE>
 | 
			
		||||
EekKeyboardClass
 | 
			
		||||
EekKeyboardPrivate
 | 
			
		||||
EekKeyboard
 | 
			
		||||
EekKeyboardClass
 | 
			
		||||
eek_keyboard_new
 | 
			
		||||
eek_keyboard_get_layout
 | 
			
		||||
eek_keyboard_get_size
 | 
			
		||||
@ -21,6 +20,11 @@ eek_keyboard_create_section
 | 
			
		||||
eek_keyboard_find_key_by_keycode
 | 
			
		||||
eek_keyboard_add_outline
 | 
			
		||||
eek_keyboard_get_outline
 | 
			
		||||
eek_keyboard_set_num_lock_mask
 | 
			
		||||
eek_keyboard_get_num_lock_mask
 | 
			
		||||
eek_keyboard_set_alt_gr_mask
 | 
			
		||||
eek_keyboard_get_alt_gr_mask
 | 
			
		||||
EekKeyboardPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_KEYBOARD
 | 
			
		||||
EEK_IS_KEYBOARD
 | 
			
		||||
@ -34,8 +38,8 @@ EEK_KEYBOARD_GET_CLASS
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-layout</FILE>
 | 
			
		||||
<TITLE>EekLayout</TITLE>
 | 
			
		||||
EekLayoutClass
 | 
			
		||||
EekLayout
 | 
			
		||||
EekLayoutClass
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_LAYOUT
 | 
			
		||||
EEK_IS_LAYOUT
 | 
			
		||||
@ -51,8 +55,9 @@ EEK_LAYOUT_GET_CLASS
 | 
			
		||||
<TITLE>EekGtkKeyboard</TITLE>
 | 
			
		||||
EekGtkKeyboard
 | 
			
		||||
EekGtkKeyboardClass
 | 
			
		||||
EekGtkKeyboardPrivate
 | 
			
		||||
eek_gtk_keyboard_new
 | 
			
		||||
eek_gtk_keyboard_set_theme
 | 
			
		||||
EekGtkKeyboardPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_GTK_KEYBOARD
 | 
			
		||||
EEK_IS_GTK_KEYBOARD
 | 
			
		||||
@ -63,12 +68,42 @@ EEK_IS_GTK_KEYBOARD_CLASS
 | 
			
		||||
EEK_GTK_KEYBOARD_GET_CLASS
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-theme-node</FILE>
 | 
			
		||||
EekSide
 | 
			
		||||
EekCorner
 | 
			
		||||
eek_theme_node_new
 | 
			
		||||
eek_theme_node_get_parent
 | 
			
		||||
eek_theme_node_get_theme
 | 
			
		||||
eek_theme_node_get_element_type
 | 
			
		||||
eek_theme_node_get_element_id
 | 
			
		||||
eek_theme_node_get_element_class
 | 
			
		||||
eek_theme_node_get_pseudo_class
 | 
			
		||||
eek_theme_node_get_color
 | 
			
		||||
eek_theme_node_get_background_color
 | 
			
		||||
eek_theme_node_get_foreground_color
 | 
			
		||||
eek_theme_node_get_background_gradient
 | 
			
		||||
eek_theme_node_get_border_width
 | 
			
		||||
eek_theme_node_get_border_radius
 | 
			
		||||
eek_theme_node_get_border_color
 | 
			
		||||
eek_theme_node_get_font
 | 
			
		||||
EekThemeNodePrivate
 | 
			
		||||
EekThemeNodeClass
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_THEME_NODE
 | 
			
		||||
EEK_IS_THEME_NODE
 | 
			
		||||
EEK_TYPE_THEME_NODE
 | 
			
		||||
eek_theme_node_get_type
 | 
			
		||||
EEK_THEME_NODE_CLASS
 | 
			
		||||
EEK_IS_THEME_NODE_CLASS
 | 
			
		||||
EEK_THEME_NODE_GET_CLASS
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-section</FILE>
 | 
			
		||||
<TITLE>EekSection</TITLE>
 | 
			
		||||
EekSectionClass
 | 
			
		||||
EekSectionPrivate
 | 
			
		||||
EekSection
 | 
			
		||||
EekSectionClass
 | 
			
		||||
eek_section_set_angle
 | 
			
		||||
eek_section_get_angle
 | 
			
		||||
eek_section_get_n_rows
 | 
			
		||||
@ -76,6 +111,7 @@ eek_section_add_row
 | 
			
		||||
eek_section_get_row
 | 
			
		||||
eek_section_create_key
 | 
			
		||||
eek_section_find_key_by_keycode
 | 
			
		||||
EekSectionPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_SECTION
 | 
			
		||||
EEK_IS_SECTION
 | 
			
		||||
@ -86,17 +122,39 @@ EEK_IS_SECTION_CLASS
 | 
			
		||||
EEK_SECTION_GET_CLASS
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-theme-context</FILE>
 | 
			
		||||
eek_theme_context_new
 | 
			
		||||
eek_theme_context_set_theme
 | 
			
		||||
eek_theme_context_get_theme
 | 
			
		||||
eek_theme_context_set_resolution
 | 
			
		||||
eek_theme_context_set_default_resolution
 | 
			
		||||
eek_theme_context_get_resolution
 | 
			
		||||
eek_theme_context_set_font
 | 
			
		||||
eek_theme_context_get_font
 | 
			
		||||
eek_theme_context_get_root_node
 | 
			
		||||
EekThemeContextClass
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_THEME_CONTEXT
 | 
			
		||||
EEK_IS_THEME_CONTEXT
 | 
			
		||||
EEK_TYPE_THEME_CONTEXT
 | 
			
		||||
eek_theme_context_get_type
 | 
			
		||||
EEK_THEME_CONTEXT_CLASS
 | 
			
		||||
EEK_IS_THEME_CONTEXT_CLASS
 | 
			
		||||
EEK_THEME_CONTEXT_GET_CLASS
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-container</FILE>
 | 
			
		||||
<TITLE>EekContainer</TITLE>
 | 
			
		||||
EekContainerClass
 | 
			
		||||
EekContainerPrivate
 | 
			
		||||
EekCallback
 | 
			
		||||
EekCompareFunc
 | 
			
		||||
EekContainer
 | 
			
		||||
EekContainerClass
 | 
			
		||||
eek_container_foreach_child
 | 
			
		||||
eek_container_find
 | 
			
		||||
eek_container_add_child
 | 
			
		||||
EekContainerPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_CONTAINER
 | 
			
		||||
EEK_IS_CONTAINER
 | 
			
		||||
@ -107,13 +165,30 @@ EEK_IS_CONTAINER_CLASS
 | 
			
		||||
EEK_CONTAINER_GET_CLASS
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-clutter-keyboard</FILE>
 | 
			
		||||
<TITLE>EekClutterKeyboard</TITLE>
 | 
			
		||||
EekClutterKeyboard
 | 
			
		||||
EekClutterKeyboardClass
 | 
			
		||||
eek_clutter_keyboard_new
 | 
			
		||||
eek_clutter_keyboard_set_theme
 | 
			
		||||
EekClutterKeyboardPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_CLUTTER_KEYBOARD
 | 
			
		||||
EEK_IS_CLUTTER_KEYBOARD
 | 
			
		||||
EEK_TYPE_CLUTTER_KEYBOARD
 | 
			
		||||
eek_clutter_keyboard_get_type
 | 
			
		||||
EEK_CLUTTER_KEYBOARD_CLASS
 | 
			
		||||
EEK_IS_CLUTTER_KEYBOARD_CLASS
 | 
			
		||||
EEK_CLUTTER_KEYBOARD_GET_CLASS
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-symbol</FILE>
 | 
			
		||||
<TITLE>EekSymbol</TITLE>
 | 
			
		||||
EekSymbolCategory
 | 
			
		||||
EekSymbolClass
 | 
			
		||||
EekSymbolPrivate
 | 
			
		||||
EekSymbol
 | 
			
		||||
EekSymbolClass
 | 
			
		||||
eek_symbol_new
 | 
			
		||||
eek_symbol_set_name
 | 
			
		||||
eek_symbol_get_name
 | 
			
		||||
@ -126,6 +201,7 @@ eek_symbol_set_modifier_mask
 | 
			
		||||
eek_symbol_is_modifier
 | 
			
		||||
eek_symbol_set_icon_name
 | 
			
		||||
eek_symbol_get_icon_name
 | 
			
		||||
EekSymbolPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_SYMBOL
 | 
			
		||||
EEK_IS_SYMBOL
 | 
			
		||||
@ -141,7 +217,6 @@ EEK_SYMBOL_GET_CLASS
 | 
			
		||||
<TITLE>EekXklLayout</TITLE>
 | 
			
		||||
EekXklLayout
 | 
			
		||||
EekXklLayoutClass
 | 
			
		||||
EekXklLayoutPrivate
 | 
			
		||||
eek_xkl_layout_new
 | 
			
		||||
eek_xkl_layout_set_config
 | 
			
		||||
eek_xkl_layout_set_config_full
 | 
			
		||||
@ -156,6 +231,7 @@ eek_xkl_layout_get_layouts
 | 
			
		||||
eek_xkl_layout_get_variants
 | 
			
		||||
eek_xkl_layout_get_options
 | 
			
		||||
eek_xkl_layout_get_option
 | 
			
		||||
EekXklLayoutPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_XKL_LAYOUT
 | 
			
		||||
EEK_IS_XKL_LAYOUT
 | 
			
		||||
@ -171,7 +247,6 @@ EEK_XKL_LAYOUT_GET_CLASS
 | 
			
		||||
<TITLE>EekXkbLayout</TITLE>
 | 
			
		||||
EekXkbLayout
 | 
			
		||||
EekXkbLayoutClass
 | 
			
		||||
EekXkbLayoutPrivate
 | 
			
		||||
eek_xkb_layout_new
 | 
			
		||||
eek_xkb_layout_set_names
 | 
			
		||||
eek_xkb_layout_set_names_full
 | 
			
		||||
@ -182,6 +257,7 @@ eek_xkb_layout_set_symbols
 | 
			
		||||
eek_xkb_layout_get_keycodes
 | 
			
		||||
eek_xkb_layout_get_geometry
 | 
			
		||||
eek_xkb_layout_get_symbols
 | 
			
		||||
EekXkbLayoutPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_XKB_LAYOUT
 | 
			
		||||
EEK_IS_XKB_LAYOUT
 | 
			
		||||
@ -195,9 +271,8 @@ EEK_XKB_LAYOUT_GET_CLASS
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-key</FILE>
 | 
			
		||||
<TITLE>EekKey</TITLE>
 | 
			
		||||
EekKeyClass
 | 
			
		||||
EekKeyPrivate
 | 
			
		||||
EekKey
 | 
			
		||||
EekKeyClass
 | 
			
		||||
eek_key_set_keycode
 | 
			
		||||
eek_key_get_keycode
 | 
			
		||||
eek_key_set_symbol_matrix
 | 
			
		||||
@ -210,6 +285,7 @@ eek_key_get_index
 | 
			
		||||
eek_key_set_oref
 | 
			
		||||
eek_key_get_oref
 | 
			
		||||
eek_key_is_pressed
 | 
			
		||||
EekKeyPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_KEY
 | 
			
		||||
EEK_IS_KEY
 | 
			
		||||
@ -223,7 +299,6 @@ EEK_KEY_GET_CLASS
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-serializable</FILE>
 | 
			
		||||
<TITLE>EekSerializable</TITLE>
 | 
			
		||||
EekSerializable
 | 
			
		||||
EekSerializableIface
 | 
			
		||||
eek_serializable_serialize
 | 
			
		||||
eek_serializable_deserialize
 | 
			
		||||
@ -238,9 +313,8 @@ EEK_SERIALIZABLE_GET_IFACE
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-element</FILE>
 | 
			
		||||
<TITLE>EekElement</TITLE>
 | 
			
		||||
EekElementClass
 | 
			
		||||
EekElementPrivate
 | 
			
		||||
EekElement
 | 
			
		||||
EekElementClass
 | 
			
		||||
eek_element_set_parent
 | 
			
		||||
eek_element_get_parent
 | 
			
		||||
eek_element_set_name
 | 
			
		||||
@ -256,6 +330,7 @@ eek_element_set_group
 | 
			
		||||
eek_element_set_level
 | 
			
		||||
eek_element_get_group
 | 
			
		||||
eek_element_get_level
 | 
			
		||||
EekElementPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_ELEMENT
 | 
			
		||||
EEK_IS_ELEMENT
 | 
			
		||||
@ -271,10 +346,10 @@ EEK_ELEMENT_GET_CLASS
 | 
			
		||||
<TITLE>EekXmlLayout</TITLE>
 | 
			
		||||
EekXmlLayout
 | 
			
		||||
EekXmlLayoutClass
 | 
			
		||||
EekXmlLayoutPrivate
 | 
			
		||||
eek_xml_layout_new
 | 
			
		||||
eek_xml_layout_set_source
 | 
			
		||||
eek_xml_layout_get_source
 | 
			
		||||
EekXmlLayoutPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_XML_LAYOUT
 | 
			
		||||
EEK_IS_XML_LAYOUT
 | 
			
		||||
@ -285,16 +360,33 @@ EEK_IS_XML_LAYOUT_CLASS
 | 
			
		||||
EEK_XML_LAYOUT_GET_CLASS
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-theme</FILE>
 | 
			
		||||
eek_theme_new
 | 
			
		||||
eek_theme_load_stylesheet
 | 
			
		||||
eek_theme_unload_stylesheet
 | 
			
		||||
EekThemeClass
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_THEME
 | 
			
		||||
EEK_IS_THEME
 | 
			
		||||
EEK_TYPE_THEME
 | 
			
		||||
eek_theme_get_type
 | 
			
		||||
EEK_THEME_CLASS
 | 
			
		||||
EEK_IS_THEME_CLASS
 | 
			
		||||
EEK_THEME_GET_CLASS
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-keysym</FILE>
 | 
			
		||||
<TITLE>EekKeysym</TITLE>
 | 
			
		||||
EEK_KEYSYM
 | 
			
		||||
EekKeysymClass
 | 
			
		||||
EekKeysymPrivate
 | 
			
		||||
EekKeysym
 | 
			
		||||
EekKeysymClass
 | 
			
		||||
eek_keysym_new
 | 
			
		||||
eek_keysym_get_xkeysym
 | 
			
		||||
eek_keysym_new_from_name
 | 
			
		||||
eek_keysym_new_with_modifier
 | 
			
		||||
EekKeysymPrivate
 | 
			
		||||
<SUBSECTION Standard>
 | 
			
		||||
EEK_INVALID_KEYSYM
 | 
			
		||||
EEK_IS_KEYSYM
 | 
			
		||||
@ -314,7 +406,6 @@ eek_keyboard_output
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-types</FILE>
 | 
			
		||||
I_
 | 
			
		||||
EEK_TYPE_SYMBOL_MATRIX
 | 
			
		||||
EEK_TYPE_POINT
 | 
			
		||||
EEK_TYPE_BOUNDS
 | 
			
		||||
EEK_TYPE_OUTLINE
 | 
			
		||||
@ -323,23 +414,40 @@ EekOrientation
 | 
			
		||||
EekModifierBehavior
 | 
			
		||||
EekModifierType
 | 
			
		||||
EEK_INVALID_KEYCODE
 | 
			
		||||
EekSymbolMatrix
 | 
			
		||||
EekPoint
 | 
			
		||||
eek_point_get_type
 | 
			
		||||
eek_point_copy
 | 
			
		||||
eek_point_free
 | 
			
		||||
eek_point_rotate
 | 
			
		||||
EekBounds
 | 
			
		||||
eek_bounds_get_type
 | 
			
		||||
eek_bounds_copy
 | 
			
		||||
eek_bounds_free
 | 
			
		||||
eek_bounds_long_side
 | 
			
		||||
EekOutline
 | 
			
		||||
eek_outline_get_type
 | 
			
		||||
eek_outline_copy
 | 
			
		||||
eek_outline_free
 | 
			
		||||
EekColor
 | 
			
		||||
eek_color_get_type
 | 
			
		||||
eek_color_new
 | 
			
		||||
eek_color_copy
 | 
			
		||||
eek_color_free
 | 
			
		||||
EekGradientType
 | 
			
		||||
EekThemeNode
 | 
			
		||||
EekThemeContext
 | 
			
		||||
EekTheme
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
<SECTION>
 | 
			
		||||
<FILE>eek-symbol-matrix</FILE>
 | 
			
		||||
EekSymbolMatrix
 | 
			
		||||
EEK_TYPE_SYMBOL_MATRIX
 | 
			
		||||
eek_symbol_matrix_get_type
 | 
			
		||||
eek_symbol_matrix_new
 | 
			
		||||
eek_symbol_matrix_copy
 | 
			
		||||
eek_symbol_matrix_free
 | 
			
		||||
eek_point_get_type
 | 
			
		||||
eek_point_rotate
 | 
			
		||||
eek_bounds_get_type
 | 
			
		||||
eek_bounds_long_side
 | 
			
		||||
eek_outline_get_type
 | 
			
		||||
eek_outline_copy
 | 
			
		||||
eek_outline_free
 | 
			
		||||
eek_color_get_type
 | 
			
		||||
eek_color_new
 | 
			
		||||
eek_symbol_matrix_set_symbol
 | 
			
		||||
eek_symbol_matrix_get_symbol
 | 
			
		||||
</SECTION>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ libeek_public_headers =				\
 | 
			
		||||
	$(srcdir)/eek-key.h			\
 | 
			
		||||
	$(srcdir)/eek-symbol.h			\
 | 
			
		||||
	$(srcdir)/eek-keysym.h			\
 | 
			
		||||
	$(srcdir)/eek-symbol-matrix.h		\
 | 
			
		||||
	$(srcdir)/eek-types.h			\
 | 
			
		||||
	$(srcdir)/eek-xml.h			\
 | 
			
		||||
	$(srcdir)/eek-xml-layout.h		\
 | 
			
		||||
@ -59,6 +60,7 @@ libeek_sources =				\
 | 
			
		||||
	$(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-types.c			\
 | 
			
		||||
@ -86,13 +88,15 @@ libeek_marshalers_sources =			\
 | 
			
		||||
 | 
			
		||||
BUILT_SOURCES =					\
 | 
			
		||||
	$(libeek_keysym_sources)		\
 | 
			
		||||
	$(libeek_enumtypes_sources)		\
 | 
			
		||||
	$(libeek_marshalers_sources)
 | 
			
		||||
 | 
			
		||||
libeek_la_SOURCES =				\
 | 
			
		||||
	$(libeek_sources)			\
 | 
			
		||||
	$(srcdir)/eek-enumtypes.c		\
 | 
			
		||||
	$(srcdir)/eek-marshalers.c
 | 
			
		||||
 | 
			
		||||
libeek_la_CFLAGS = $(GIO2_CFLAGS) $(PANGOCAIRO_CFLAGS) $(LIBCROCO_CFLAGS)
 | 
			
		||||
libeek_la_CFLAGS = -DEEK_COMPILATION=1 $(GIO2_CFLAGS) $(PANGOCAIRO_CFLAGS) $(LIBCROCO_CFLAGS)
 | 
			
		||||
libeek_la_LIBADD = $(GIO2_LIBS) $(PANGOCAIRO_LIBS) $(LIBCROCO_LIBS) -lm
 | 
			
		||||
 | 
			
		||||
if ENABLE_CLUTTER
 | 
			
		||||
@ -112,7 +116,7 @@ libeek_clutter_sources =			\
 | 
			
		||||
	$(srcdir)/eek-clutter-renderer.c
 | 
			
		||||
 | 
			
		||||
libeek_clutter_la_SOURCES = $(libeek_clutter_sources)
 | 
			
		||||
libeek_clutter_la_CFLAGS = $(CLUTTER_CFLAGS)
 | 
			
		||||
libeek_clutter_la_CFLAGS = -DEEK_COMPILATION=1 $(CLUTTER_CFLAGS)
 | 
			
		||||
libeek_clutter_la_LIBADD = libeek.la $(CLUTTER_LIBS)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
@ -126,7 +130,7 @@ libeek_gtk_sources =				\
 | 
			
		||||
	$(srcdir)/eek-gtk-renderer.c
 | 
			
		||||
 | 
			
		||||
libeek_gtk_la_SOURCES = $(libeek_gtk_sources)
 | 
			
		||||
libeek_gtk_la_CFLAGS = $(GTK_CFLAGS)
 | 
			
		||||
libeek_gtk_la_CFLAGS = -DEEK_COMPILATION=1 $(GTK_CFLAGS)
 | 
			
		||||
libeek_gtk_la_LIBADD = libeek.la $(GTK_LIBS)
 | 
			
		||||
 | 
			
		||||
libeek_xkb_public_headers =			\
 | 
			
		||||
@ -137,7 +141,7 @@ libeek_xkb_sources =				\
 | 
			
		||||
	$(srcdir)/eek-xkb-layout.c
 | 
			
		||||
 | 
			
		||||
libeek_xkb_la_SOURCES = $(libeek_xkb_sources)
 | 
			
		||||
libeek_xkb_la_CFLAGS = $(XKB_CFLAGS) $(GTK_CFLAGS)
 | 
			
		||||
libeek_xkb_la_CFLAGS = -DEEK_COMPILATION=1 $(XKB_CFLAGS) $(GTK_CFLAGS)
 | 
			
		||||
libeek_xkb_la_LIBADD = libeek.la $(XKB_LIBS) $(GTK_LIBS)
 | 
			
		||||
 | 
			
		||||
libeek_xkl_public_headers =			\
 | 
			
		||||
@ -148,12 +152,13 @@ libeek_xkl_sources =				\
 | 
			
		||||
	$(srcdir)/eek-xkl-layout.c
 | 
			
		||||
 | 
			
		||||
libeek_xkl_la_SOURCES = $(libeek_xkl_sources)
 | 
			
		||||
libeek_xkl_la_CFLAGS = $(LIBXKLAVIER_CFLAGS) $(GTK_CFLAGS)
 | 
			
		||||
libeek_xkl_la_CFLAGS = -DEEK_COMPILATION=1 $(LIBXKLAVIER_CFLAGS) $(GTK_CFLAGS)
 | 
			
		||||
libeek_xkl_la_LIBADD = libeek-xkb.la $(LIBXKLAVIER_LIBS) $(GTK_LIBS)
 | 
			
		||||
 | 
			
		||||
eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek
 | 
			
		||||
eek_HEADERS =					\
 | 
			
		||||
	$(libeek_public_headers)		\
 | 
			
		||||
	$(srcdir)/eek-enumtypes.h		\
 | 
			
		||||
	$(libeek_clutter_public_headers)	\
 | 
			
		||||
	$(libeek_gtk_public_headers)		\
 | 
			
		||||
	$(libeek_xkb_public_headers)		\
 | 
			
		||||
@ -173,6 +178,16 @@ eek-unicode-keysym-entries.h: unicode-keysym-entries.txt
 | 
			
		||||
eek-xkeysym-keysym-entries.h: xkeysym-keysym-entries.txt
 | 
			
		||||
	$(PYTHON) ./gen-keysym-entries.py xkeysym_keysym_entries < $< > $@
 | 
			
		||||
 | 
			
		||||
eek-enumtypes.h: $(libeek_public_headers) eek-enumtypes.h.template
 | 
			
		||||
	$(AM_V_GEN) $(GLIB_MKENUMS) --template 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 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 && \
 | 
			
		||||
@ -205,6 +220,8 @@ EXTRA_DIST =					\
 | 
			
		||||
	special-keysym-entries.txt		\
 | 
			
		||||
	unicode-keysym-entries.txt		\
 | 
			
		||||
	xkeysym-keysym-entries.txt		\
 | 
			
		||||
	eek-enumtypes.h.template		\
 | 
			
		||||
	eek-enumtypes.c.template		\
 | 
			
		||||
	eek-marshalers.list
 | 
			
		||||
 | 
			
		||||
-include $(INTROSPECTION_MAKEFILE)
 | 
			
		||||
@ -219,7 +236,7 @@ Eek@EEK_LIBRARY_SUFFIX_U@_gir_SCANNERFLAGS = --strip-prefix=Eek --pkg=glib-2.0
 | 
			
		||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GLib-2.0 GObject-2.0 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)
 | 
			
		||||
Eek@EEK_LIBRARY_SUFFIX_U@_gir_FILES = $(libeek_sources) $(libeek_public_headers) $(srcdir)/eek-enumtypes.h
 | 
			
		||||
 | 
			
		||||
EekGtk@EEK_LIBRARY_SUFFIX@.gir: libeek-gtk.la Eek@EEK_LIBRARY_SUFFIX@.gir
 | 
			
		||||
EekGtk@EEK_LIBRARY_SUFFIX_U@_gir_INCLUDES = GObject-2.0 Gtk-@GTK_API_VERSION@ Eek@EEK_LIBRARY_SUFFIX@
 | 
			
		||||
 | 
			
		||||
@ -23,8 +23,8 @@ includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: EEK
 | 
			
		||||
Description: A Library to Create Keyboard-like UI
 | 
			
		||||
URL: http://ueno.github.com/eekboard/
 | 
			
		||||
URL: http://fedorahosted.org/eekboard/
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Requires: gobject-2.0
 | 
			
		||||
Requires: gobject-2.0 gio-2.0
 | 
			
		||||
Libs: -L${libdir} -leek
 | 
			
		||||
Cflags: -I${includedir}/eek-@EEK_API_VERSION@
 | 
			
		||||
 | 
			
		||||
@ -23,7 +23,7 @@ includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: libeek-clutter
 | 
			
		||||
Description: A Library to Create Keyboard-like UI (Clutter Support)
 | 
			
		||||
URL: http://ueno.github.com/eekboard/
 | 
			
		||||
URL: http://fedorahosted.org/eekboard/
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Requires: eek-@EEK_API_VERSION@ clutter-1.0
 | 
			
		||||
Libs: -L${libdir} -leek-clutter
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek-clutter.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_CLUTTER_KEYBOARD_H
 | 
			
		||||
#define EEK_CLUTTER_KEYBOARD_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -249,7 +249,7 @@ eek_container_init (EekContainer *self)
 | 
			
		||||
/**
 | 
			
		||||
 * eek_container_foreach_child:
 | 
			
		||||
 * @container: an #EekContainer
 | 
			
		||||
 * @callback: an #EekCallback
 | 
			
		||||
 * @callback: (scope call): an #EekCallback
 | 
			
		||||
 * @user_data: additional data passed to @callback
 | 
			
		||||
 *
 | 
			
		||||
 * Enumerate children of @container and run @callback with each child.
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_CONTAINER_H
 | 
			
		||||
#define EEK_CONTAINER_H 1
 | 
			
		||||
 | 
			
		||||
@ -34,6 +39,14 @@ G_BEGIN_DECLS
 | 
			
		||||
typedef struct _EekContainerClass EekContainerClass;
 | 
			
		||||
typedef struct _EekContainerPrivate EekContainerPrivate;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * EekCallback:
 | 
			
		||||
 * @element: an #EekElement
 | 
			
		||||
 * @user_data: user-supplied data
 | 
			
		||||
 *
 | 
			
		||||
 * The type of the callback function used for iterating over the
 | 
			
		||||
 * children of a container, see eek_container_foreach_child().
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*EekCallback) (EekElement *element, gpointer user_data);
 | 
			
		||||
typedef gint (*EekCompareFunc) (EekElement *element, gpointer user_data);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_ELEMENT_H
 | 
			
		||||
#define EEK_ELEMENT_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										36
									
								
								eek/eek-enumtypes.c.template
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								eek/eek-enumtypes.c.template
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,36 @@
 | 
			
		||||
/*** BEGIN file-header ***/
 | 
			
		||||
#include "eek.h"
 | 
			
		||||
 | 
			
		||||
/*** END file-header ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN file-production ***/
 | 
			
		||||
/* enumerations from "@filename@" */
 | 
			
		||||
/*** END file-production ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN value-header ***/
 | 
			
		||||
GType
 | 
			
		||||
@enum_name@_get_type (void)
 | 
			
		||||
{
 | 
			
		||||
  static volatile gsize g_define_type_id__volatile = 0;
 | 
			
		||||
 | 
			
		||||
  if (g_once_init_enter (&g_define_type_id__volatile))
 | 
			
		||||
    {
 | 
			
		||||
      static const G@Type@Value values[] = {
 | 
			
		||||
/*** END value-header ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN value-production ***/
 | 
			
		||||
        { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
 | 
			
		||||
/*** END value-production ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN value-tail ***/
 | 
			
		||||
        { 0, NULL, NULL }
 | 
			
		||||
      };
 | 
			
		||||
      GType g_define_type_id =
 | 
			
		||||
        g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
 | 
			
		||||
      g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return g_define_type_id__volatile;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*** END value-tail ***/
 | 
			
		||||
							
								
								
									
										29
									
								
								eek/eek-enumtypes.h.template
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								eek/eek-enumtypes.h.template
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
/*** BEGIN file-header ***/
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __EEK_ENUMTYPES_H__
 | 
			
		||||
#define __EEK_ENUMTYPES_H__
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
/*** END file-header ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN file-production ***/
 | 
			
		||||
 | 
			
		||||
/* enumerations from "@filename@" */
 | 
			
		||||
/*** END file-production ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN value-header ***/
 | 
			
		||||
GType @enum_name@_get_type (void) G_GNUC_CONST;
 | 
			
		||||
#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
 | 
			
		||||
/*** END value-header ***/
 | 
			
		||||
 | 
			
		||||
/*** BEGIN file-tail ***/
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __EEK_ENUMTYPES_H__ */
 | 
			
		||||
/*** END file-tail ***/
 | 
			
		||||
@ -23,7 +23,7 @@ includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: libeek-gtk
 | 
			
		||||
Description: A Library to Create Keyboard-like UI (GTK Support)
 | 
			
		||||
URL: http://ueno.github.com/eekboard/
 | 
			
		||||
URL: http://fedorahosted.org/eekboard/
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Requires: eek-@EEK_API_VERSION@ gtk+-@GTK_API_VERSION@
 | 
			
		||||
Libs: -L${libdir} -leek-gtk
 | 
			
		||||
 | 
			
		||||
@ -201,20 +201,32 @@ eek_gtk_keyboard_real_button_press_event (GtkWidget      *self,
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
eek_gtk_keyboard_real_button_release_event (GtkWidget      *self,
 | 
			
		||||
                                            GdkEventButton *event)
 | 
			
		||||
static void
 | 
			
		||||
clear_dragged_key (EekGtkKeyboard *keyboard)
 | 
			
		||||
{
 | 
			
		||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
			
		||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
 | 
			
		||||
 | 
			
		||||
    if (priv->dragged_key) {
 | 
			
		||||
        g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
 | 
			
		||||
        priv->dragged_key = NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
eek_gtk_keyboard_real_button_release_event (GtkWidget      *self,
 | 
			
		||||
                                            GdkEventButton *event)
 | 
			
		||||
{
 | 
			
		||||
    clear_dragged_key (EEK_GTK_KEYBOARD(self));
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_gtk_keyboard_real_unmap (GtkWidget *self)
 | 
			
		||||
{
 | 
			
		||||
    clear_dragged_key (EEK_GTK_KEYBOARD(self));
 | 
			
		||||
    GTK_WIDGET_CLASS (eek_gtk_keyboard_parent_class)->unmap (self);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
 | 
			
		||||
                               EekKeyboard    *keyboard)
 | 
			
		||||
@ -308,6 +320,7 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
 | 
			
		||||
                              sizeof (EekGtkKeyboardPrivate));
 | 
			
		||||
 | 
			
		||||
    widget_class->realize = eek_gtk_keyboard_real_realize;
 | 
			
		||||
    widget_class->unmap = eek_gtk_keyboard_real_unmap;
 | 
			
		||||
#if GTK_CHECK_VERSION (2, 91, 2)
 | 
			
		||||
    widget_class->draw = eek_gtk_keyboard_real_draw;
 | 
			
		||||
#else  /* GTK_CHECK_VERSION (2, 91, 2) */
 | 
			
		||||
@ -434,6 +447,7 @@ on_key_released (EekKeyboard *keyboard,
 | 
			
		||||
                     large_bounds.width,
 | 
			
		||||
                     large_bounds.height);
 | 
			
		||||
    cairo_clip (cr);
 | 
			
		||||
 | 
			
		||||
    eek_renderer_render_keyboard (priv->renderer, cr);
 | 
			
		||||
    cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
 | 
			
		||||
    cairo_destroy (cr);
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek-gtk.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_GTK_KEYBOARD_H
 | 
			
		||||
#define EEK_GTK_KEYBOARD_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -557,9 +557,9 @@ eek_key_get_symbol_matrix (EekKey *key)
 | 
			
		||||
/**
 | 
			
		||||
 * eek_key_get_symbol:
 | 
			
		||||
 * @key: an #EekKey
 | 
			
		||||
 * @returns: (transfer none): the current #EekSymbol or %NULL on failure
 | 
			
		||||
 *
 | 
			
		||||
 * Get the current symbol of @key.
 | 
			
		||||
 * Return value: (transfer none): the current #EekSymbol or %NULL on failure
 | 
			
		||||
 */
 | 
			
		||||
EekSymbol *
 | 
			
		||||
eek_key_get_symbol (EekKey *key)
 | 
			
		||||
@ -572,9 +572,9 @@ eek_key_get_symbol (EekKey *key)
 | 
			
		||||
 * @key: an #EekKey
 | 
			
		||||
 * @fallback_group: fallback group index
 | 
			
		||||
 * @fallback_level: fallback level index
 | 
			
		||||
 * @returns: (transfer none): the current #EekSymbol or %NULL on failure
 | 
			
		||||
 *
 | 
			
		||||
 * Get the current symbol of @key.
 | 
			
		||||
 * Return value: (transfer none): the current #EekSymbol or %NULL on failure
 | 
			
		||||
 */
 | 
			
		||||
EekSymbol *
 | 
			
		||||
eek_key_get_symbol_with_fallback (EekKey *key,
 | 
			
		||||
@ -628,9 +628,9 @@ eek_key_get_symbol_with_fallback (EekKey *key,
 | 
			
		||||
 * @level: level index of the symbol matrix
 | 
			
		||||
 * @fallback_group: fallback group index
 | 
			
		||||
 * @fallback_level: fallback level index
 | 
			
		||||
 * @returns: (transfer none): an #EekSymbol at (@group, @level), or %NULL
 | 
			
		||||
 *
 | 
			
		||||
 * Get the symbol at (@group, @level) in the symbol matrix of @key.
 | 
			
		||||
 * Return value: (transfer none): an #EekSymbol at (@group, @level), or %NULL
 | 
			
		||||
 */
 | 
			
		||||
EekSymbol *
 | 
			
		||||
eek_key_get_symbol_at_index (EekKey *key,
 | 
			
		||||
 | 
			
		||||
@ -17,12 +17,16 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_KEY_H
 | 
			
		||||
#define EEK_KEY_H 1
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
#include "eek-element.h"
 | 
			
		||||
#include "eek-types.h"
 | 
			
		||||
#include "eek-symbol-matrix.h"
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -36,6 +36,7 @@
 | 
			
		||||
#include "eek-key.h"
 | 
			
		||||
#include "eek-symbol.h"
 | 
			
		||||
#include "eek-serializable.h"
 | 
			
		||||
#include "eek-enumtypes.h"
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
    PROP_0,
 | 
			
		||||
@ -147,6 +148,7 @@ eek_keyboard_real_serialize (EekSerializable *self,
 | 
			
		||||
    }
 | 
			
		||||
    g_variant_builder_add (builder, "v", g_variant_builder_end (&array));
 | 
			
		||||
    g_variant_builder_add (builder, "u", priv->num_lock_mask);
 | 
			
		||||
    g_variant_builder_add (builder, "u", priv->alt_gr_mask);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gsize
 | 
			
		||||
@ -172,6 +174,7 @@ eek_keyboard_real_deserialize (EekSerializable *self,
 | 
			
		||||
        g_slice_free (EekOutline, _outline);
 | 
			
		||||
    }
 | 
			
		||||
    g_variant_get_child (variant, index++, "u", &priv->num_lock_mask);
 | 
			
		||||
    g_variant_get_child (variant, index++, "u", &priv->alt_gr_mask);
 | 
			
		||||
 | 
			
		||||
    return index;
 | 
			
		||||
}
 | 
			
		||||
@ -272,7 +275,7 @@ eek_keyboard_set_property (GObject      *object,
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_MODIFIER_BEHAVIOR:
 | 
			
		||||
        eek_keyboard_set_modifier_behavior (EEK_KEYBOARD(object),
 | 
			
		||||
                                            g_value_get_int (value));
 | 
			
		||||
                                            g_value_get_enum (value));
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        g_object_set_property (object,
 | 
			
		||||
@ -295,8 +298,8 @@ eek_keyboard_get_property (GObject    *object,
 | 
			
		||||
        g_value_set_object (value, priv->layout);
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_MODIFIER_BEHAVIOR:
 | 
			
		||||
        g_value_set_int (value,
 | 
			
		||||
                         eek_keyboard_get_modifier_behavior (EEK_KEYBOARD(object)));
 | 
			
		||||
        g_value_set_enum (value,
 | 
			
		||||
                          eek_keyboard_get_modifier_behavior (EEK_KEYBOARD(object)));
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        g_object_get_property (object,
 | 
			
		||||
@ -359,7 +362,10 @@ eek_keyboard_real_key_released (EekKeyboard *self,
 | 
			
		||||
        priv->modifiers ^= modifier;
 | 
			
		||||
        break;
 | 
			
		||||
    case EEK_MODIFIER_BEHAVIOR_LATCH:
 | 
			
		||||
        priv->modifiers = (priv->modifiers ^ modifier) & modifier;
 | 
			
		||||
        if (modifier == priv->alt_gr_mask || modifier == EEK_SHIFT_MASK)
 | 
			
		||||
            priv->modifiers ^= modifier;
 | 
			
		||||
        else
 | 
			
		||||
            priv->modifiers = (priv->modifiers ^ modifier) & modifier;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    set_level_from_modifiers (self);
 | 
			
		||||
@ -460,11 +466,12 @@ eek_keyboard_class_init (EekKeyboardClass *klass)
 | 
			
		||||
     *
 | 
			
		||||
     * The modifier handling mode of #EekKeyboard.
 | 
			
		||||
     */
 | 
			
		||||
    pspec = g_param_spec_int ("modifier-behavior",
 | 
			
		||||
                              "Modifier behavior",
 | 
			
		||||
                              "Modifier handling mode of the keyboard",
 | 
			
		||||
                              0, G_MAXINT, EEK_MODIFIER_BEHAVIOR_NONE,
 | 
			
		||||
                              G_PARAM_READWRITE);
 | 
			
		||||
    pspec = g_param_spec_enum ("modifier-behavior",
 | 
			
		||||
                               "Modifier behavior",
 | 
			
		||||
                               "Modifier handling mode of the keyboard",
 | 
			
		||||
                               EEK_TYPE_MODIFIER_BEHAVIOR,
 | 
			
		||||
                               EEK_MODIFIER_BEHAVIOR_NONE,
 | 
			
		||||
                               G_PARAM_READWRITE);
 | 
			
		||||
    g_object_class_install_property (gobject_class,
 | 
			
		||||
                                     PROP_MODIFIER_BEHAVIOR,
 | 
			
		||||
                                     pspec);
 | 
			
		||||
@ -653,9 +660,9 @@ eek_keyboard_create_section (EekKeyboard *keyboard)
 | 
			
		||||
 * eek_keyboard_find_key_by_keycode:
 | 
			
		||||
 * @keyboard: an #EekKeyboard
 | 
			
		||||
 * @keycode: a keycode
 | 
			
		||||
 * @returns: (transfer none): #EekKey whose keycode is @keycode
 | 
			
		||||
 *
 | 
			
		||||
 * Find an #EekKey whose keycode is @keycode.
 | 
			
		||||
 * Return value: (transfer none): #EekKey whose keycode is @keycode
 | 
			
		||||
 */
 | 
			
		||||
EekKey *
 | 
			
		||||
eek_keyboard_find_key_by_keycode (EekKeyboard *keyboard,
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_KEYBOARD_H
 | 
			
		||||
#define EEK_KEYBOARD_H 1
 | 
			
		||||
 | 
			
		||||
@ -104,6 +109,7 @@ void                eek_keyboard_set_size
 | 
			
		||||
                                     (EekKeyboard        *keyboard,
 | 
			
		||||
                                      gdouble             width,
 | 
			
		||||
                                      gdouble             height);
 | 
			
		||||
#ifndef EEK_DISABLE_DEPRECATED
 | 
			
		||||
void                eek_keyboard_set_symbol_index
 | 
			
		||||
                                     (EekKeyboard        *keyboard,
 | 
			
		||||
                                      gint                group,
 | 
			
		||||
@ -112,7 +118,6 @@ void                eek_keyboard_get_symbol_index
 | 
			
		||||
                                     (EekKeyboard        *keyboard,
 | 
			
		||||
                                      gint               *group,
 | 
			
		||||
                                      gint               *level);
 | 
			
		||||
 | 
			
		||||
void                eek_keyboard_set_group
 | 
			
		||||
                                     (EekKeyboard        *keyboard,
 | 
			
		||||
                                      gint                group);
 | 
			
		||||
@ -123,6 +128,7 @@ gint                eek_keyboard_get_group
 | 
			
		||||
                                     (EekKeyboard        *keyboard);
 | 
			
		||||
gint                eek_keyboard_get_level
 | 
			
		||||
                                     (EekKeyboard        *keyboard);
 | 
			
		||||
#endif  /* EEK_DISABLE_DEPRECATED */
 | 
			
		||||
 | 
			
		||||
void                eek_keyboard_set_modifier_behavior
 | 
			
		||||
                                     (EekKeyboard        *keyboard,
 | 
			
		||||
 | 
			
		||||
@ -223,7 +223,8 @@ eek_keysym_init (EekKeysym *self)
 | 
			
		||||
 * modifier @modifier_mask.
 | 
			
		||||
 */
 | 
			
		||||
EekKeysym *
 | 
			
		||||
eek_keysym_new_with_modifier (guint xkeysym, EekModifierType modifier_mask)
 | 
			
		||||
eek_keysym_new_with_modifier (guint           xkeysym,
 | 
			
		||||
                              EekModifierType modifier_mask)
 | 
			
		||||
{
 | 
			
		||||
    EekKeysym *keysym;
 | 
			
		||||
    EekKeysymPrivate *priv;
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_KEYSYM_H
 | 
			
		||||
#define EEK_KEYSYM_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,10 @@
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_LAYOUT_H
 | 
			
		||||
#define EEK_LAYOUT_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -53,6 +53,7 @@ struct _EekRendererPrivate
 | 
			
		||||
    gdouble allocation_height;
 | 
			
		||||
    gdouble scale;
 | 
			
		||||
 | 
			
		||||
    PangoFontDescription *ascii_font;
 | 
			
		||||
    PangoFontDescription *font;
 | 
			
		||||
    GHashTable *outline_surface_cache;
 | 
			
		||||
    GHashTable *active_outline_surface_cache;
 | 
			
		||||
@ -65,14 +66,13 @@ struct _EekRendererPrivate
 | 
			
		||||
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};
 | 
			
		||||
 | 
			
		||||
struct {
 | 
			
		||||
struct _TextProperty {
 | 
			
		||||
    gint category;
 | 
			
		||||
    gboolean ascii;
 | 
			
		||||
    gdouble scale;
 | 
			
		||||
} symbol_category_scale_factors[EEK_SYMBOL_CATEGORY_LAST] = {
 | 
			
		||||
    { EEK_SYMBOL_CATEGORY_LETTER, 1.0 },
 | 
			
		||||
    { EEK_SYMBOL_CATEGORY_FUNCTION, 0.5 },
 | 
			
		||||
    { EEK_SYMBOL_CATEGORY_KEYNAME, 0.5 }
 | 
			
		||||
    gboolean ellipses;
 | 
			
		||||
};
 | 
			
		||||
typedef struct _TextProperty TextProperty;
 | 
			
		||||
 | 
			
		||||
/* eek-keyboard-drawing.c */
 | 
			
		||||
extern void _eek_rounded_polygon               (cairo_t     *cr,
 | 
			
		||||
@ -342,7 +342,7 @@ render_key_outline (EekRenderer *renderer,
 | 
			
		||||
 | 
			
		||||
struct _CalculateFontSizeCallbackData {
 | 
			
		||||
    gdouble size;
 | 
			
		||||
    gdouble em_size;
 | 
			
		||||
    gboolean ascii;
 | 
			
		||||
    EekRenderer *renderer;
 | 
			
		||||
    const PangoFontDescription *base_font;
 | 
			
		||||
};
 | 
			
		||||
@ -358,16 +358,21 @@ calculate_font_size_key_callback (EekElement *element, gpointer user_data)
 | 
			
		||||
    PangoRectangle extents = { 0, };
 | 
			
		||||
    PangoLayout *layout;
 | 
			
		||||
    gdouble size;
 | 
			
		||||
    EekSymbol *symbol;
 | 
			
		||||
    EekBounds bounds;
 | 
			
		||||
    const gchar *label = NULL;
 | 
			
		||||
 | 
			
		||||
    symbol = eek_key_get_symbol (EEK_KEY(element));
 | 
			
		||||
    if (symbol &&
 | 
			
		||||
        eek_symbol_get_category (symbol) == EEK_SYMBOL_CATEGORY_LETTER)
 | 
			
		||||
        label = eek_symbol_get_label (symbol);
 | 
			
		||||
    if (!label)
 | 
			
		||||
    if (data->ascii)
 | 
			
		||||
        label = "M";
 | 
			
		||||
    else {
 | 
			
		||||
        EekSymbol *symbol;
 | 
			
		||||
 | 
			
		||||
        symbol = eek_key_get_symbol (EEK_KEY(element));
 | 
			
		||||
        if (symbol &&
 | 
			
		||||
            eek_symbol_get_category (symbol) == EEK_SYMBOL_CATEGORY_LETTER)
 | 
			
		||||
            label = eek_symbol_get_label (symbol);
 | 
			
		||||
        if (!label)
 | 
			
		||||
            label = "M";
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    font = pango_font_description_copy (data->base_font);
 | 
			
		||||
 | 
			
		||||
@ -390,12 +395,8 @@ calculate_font_size_key_callback (EekElement *element, gpointer user_data)
 | 
			
		||||
        sy = bounds.height * PANGO_SCALE / extents.height;
 | 
			
		||||
 | 
			
		||||
    size *= MIN(sx, sy);
 | 
			
		||||
    if (size >= pango_font_description_get_size (data->base_font)) {
 | 
			
		||||
        if (size < data->size)
 | 
			
		||||
            data->size = size;
 | 
			
		||||
        if (size < data->em_size)
 | 
			
		||||
            data->em_size = size;
 | 
			
		||||
    }
 | 
			
		||||
    if (size < data->size)
 | 
			
		||||
        data->size = size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@ -407,19 +408,21 @@ calculate_font_size_section_callback (EekElement *element, gpointer user_data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gdouble
 | 
			
		||||
calculate_font_size (EekRenderer *renderer, const PangoFontDescription *base_font)
 | 
			
		||||
calculate_font_size (EekRenderer                *renderer,
 | 
			
		||||
                     const PangoFontDescription *base_font,
 | 
			
		||||
                     gboolean                    ascii)
 | 
			
		||||
{
 | 
			
		||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(renderer);
 | 
			
		||||
    CalculateFontSizeCallbackData data;
 | 
			
		||||
 | 
			
		||||
    data.size = G_MAXDOUBLE;
 | 
			
		||||
    data.em_size = G_MAXDOUBLE;
 | 
			
		||||
    data.ascii = ascii;
 | 
			
		||||
    data.renderer = renderer;
 | 
			
		||||
    data.base_font = base_font;
 | 
			
		||||
    eek_container_foreach_child (EEK_CONTAINER(priv->keyboard),
 | 
			
		||||
                                 calculate_font_size_section_callback,
 | 
			
		||||
                                 &data);
 | 
			
		||||
    return data.size > 0 ? data.size : data.em_size;
 | 
			
		||||
    return data.size;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@ -479,7 +482,6 @@ render_key (EekRenderer *self,
 | 
			
		||||
        PangoLayout *layout;
 | 
			
		||||
        PangoRectangle extents = { 0, };
 | 
			
		||||
        EekColor foreground;
 | 
			
		||||
        EekThemeNode *theme_node;
 | 
			
		||||
 | 
			
		||||
        layout = pango_cairo_create_layout (cr);
 | 
			
		||||
        eek_renderer_render_key_label (self, layout, key);
 | 
			
		||||
@ -491,11 +493,6 @@ render_key (EekRenderer *self,
 | 
			
		||||
             (bounds.width * priv->scale - extents.width / PANGO_SCALE) / 2,
 | 
			
		||||
             (bounds.height * priv->scale - extents.height / PANGO_SCALE) / 2);
 | 
			
		||||
 | 
			
		||||
        if (eek_key_is_pressed (key))
 | 
			
		||||
            theme_node = g_object_get_data (G_OBJECT(key), "theme-node-pressed");
 | 
			
		||||
        else
 | 
			
		||||
            theme_node = g_object_get_data (G_OBJECT(key), "theme-node");
 | 
			
		||||
 | 
			
		||||
        eek_renderer_get_foreground_color (self, EEK_ELEMENT(key), &foreground);
 | 
			
		||||
        cairo_set_source_rgba (cr,
 | 
			
		||||
                               foreground.red,
 | 
			
		||||
@ -538,6 +535,23 @@ eek_renderer_apply_transformation_for_key (EekRenderer *self,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const TextProperty *
 | 
			
		||||
get_text_property_for_category (EekSymbolCategory category)
 | 
			
		||||
{
 | 
			
		||||
    static const TextProperty props[EEK_SYMBOL_CATEGORY_LAST] = {
 | 
			
		||||
        { EEK_SYMBOL_CATEGORY_LETTER, FALSE, 1.0, FALSE },
 | 
			
		||||
        { EEK_SYMBOL_CATEGORY_FUNCTION, TRUE, 0.5, FALSE },
 | 
			
		||||
        { EEK_SYMBOL_CATEGORY_KEYNAME, TRUE, 0.5, TRUE }
 | 
			
		||||
    };
 | 
			
		||||
    gint i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < G_N_ELEMENTS(props); i++)
 | 
			
		||||
        if (props[i].category == category)
 | 
			
		||||
            return &props[i];
 | 
			
		||||
 | 
			
		||||
    g_return_val_if_reached (NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eek_renderer_real_render_key_label (EekRenderer *self,
 | 
			
		||||
                                    PangoLayout *layout,
 | 
			
		||||
@ -548,9 +562,9 @@ eek_renderer_real_render_key_label (EekRenderer *self,
 | 
			
		||||
    EekSymbolCategory category;
 | 
			
		||||
    const gchar *label;
 | 
			
		||||
    EekBounds bounds;
 | 
			
		||||
    const TextProperty *prop;
 | 
			
		||||
    PangoFontDescription *font;
 | 
			
		||||
    gdouble size, scale;
 | 
			
		||||
    gint i;
 | 
			
		||||
    gdouble scale;
 | 
			
		||||
 | 
			
		||||
    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
			
		||||
    if (!symbol)
 | 
			
		||||
@ -562,7 +576,7 @@ eek_renderer_real_render_key_label (EekRenderer *self,
 | 
			
		||||
 | 
			
		||||
    if (!priv->font) {
 | 
			
		||||
        const PangoFontDescription *base_font;
 | 
			
		||||
        gdouble size;
 | 
			
		||||
        gdouble ascii_size, size;
 | 
			
		||||
        EekThemeNode *theme_node;
 | 
			
		||||
 | 
			
		||||
        theme_node = g_object_get_data (G_OBJECT(key), "theme-node");
 | 
			
		||||
@ -570,7 +584,11 @@ eek_renderer_real_render_key_label (EekRenderer *self,
 | 
			
		||||
            base_font = eek_theme_node_get_font (theme_node);
 | 
			
		||||
        else
 | 
			
		||||
            base_font = pango_context_get_font_description (priv->pcontext);
 | 
			
		||||
        size = calculate_font_size (self, base_font);
 | 
			
		||||
        ascii_size = calculate_font_size (self, base_font, TRUE);
 | 
			
		||||
        priv->ascii_font = pango_font_description_copy (base_font);
 | 
			
		||||
        pango_font_description_set_size (priv->ascii_font, ascii_size);
 | 
			
		||||
 | 
			
		||||
        size = calculate_font_size (self, base_font, FALSE);
 | 
			
		||||
        priv->font = pango_font_description_copy (base_font);
 | 
			
		||||
        pango_font_description_set_size (priv->font, size);
 | 
			
		||||
    }
 | 
			
		||||
@ -579,21 +597,23 @@ eek_renderer_real_render_key_label (EekRenderer *self,
 | 
			
		||||
    scale = MIN((bounds.width - priv->border_width) / bounds.width,
 | 
			
		||||
                (bounds.height - priv->border_width) / bounds.height);
 | 
			
		||||
 | 
			
		||||
    font = pango_font_description_copy (priv->font);
 | 
			
		||||
    size = pango_font_description_get_size (font);
 | 
			
		||||
    category = eek_symbol_get_category (symbol);
 | 
			
		||||
    for (i = 0; i < G_N_ELEMENTS(symbol_category_scale_factors); i++)
 | 
			
		||||
        if (symbol_category_scale_factors[i].category == category) {
 | 
			
		||||
            size *= symbol_category_scale_factors[i].scale;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    pango_font_description_set_size (font, size * priv->scale * scale);
 | 
			
		||||
    prop = get_text_property_for_category (category);
 | 
			
		||||
 | 
			
		||||
    font = pango_font_description_copy (prop->ascii ?
 | 
			
		||||
                                        priv->ascii_font :
 | 
			
		||||
                                        priv->font);
 | 
			
		||||
    pango_font_description_set_size (font,
 | 
			
		||||
                                     pango_font_description_get_size (font) *
 | 
			
		||||
                                     prop->scale * priv->scale * scale);
 | 
			
		||||
    pango_layout_set_font_description (layout, font);
 | 
			
		||||
    pango_font_description_free (font);
 | 
			
		||||
 | 
			
		||||
    pango_layout_set_text (layout, label, -1);
 | 
			
		||||
    pango_layout_set_width (layout,
 | 
			
		||||
                            PANGO_SCALE * bounds.width * priv->scale * scale);
 | 
			
		||||
    pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
 | 
			
		||||
    if (prop->ellipses)
 | 
			
		||||
        pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@ -627,6 +647,7 @@ eek_renderer_real_render_keyboard (EekRenderer *self,
 | 
			
		||||
                                   cairo_t     *cr)
 | 
			
		||||
{
 | 
			
		||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self);
 | 
			
		||||
    cairo_pattern_t *source;
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail (priv->keyboard);
 | 
			
		||||
    g_return_if_fail (priv->allocation_width > 0.0);
 | 
			
		||||
@ -636,6 +657,8 @@ eek_renderer_real_render_keyboard (EekRenderer *self,
 | 
			
		||||
        priv->keyboard_surface = create_keyboard_surface (self);
 | 
			
		||||
 | 
			
		||||
    cairo_set_source_surface (cr, priv->keyboard_surface, 0.0, 0.0);
 | 
			
		||||
    source = cairo_get_source (cr);
 | 
			
		||||
    cairo_pattern_set_extend (source, CAIRO_EXTEND_PAD);
 | 
			
		||||
    cairo_paint (cr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -719,6 +742,7 @@ eek_renderer_finalize (GObject *object)
 | 
			
		||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(object);
 | 
			
		||||
    g_hash_table_destroy (priv->outline_surface_cache);
 | 
			
		||||
    g_hash_table_destroy (priv->active_outline_surface_cache);
 | 
			
		||||
    pango_font_description_free (priv->ascii_font);
 | 
			
		||||
    pango_font_description_free (priv->font);
 | 
			
		||||
    G_OBJECT_CLASS (eek_renderer_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
@ -1114,7 +1138,6 @@ eek_renderer_get_background_gradient (EekRenderer     *renderer,
 | 
			
		||||
                                      EekColor        *start,
 | 
			
		||||
                                      EekColor        *end)
 | 
			
		||||
{
 | 
			
		||||
    EekRendererPrivate *priv;
 | 
			
		||||
    EekThemeNode *theme_node;
 | 
			
		||||
 | 
			
		||||
    g_return_if_fail (EEK_IS_RENDERER(renderer));
 | 
			
		||||
@ -1123,8 +1146,6 @@ eek_renderer_get_background_gradient (EekRenderer     *renderer,
 | 
			
		||||
    g_return_if_fail (start);
 | 
			
		||||
    g_return_if_fail (end);
 | 
			
		||||
 | 
			
		||||
    priv = EEK_RENDERER_GET_PRIVATE(renderer);
 | 
			
		||||
 | 
			
		||||
    theme_node = g_object_get_data (G_OBJECT(element), "theme-node");
 | 
			
		||||
    if (theme_node)
 | 
			
		||||
        eek_theme_node_get_background_gradient (theme_node, type, start, end);
 | 
			
		||||
@ -1207,11 +1228,8 @@ find_key_by_position_section_callback (EekElement *element,
 | 
			
		||||
{
 | 
			
		||||
    FindKeyByPositionCallbackData *data = user_data;
 | 
			
		||||
    EekBounds bounds;
 | 
			
		||||
    EekRendererPrivate *priv;
 | 
			
		||||
    EekPoint origin;
 | 
			
		||||
 | 
			
		||||
    priv = EEK_RENDERER_GET_PRIVATE(data->renderer);
 | 
			
		||||
 | 
			
		||||
    origin = data->origin;
 | 
			
		||||
    eek_element_get_bounds (element, &bounds);
 | 
			
		||||
    data->origin.x += bounds.x;
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_SECTION_H
 | 
			
		||||
#define EEK_SECTION_H 1
 | 
			
		||||
 | 
			
		||||
@ -54,6 +59,8 @@ struct _EekSection
 | 
			
		||||
 * @create_key: virtual function for creating key in the section
 | 
			
		||||
 * @find_key_by_keycode: virtual function for accessing a key in the
 | 
			
		||||
 * section by keycode
 | 
			
		||||
 * @key_pressed: class handler for #EekSection::key-pressed signal
 | 
			
		||||
 * @key_released: class handler for #EekSection::key-released signal
 | 
			
		||||
 */
 | 
			
		||||
struct _EekSectionClass
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,10 @@
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_SERIALIZABLE_H
 | 
			
		||||
#define EEK_SERIALIZABLE_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										105
									
								
								eek/eek-symbol-matrix.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								eek/eek-symbol-matrix.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,105 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
#include "eek-symbol-matrix.h"
 | 
			
		||||
 | 
			
		||||
EekSymbolMatrix *
 | 
			
		||||
eek_symbol_matrix_new (gint num_groups,
 | 
			
		||||
                       gint num_levels)
 | 
			
		||||
{
 | 
			
		||||
    EekSymbolMatrix *matrix = g_slice_new (EekSymbolMatrix);
 | 
			
		||||
 | 
			
		||||
    matrix->num_groups = num_groups;
 | 
			
		||||
    matrix->num_levels = num_levels;
 | 
			
		||||
    matrix->data = g_slice_alloc0 (sizeof (EekSymbol *) *
 | 
			
		||||
                                   num_groups * num_levels);
 | 
			
		||||
    return matrix;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EekSymbolMatrix *
 | 
			
		||||
eek_symbol_matrix_copy (const EekSymbolMatrix *matrix)
 | 
			
		||||
{
 | 
			
		||||
    EekSymbolMatrix *retval;
 | 
			
		||||
    gint i, num_symbols = matrix->num_groups * matrix->num_levels;
 | 
			
		||||
 | 
			
		||||
    retval = g_slice_dup (EekSymbolMatrix, matrix);
 | 
			
		||||
    retval->data = g_slice_copy (sizeof (EekSymbol *) * num_symbols,
 | 
			
		||||
                                 matrix->data);
 | 
			
		||||
    for (i = 0; i < num_symbols; i++)
 | 
			
		||||
        if (retval->data[i])
 | 
			
		||||
            g_object_ref (retval->data[i]);
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eek_symbol_matrix_free (EekSymbolMatrix *matrix)
 | 
			
		||||
{
 | 
			
		||||
    gint i, num_symbols = matrix->num_groups * matrix->num_levels;
 | 
			
		||||
    for (i = 0; i < num_symbols; i++)
 | 
			
		||||
        if (matrix->data[i])
 | 
			
		||||
            g_object_unref (matrix->data[i]);
 | 
			
		||||
    g_slice_free1 (sizeof (EekSymbol *) * num_symbols, matrix->data);
 | 
			
		||||
    g_slice_free (EekSymbolMatrix, matrix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GType
 | 
			
		||||
eek_symbol_matrix_get_type (void)
 | 
			
		||||
{
 | 
			
		||||
    static GType our_type = 0;
 | 
			
		||||
 | 
			
		||||
    if (our_type == 0)
 | 
			
		||||
        our_type =
 | 
			
		||||
            g_boxed_type_register_static ("EekSymbolMatrix",
 | 
			
		||||
                                          (GBoxedCopyFunc)eek_symbol_matrix_copy,
 | 
			
		||||
                                          (GBoxedFreeFunc)eek_symbol_matrix_free);
 | 
			
		||||
    return our_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eek_symbol_matrix_set_symbol (EekSymbolMatrix *matrix,
 | 
			
		||||
                              gint             group,
 | 
			
		||||
                              gint             level,
 | 
			
		||||
                              EekSymbol       *symbol)
 | 
			
		||||
{
 | 
			
		||||
    g_return_if_fail (group >= 0 && group < matrix->num_groups);
 | 
			
		||||
    g_return_if_fail (level >= 0 && level < matrix->num_levels);
 | 
			
		||||
    g_return_if_fail (EEK_IS_SYMBOL(symbol));
 | 
			
		||||
    matrix->data[group * matrix->num_levels + level] = g_object_ref (symbol);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_symbol_matrix_get_symbol:
 | 
			
		||||
 * @matrix: an #EekSymbolMatrix
 | 
			
		||||
 * @group: group index of @matrix
 | 
			
		||||
 * @level: level index of @matrix
 | 
			
		||||
 *
 | 
			
		||||
 * Get an #EekSymbol stored in the cell selected by (@group, @level)
 | 
			
		||||
 * in @matrix.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer none): an #EekSymbol.
 | 
			
		||||
 */
 | 
			
		||||
EekSymbol *
 | 
			
		||||
eek_symbol_matrix_get_symbol (EekSymbolMatrix *matrix,
 | 
			
		||||
                              gint             group,
 | 
			
		||||
                              gint             level)
 | 
			
		||||
{
 | 
			
		||||
    g_return_val_if_fail (group >= 0 && group < matrix->num_groups, NULL);
 | 
			
		||||
    g_return_val_if_fail (level >= 0 && level < matrix->num_levels, NULL);
 | 
			
		||||
    return matrix->data[group * matrix->num_levels + level];
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										61
									
								
								eek/eek-symbol-matrix.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								eek/eek-symbol-matrix.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,61 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
#ifndef EEK_SYMBOL_MATRIX_H
 | 
			
		||||
#define EEK_SYMBOL_MATRIX_H 1
 | 
			
		||||
 | 
			
		||||
#include "eek-symbol.h"
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * EekSymbolMatrix:
 | 
			
		||||
 * @data: array of symbols
 | 
			
		||||
 * @num_groups: the number of groups (rows)
 | 
			
		||||
 * @num_levels: the number of levels (columns)
 | 
			
		||||
 *
 | 
			
		||||
 * Symbol matrix of a key.
 | 
			
		||||
 */
 | 
			
		||||
struct _EekSymbolMatrix
 | 
			
		||||
{
 | 
			
		||||
    gint num_groups;
 | 
			
		||||
    gint num_levels;
 | 
			
		||||
    EekSymbol **data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define EEK_TYPE_SYMBOL_MATRIX (eek_symbol_matrix_get_type ())
 | 
			
		||||
GType            eek_symbol_matrix_get_type (void) G_GNUC_CONST;
 | 
			
		||||
EekSymbolMatrix *eek_symbol_matrix_new      (gint                   num_groups,
 | 
			
		||||
                                             gint                   num_levels);
 | 
			
		||||
EekSymbolMatrix *eek_symbol_matrix_copy     (const EekSymbolMatrix *matrix);
 | 
			
		||||
void             eek_symbol_matrix_free     (EekSymbolMatrix       *matrix);
 | 
			
		||||
 | 
			
		||||
void             eek_symbol_matrix_set_symbol
 | 
			
		||||
                                            (EekSymbolMatrix       *matrix,
 | 
			
		||||
                                             gint                   group,
 | 
			
		||||
                                             gint                   level,
 | 
			
		||||
                                             EekSymbol             *symbol);
 | 
			
		||||
EekSymbol       *eek_symbol_matrix_get_symbol
 | 
			
		||||
                                            (EekSymbolMatrix       *matrix,
 | 
			
		||||
                                             gint                   group,
 | 
			
		||||
                                             gint                   level);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif  /* EEK_SYMBOL_MATRIX_H */
 | 
			
		||||
@ -31,6 +31,7 @@
 | 
			
		||||
 | 
			
		||||
#include "eek-symbol.h"
 | 
			
		||||
#include "eek-serializable.h"
 | 
			
		||||
#include "eek-enumtypes.h"
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
    PROP_0,
 | 
			
		||||
@ -110,11 +111,11 @@ eek_symbol_set_property (GObject      *object,
 | 
			
		||||
        eek_symbol_set_label (EEK_SYMBOL(object), g_value_get_string (value));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_CATEGORY:
 | 
			
		||||
        eek_symbol_set_category (EEK_SYMBOL(object), g_value_get_uint (value));
 | 
			
		||||
        eek_symbol_set_category (EEK_SYMBOL(object), g_value_get_enum (value));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_MODIFIER_MASK:
 | 
			
		||||
        eek_symbol_set_modifier_mask (EEK_SYMBOL(object),
 | 
			
		||||
                                      g_value_get_uint (value));
 | 
			
		||||
                                      g_value_get_flags (value));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_ICON_NAME:
 | 
			
		||||
        eek_symbol_set_icon_name (EEK_SYMBOL(object),
 | 
			
		||||
@ -142,11 +143,11 @@ eek_symbol_get_property (GObject    *object,
 | 
			
		||||
        g_value_set_string (value, eek_symbol_get_label (EEK_SYMBOL(object)));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_CATEGORY:
 | 
			
		||||
        g_value_set_uint (value, eek_symbol_get_category (EEK_SYMBOL(object)));
 | 
			
		||||
        g_value_set_enum (value, eek_symbol_get_category (EEK_SYMBOL(object)));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_MODIFIER_MASK:
 | 
			
		||||
        g_value_set_uint (value,
 | 
			
		||||
                          eek_symbol_get_modifier_mask (EEK_SYMBOL(object)));
 | 
			
		||||
        g_value_set_flags (value,
 | 
			
		||||
                           eek_symbol_get_modifier_mask (EEK_SYMBOL(object)));
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_ICON_NAME:
 | 
			
		||||
        g_value_set_string (value,
 | 
			
		||||
@ -197,18 +198,20 @@ eek_symbol_class_init (EekSymbolClass *klass)
 | 
			
		||||
                                 G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
 | 
			
		||||
    g_object_class_install_property (gobject_class, PROP_LABEL, pspec);
 | 
			
		||||
 | 
			
		||||
    pspec = g_param_spec_uint ("category",
 | 
			
		||||
    pspec = g_param_spec_enum ("category",
 | 
			
		||||
                               "Category",
 | 
			
		||||
                               "Category of the symbol",
 | 
			
		||||
                               0, G_MAXUINT, 0,
 | 
			
		||||
                               EEK_TYPE_SYMBOL_CATEGORY,
 | 
			
		||||
                               EEK_SYMBOL_CATEGORY_UNKNOWN,
 | 
			
		||||
                               G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
 | 
			
		||||
    g_object_class_install_property (gobject_class, PROP_CATEGORY, pspec);
 | 
			
		||||
 | 
			
		||||
    pspec = g_param_spec_uint ("modifier-mask",
 | 
			
		||||
                               "Modifier mask",
 | 
			
		||||
                               "Modifier mask of the symbol",
 | 
			
		||||
                               0, G_MAXUINT, 0,
 | 
			
		||||
                               G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
 | 
			
		||||
    pspec = g_param_spec_flags ("modifier-mask",
 | 
			
		||||
                                "Modifier mask",
 | 
			
		||||
                                "Modifier mask of the symbol",
 | 
			
		||||
                                EEK_TYPE_MODIFIER_TYPE,
 | 
			
		||||
                                0,
 | 
			
		||||
                                G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
 | 
			
		||||
    g_object_class_install_property (gobject_class, PROP_MODIFIER_MASK, pspec);
 | 
			
		||||
 | 
			
		||||
    pspec = g_param_spec_string ("icon-name",
 | 
			
		||||
@ -361,8 +364,9 @@ eek_symbol_get_category (EekSymbol *symbol)
 | 
			
		||||
/**
 | 
			
		||||
 * eek_symbol_set_modifier_mask:
 | 
			
		||||
 * @symbol: an #EekSymbol
 | 
			
		||||
 * @mask: an #EekModifierType
 | 
			
		||||
 *
 | 
			
		||||
 * Set modifier mask @symbol can trigger.
 | 
			
		||||
 * Set modifier mask that @symbol can trigger.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
eek_symbol_set_modifier_mask (EekSymbol      *symbol,
 | 
			
		||||
@ -380,7 +384,7 @@ eek_symbol_set_modifier_mask (EekSymbol      *symbol,
 | 
			
		||||
 * eek_symbol_get_modifier_mask:
 | 
			
		||||
 * @symbol: an #EekSymbol
 | 
			
		||||
 *
 | 
			
		||||
 * Get modifier mask @symbol can trigger.
 | 
			
		||||
 * Get modifier mask that @symbol can trigger.
 | 
			
		||||
 */
 | 
			
		||||
EekModifierType
 | 
			
		||||
eek_symbol_get_modifier_mask (EekSymbol *symbol)
 | 
			
		||||
 | 
			
		||||
@ -17,10 +17,14 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_SYMBOL_H
 | 
			
		||||
#define EEK_SYMBOL_H 1
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
#include "eek-types.h"
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
@ -37,6 +41,7 @@ G_BEGIN_DECLS
 | 
			
		||||
 * @EEK_SYMBOL_CATEGORY_USER3: reserved for future use
 | 
			
		||||
 * @EEK_SYMBOL_CATEGORY_USER4: reserved for future use
 | 
			
		||||
 * @EEK_SYMBOL_CATEGORY_UNKNOWN: used for error reporting
 | 
			
		||||
 * @EEK_SYMBOL_CATEGORY_LAST: the last symbol category
 | 
			
		||||
 *
 | 
			
		||||
 * Category of the key symbols.
 | 
			
		||||
 */
 | 
			
		||||
@ -50,7 +55,6 @@ typedef enum {
 | 
			
		||||
    EEK_SYMBOL_CATEGORY_USER3,
 | 
			
		||||
    EEK_SYMBOL_CATEGORY_USER4,
 | 
			
		||||
    EEK_SYMBOL_CATEGORY_UNKNOWN,
 | 
			
		||||
    /*< private >*/
 | 
			
		||||
    EEK_SYMBOL_CATEGORY_LAST = EEK_SYMBOL_CATEGORY_UNKNOWN
 | 
			
		||||
} EekSymbolCategory;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -121,7 +121,8 @@ eek_theme_context_changed (EekThemeContext *context)
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * eek_theme_context_set_theme:
 | 
			
		||||
 * @context: a #EekThemeContext
 | 
			
		||||
 * @context: an #EekThemeContext
 | 
			
		||||
 * @theme: an #EekTheme
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the default set of theme stylesheets for the context. This theme will
 | 
			
		||||
 * be used for the root node and for nodes descending from it, unless some other
 | 
			
		||||
 | 
			
		||||
@ -28,7 +28,7 @@
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:EekThemeContext
 | 
			
		||||
 * SECTION:eek-theme-context
 | 
			
		||||
 * @short_description: holds global information about a tree of styled objects
 | 
			
		||||
 *
 | 
			
		||||
 * #EekThemeContext is responsible for managing information global to
 | 
			
		||||
 | 
			
		||||
@ -26,12 +26,12 @@
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * SECTION:EekThemeNode
 | 
			
		||||
 * SECTION:eek-theme-node
 | 
			
		||||
 * @short_description: style information for one node in a tree of
 | 
			
		||||
 * themed objects
 | 
			
		||||
 *
 | 
			
		||||
 * A #EekThemeNode represents the CSS style information (the set of
 | 
			
		||||
 * CSS properties) for one node in a tree of themed objects. In
 | 
			
		||||
 * The #EekThemeNode class represents the CSS style information (the
 | 
			
		||||
 * set of CSS properties) for one node in a tree of themed objects. In
 | 
			
		||||
 * typical usage, it represents the style information for a single
 | 
			
		||||
 * #EekElement. A #EekThemeNode is immutable: attributes such as the
 | 
			
		||||
 * CSS classes for the node are passed in at construction. If the
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,9 @@
 | 
			
		||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef __EEK_THEME_H__
 | 
			
		||||
#define __EEK_THEME_H__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										121
									
								
								eek/eek-types.c
									
									
									
									
									
								
							
							
						
						
									
										121
									
								
								eek/eek-types.c
									
									
									
									
									
								
							@ -32,84 +32,21 @@
 | 
			
		||||
 | 
			
		||||
#include "eek-types.h"
 | 
			
		||||
 | 
			
		||||
/* EekSymbolMatrix */
 | 
			
		||||
EekSymbolMatrix *
 | 
			
		||||
eek_symbol_matrix_new (gint num_groups, gint num_levels)
 | 
			
		||||
{
 | 
			
		||||
    EekSymbolMatrix *matrix = g_slice_new (EekSymbolMatrix);
 | 
			
		||||
 | 
			
		||||
    matrix->num_groups = num_groups;
 | 
			
		||||
    matrix->num_levels = num_levels;
 | 
			
		||||
    matrix->data = g_slice_alloc0 (sizeof (EekSymbol *) *
 | 
			
		||||
                                   num_groups * num_levels);
 | 
			
		||||
    return matrix;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EekSymbolMatrix *
 | 
			
		||||
eek_symbol_matrix_copy (const EekSymbolMatrix *matrix)
 | 
			
		||||
{
 | 
			
		||||
    EekSymbolMatrix *retval;
 | 
			
		||||
    gint i, num_symbols = matrix->num_groups * matrix->num_levels;
 | 
			
		||||
 | 
			
		||||
    retval = g_slice_dup (EekSymbolMatrix, matrix);
 | 
			
		||||
    retval->data = g_slice_copy (sizeof (EekSymbol *) * num_symbols,
 | 
			
		||||
                                 matrix->data);
 | 
			
		||||
    for (i = 0; i < num_symbols; i++)
 | 
			
		||||
        if (retval->data[i])
 | 
			
		||||
            g_object_ref (retval->data[i]);
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eek_symbol_matrix_free (EekSymbolMatrix *matrix)
 | 
			
		||||
{
 | 
			
		||||
    gint i, num_symbols = matrix->num_groups * matrix->num_levels;
 | 
			
		||||
    for (i = 0; i < num_symbols; i++)
 | 
			
		||||
        if (matrix->data[i])
 | 
			
		||||
            g_object_unref (matrix->data[i]);
 | 
			
		||||
    g_slice_free1 (sizeof (EekSymbol *) * num_symbols, matrix->data);
 | 
			
		||||
    g_slice_free (EekSymbolMatrix, matrix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GType
 | 
			
		||||
eek_symbol_matrix_get_type (void)
 | 
			
		||||
{
 | 
			
		||||
    static GType our_type = 0;
 | 
			
		||||
 | 
			
		||||
    if (our_type == 0)
 | 
			
		||||
        our_type =
 | 
			
		||||
            g_boxed_type_register_static ("EekSymbolMatrix",
 | 
			
		||||
                                          (GBoxedCopyFunc)eek_symbol_matrix_copy,
 | 
			
		||||
                                          (GBoxedFreeFunc)eek_symbol_matrix_free);
 | 
			
		||||
    return our_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* EekPoint */
 | 
			
		||||
static EekPoint *
 | 
			
		||||
G_DEFINE_BOXED_TYPE(EekPoint, eek_point, eek_point_copy, eek_point_free);
 | 
			
		||||
 | 
			
		||||
EekPoint *
 | 
			
		||||
eek_point_copy (const EekPoint *point)
 | 
			
		||||
{
 | 
			
		||||
    return g_slice_dup (EekPoint, point);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
void
 | 
			
		||||
eek_point_free (EekPoint *point)
 | 
			
		||||
{
 | 
			
		||||
    g_slice_free (EekPoint, point);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GType
 | 
			
		||||
eek_point_get_type (void)
 | 
			
		||||
{
 | 
			
		||||
    static GType our_type = 0;
 | 
			
		||||
 | 
			
		||||
    if (our_type == 0)
 | 
			
		||||
        our_type =
 | 
			
		||||
            g_boxed_type_register_static ("EekPoint",
 | 
			
		||||
                                          (GBoxedCopyFunc)eek_point_copy,
 | 
			
		||||
                                          (GBoxedFreeFunc)eek_point_free);
 | 
			
		||||
    return our_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eek_point_rotate (EekPoint *point, gint angle)
 | 
			
		||||
{
 | 
			
		||||
@ -123,32 +60,24 @@ eek_point_rotate (EekPoint *point, gint angle)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* EekBounds */
 | 
			
		||||
static EekBounds *
 | 
			
		||||
G_DEFINE_BOXED_TYPE(EekBounds, eek_bounds, eek_bounds_copy, eek_bounds_free);
 | 
			
		||||
 | 
			
		||||
EekBounds *
 | 
			
		||||
eek_bounds_copy (const EekBounds *bounds)
 | 
			
		||||
{
 | 
			
		||||
    return g_slice_dup (EekBounds, bounds);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
void
 | 
			
		||||
eek_bounds_free (EekBounds *bounds)
 | 
			
		||||
{
 | 
			
		||||
    g_slice_free (EekBounds, bounds);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GType
 | 
			
		||||
eek_bounds_get_type (void)
 | 
			
		||||
{
 | 
			
		||||
    static GType our_type = 0;
 | 
			
		||||
 | 
			
		||||
    if (our_type == 0)
 | 
			
		||||
        our_type =
 | 
			
		||||
            g_boxed_type_register_static ("EekBounds",
 | 
			
		||||
                                          (GBoxedCopyFunc)eek_bounds_copy,
 | 
			
		||||
                                          (GBoxedFreeFunc)eek_bounds_free);
 | 
			
		||||
    return our_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* EekOutline */
 | 
			
		||||
G_DEFINE_BOXED_TYPE(EekOutline, eek_outline,
 | 
			
		||||
                    eek_outline_copy, eek_outline_free);
 | 
			
		||||
 | 
			
		||||
EekOutline *
 | 
			
		||||
eek_outline_copy (const EekOutline *outline)
 | 
			
		||||
{
 | 
			
		||||
@ -167,20 +96,9 @@ eek_outline_free (EekOutline *outline)
 | 
			
		||||
    g_slice_free (EekOutline, outline);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GType
 | 
			
		||||
eek_outline_get_type (void)
 | 
			
		||||
{
 | 
			
		||||
    static GType our_type = 0;
 | 
			
		||||
 | 
			
		||||
    if (our_type == 0)
 | 
			
		||||
        our_type =
 | 
			
		||||
            g_boxed_type_register_static ("EekOutline",
 | 
			
		||||
                                          (GBoxedCopyFunc)eek_outline_copy,
 | 
			
		||||
                                          (GBoxedFreeFunc)eek_outline_free);
 | 
			
		||||
    return our_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* EekColor */
 | 
			
		||||
G_DEFINE_BOXED_TYPE(EekColor, eek_color, eek_color_copy, eek_color_free);
 | 
			
		||||
 | 
			
		||||
EekColor *
 | 
			
		||||
eek_color_copy (const EekColor *color)
 | 
			
		||||
{
 | 
			
		||||
@ -193,19 +111,6 @@ eek_color_free (EekColor *color)
 | 
			
		||||
    g_slice_free (EekColor, color);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
GType
 | 
			
		||||
eek_color_get_type (void)
 | 
			
		||||
{
 | 
			
		||||
    static GType our_type = 0;
 | 
			
		||||
 | 
			
		||||
    if (our_type == 0)
 | 
			
		||||
        our_type =
 | 
			
		||||
            g_boxed_type_register_static ("EekColor",
 | 
			
		||||
                                          (GBoxedCopyFunc)eek_color_copy,
 | 
			
		||||
                                          (GBoxedFreeFunc)eek_color_free);
 | 
			
		||||
    return our_type;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
EekColor *
 | 
			
		||||
eek_color_new (gdouble red,
 | 
			
		||||
               gdouble green,
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_TYPES_H
 | 
			
		||||
#define EEK_TYPES_H 1
 | 
			
		||||
 | 
			
		||||
@ -26,7 +31,6 @@ G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define I_(string) g_intern_static_string (string)
 | 
			
		||||
 | 
			
		||||
#define EEK_TYPE_SYMBOL_MATRIX (eek_symbol_matrix_get_type ())
 | 
			
		||||
#define EEK_TYPE_POINT (eek_point_get_type ())
 | 
			
		||||
#define EEK_TYPE_BOUNDS (eek_bounds_get_type ())
 | 
			
		||||
#define EEK_TYPE_OUTLINE (eek_outline_get_type ())
 | 
			
		||||
@ -141,33 +145,10 @@ typedef struct _EekThemeContext EekThemeContext;
 | 
			
		||||
typedef struct _EekThemeNode EekThemeNode;
 | 
			
		||||
 | 
			
		||||
typedef struct _EekSymbolMatrix EekSymbolMatrix;
 | 
			
		||||
typedef struct _EekPoint EekPoint;
 | 
			
		||||
typedef struct _EekBounds EekBounds;
 | 
			
		||||
typedef struct _EekOutline EekOutline;
 | 
			
		||||
typedef struct _EekColor EekColor;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * EekSymbolMatrix:
 | 
			
		||||
 * @data: array of symbols
 | 
			
		||||
 * @num_groups: the number of groups (rows)
 | 
			
		||||
 * @num_levels: the number of levels (columns)
 | 
			
		||||
 *
 | 
			
		||||
 * Symbol matrix of a key.
 | 
			
		||||
 */
 | 
			
		||||
struct _EekSymbolMatrix
 | 
			
		||||
{
 | 
			
		||||
    gint num_groups;
 | 
			
		||||
    gint num_levels;
 | 
			
		||||
    EekSymbol **data;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
GType             eek_symbol_matrix_get_type
 | 
			
		||||
                                         (void) G_GNUC_CONST;
 | 
			
		||||
EekSymbolMatrix * eek_symbol_matrix_new  (gint                   num_groups,
 | 
			
		||||
                                          gint                   num_levels);
 | 
			
		||||
EekSymbolMatrix  *eek_symbol_matrix_copy (const EekSymbolMatrix *matrix);
 | 
			
		||||
void              eek_symbol_matrix_free (EekSymbolMatrix       *matrix);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * EekPoint:
 | 
			
		||||
 * @x: X coordinate of the point
 | 
			
		||||
@ -175,15 +156,18 @@ void              eek_symbol_matrix_free (EekSymbolMatrix       *matrix);
 | 
			
		||||
 *
 | 
			
		||||
 * 2D vertex
 | 
			
		||||
 */
 | 
			
		||||
typedef struct _EekPoint EekPoint;
 | 
			
		||||
struct _EekPoint
 | 
			
		||||
{
 | 
			
		||||
    gdouble x;
 | 
			
		||||
    gdouble y;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
GType eek_point_get_type (void) G_GNUC_CONST;
 | 
			
		||||
void  eek_point_rotate   (EekPoint *point,
 | 
			
		||||
                          gint      angle);
 | 
			
		||||
GType     eek_point_get_type (void) G_GNUC_CONST;
 | 
			
		||||
EekPoint *eek_point_copy     (const EekPoint *point);
 | 
			
		||||
void      eek_point_free     (EekPoint       *point);
 | 
			
		||||
void      eek_point_rotate   (EekPoint       *point,
 | 
			
		||||
                              gint            angle);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * EekBounds:
 | 
			
		||||
@ -196,14 +180,15 @@ void  eek_point_rotate   (EekPoint *point,
 | 
			
		||||
 */
 | 
			
		||||
struct _EekBounds
 | 
			
		||||
{
 | 
			
		||||
    /*< public >*/
 | 
			
		||||
    gdouble x;
 | 
			
		||||
    gdouble y;
 | 
			
		||||
    gdouble width;
 | 
			
		||||
    gdouble height;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
GType eek_bounds_get_type (void) G_GNUC_CONST;
 | 
			
		||||
GType      eek_bounds_get_type (void) G_GNUC_CONST;
 | 
			
		||||
EekBounds *eek_bounds_copy     (const EekBounds *bounds);
 | 
			
		||||
void       eek_bounds_free     (EekBounds       *bounds);
 | 
			
		||||
 | 
			
		||||
G_INLINE_FUNC gdouble
 | 
			
		||||
eek_bounds_long_side (EekBounds *bounds)
 | 
			
		||||
 | 
			
		||||
@ -23,7 +23,7 @@ includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: libeek-xkb
 | 
			
		||||
Description: A Library to Create Keyboard-like UI (XKB Support)
 | 
			
		||||
URL: http://ueno.github.com/eekboard/
 | 
			
		||||
URL: http://fedorahosted.org/eekboard/
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Requires: eek-@EEK_API_VERSION@ gtk+-x11-@GTK_API_VERSION@
 | 
			
		||||
Libs: -L${libdir} -leek-xkb
 | 
			
		||||
 | 
			
		||||
@ -127,7 +127,7 @@ create_key (EekXkbLayout *layout,
 | 
			
		||||
    EekSymbolMatrix *matrix = NULL;
 | 
			
		||||
    gchar name[XkbKeyNameLength + 1];
 | 
			
		||||
    KeyCode keycode;
 | 
			
		||||
    gint num_groups, num_levels, num_symbols;
 | 
			
		||||
    gint num_groups, num_levels;
 | 
			
		||||
    gulong oref;
 | 
			
		||||
 | 
			
		||||
    xkbgeometry = priv->xkb->geom;
 | 
			
		||||
@ -199,7 +199,6 @@ create_key (EekXkbLayout *layout,
 | 
			
		||||
 | 
			
		||||
        num_groups = XkbKeyNumGroups (priv->xkb, keycode);
 | 
			
		||||
        num_levels = XkbKeyGroupsWidth (priv->xkb, keycode);
 | 
			
		||||
        num_symbols = num_groups * num_levels;
 | 
			
		||||
        matrix = eek_symbol_matrix_new (num_groups, num_levels);
 | 
			
		||||
        for (i = 0; i < num_groups; i++)
 | 
			
		||||
            for (j = 0; j < num_levels; j++) {
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek-xkb.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_XKB_LAYOUT_H
 | 
			
		||||
#define EEK_XKB_LAYOUT_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -23,7 +23,7 @@ includedir=@includedir@
 | 
			
		||||
 | 
			
		||||
Name: libeek-xkl
 | 
			
		||||
Description: A Library to Create Keyboard-like UI (Libxklavier Support)
 | 
			
		||||
URL: http://ueno.github.com/eekboard/
 | 
			
		||||
URL: http://fedorahosted.org/eekboard/
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Requires: eek-xkb-@EEK_API_VERSION@ libxklavier
 | 
			
		||||
Libs: -L${libdir} -leek-xkl
 | 
			
		||||
 | 
			
		||||
@ -17,6 +17,11 @@
 | 
			
		||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
 * 02110-1301 USA
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek-xkl.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_XKL_LAYOUT_H
 | 
			
		||||
#define EEK_XKL_LAYOUT_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -590,6 +590,10 @@ eek_xml_layout_real_create_keyboard (EekLayout *self,
 | 
			
		||||
    if (data.oref_outline_hash)
 | 
			
		||||
        g_hash_table_destroy (data.oref_outline_hash);
 | 
			
		||||
 | 
			
		||||
    /* use pre-defined modifier mask here */
 | 
			
		||||
    eek_keyboard_set_num_lock_mask (data.keyboard, EEK_MOD2_MASK);
 | 
			
		||||
    eek_keyboard_set_alt_gr_mask (data.keyboard, EEK_MOD5_MASK);
 | 
			
		||||
 | 
			
		||||
    return data.keyboard;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,10 @@
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_XML_LAYOUT_H
 | 
			
		||||
#define EEK_XML_LAYOUT_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -16,6 +16,10 @@
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEK_H_INSIDE__) && !defined(EEK_COMPILATION)
 | 
			
		||||
#error "Only <eek/eek.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEK_XML_H
 | 
			
		||||
#define EEK_XML_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,8 @@
 | 
			
		||||
#ifndef EEK_H
 | 
			
		||||
#define EEK_H 1
 | 
			
		||||
 | 
			
		||||
#define __EEK_H_INSIDE__ 1
 | 
			
		||||
 | 
			
		||||
#include "eek-keyboard.h"
 | 
			
		||||
#include "eek-section.h"
 | 
			
		||||
#include "eek-key.h"
 | 
			
		||||
 | 
			
		||||
@ -47,6 +47,8 @@
 | 
			
		||||
0xFFE5 "⇪" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
			
		||||
0xFFE9 "Alt" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
			
		||||
0xFFEA "Alt" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
			
		||||
0xFFE7 "Meta" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
			
		||||
0xFFE8 "Meta" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
			
		||||
0xFFEB "Super" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
			
		||||
0xFFEC "Super" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
			
		||||
0xFFED "Hyper" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ libeekboard_sources =				\
 | 
			
		||||
	eekboard-context.c
 | 
			
		||||
 | 
			
		||||
libeekboard_la_SOURCES = $(libeekboard_sources)
 | 
			
		||||
libeekboard_la_CFLAGS = -I$(top_srcdir) $(GIO2_CFLAGS)
 | 
			
		||||
libeekboard_la_CFLAGS = -DEEKBOARD_COMPILATION=1 -I$(top_srcdir) $(GIO2_CFLAGS)
 | 
			
		||||
libeekboard_la_LIBADD = $(top_builddir)/eek/libeek.la $(GIO2_LIBS)
 | 
			
		||||
 | 
			
		||||
eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,6 @@ Name: Eekboard
 | 
			
		||||
Description: A Library to Create Keyboard-like UI
 | 
			
		||||
URL: http://ueno.github.com/eekboard/
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Requires: gobject-2.0
 | 
			
		||||
Requires: eek-@EEK_API_VERSION@
 | 
			
		||||
Libs: -L${libdir} -leek
 | 
			
		||||
Cflags: -I${includedir}/eekboard-@EEK_API_VERSION@
 | 
			
		||||
 | 
			
		||||
@ -368,9 +368,9 @@ eekboard_context_new (GDBusConnection *connection,
 | 
			
		||||
        g_initable_new (EEKBOARD_TYPE_CONTEXT,
 | 
			
		||||
                        cancellable,
 | 
			
		||||
                        &error,
 | 
			
		||||
                        "g-name", "com.redhat.Eekboard.Server",
 | 
			
		||||
                        "g-name", "org.fedorahosted.Eekboard.Server",
 | 
			
		||||
                        "g-connection", connection,
 | 
			
		||||
                        "g-interface-name", "com.redhat.Eekboard.Context",
 | 
			
		||||
                        "g-interface-name", "org.fedorahosted.Eekboard.Context",
 | 
			
		||||
                        "g-object-path", object_path,
 | 
			
		||||
                        NULL);
 | 
			
		||||
    if (initable != NULL) {
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,11 @@
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEKBOARD_H_INSIDE__) && !defined(EEKBOARD_COMPILATION)
 | 
			
		||||
#error "Only <eekboard/eekboard.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEKBOARD_CONTEXT_H
 | 
			
		||||
#define EEKBOARD_CONTEXT_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -143,9 +143,9 @@ eekboard_eekboard_new (GDBusConnection *connection,
 | 
			
		||||
                        cancellable,
 | 
			
		||||
                        &error,
 | 
			
		||||
                        "g-connection", connection,
 | 
			
		||||
                        "g-name", "com.redhat.Eekboard.Server",
 | 
			
		||||
                        "g-interface-name", "com.redhat.Eekboard.Server",
 | 
			
		||||
                        "g-object-path", "/com/redhat/Eekboard/Server",
 | 
			
		||||
                        "g-name", "org.fedorahosted.Eekboard.Server",
 | 
			
		||||
                        "g-interface-name", "org.fedorahosted.Eekboard.Server",
 | 
			
		||||
                        "g-object-path", "/org/fedorahosted/Eekboard/Server",
 | 
			
		||||
                        NULL);
 | 
			
		||||
    if (initable != NULL) {
 | 
			
		||||
        EekboardEekboard *eekboard = EEKBOARD_EEKBOARD (initable);
 | 
			
		||||
@ -188,6 +188,8 @@ on_context_destroyed (EekboardContext *context,
 | 
			
		||||
 * @cancellable: a #GCancellable
 | 
			
		||||
 *
 | 
			
		||||
 * Create a new input context.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: (transfer full): a newly created #EekboardContext.
 | 
			
		||||
 */
 | 
			
		||||
EekboardContext *
 | 
			
		||||
eekboard_eekboard_create_context (EekboardEekboard *eekboard,
 | 
			
		||||
 | 
			
		||||
@ -15,6 +15,11 @@
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#if !defined(__EEKBOARD_H_INSIDE__) && !defined(EEKBOARD_COMPILATION)
 | 
			
		||||
#error "Only <eekboard/eekboard.h> can be included directly."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef EEKBOARD_EEKBOARD_H
 | 
			
		||||
#define EEKBOARD_EEKBOARD_H 1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -18,6 +18,8 @@
 | 
			
		||||
#ifndef EEKBOARD_H
 | 
			
		||||
#define EEKBOARD_H 1
 | 
			
		||||
 | 
			
		||||
#define __EEKBOARD_H_INSIDE__ 1
 | 
			
		||||
 | 
			
		||||
#include "eekboard/eekboard-eekboard.h"
 | 
			
		||||
#include "eekboard/eekboard-context.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								examples/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								examples/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
SUBDIRS = eekboard-inscript simple-client
 | 
			
		||||
							
								
								
									
										14
									
								
								examples/eekboard-inscript/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								examples/eekboard-inscript/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,14 @@
 | 
			
		||||
bin_SCRIPTS = eekboard-inscript
 | 
			
		||||
keyboarddir = $(pkgdatadir)/keyboards
 | 
			
		||||
 | 
			
		||||
eekboard_inscript_datadir = $(datarootdir)/eekboard-inscript
 | 
			
		||||
eekboard_inscript_data_PYTHON = inscript.py main.py
 | 
			
		||||
 | 
			
		||||
eekboard-inscript: eekboard-inscript.in
 | 
			
		||||
	$(AM_V_GEN) sed -e 's!@''PYTHON@!'$(PYTHON)'!' \
 | 
			
		||||
			-e 's!@EEKBOARD_KEYBOARDDIR@!'$(keyboarddir)'!' \
 | 
			
		||||
			-e 's!@M17N_DIR@!'$(datadir)/m17n'!' \
 | 
			
		||||
			-e 's!@EEKBOARD_INSCRIPT_DATADIR@!'$(eekboard_inscript_datadir)'!' < $< > $@
 | 
			
		||||
 | 
			
		||||
CLEANFILES = eekboard-inscript
 | 
			
		||||
EXTRA_DIST = eekboard-inscript.in
 | 
			
		||||
							
								
								
									
										23
									
								
								examples/eekboard-inscript/eekboard-inscript.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								examples/eekboard-inscript/eekboard-inscript.in
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,23 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
 | 
			
		||||
export EEKBOARD_KEYBOARDDIR=@EEKBOARD_KEYBOARDDIR@
 | 
			
		||||
export M17N_DIR=@M17N_DIR@
 | 
			
		||||
exec @PYTHON@ @EEKBOARD_INSCRIPT_DATADIR@/main.py $@
 | 
			
		||||
							
								
								
									
										226
									
								
								examples/eekboard-inscript/inscript.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										226
									
								
								examples/eekboard-inscript/inscript.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,226 @@
 | 
			
		||||
#!/usr/bin/env python
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
 | 
			
		||||
import eekboard
 | 
			
		||||
import gobject, gtk, virtkey
 | 
			
		||||
import sys, os.path, re
 | 
			
		||||
 | 
			
		||||
KEYCODE_TABLE = {
 | 
			
		||||
    '1': 10, '2': 11, '3': 12, '4': 13, '5': 14, '6': 15, '7': 16, '8': 17,
 | 
			
		||||
    '9': 18, '0': 19, '-': 20, '=': 21, 'q': 24, 'w': 25, 'e': 26, 'r': 27,
 | 
			
		||||
    't': 28, 'y': 29, 'u': 30, 'i': 31, 'o': 32, 'p': 33, '[': 34, ']': 35,
 | 
			
		||||
    'a': 38, 's': 39, 'd': 40, 'f': 41, 'g': 42, 'h': 43, 'j': 44, 'k': 45,
 | 
			
		||||
    'l': 46, ';': 47, '\'': 48, '`': 49, '\\': 51, 'z': 52, 'x': 53, 'c': 54,
 | 
			
		||||
    'v': 55, 'b': 56, 'n': 57, 'm': 58, ',': 59, '.': 60, '/': 61
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MARK_UPPER = '~!@#$%^&*()_+{}|:"<>?'
 | 
			
		||||
MARK_LOWER = '`1234567890-=[]\\;\',./'
 | 
			
		||||
 | 
			
		||||
INSCRIPT_MAPS = (
 | 
			
		||||
    "as-inscript",
 | 
			
		||||
    "bn-inscript",
 | 
			
		||||
    "gu-inscript",
 | 
			
		||||
    "hi-inscript",
 | 
			
		||||
    "kn-inscript",
 | 
			
		||||
    "ml-inscript",
 | 
			
		||||
    "mr-inscript",
 | 
			
		||||
    "or-inscript",
 | 
			
		||||
    "pa-inscript",
 | 
			
		||||
    "sd-inscript",
 | 
			
		||||
    "ta-inscript",
 | 
			
		||||
    "te-inscript",
 | 
			
		||||
    "kn-inscript2",
 | 
			
		||||
    "kok-inscript2-deva",
 | 
			
		||||
    "mai-inscript2",
 | 
			
		||||
    "ml-inscript2",
 | 
			
		||||
    "mni-inscript2-beng",
 | 
			
		||||
    "mni-inscript2-mtei",
 | 
			
		||||
    "mr-inscript2",
 | 
			
		||||
    "ne-inscript2-deva",
 | 
			
		||||
    "or-inscript2",
 | 
			
		||||
    "pa-inscript2-guru",
 | 
			
		||||
    "sa-inscript2",
 | 
			
		||||
    "sat-inscript2-deva",
 | 
			
		||||
    "sat-inscript2-olck",
 | 
			
		||||
    "sd-inscript2-deva",
 | 
			
		||||
    "ta-inscript2",
 | 
			
		||||
    "te-inscript2")
 | 
			
		||||
 | 
			
		||||
class MapFile(object):
 | 
			
		||||
    MAPENTRY_PATTERN = re.compile(r'\A\s*\((?:\((.*?)\)|"(.*?)")\s*"(.*?)"\)')
 | 
			
		||||
 | 
			
		||||
    def __init__(self, path):
 | 
			
		||||
        self.__dict = dict()
 | 
			
		||||
 | 
			
		||||
        with open(path, 'r') as fp:
 | 
			
		||||
            for line in fp:
 | 
			
		||||
                match = re.match(self.MAPENTRY_PATTERN, line)
 | 
			
		||||
                if match:
 | 
			
		||||
                    insert = match.group(3).decode('UTF-8')
 | 
			
		||||
                    if match.group(1):
 | 
			
		||||
                        keyseq = re.sub(r'\\(.)', r'\1', match.group(1))
 | 
			
		||||
                        self.__add_symbol_entry(keyseq, insert)
 | 
			
		||||
                    else:
 | 
			
		||||
                        keyseq = re.sub(r'\\(.)', r'\1', match.group(2))
 | 
			
		||||
                        self.__add_text_entry(keyseq, insert)
 | 
			
		||||
 | 
			
		||||
    def get_entry_for_keycode(self, keycode):
 | 
			
		||||
        return self.__dict.get(keycode)
 | 
			
		||||
 | 
			
		||||
    def __add_entry(self, letter, level, insert):
 | 
			
		||||
        if letter.isupper():
 | 
			
		||||
            level |= 1
 | 
			
		||||
            letter = letter.lower()
 | 
			
		||||
        elif letter in MARK_UPPER:
 | 
			
		||||
            level |= 1
 | 
			
		||||
            letter = MARK_LOWER[MARK_UPPER.index(letter)]
 | 
			
		||||
        keycode = KEYCODE_TABLE[letter]
 | 
			
		||||
        if keycode not in self.__dict:
 | 
			
		||||
            self.__dict[keycode] = list([None,None,None,None])
 | 
			
		||||
        self.__dict[keycode][level] = insert
 | 
			
		||||
        
 | 
			
		||||
    def __add_symbol_entry(self, symbol, insert):
 | 
			
		||||
        level = 0
 | 
			
		||||
        if symbol.startswith('G-'):
 | 
			
		||||
            level |= 2
 | 
			
		||||
            symbol = symbol[2:]
 | 
			
		||||
        if not symbol.startswith('KP_'):
 | 
			
		||||
            self.__add_entry(symbol, level, insert)
 | 
			
		||||
 | 
			
		||||
    def __add_text_entry(self, text, insert):
 | 
			
		||||
        self.__add_entry(text, 0, insert)
 | 
			
		||||
 | 
			
		||||
class Keyboard(gobject.GObject):
 | 
			
		||||
    __gtype_name__ = "PYInscriptKeyboard"
 | 
			
		||||
    __gsignals__ = {
 | 
			
		||||
        'quit': (
 | 
			
		||||
            gobject.SIGNAL_RUN_LAST,
 | 
			
		||||
            gobject.TYPE_NONE,
 | 
			
		||||
            ()),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    def __init__(self, client_name, map_path, kbd_path):
 | 
			
		||||
        super(Keyboard, self).__init__()
 | 
			
		||||
        self.__keyboard = self.__create_keyboard(map_path, kbd_path)
 | 
			
		||||
        self.__eekboard = eekboard.Eekboard()
 | 
			
		||||
        self.__context = self.__eekboard.create_context(client_name)
 | 
			
		||||
        keyboard_id = self.__context.add_keyboard(self.__keyboard)
 | 
			
		||||
        self.__context.set_keyboard(keyboard_id)
 | 
			
		||||
        self.__keyboard.connect('key-pressed', self.__key_pressed_cb)
 | 
			
		||||
        self.__keyboard.connect('key-released', self.__key_released_cb)
 | 
			
		||||
        self.__virtkey = virtkey.virtkey()
 | 
			
		||||
        self.__english = False
 | 
			
		||||
        self.__eekboard.connect('destroyed', self.__destroyed_cb)
 | 
			
		||||
        self.__context.connect('destroyed', self.__destroyed_cb)
 | 
			
		||||
        self.__context.connect('notify::keyboard-visible', self.__notify_keyboard_visible_cb)
 | 
			
		||||
 | 
			
		||||
    def __create_keyboard(self, map_path, kbd_path):
 | 
			
		||||
        def __each_key(element, data):
 | 
			
		||||
            keycode = element.get_keycode()
 | 
			
		||||
            # keycode 37 is used to toggle English/Inscript
 | 
			
		||||
            if keycode == 37:
 | 
			
		||||
                matrix = eekboard.SymbolMatrix.new(2, 1)
 | 
			
		||||
                keysym = eekboard.Keysym.new(0)
 | 
			
		||||
                keysym.set_label("Ind")
 | 
			
		||||
                keysym.set_category(eekboard.SymbolCategory.FUNCTION)
 | 
			
		||||
                matrix.set_symbol(0, 0, keysym)
 | 
			
		||||
                keysym = eekboard.Keysym.new(0)
 | 
			
		||||
                keysym.set_label("Eng")
 | 
			
		||||
                keysym.set_category(eekboard.SymbolCategory.FUNCTION)
 | 
			
		||||
                matrix.set_symbol(1, 0, keysym)
 | 
			
		||||
                element.set_symbol_matrix(matrix)
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
            # group(0) is us keyboard
 | 
			
		||||
            matrix = eekboard.SymbolMatrix.new(2, 4)
 | 
			
		||||
            for l in xrange(4):
 | 
			
		||||
                keysym = element.get_symbol_at_index(0, l, 0, 0)
 | 
			
		||||
                matrix.set_symbol(0, l, keysym)
 | 
			
		||||
            # group(1) is inscript keyboard
 | 
			
		||||
            entry = data.get_entry_for_keycode(keycode)
 | 
			
		||||
            for l in xrange(4):
 | 
			
		||||
                if entry and entry[l]:
 | 
			
		||||
                    try:
 | 
			
		||||
                        keyval = gtk.gdk.unicode_to_keyval(ord(entry[l]))
 | 
			
		||||
                        keysym = eekboard.Keysym.new(keyval)
 | 
			
		||||
                    except:
 | 
			
		||||
                        keysym = eekboard.Keysym.new(0)
 | 
			
		||||
                        keysym.set_label(entry[l].encode('UTF-8'))
 | 
			
		||||
                        keysym.set_category(eekboard.SymbolCategory.LETTER)
 | 
			
		||||
                        print >> sys.stderr, "can't convert %s (%d) to keyval" % (entry[l], keycode)
 | 
			
		||||
                else:
 | 
			
		||||
                    keysym = element.get_symbol_at_index(1, l, 0, 0)
 | 
			
		||||
                matrix.set_symbol(1, l, keysym)
 | 
			
		||||
            element.set_symbol_matrix(matrix)
 | 
			
		||||
 | 
			
		||||
        def __each_section(element, data):
 | 
			
		||||
            element.foreach_child(__each_key, data)
 | 
			
		||||
 | 
			
		||||
        mapfile = MapFile(map_path)
 | 
			
		||||
        keyboard = eekboard.XmlKeyboard(kbd_path,
 | 
			
		||||
                                        eekboard.MODIFIER_BEHAVIOR_LATCH)
 | 
			
		||||
        keyboard.foreach_child(__each_section, mapfile)
 | 
			
		||||
        return keyboard
 | 
			
		||||
 | 
			
		||||
    def __destroyed_cb(self, *args):
 | 
			
		||||
        self.emit('quit')
 | 
			
		||||
 | 
			
		||||
    def __notify_keyboard_visible_cb(self, obj, pspec):
 | 
			
		||||
        if not obj.get_property(pspec.name):
 | 
			
		||||
            self.emit('quit')
 | 
			
		||||
 | 
			
		||||
    def enable(self):
 | 
			
		||||
        self.__eekboard.push_context(self.__context)
 | 
			
		||||
 | 
			
		||||
    def disable(self):
 | 
			
		||||
        self.__eekboard.pop_context(self.__context)
 | 
			
		||||
 | 
			
		||||
    def show(self):
 | 
			
		||||
        self.__context.show_keyboard()
 | 
			
		||||
 | 
			
		||||
    def set_group(self, group):
 | 
			
		||||
        self.__group = group
 | 
			
		||||
        self.__context.set_group(self.__group)
 | 
			
		||||
 | 
			
		||||
    def __key_pressed_cb(self, keyboard, key):
 | 
			
		||||
        if key.get_keycode() == 37:
 | 
			
		||||
            return
 | 
			
		||||
        symbol = key.get_symbol()
 | 
			
		||||
        if isinstance(symbol, eekboard.Keysym):
 | 
			
		||||
            xkeysym = symbol.get_xkeysym()
 | 
			
		||||
            modifiers = self.__keyboard.get_modifiers()
 | 
			
		||||
            self.__virtkey.latch_mod(modifiers)
 | 
			
		||||
            self.__virtkey.press_keysym(xkeysym)
 | 
			
		||||
            self.__virtkey.unlatch_mod(modifiers)
 | 
			
		||||
 | 
			
		||||
    def __key_released_cb(self, keyboard, key):
 | 
			
		||||
        if key.get_keycode() == 37:
 | 
			
		||||
            if self.__english:
 | 
			
		||||
                self.__context.set_group(self.__group)
 | 
			
		||||
                self.__english = False
 | 
			
		||||
            else:
 | 
			
		||||
                self.__context.set_group(0)
 | 
			
		||||
                self.__english = True
 | 
			
		||||
            return
 | 
			
		||||
        symbol = key.get_symbol()
 | 
			
		||||
        if isinstance(symbol, eekboard.Keysym):
 | 
			
		||||
            xkeysym = symbol.get_xkeysym()
 | 
			
		||||
            self.__virtkey.release_keysym(xkeysym)
 | 
			
		||||
							
								
								
									
										60
									
								
								examples/eekboard-inscript/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								examples/eekboard-inscript/main.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,60 @@
 | 
			
		||||
# 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
 | 
			
		||||
 | 
			
		||||
import inscript
 | 
			
		||||
import gtk
 | 
			
		||||
from optparse import OptionParser
 | 
			
		||||
import sys, os, os.path, glob
 | 
			
		||||
 | 
			
		||||
parser = OptionParser()
 | 
			
		||||
parser.add_option("-n", "--name=LANGCODE", dest="langcode",
 | 
			
		||||
                  help="Specify language code to LANGCODE",
 | 
			
		||||
                  metavar="LANGCODE")
 | 
			
		||||
parser.add_option("-l", "--list", dest="list", default=False,
 | 
			
		||||
                  action="store_true",
 | 
			
		||||
                  help="List available language codes")
 | 
			
		||||
(options, args) = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
if options.list:
 | 
			
		||||
    pat = os.path.join(os.getenv("M17N_DIR"), "*.mim")
 | 
			
		||||
    for fname in sorted(glob.glob(pat)):
 | 
			
		||||
        mname = os.path.basename(fname[:-4])
 | 
			
		||||
        if mname in inscript.INSCRIPT_MAPS:
 | 
			
		||||
            print mname
 | 
			
		||||
    exit(0)
 | 
			
		||||
 | 
			
		||||
if options.langcode is None:
 | 
			
		||||
    print >> sys.stderr, "Specify language code with -n"
 | 
			
		||||
    exit(1)
 | 
			
		||||
 | 
			
		||||
map_path = os.path.join(os.getenv("M17N_DIR"), options.langcode + ".mim")
 | 
			
		||||
if not os.path.exists(map_path):
 | 
			
		||||
    print >> sys.stderr, "%s not found" % map_path
 | 
			
		||||
    exit(1)
 | 
			
		||||
 | 
			
		||||
kbd_path = os.path.join(os.getenv("EEKBOARD_KEYBOARDDIR"), "us-qwerty.xml")
 | 
			
		||||
if not os.path.exists(kbd_path):
 | 
			
		||||
    print >> sys.stderr, "%s not found" % kbd_path
 | 
			
		||||
    exit(1)
 | 
			
		||||
 | 
			
		||||
keyboard = inscript.Keyboard("eekboard-inscript", map_path, kbd_path)
 | 
			
		||||
keyboard.connect('quit', lambda *args: gtk.main_quit())
 | 
			
		||||
keyboard.set_group(1)
 | 
			
		||||
keyboard.enable()
 | 
			
		||||
keyboard.show()
 | 
			
		||||
gtk.main()
 | 
			
		||||
							
								
								
									
										12
									
								
								examples/simple-client/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/simple-client/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,12 @@
 | 
			
		||||
noinst_PROGRAMS = simple-client
 | 
			
		||||
 | 
			
		||||
simple_client_CFLAGS = \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
	$(GIO2_CFLAGS)
 | 
			
		||||
 | 
			
		||||
simple_client_LDADD = \
 | 
			
		||||
	$(top_builddir)/eekboard/libeekboard.la \
 | 
			
		||||
	$(top_builddir)/eek/libeek.la \
 | 
			
		||||
	$(GIO2_LIBS)
 | 
			
		||||
 | 
			
		||||
simple_client_SOURCES = main.c
 | 
			
		||||
							
								
								
									
										217
									
								
								examples/simple-client/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										217
									
								
								examples/simple-client/main.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,217 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * 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>
 | 
			
		||||
#include <glib/gi18n.h>
 | 
			
		||||
 | 
			
		||||
#include "eekboard/eekboard.h"
 | 
			
		||||
 | 
			
		||||
static gboolean opt_system = FALSE;
 | 
			
		||||
static gboolean opt_session = FALSE;
 | 
			
		||||
static gchar *opt_address = NULL;
 | 
			
		||||
 | 
			
		||||
static gchar *opt_set_keyboard = NULL;
 | 
			
		||||
static gint opt_set_group = -1;
 | 
			
		||||
static gboolean opt_show_keyboard = FALSE;
 | 
			
		||||
static gboolean opt_hide_keyboard = FALSE;
 | 
			
		||||
static gint opt_press_key = -1;
 | 
			
		||||
static gint opt_release_key = -1;
 | 
			
		||||
static gboolean opt_listen = 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")},
 | 
			
		||||
    {"set-keyboard", '\0', 0, G_OPTION_ARG_STRING, &opt_set_keyboard,
 | 
			
		||||
     N_("Upload keyboard description from an XML file")},
 | 
			
		||||
    {"set-group", '\0', 0, G_OPTION_ARG_INT, &opt_set_group,
 | 
			
		||||
     N_("Set group of the keyboard")},
 | 
			
		||||
    {"show-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_show_keyboard,
 | 
			
		||||
     N_("Show keyboard")},
 | 
			
		||||
    {"hide-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_hide_keyboard,
 | 
			
		||||
     N_("Hide keyboard")},
 | 
			
		||||
    {"press-key", '\0', 0, G_OPTION_ARG_INT, &opt_press_key,
 | 
			
		||||
     N_("Press key")},
 | 
			
		||||
    {"release-key", '\0', 0, G_OPTION_ARG_INT, &opt_release_key,
 | 
			
		||||
     N_("Release key")},
 | 
			
		||||
    {"listen", '\0', 0, G_OPTION_ARG_NONE, &opt_listen,
 | 
			
		||||
     N_("Listen events")},
 | 
			
		||||
    {NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_key_pressed (guint keycode, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
    g_print ("KeyPressed %u\n", keycode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_key_released (guint keycode, gpointer user_data)
 | 
			
		||||
{
 | 
			
		||||
    g_print ("KeyReleased %u\n", keycode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    EekboardEekboard *eekboard = NULL;
 | 
			
		||||
    EekboardContext *context = NULL;
 | 
			
		||||
    GBusType bus_type;
 | 
			
		||||
    GDBusConnection *connection = NULL;
 | 
			
		||||
    GError *error;
 | 
			
		||||
    GOptionContext *option_context;
 | 
			
		||||
    GMainLoop *loop = NULL;
 | 
			
		||||
    gint retval = 0;
 | 
			
		||||
 | 
			
		||||
    g_type_init ();
 | 
			
		||||
    g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
 | 
			
		||||
 | 
			
		||||
    option_context = g_option_context_new ("eekboard-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:
 | 
			
		||||
    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 bus: %s\n", error->message);
 | 
			
		||||
            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);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        g_assert_not_reached ();
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    eekboard = eekboard_eekboard_new (connection, NULL);
 | 
			
		||||
    if (eekboard == NULL) {
 | 
			
		||||
        g_printerr ("Can't create eekboard proxy\n");
 | 
			
		||||
        retval = 1;
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    context = eekboard_eekboard_create_context (eekboard,
 | 
			
		||||
                                                "eekboard-client",
 | 
			
		||||
                                                NULL);
 | 
			
		||||
    if (context == NULL) {
 | 
			
		||||
        g_printerr ("Can't create context\n");
 | 
			
		||||
        retval = 1;
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    eekboard_eekboard_push_context (eekboard, context, NULL);
 | 
			
		||||
 | 
			
		||||
    if (opt_set_keyboard) {
 | 
			
		||||
        GFile *file;
 | 
			
		||||
        GFileInputStream *input;
 | 
			
		||||
        EekLayout *layout;
 | 
			
		||||
        EekKeyboard *keyboard;
 | 
			
		||||
        guint keyboard_id;
 | 
			
		||||
 | 
			
		||||
        file = g_file_new_for_path (opt_set_keyboard);
 | 
			
		||||
 | 
			
		||||
        error = NULL;
 | 
			
		||||
        input = g_file_read (file, NULL, &error);
 | 
			
		||||
        if (error) {
 | 
			
		||||
            g_printerr ("Can't read file %s: %s\n",
 | 
			
		||||
                        opt_set_keyboard, error->message);
 | 
			
		||||
            retval = 1;
 | 
			
		||||
            goto out;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        layout = eek_xml_layout_new (G_INPUT_STREAM(input));
 | 
			
		||||
        g_object_unref (input);
 | 
			
		||||
        keyboard = eek_keyboard_new (layout, 640, 480);
 | 
			
		||||
        g_object_unref (layout);
 | 
			
		||||
 | 
			
		||||
        keyboard_id = eekboard_context_add_keyboard (context, keyboard, NULL);
 | 
			
		||||
        g_object_unref (keyboard);
 | 
			
		||||
 | 
			
		||||
        eekboard_context_set_keyboard (context, keyboard_id, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_set_group >= 0) {
 | 
			
		||||
        eekboard_context_set_group (context, opt_set_group, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_show_keyboard) {
 | 
			
		||||
        eekboard_context_show_keyboard (context, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_hide_keyboard) {
 | 
			
		||||
        eekboard_context_hide_keyboard (context, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_press_key >= 0) {
 | 
			
		||||
        eekboard_context_press_key (context, opt_press_key, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_release_key >= 0) {
 | 
			
		||||
        eekboard_context_release_key (context, opt_release_key, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_listen) {
 | 
			
		||||
        g_signal_connect (context, "key-pressed",
 | 
			
		||||
                          G_CALLBACK(on_key_pressed), NULL);
 | 
			
		||||
        g_signal_connect (context, "key-released",
 | 
			
		||||
                          G_CALLBACK(on_key_released), NULL);
 | 
			
		||||
        loop = g_main_loop_new (NULL, FALSE);
 | 
			
		||||
        g_main_loop_run (loop);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 out:
 | 
			
		||||
    if (context)
 | 
			
		||||
        g_object_unref (context);
 | 
			
		||||
    if (connection)
 | 
			
		||||
        g_object_unref (connection);
 | 
			
		||||
    if (loop)
 | 
			
		||||
        g_main_loop_unref (loop);
 | 
			
		||||
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
src/server-server.c
 | 
			
		||||
src/server-context.c
 | 
			
		||||
src/client-main.c
 | 
			
		||||
src/desktop-client.c
 | 
			
		||||
src/desktop-client-main.c
 | 
			
		||||
src/xml-main.c
 | 
			
		||||
src/server-main.c
 | 
			
		||||
src/client.c
 | 
			
		||||
src/client-main.c
 | 
			
		||||
src/xml-main.c
 | 
			
		||||
examples/simple-client/main.c
 | 
			
		||||
 | 
			
		||||
@ -16,50 +16,54 @@
 | 
			
		||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
			
		||||
# 02110-1301 USA
 | 
			
		||||
 | 
			
		||||
if ENABLE_EEKBOARD
 | 
			
		||||
bin_PROGRAMS = \
 | 
			
		||||
	eekboard-desktop-client \
 | 
			
		||||
	eekboard-client \
 | 
			
		||||
	eekboard \
 | 
			
		||||
	eekboard-server \
 | 
			
		||||
	eekboard-xml
 | 
			
		||||
 | 
			
		||||
noinst_LTLIBRARIES = libxklutil.la
 | 
			
		||||
 | 
			
		||||
eekboard_desktop_client_CFLAGS = \
 | 
			
		||||
eekboard_CFLAGS = \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
	$(GIO2_CFLAGS) \
 | 
			
		||||
	$(GTK_CFLAGS) \
 | 
			
		||||
	$(GCONF2_CFLAGS) \
 | 
			
		||||
	$(XKB_CFLAGS) \
 | 
			
		||||
	$(LIBXKLAVIER_CFLAGS)
 | 
			
		||||
	$(LIBXKLAVIER_CFLAGS) \
 | 
			
		||||
	-DKEYBOARDDIR=\"$(pkgdatadir)/keyboards\"
 | 
			
		||||
 | 
			
		||||
eekboard_desktop_client_LDADD = \
 | 
			
		||||
eekboard_LDADD = \
 | 
			
		||||
	$(builddir)/libxklutil.la \
 | 
			
		||||
	$(top_builddir)/eekboard/libeekboard.la \
 | 
			
		||||
	$(top_builddir)/eek/libeek.la \
 | 
			
		||||
	$(top_builddir)/eek/libeek-xkl.la \
 | 
			
		||||
	$(GIO2_LIBS) \
 | 
			
		||||
	$(GTK_LIBS) \
 | 
			
		||||
	$(GCONF2_LIBS) \
 | 
			
		||||
	$(XKB_LIBS) \
 | 
			
		||||
	$(LIBXKLAVIER_LIBS)
 | 
			
		||||
 | 
			
		||||
if ENABLE_FAKEKEY
 | 
			
		||||
eekboard_desktop_client_CFLAGS += \
 | 
			
		||||
	$(FAKEKEY_CFLAGS)
 | 
			
		||||
eekboard_desktop_client_LDADD += \
 | 
			
		||||
	$(FAKEKEY_LIBS)
 | 
			
		||||
if ENABLE_XTEST
 | 
			
		||||
eekboard_CFLAGS += \
 | 
			
		||||
	$(XTEST_CFLAGS)
 | 
			
		||||
eekboard_LDADD += \
 | 
			
		||||
	$(XTEST_LIBS)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
if ENABLE_CSPI
 | 
			
		||||
eekboard_desktop_client_CFLAGS += \
 | 
			
		||||
	$(CSPI_CFLAGS)
 | 
			
		||||
eekboard_desktop_client_LDADD += \
 | 
			
		||||
	$(CSPI_LIBS)
 | 
			
		||||
if ENABLE_ATSPI
 | 
			
		||||
eekboard_CFLAGS += \
 | 
			
		||||
	$(ATSPI2_CFLAGS)
 | 
			
		||||
eekboard_LDADD += \
 | 
			
		||||
	$(ATSPI2_LIBS)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
eekboard_desktop_client_headers = desktop-client.h
 | 
			
		||||
eekboard_desktop_client_SOURCES = desktop-client.c desktop-client-main.c
 | 
			
		||||
if ENABLE_IBUS
 | 
			
		||||
eekboard_CFLAGS += \
 | 
			
		||||
	$(IBUS_CFLAGS)
 | 
			
		||||
eekboard_LDADD += \
 | 
			
		||||
	$(IBUS_LIBS)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
eekboard_headers = client.h
 | 
			
		||||
eekboard_SOURCES = client.c client-main.c
 | 
			
		||||
 | 
			
		||||
eekboard_server_CFLAGS = \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
@ -74,25 +78,19 @@ eekboard_server_LDADD = \
 | 
			
		||||
	$(GIO2_LIBS) \
 | 
			
		||||
	$(GTK_LIBS)
 | 
			
		||||
 | 
			
		||||
if ENABLE_CLUTTER
 | 
			
		||||
eekboard_server_CFLAGS += $(CLUTTER_CFLAGS) $(CLUTTER_GTK_CFLAGS)
 | 
			
		||||
eekboard_server_LDADD += $(CLUTTER_LIBS) $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS)
 | 
			
		||||
if ENABLE_CLUTTER_GTK
 | 
			
		||||
eekboard_server_CFLAGS += $(CLUTTER_GTK_CFLAGS)
 | 
			
		||||
eekboard_server_LDADD += $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
if ENABLE_XDOCK
 | 
			
		||||
eekboard_server_CFLAGS += $(XDOCK_CFLAGS)
 | 
			
		||||
eekboard_server_LDADD += $(XDOCK_LIBS)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
eekboard_server_headers = server-server.h server-context.h
 | 
			
		||||
eekboard_server_SOURCES = server-server.c server-context.c server-main.c
 | 
			
		||||
 | 
			
		||||
eekboard_client_CFLAGS = \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
	$(GIO2_CFLAGS)
 | 
			
		||||
 | 
			
		||||
eekboard_client_LDADD = \
 | 
			
		||||
	$(top_builddir)/eekboard/libeekboard.la \
 | 
			
		||||
	$(top_builddir)/eek/libeek.la \
 | 
			
		||||
	$(GIO2_LIBS)
 | 
			
		||||
 | 
			
		||||
eekboard_client_SOURCES = client-main.c
 | 
			
		||||
 | 
			
		||||
eekboard_xml_CFLAGS = \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
	$(GIO2_CFLAGS) \
 | 
			
		||||
@ -125,19 +123,7 @@ eekboard_HEADERS =				\
 | 
			
		||||
	$(libeekboard_headers)
 | 
			
		||||
 | 
			
		||||
noinst_HEADERS = \
 | 
			
		||||
	$(eekboard_desktop_client_headers) \
 | 
			
		||||
	$(eekboard_client_headers) \
 | 
			
		||||
	$(eekboard_headers) \
 | 
			
		||||
	$(eekboard_server_headers) \
 | 
			
		||||
	$(eekboard_xml_headers) \
 | 
			
		||||
	$(libxklutil_la_headers)
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = $(service_in_files)
 | 
			
		||||
DISTCLEANFILES = $(service_DATA)
 | 
			
		||||
 | 
			
		||||
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)|" $< > $@
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
@ -20,21 +20,35 @@
 | 
			
		||||
#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.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_LAYOUT "us-qwerty"
 | 
			
		||||
 | 
			
		||||
static gboolean opt_system = FALSE;
 | 
			
		||||
static gboolean opt_session = FALSE;
 | 
			
		||||
static gchar *opt_address = NULL;
 | 
			
		||||
 | 
			
		||||
static gchar *opt_set_keyboard = NULL;
 | 
			
		||||
static gint opt_set_group = -1;
 | 
			
		||||
static gboolean opt_show_keyboard = FALSE;
 | 
			
		||||
static gboolean opt_hide_keyboard = FALSE;
 | 
			
		||||
static gint opt_press_key = -1;
 | 
			
		||||
static gint opt_release_key = -1;
 | 
			
		||||
static gboolean opt_listen = FALSE;
 | 
			
		||||
static gboolean opt_use_system_layout = FALSE;
 | 
			
		||||
static gboolean opt_focus = FALSE;
 | 
			
		||||
static gboolean opt_keystroke = FALSE;
 | 
			
		||||
 | 
			
		||||
static gchar *opt_keyboard = NULL;
 | 
			
		||||
 | 
			
		||||
static gchar *opt_model = NULL;
 | 
			
		||||
static gchar *opt_layouts = NULL;
 | 
			
		||||
static gchar *opt_options = NULL;
 | 
			
		||||
 | 
			
		||||
static gboolean opt_fullscreen = FALSE;
 | 
			
		||||
 | 
			
		||||
static const GOptionEntry options[] = {
 | 
			
		||||
    {"system", 'y', 0, G_OPTION_ARG_NONE, &opt_system,
 | 
			
		||||
@ -43,51 +57,88 @@ static const GOptionEntry options[] = {
 | 
			
		||||
     N_("Connect to the session bus")},
 | 
			
		||||
    {"address", 'a', 0, G_OPTION_ARG_STRING, &opt_address,
 | 
			
		||||
     N_("Connect to the given D-Bus address")},
 | 
			
		||||
    {"set-keyboard", '\0', 0, G_OPTION_ARG_STRING, &opt_set_keyboard,
 | 
			
		||||
     N_("Upload keyboard description from an XML file")},
 | 
			
		||||
    {"set-group", '\0', 0, G_OPTION_ARG_INT, &opt_set_group,
 | 
			
		||||
     N_("Set group of the keyboard")},
 | 
			
		||||
    {"show-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_show_keyboard,
 | 
			
		||||
     N_("Show keyboard")},
 | 
			
		||||
    {"hide-keyboard", '\0', 0, G_OPTION_ARG_NONE, &opt_hide_keyboard,
 | 
			
		||||
     N_("Hide keyboard")},
 | 
			
		||||
    {"press-key", '\0', 0, G_OPTION_ARG_INT, &opt_press_key,
 | 
			
		||||
     N_("Press key")},
 | 
			
		||||
    {"release-key", '\0', 0, G_OPTION_ARG_INT, &opt_release_key,
 | 
			
		||||
     N_("Release key")},
 | 
			
		||||
    {"listen", '\0', 0, G_OPTION_ARG_NONE, &opt_listen,
 | 
			
		||||
     N_("Listen events")},
 | 
			
		||||
    {"use-system-layout", 'x', 0, G_OPTION_ARG_NONE, &opt_use_system_layout,
 | 
			
		||||
     N_("Use system keyboard layout")},
 | 
			
		||||
#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 */
 | 
			
		||||
    {"keyboard", 'k', 0, G_OPTION_ARG_STRING, &opt_keyboard,
 | 
			
		||||
     N_("Specify keyboard")},
 | 
			
		||||
    {"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model,
 | 
			
		||||
     N_("Specify model")},
 | 
			
		||||
    {"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts,
 | 
			
		||||
     N_("Specify layouts")},
 | 
			
		||||
    {"options", '\0', 0, G_OPTION_ARG_STRING, &opt_options,
 | 
			
		||||
     N_("Specify options")},
 | 
			
		||||
    {"fullscreen", 'F', 0, G_OPTION_ARG_NONE, &opt_fullscreen,
 | 
			
		||||
     N_("Create window in fullscreen mode")},
 | 
			
		||||
    {NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_key_pressed (guint keycode, gpointer user_data)
 | 
			
		||||
on_notify_keyboard_visible (GObject    *object,
 | 
			
		||||
                            GParamSpec *spec,
 | 
			
		||||
                            gpointer    user_data)
 | 
			
		||||
{
 | 
			
		||||
    g_print ("KeyPressed %u\n", keycode);
 | 
			
		||||
    GMainLoop *loop = user_data;
 | 
			
		||||
    gboolean visible;
 | 
			
		||||
 | 
			
		||||
    g_object_get (object, "keyboard-visible", &visible, NULL);
 | 
			
		||||
 | 
			
		||||
    /* user explicitly closed the window */
 | 
			
		||||
    if (!visible && eekboard_context_is_enabled (EEKBOARD_CONTEXT(object)))
 | 
			
		||||
        g_main_loop_quit (loop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_key_released (guint keycode, gpointer user_data)
 | 
			
		||||
on_context_destroyed (EekboardContext *context,
 | 
			
		||||
                      gpointer         user_data)
 | 
			
		||||
{
 | 
			
		||||
    g_print ("KeyReleased %u\n", keycode);
 | 
			
		||||
    GMainLoop *loop = user_data;
 | 
			
		||||
 | 
			
		||||
    g_main_loop_quit (loop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_destroyed (EekboardEekboard *eekboard,
 | 
			
		||||
              gpointer          user_data)
 | 
			
		||||
{
 | 
			
		||||
    GMainLoop *loop = user_data;
 | 
			
		||||
 | 
			
		||||
    g_main_loop_quit (loop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
    FOCUS_NONE,
 | 
			
		||||
    FOCUS_ATSPI,
 | 
			
		||||
    FOCUS_IBUS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    EekboardEekboard *eekboard = NULL;
 | 
			
		||||
    EekboardContext *context = NULL;
 | 
			
		||||
    EekboardClient *client;
 | 
			
		||||
    EekboardEekboard *eekboard;
 | 
			
		||||
    EekboardContext *context;
 | 
			
		||||
    GBusType bus_type;
 | 
			
		||||
    GDBusConnection *connection = NULL;
 | 
			
		||||
    GDBusConnection *connection;
 | 
			
		||||
    GError *error;
 | 
			
		||||
    GOptionContext *option_context;
 | 
			
		||||
    GMainLoop *loop = NULL;
 | 
			
		||||
    gint retval = 0;
 | 
			
		||||
    GMainLoop *loop;
 | 
			
		||||
    gint focus;
 | 
			
		||||
    GSettings *settings;
 | 
			
		||||
 | 
			
		||||
    g_type_init ();
 | 
			
		||||
    g_log_set_always_fatal (G_LOG_LEVEL_CRITICAL);
 | 
			
		||||
    if (!gtk_init_check (&argc, &argv)) {
 | 
			
		||||
        g_printerr ("Can't init GTK\n");
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    option_context = g_option_context_new ("eekboard-client");
 | 
			
		||||
    option_context = g_option_context_new ("eekboard-desktop-client");
 | 
			
		||||
    g_option_context_add_main_entries (option_context, options, NULL);
 | 
			
		||||
    g_option_context_parse (option_context, &argc, &argv, NULL);
 | 
			
		||||
    g_option_context_free (option_context);
 | 
			
		||||
@ -128,90 +179,155 @@ main (int argc, char **argv)
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    eekboard = eekboard_eekboard_new (connection, NULL);
 | 
			
		||||
    if (eekboard == NULL) {
 | 
			
		||||
        g_printerr ("Can't create eekboard proxy\n");
 | 
			
		||||
        retval = 1;
 | 
			
		||||
        goto out;
 | 
			
		||||
    client = eekboard_client_new (connection);
 | 
			
		||||
    g_object_unref (connection);
 | 
			
		||||
 | 
			
		||||
    if (client == NULL) {
 | 
			
		||||
        g_printerr ("Can't create a client\n");
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    context = eekboard_eekboard_create_context (eekboard,
 | 
			
		||||
                                                "eekboard-client",
 | 
			
		||||
                                                NULL);
 | 
			
		||||
    if (context == NULL) {
 | 
			
		||||
        g_printerr ("Can't create context\n");
 | 
			
		||||
        retval = 1;
 | 
			
		||||
        goto out;
 | 
			
		||||
    }
 | 
			
		||||
    settings = g_settings_new ("org.fedorahosted.eekboard");
 | 
			
		||||
    focus = FOCUS_NONE;
 | 
			
		||||
    if (opt_focus) {
 | 
			
		||||
        gchar *focus_listener = g_settings_get_string (settings,
 | 
			
		||||
                                                       "focus-listener");
 | 
			
		||||
 | 
			
		||||
    eekboard_eekboard_push_context (eekboard, context, NULL);
 | 
			
		||||
 | 
			
		||||
    if (opt_set_keyboard) {
 | 
			
		||||
        GFile *file;
 | 
			
		||||
        GFileInputStream *input;
 | 
			
		||||
        EekLayout *layout;
 | 
			
		||||
        EekKeyboard *keyboard;
 | 
			
		||||
        guint keyboard_id;
 | 
			
		||||
 | 
			
		||||
        file = g_file_new_for_path (opt_set_keyboard);
 | 
			
		||||
 | 
			
		||||
        error = NULL;
 | 
			
		||||
        input = g_file_read (file, NULL, &error);
 | 
			
		||||
        if (error) {
 | 
			
		||||
            g_printerr ("Can't read file %s: %s\n",
 | 
			
		||||
                        opt_set_keyboard, error->message);
 | 
			
		||||
            retval = 1;
 | 
			
		||||
            goto out;
 | 
			
		||||
        if (g_strcmp0 (focus_listener, "atspi") == 0)
 | 
			
		||||
            focus = FOCUS_ATSPI;
 | 
			
		||||
        else if (g_strcmp0 (focus_listener, "ibus") == 0)
 | 
			
		||||
            focus = FOCUS_IBUS;
 | 
			
		||||
        else {
 | 
			
		||||
            g_printerr ("Unknown focus listener \"%s\".  "
 | 
			
		||||
                        "Try \"atspi\" or \"ibus\"\n", focus_listener);
 | 
			
		||||
            g_object_unref (client);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        layout = eek_xml_layout_new (G_INPUT_STREAM(input));
 | 
			
		||||
        g_object_unref (input);
 | 
			
		||||
        keyboard = eek_keyboard_new (layout, 640, 480);
 | 
			
		||||
        g_object_unref (layout);
 | 
			
		||||
 | 
			
		||||
        keyboard_id = eekboard_context_add_keyboard (context, keyboard, NULL);
 | 
			
		||||
        g_object_unref (keyboard);
 | 
			
		||||
 | 
			
		||||
        eekboard_context_set_keyboard (context, keyboard_id, NULL);
 | 
			
		||||
    }
 | 
			
		||||
        
 | 
			
		||||
    if (opt_set_group >= 0) {
 | 
			
		||||
        eekboard_context_set_group (context, opt_set_group, NULL);
 | 
			
		||||
#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 (settings, "toolkit-accessibility");
 | 
			
		||||
        g_object_unref (desktop_settings);
 | 
			
		||||
 | 
			
		||||
        if (accessibility_enabled) {
 | 
			
		||||
            if (atspi_init () != 0) {
 | 
			
		||||
                g_printerr ("Can't init AT-SPI 2\n");
 | 
			
		||||
                g_object_unref (client);
 | 
			
		||||
                exit (1);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (focus == FOCUS_ATSPI &&
 | 
			
		||||
                !eekboard_client_enable_atspi_focus (client)) {
 | 
			
		||||
                g_printerr ("Can't register AT-SPI focus change event listeners\n");
 | 
			
		||||
                g_object_unref (client);
 | 
			
		||||
                exit (1);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (opt_keystroke &&
 | 
			
		||||
                !eekboard_client_enable_atspi_keystroke (client)) {
 | 
			
		||||
                g_printerr ("Can't register AT-SPI keystroke event listeners\n");
 | 
			
		||||
                g_object_unref (client);
 | 
			
		||||
                exit (1);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            g_printerr ("Desktop accessibility support is disabled\n");
 | 
			
		||||
            g_object_unref (client);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif  /* HAVE_ATSPI */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_IBUS
 | 
			
		||||
    if (focus == FOCUS_IBUS) {
 | 
			
		||||
        ibus_init ();
 | 
			
		||||
 | 
			
		||||
        if (focus == FOCUS_IBUS &&
 | 
			
		||||
            !eekboard_client_enable_ibus_focus (client)) {
 | 
			
		||||
            g_printerr ("Can't register IBus focus change event listeners\n");
 | 
			
		||||
            g_object_unref (client);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif  /* HAVE_IBUS */
 | 
			
		||||
 | 
			
		||||
    if (opt_use_system_layout && (opt_keyboard || opt_model || opt_layouts || opt_options)) {
 | 
			
		||||
        g_printerr ("Can't use --use-system-layout option with keyboard options\n");
 | 
			
		||||
        g_object_unref (client);
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_show_keyboard) {
 | 
			
		||||
        eekboard_context_show_keyboard (context, NULL);
 | 
			
		||||
    if (!eekboard_client_enable_xkl (client)) {
 | 
			
		||||
        g_printerr ("Can't register xklavier event listeners\n");
 | 
			
		||||
        g_object_unref (client);
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_hide_keyboard) {
 | 
			
		||||
        eekboard_context_hide_keyboard (context, NULL);
 | 
			
		||||
    if (opt_use_system_layout || opt_model || opt_layouts || opt_options) {
 | 
			
		||||
        if (!eekboard_client_load_keyboard_from_xkl (client,
 | 
			
		||||
                                                     opt_model,
 | 
			
		||||
                                                     opt_layouts,
 | 
			
		||||
                                                     opt_options)) {
 | 
			
		||||
            g_printerr ("Can't load keyboard from xklavier config\n");
 | 
			
		||||
            g_object_unref (client);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        gchar *file;
 | 
			
		||||
        gboolean success;
 | 
			
		||||
 | 
			
		||||
        if (!opt_keyboard)
 | 
			
		||||
            opt_keyboard = DEFAULT_LAYOUT;
 | 
			
		||||
 | 
			
		||||
        if (g_str_has_suffix (opt_keyboard, ".xml"))
 | 
			
		||||
            file = g_strdup (opt_keyboard);
 | 
			
		||||
        else
 | 
			
		||||
            file = g_strdup_printf ("%s/%s.xml", KEYBOARDDIR, opt_keyboard);
 | 
			
		||||
        success = eekboard_client_load_keyboard_from_file (client, file);
 | 
			
		||||
        g_free (file);
 | 
			
		||||
        if (!success) {
 | 
			
		||||
            g_printerr ("Can't load keyboard file %s\n", file);
 | 
			
		||||
            g_object_unref (client);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_press_key >= 0) {
 | 
			
		||||
        eekboard_context_press_key (context, opt_press_key, NULL);
 | 
			
		||||
#ifdef HAVE_XTEST
 | 
			
		||||
    if (!eekboard_client_enable_xtest (client)) {
 | 
			
		||||
        g_printerr ("Can't init xtest\n");
 | 
			
		||||
        g_object_unref (client);
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
#endif  /* HAVE_XTEST */
 | 
			
		||||
 | 
			
		||||
    if (opt_release_key >= 0) {
 | 
			
		||||
        eekboard_context_release_key (context, opt_release_key, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_listen) {
 | 
			
		||||
        g_signal_connect (context, "key-pressed",
 | 
			
		||||
                          G_CALLBACK(on_key_pressed), NULL);
 | 
			
		||||
        g_signal_connect (context, "key-released",
 | 
			
		||||
                          G_CALLBACK(on_key_released), NULL);
 | 
			
		||||
        loop = g_main_loop_new (NULL, FALSE);
 | 
			
		||||
        g_main_loop_run (loop);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 out:
 | 
			
		||||
    if (context)
 | 
			
		||||
    loop = g_main_loop_new (NULL, FALSE);
 | 
			
		||||
    if (!opt_focus) {
 | 
			
		||||
        g_object_get (client, "context", &context, NULL);
 | 
			
		||||
        g_signal_connect (context, "notify::keyboard-visible",
 | 
			
		||||
                          G_CALLBACK(on_notify_keyboard_visible), loop);
 | 
			
		||||
        g_signal_connect (context, "destroyed",
 | 
			
		||||
                          G_CALLBACK(on_context_destroyed), loop);
 | 
			
		||||
        g_object_unref (context);
 | 
			
		||||
    if (connection)
 | 
			
		||||
        g_object_unref (connection);
 | 
			
		||||
    if (loop)
 | 
			
		||||
        g_main_loop_unref (loop);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return retval;
 | 
			
		||||
    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), loop);
 | 
			
		||||
 | 
			
		||||
    g_main_loop_run (loop);
 | 
			
		||||
    g_main_loop_unref (loop);
 | 
			
		||||
    g_object_unref (client);
 | 
			
		||||
    g_object_unref (settings);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1132
									
								
								src/client.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1132
									
								
								src/client.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										68
									
								
								src/client.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								src/client.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,68 @@
 | 
			
		||||
/* 
 | 
			
		||||
 * 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 EEKBOARD_CLIENT_H
 | 
			
		||||
#define EEKBOARD_CLIENT_H 1
 | 
			
		||||
 | 
			
		||||
#include <gio/gio.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define EEKBOARD_TYPE_CLIENT (eekboard_client_get_type())
 | 
			
		||||
#define EEKBOARD_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEKBOARD_TYPE_CLIENT, EekboardClient))
 | 
			
		||||
#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;
 | 
			
		||||
 | 
			
		||||
EekboardClient * eekboard_client_new           (GDBusConnection *connection);
 | 
			
		||||
 | 
			
		||||
gboolean         eekboard_client_load_keyboard_from_file
 | 
			
		||||
                                               (EekboardClient  *client,
 | 
			
		||||
                                                const gchar     *file);
 | 
			
		||||
 | 
			
		||||
gboolean         eekboard_client_load_keyboard_from_xkl
 | 
			
		||||
                                               (EekboardClient  *client,
 | 
			
		||||
                                                const gchar     *model,
 | 
			
		||||
                                                const gchar     *layouts,
 | 
			
		||||
                                                const gchar     *options);
 | 
			
		||||
 | 
			
		||||
gboolean         eekboard_client_enable_xkl    (EekboardClient  *client);
 | 
			
		||||
void             eekboard_client_disable_xkl   (EekboardClient  *client);
 | 
			
		||||
 | 
			
		||||
gboolean         eekboard_client_enable_atspi_focus
 | 
			
		||||
                                               (EekboardClient  *client);
 | 
			
		||||
void             eekboard_client_disable_atspi_focus
 | 
			
		||||
                                               (EekboardClient  *client);
 | 
			
		||||
 | 
			
		||||
gboolean         eekboard_client_enable_atspi_keystroke
 | 
			
		||||
                                               (EekboardClient  *client);
 | 
			
		||||
void             eekboard_client_disable_atspi_keystroke
 | 
			
		||||
                                               (EekboardClient  *client);
 | 
			
		||||
 | 
			
		||||
gboolean         eekboard_client_enable_xtest  (EekboardClient  *client);
 | 
			
		||||
void             eekboard_client_disable_xtest (EekboardClient  *client);
 | 
			
		||||
 | 
			
		||||
gboolean         eekboard_client_enable_ibus_focus
 | 
			
		||||
                                               (EekboardClient  *client);
 | 
			
		||||
void             eekboard_client_disable_ibus_focus
 | 
			
		||||
                                               (EekboardClient  *client);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
#endif  /* EEKBOARD_CLIENT_H */
 | 
			
		||||
@ -1,245 +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>
 | 
			
		||||
#include <cspi/spi.h>
 | 
			
		||||
#include <gtk/gtk.h>
 | 
			
		||||
#include <glib/gi18n.h>
 | 
			
		||||
#include <gconf/gconf-client.h>
 | 
			
		||||
#include "eekboard/eekboard.h"
 | 
			
		||||
#include "desktop-client.h"
 | 
			
		||||
 | 
			
		||||
static gboolean opt_system = FALSE;
 | 
			
		||||
static gboolean opt_session = FALSE;
 | 
			
		||||
static gchar *opt_address = NULL;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
static gboolean opt_focus = FALSE;
 | 
			
		||||
static gboolean opt_keystroke = FALSE;
 | 
			
		||||
#endif  /* HAVE_CSPI */
 | 
			
		||||
 | 
			
		||||
static gchar *opt_model = NULL;
 | 
			
		||||
static gchar *opt_layouts = NULL;
 | 
			
		||||
static gchar *opt_options = 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")},
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
    {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
 | 
			
		||||
     N_("Listen focus change events with AT-SPI")},
 | 
			
		||||
    {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
 | 
			
		||||
     N_("Listen keystroke events with AT-SPI")},
 | 
			
		||||
#endif  /* HAVE_CSPI */
 | 
			
		||||
    {"model", '\0', 0, G_OPTION_ARG_STRING, &opt_model,
 | 
			
		||||
     N_("Specify model")},
 | 
			
		||||
    {"layouts", '\0', 0, G_OPTION_ARG_STRING, &opt_layouts,
 | 
			
		||||
     N_("Specify layouts")},
 | 
			
		||||
    {"options", '\0', 0, G_OPTION_ARG_STRING, &opt_options,
 | 
			
		||||
     N_("Specify options")},
 | 
			
		||||
    {"fullscreen", 'F', 0, G_OPTION_ARG_NONE, &opt_fullscreen,
 | 
			
		||||
     N_("Create window in fullscreen mode")},
 | 
			
		||||
    {NULL}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_notify_keyboard_visible (GObject    *object,
 | 
			
		||||
                            GParamSpec *spec,
 | 
			
		||||
                            gpointer    user_data)
 | 
			
		||||
{
 | 
			
		||||
    GMainLoop *loop = user_data;
 | 
			
		||||
    gboolean visible;
 | 
			
		||||
 | 
			
		||||
    g_object_get (object, "keyboard-visible", &visible, NULL);
 | 
			
		||||
 | 
			
		||||
    /* user explicitly closed the window */
 | 
			
		||||
    if (!visible && eekboard_context_is_enabled (EEKBOARD_CONTEXT(object)))
 | 
			
		||||
        g_main_loop_quit (loop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_context_destroyed (EekboardContext *context,
 | 
			
		||||
                      gpointer         user_data)
 | 
			
		||||
{
 | 
			
		||||
    GMainLoop *loop = user_data;
 | 
			
		||||
 | 
			
		||||
    g_main_loop_quit (loop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_destroyed (EekboardEekboard *eekboard,
 | 
			
		||||
              gpointer          user_data)
 | 
			
		||||
{
 | 
			
		||||
    GMainLoop *loop = user_data;
 | 
			
		||||
 | 
			
		||||
    g_main_loop_quit (loop);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
main (int argc, char **argv)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client;
 | 
			
		||||
    EekboardEekboard *eekboard;
 | 
			
		||||
    EekboardContext *context;
 | 
			
		||||
    GBusType bus_type;
 | 
			
		||||
    GDBusConnection *connection;
 | 
			
		||||
    GError *error;
 | 
			
		||||
    GConfClient *gconfc;
 | 
			
		||||
    GOptionContext *option_context;
 | 
			
		||||
    GMainLoop *loop;
 | 
			
		||||
 | 
			
		||||
    if (!gtk_init_check (&argc, &argv)) {
 | 
			
		||||
        g_printerr ("Can't init GTK\n");
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    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:
 | 
			
		||||
    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 bus: %s\n", error->message);
 | 
			
		||||
            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);
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        g_assert_not_reached ();
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    client = eekboard_desktop_client_new (connection);
 | 
			
		||||
    if (client == NULL) {
 | 
			
		||||
        g_printerr ("Can't create a client\n");
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    gconfc = gconf_client_get_default ();
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
    error = NULL;
 | 
			
		||||
    if (opt_focus || opt_keystroke) {
 | 
			
		||||
        if (gconf_client_get_bool (gconfc,
 | 
			
		||||
                                   "/desktop/gnome/interface/accessibility",
 | 
			
		||||
                                   &error) ||
 | 
			
		||||
            gconf_client_get_bool (gconfc,
 | 
			
		||||
                                   "/desktop/gnome/interface/accessibility2",
 | 
			
		||||
                                   &error)) {
 | 
			
		||||
            if (SPI_init () != 0) {
 | 
			
		||||
                g_printerr ("Can't init CSPI\n");
 | 
			
		||||
                exit (1);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (opt_focus &&
 | 
			
		||||
                !eekboard_desktop_client_enable_cspi_focus (client)) {
 | 
			
		||||
                g_printerr ("Can't register focus change event listeners\n");
 | 
			
		||||
                exit (1);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (opt_keystroke &&
 | 
			
		||||
                !eekboard_desktop_client_enable_cspi_keystroke (client)) {
 | 
			
		||||
                g_printerr ("Can't register keystroke event listeners\n");
 | 
			
		||||
                exit (1);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            g_printerr ("Desktop accessibility support is disabled\n");
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif  /* HAVE_CSPI */
 | 
			
		||||
 | 
			
		||||
    if (opt_model || opt_layouts || opt_options) {
 | 
			
		||||
        if (!eekboard_desktop_client_set_xkl_config (client,
 | 
			
		||||
                                                     opt_model,
 | 
			
		||||
                                                     opt_layouts,
 | 
			
		||||
                                                     opt_options)) {
 | 
			
		||||
            g_printerr ("Can't set xklavier config\n");
 | 
			
		||||
            exit (1);
 | 
			
		||||
        }
 | 
			
		||||
    } else if (!eekboard_desktop_client_enable_xkl (client)) {
 | 
			
		||||
        g_printerr ("Can't register xklavier event listeners\n");
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_FAKEKEY
 | 
			
		||||
    if (!eekboard_desktop_client_enable_fakekey (client)) {
 | 
			
		||||
        g_printerr ("Can't init fakekey\n");
 | 
			
		||||
        exit (1);
 | 
			
		||||
    }
 | 
			
		||||
#endif  /* HAVE_FAKEKEY */
 | 
			
		||||
 | 
			
		||||
    loop = g_main_loop_new (NULL, FALSE);
 | 
			
		||||
    if (!opt_focus) {
 | 
			
		||||
        g_object_get (client, "context", &context, NULL);
 | 
			
		||||
        g_signal_connect (context, "notify::keyboard-visible",
 | 
			
		||||
                          G_CALLBACK(on_notify_keyboard_visible), loop);
 | 
			
		||||
        g_signal_connect (context, "destroyed",
 | 
			
		||||
                          G_CALLBACK(on_context_destroyed), loop);
 | 
			
		||||
        g_object_unref (context);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opt_fullscreen) {
 | 
			
		||||
        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), loop);
 | 
			
		||||
 | 
			
		||||
    g_main_loop_run (loop);
 | 
			
		||||
    g_main_loop_unref (loop);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
@ -1,718 +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 <libxklavier/xklavier.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
#include <cspi/spi.h>
 | 
			
		||||
#endif  /* HAVE_CSPI */
 | 
			
		||||
 | 
			
		||||
#include <gdk/gdkx.h>
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_FAKEKEY
 | 
			
		||||
#include <fakekey/fakekey.h>
 | 
			
		||||
#endif  /* HAVE_FAKEKEY */
 | 
			
		||||
 | 
			
		||||
#include "eek/eek.h"
 | 
			
		||||
#include "eek/eek-xkl.h"
 | 
			
		||||
#include "eekboard/eekboard.h"
 | 
			
		||||
#include "desktop-client.h"
 | 
			
		||||
#include "xklutil.h"
 | 
			
		||||
 | 
			
		||||
#define CSW 640
 | 
			
		||||
#define CSH 480
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
    PROP_0,
 | 
			
		||||
    PROP_CONNECTION,
 | 
			
		||||
    PROP_EEKBOARD,
 | 
			
		||||
    PROP_CONTEXT,
 | 
			
		||||
    PROP_LAST
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct _EekboardDesktopClientClass EekboardDesktopClientClass;
 | 
			
		||||
 | 
			
		||||
struct _EekboardDesktopClient {
 | 
			
		||||
    GObject parent;
 | 
			
		||||
 | 
			
		||||
    EekboardEekboard *eekboard;
 | 
			
		||||
    EekboardContext *context;
 | 
			
		||||
 | 
			
		||||
    EekKeyboard *keyboard;
 | 
			
		||||
    GdkDisplay *display;
 | 
			
		||||
    XklEngine *xkl_engine;
 | 
			
		||||
    XklConfigRegistry *xkl_config_registry;
 | 
			
		||||
 | 
			
		||||
    gulong xkl_config_changed_handler;
 | 
			
		||||
    gulong xkl_state_changed_handler;
 | 
			
		||||
 | 
			
		||||
    gulong key_pressed_handler;
 | 
			
		||||
    gulong key_released_handler;
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
    Accessible *acc;
 | 
			
		||||
    AccessibleEventListener *focus_listener;
 | 
			
		||||
    AccessibleEventListener *keystroke_listener;
 | 
			
		||||
#endif  /* HAVE_CSPI */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_FAKEKEY
 | 
			
		||||
    FakeKey *fakekey;
 | 
			
		||||
#endif  /* HAVE_FAKEKEY */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _EekboardDesktopClientClass {
 | 
			
		||||
    GObjectClass parent_class;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (EekboardDesktopClient, eekboard_desktop_client, G_TYPE_OBJECT);
 | 
			
		||||
 | 
			
		||||
static GdkFilterReturn filter_xkl_event  (GdkXEvent                 *xev,
 | 
			
		||||
                                          GdkEvent                  *event,
 | 
			
		||||
                                          gpointer                   user_data);
 | 
			
		||||
static void            on_xkl_config_changed
 | 
			
		||||
                                         (XklEngine                 *xklengine,
 | 
			
		||||
                                          gpointer                   user_data);
 | 
			
		||||
 | 
			
		||||
static void            on_xkl_state_changed
 | 
			
		||||
                                         (XklEngine                 *xklengine,
 | 
			
		||||
                                          XklEngineStateChange       type,
 | 
			
		||||
                                          gint                       value,
 | 
			
		||||
                                          gboolean                   restore,
 | 
			
		||||
                                          gpointer                   user_data);
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
static SPIBoolean      focus_listener_cb (const AccessibleEvent     *event,
 | 
			
		||||
                                          void                      *user_data);
 | 
			
		||||
 | 
			
		||||
static SPIBoolean      keystroke_listener_cb
 | 
			
		||||
                                         (const AccessibleKeystroke *stroke,
 | 
			
		||||
                                          void                      *user_data);
 | 
			
		||||
#endif  /* HAVE_CSPI */
 | 
			
		||||
static gboolean        set_keyboard      (EekboardDesktopClient     *client,
 | 
			
		||||
                                          gboolean                   show,
 | 
			
		||||
                                          const gchar               *model,
 | 
			
		||||
                                          const gchar               *layouts,
 | 
			
		||||
                                          const gchar               *options);
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eekboard_desktop_client_set_property (GObject      *object,
 | 
			
		||||
                                      guint         prop_id,
 | 
			
		||||
                                      const GValue *value,
 | 
			
		||||
                                      GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = EEKBOARD_DESKTOP_CLIENT(object);
 | 
			
		||||
    GDBusConnection *connection;
 | 
			
		||||
 | 
			
		||||
    switch (prop_id) {
 | 
			
		||||
    case PROP_CONNECTION:
 | 
			
		||||
        connection = g_value_get_object (value);
 | 
			
		||||
 | 
			
		||||
        client->eekboard = eekboard_eekboard_new (connection, NULL);
 | 
			
		||||
        if (client->eekboard != NULL) {
 | 
			
		||||
            client->context =
 | 
			
		||||
                eekboard_eekboard_create_context (client->eekboard,
 | 
			
		||||
                                                  "eekboard-desktop-client",
 | 
			
		||||
                                                  NULL);
 | 
			
		||||
            if (client->context == NULL) {
 | 
			
		||||
                g_object_unref (client->eekboard);
 | 
			
		||||
                client->eekboard = NULL;
 | 
			
		||||
            } else
 | 
			
		||||
                eekboard_eekboard_push_context (client->eekboard,
 | 
			
		||||
                                                client->context,
 | 
			
		||||
                                                NULL);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        g_object_set_property (object,
 | 
			
		||||
                               g_param_spec_get_name (pspec),
 | 
			
		||||
                               value);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eekboard_desktop_client_get_property (GObject    *object,
 | 
			
		||||
                                     guint       prop_id,
 | 
			
		||||
                                     GValue     *value,
 | 
			
		||||
                                     GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = EEKBOARD_DESKTOP_CLIENT(object);
 | 
			
		||||
 | 
			
		||||
    switch (prop_id) {
 | 
			
		||||
    case PROP_EEKBOARD:
 | 
			
		||||
        g_value_set_object (value, client->eekboard);
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_CONTEXT:
 | 
			
		||||
        g_value_set_object (value, client->context);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        g_object_get_property (object,
 | 
			
		||||
                               g_param_spec_get_name (pspec),
 | 
			
		||||
                               value);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eekboard_desktop_client_dispose (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = EEKBOARD_DESKTOP_CLIENT(object);
 | 
			
		||||
 | 
			
		||||
    eekboard_desktop_client_disable_xkl (client);
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
    eekboard_desktop_client_disable_cspi_focus (client);
 | 
			
		||||
    eekboard_desktop_client_disable_cspi_keystroke (client);
 | 
			
		||||
#endif  /* HAVE_CSPI */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_FAKEKEY
 | 
			
		||||
    eekboard_desktop_client_disable_fakekey (client);
 | 
			
		||||
#endif  /* HAVE_FAKEKEY */
 | 
			
		||||
 | 
			
		||||
    if (client->context) {
 | 
			
		||||
        if (client->eekboard) {
 | 
			
		||||
            eekboard_eekboard_pop_context (client->eekboard, NULL);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        g_object_unref (client->context);
 | 
			
		||||
        client->context = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (client->eekboard) {
 | 
			
		||||
        g_object_unref (client->eekboard);
 | 
			
		||||
        client->eekboard = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (client->keyboard) {
 | 
			
		||||
        g_object_unref (client->keyboard);
 | 
			
		||||
        client->keyboard = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_FAKEKEY
 | 
			
		||||
    if (client->fakekey) {
 | 
			
		||||
        client->fakekey = NULL;
 | 
			
		||||
    }
 | 
			
		||||
#endif  /* HAVE_FAKEKEY */
 | 
			
		||||
 | 
			
		||||
    if (client->display) {
 | 
			
		||||
        gdk_display_close (client->display);
 | 
			
		||||
        client->display = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    G_OBJECT_CLASS (eekboard_desktop_client_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eekboard_desktop_client_class_init (EekboardDesktopClientClass *klass)
 | 
			
		||||
{
 | 
			
		||||
    GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
    GParamSpec *pspec;
 | 
			
		||||
 | 
			
		||||
    gobject_class->set_property = eekboard_desktop_client_set_property;
 | 
			
		||||
    gobject_class->get_property = eekboard_desktop_client_get_property;
 | 
			
		||||
    gobject_class->dispose = eekboard_desktop_client_dispose;
 | 
			
		||||
 | 
			
		||||
    pspec = g_param_spec_object ("connection",
 | 
			
		||||
                                 "Connection",
 | 
			
		||||
                                 "Connection",
 | 
			
		||||
                                 G_TYPE_DBUS_CONNECTION,
 | 
			
		||||
                                 G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE);
 | 
			
		||||
    g_object_class_install_property (gobject_class,
 | 
			
		||||
                                     PROP_CONNECTION,
 | 
			
		||||
                                     pspec);
 | 
			
		||||
 | 
			
		||||
    pspec = g_param_spec_object ("eekboard",
 | 
			
		||||
                                 "Eekboard",
 | 
			
		||||
                                 "Eekboard",
 | 
			
		||||
                                 EEKBOARD_TYPE_EEKBOARD,
 | 
			
		||||
                                 G_PARAM_READABLE);
 | 
			
		||||
    g_object_class_install_property (gobject_class,
 | 
			
		||||
                                     PROP_EEKBOARD,
 | 
			
		||||
                                     pspec);
 | 
			
		||||
 | 
			
		||||
    pspec = g_param_spec_object ("context",
 | 
			
		||||
                                 "Context",
 | 
			
		||||
                                 "Context",
 | 
			
		||||
                                 EEKBOARD_TYPE_CONTEXT,
 | 
			
		||||
                                 G_PARAM_READABLE);
 | 
			
		||||
    g_object_class_install_property (gobject_class,
 | 
			
		||||
                                     PROP_CONTEXT,
 | 
			
		||||
                                     pspec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
eekboard_desktop_client_init (EekboardDesktopClient *client)
 | 
			
		||||
{
 | 
			
		||||
    client->eekboard = NULL;
 | 
			
		||||
    client->context = NULL;
 | 
			
		||||
    client->display = NULL;
 | 
			
		||||
    client->xkl_engine = NULL;
 | 
			
		||||
    client->xkl_config_registry = NULL;
 | 
			
		||||
    client->keyboard = NULL;
 | 
			
		||||
    client->key_pressed_handler = 0;
 | 
			
		||||
    client->key_released_handler = 0;
 | 
			
		||||
    client->xkl_config_changed_handler = 0;
 | 
			
		||||
    client->xkl_state_changed_handler = 0;
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
    client->focus_listener = NULL;
 | 
			
		||||
    client->keystroke_listener = NULL;
 | 
			
		||||
#endif  /* HAVE_CSPI */
 | 
			
		||||
#ifdef HAVE_FAKEKEY
 | 
			
		||||
    client->fakekey = NULL;
 | 
			
		||||
#endif  /* HAVE_FAKEKEY */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
eekboard_desktop_client_set_xkl_config (EekboardDesktopClient *client,
 | 
			
		||||
                                        const gchar *model,
 | 
			
		||||
                                        const gchar *layouts,
 | 
			
		||||
                                        const gchar *options)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
    return set_keyboard (client,
 | 
			
		||||
                         client->focus_listener ? FALSE : TRUE,
 | 
			
		||||
                         model,
 | 
			
		||||
                         layouts,
 | 
			
		||||
                         options);
 | 
			
		||||
#else
 | 
			
		||||
    return set_keyboard (client,
 | 
			
		||||
                         TRUE,
 | 
			
		||||
                         model,
 | 
			
		||||
                         layouts,
 | 
			
		||||
                         options);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
eekboard_desktop_client_enable_xkl (EekboardDesktopClient *client)
 | 
			
		||||
{
 | 
			
		||||
    if (!client->display) {
 | 
			
		||||
        client->display = gdk_display_get_default ();
 | 
			
		||||
    }
 | 
			
		||||
    g_assert (client->display);
 | 
			
		||||
 | 
			
		||||
    if (!client->xkl_engine) {
 | 
			
		||||
        client->xkl_engine =
 | 
			
		||||
            xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (client->display));
 | 
			
		||||
    }
 | 
			
		||||
    g_assert (client->xkl_engine);
 | 
			
		||||
 | 
			
		||||
    if (!client->xkl_config_registry) {
 | 
			
		||||
        client->xkl_config_registry =
 | 
			
		||||
            xkl_config_registry_get_instance (client->xkl_engine);
 | 
			
		||||
        xkl_config_registry_load (client->xkl_config_registry, FALSE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    client->xkl_config_changed_handler =
 | 
			
		||||
        g_signal_connect (client->xkl_engine, "X-config-changed",
 | 
			
		||||
                          G_CALLBACK(on_xkl_config_changed), client);
 | 
			
		||||
    client->xkl_state_changed_handler =
 | 
			
		||||
        g_signal_connect (client->xkl_engine, "X-state-changed",
 | 
			
		||||
                          G_CALLBACK(on_xkl_state_changed), client);
 | 
			
		||||
 | 
			
		||||
    gdk_window_add_filter (NULL,
 | 
			
		||||
                           (GdkFilterFunc) filter_xkl_event,
 | 
			
		||||
                           client);
 | 
			
		||||
    gdk_window_add_filter (gdk_get_default_root_window (),
 | 
			
		||||
                           (GdkFilterFunc) filter_xkl_event,
 | 
			
		||||
                           client);
 | 
			
		||||
 | 
			
		||||
    xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
    return set_keyboard (client, client->focus_listener ? FALSE : TRUE,
 | 
			
		||||
                         NULL, NULL, NULL);
 | 
			
		||||
#else
 | 
			
		||||
    return set_keyboard (client, TRUE, NULL, NULL, NULL);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eekboard_desktop_client_disable_xkl (EekboardDesktopClient *client)
 | 
			
		||||
{
 | 
			
		||||
    if (client->xkl_engine)
 | 
			
		||||
        xkl_engine_stop_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
 | 
			
		||||
    if (g_signal_handler_is_connected (client->xkl_engine,
 | 
			
		||||
                                       client->xkl_config_changed_handler))
 | 
			
		||||
        g_signal_handler_disconnect (client->xkl_engine,
 | 
			
		||||
                                     client->xkl_config_changed_handler);
 | 
			
		||||
    if (g_signal_handler_is_connected (client->xkl_engine,
 | 
			
		||||
                                       client->xkl_state_changed_handler))
 | 
			
		||||
        g_signal_handler_disconnect (client->xkl_engine,
 | 
			
		||||
                                     client->xkl_state_changed_handler);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CSPI
 | 
			
		||||
gboolean
 | 
			
		||||
eekboard_desktop_client_enable_cspi_focus (EekboardDesktopClient *client)
 | 
			
		||||
{
 | 
			
		||||
    client->focus_listener = SPI_createAccessibleEventListener
 | 
			
		||||
        ((AccessibleEventListenerCB)focus_listener_cb,
 | 
			
		||||
         client);
 | 
			
		||||
 | 
			
		||||
    if (!SPI_registerGlobalEventListener (client->focus_listener,
 | 
			
		||||
                                          "object:state-changed:focused"))
 | 
			
		||||
        return FALSE;
 | 
			
		||||
 | 
			
		||||
    if (!SPI_registerGlobalEventListener (client->focus_listener,
 | 
			
		||||
                                          "focus:"))
 | 
			
		||||
        return FALSE;
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eekboard_desktop_client_disable_cspi_focus (EekboardDesktopClient *client)
 | 
			
		||||
{
 | 
			
		||||
    if (client->focus_listener) {
 | 
			
		||||
        SPI_deregisterGlobalEventListenerAll (client->focus_listener);
 | 
			
		||||
        AccessibleEventListener_unref (client->focus_listener);
 | 
			
		||||
        client->focus_listener = NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
eekboard_desktop_client_enable_cspi_keystroke (EekboardDesktopClient *client)
 | 
			
		||||
{
 | 
			
		||||
    client->keystroke_listener =
 | 
			
		||||
        SPI_createAccessibleKeystrokeListener (keystroke_listener_cb,
 | 
			
		||||
                                               client);
 | 
			
		||||
 | 
			
		||||
    if (!SPI_registerAccessibleKeystrokeListener
 | 
			
		||||
        (client->keystroke_listener,
 | 
			
		||||
         SPI_KEYSET_ALL_KEYS,
 | 
			
		||||
         0,
 | 
			
		||||
         SPI_KEY_PRESSED |
 | 
			
		||||
         SPI_KEY_RELEASED,
 | 
			
		||||
         SPI_KEYLISTENER_NOSYNC))
 | 
			
		||||
        return FALSE;
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eekboard_desktop_client_disable_cspi_keystroke (EekboardDesktopClient *client)
 | 
			
		||||
{
 | 
			
		||||
    if (client->keystroke_listener) {
 | 
			
		||||
        SPI_deregisterAccessibleKeystrokeListener (client->keystroke_listener,
 | 
			
		||||
                                                   0);
 | 
			
		||||
        AccessibleKeystrokeListener_unref (client->keystroke_listener);
 | 
			
		||||
        client->keystroke_listener = NULL;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static SPIBoolean
 | 
			
		||||
focus_listener_cb (const AccessibleEvent *event,
 | 
			
		||||
                   void                  *user_data)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = user_data;
 | 
			
		||||
    Accessible *accessible = event->source;
 | 
			
		||||
    AccessibleStateSet *state_set = Accessible_getStateSet (accessible);
 | 
			
		||||
    AccessibleRole role = Accessible_getRole (accessible);
 | 
			
		||||
 | 
			
		||||
    if (AccessibleStateSet_contains (state_set, SPI_STATE_EDITABLE) ||
 | 
			
		||||
        role == SPI_ROLE_TERMINAL) {
 | 
			
		||||
        switch (role) {
 | 
			
		||||
        case SPI_ROLE_TEXT:
 | 
			
		||||
        case SPI_ROLE_PARAGRAPH:
 | 
			
		||||
        case SPI_ROLE_PASSWORD_TEXT:
 | 
			
		||||
        case SPI_ROLE_TERMINAL:
 | 
			
		||||
            if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
 | 
			
		||||
                client->acc = accessible;
 | 
			
		||||
                eekboard_context_show_keyboard (client->context, NULL);
 | 
			
		||||
            } else if (event->detail1 == 0 && accessible == client->acc) {
 | 
			
		||||
                client->acc = NULL;
 | 
			
		||||
                eekboard_context_hide_keyboard (client->context, NULL);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case SPI_ROLE_ENTRY:
 | 
			
		||||
            if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
 | 
			
		||||
                client->acc = accessible;
 | 
			
		||||
                eekboard_context_show_keyboard (client->context, NULL);
 | 
			
		||||
            } else if (event->detail1 == 0) {
 | 
			
		||||
                client->acc = NULL;
 | 
			
		||||
                eekboard_context_hide_keyboard (client->context, NULL);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
            
 | 
			
		||||
        default:
 | 
			
		||||
            ;
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        eekboard_context_hide_keyboard (client->context, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static SPIBoolean
 | 
			
		||||
keystroke_listener_cb (const AccessibleKeystroke *stroke,
 | 
			
		||||
                       void                      *user_data)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = user_data;
 | 
			
		||||
    EekKey *key;
 | 
			
		||||
 | 
			
		||||
    /* Ignore modifiers since the keystroke listener does not called
 | 
			
		||||
       when a modifier key is released. */
 | 
			
		||||
    key = eek_keyboard_find_key_by_keycode (client->keyboard,
 | 
			
		||||
                                            stroke->keycode);
 | 
			
		||||
    if (key) {
 | 
			
		||||
        EekSymbol *symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
			
		||||
        if (symbol && eek_symbol_is_modifier (symbol))
 | 
			
		||||
            return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (stroke->type == SPI_KEY_PRESSED) {
 | 
			
		||||
        eekboard_context_press_key (client->context, stroke->keycode, NULL);
 | 
			
		||||
    } else {
 | 
			
		||||
        eekboard_context_release_key (client->context, stroke->keycode, NULL);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
#endif  /* HAVE_CSPI */
 | 
			
		||||
 | 
			
		||||
EekboardDesktopClient *
 | 
			
		||||
eekboard_desktop_client_new (GDBusConnection *connection)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = g_object_new (EEKBOARD_TYPE_DESKTOP_CLIENT,
 | 
			
		||||
                                                  "connection", connection,
 | 
			
		||||
                                                  NULL);
 | 
			
		||||
    if (client->context)
 | 
			
		||||
        return client;
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static GdkFilterReturn
 | 
			
		||||
filter_xkl_event (GdkXEvent *xev,
 | 
			
		||||
                  GdkEvent  *event,
 | 
			
		||||
                  gpointer   user_data)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = user_data;
 | 
			
		||||
    XEvent *xevent = (XEvent *)xev;
 | 
			
		||||
 | 
			
		||||
    xkl_engine_filter_events (client->xkl_engine, xevent);
 | 
			
		||||
    return GDK_FILTER_CONTINUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_xkl_config_changed (XklEngine *xklengine,
 | 
			
		||||
                       gpointer   user_data)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = user_data;
 | 
			
		||||
    gboolean retval;
 | 
			
		||||
 | 
			
		||||
    retval = set_keyboard (client, FALSE, NULL, NULL, NULL);
 | 
			
		||||
    g_return_if_fail (retval);
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_FAKEKEY
 | 
			
		||||
    if (client->fakekey)
 | 
			
		||||
        fakekey_reload_keysyms (client->fakekey);
 | 
			
		||||
#endif  /* HAVE_FAKEKEY */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
set_keyboard (EekboardDesktopClient *client,
 | 
			
		||||
              gboolean               show,
 | 
			
		||||
              const gchar           *model,
 | 
			
		||||
              const gchar           *layouts,
 | 
			
		||||
              const gchar           *options)
 | 
			
		||||
{
 | 
			
		||||
    EekLayout *layout;
 | 
			
		||||
    gchar *keyboard_name;
 | 
			
		||||
    static gint keyboard_serial = 0;
 | 
			
		||||
    guint keyboard_id;
 | 
			
		||||
 | 
			
		||||
    if (client->keyboard)
 | 
			
		||||
        g_object_unref (client->keyboard);
 | 
			
		||||
    layout = eek_xkl_layout_new ();
 | 
			
		||||
 | 
			
		||||
    if (model) {
 | 
			
		||||
        if (!eek_xkl_layout_set_model (EEK_XKL_LAYOUT(layout), model)) {
 | 
			
		||||
            g_object_unref (layout);
 | 
			
		||||
            return FALSE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (layouts) {
 | 
			
		||||
        XklConfigRec *rec;
 | 
			
		||||
 | 
			
		||||
        rec = eekboard_xkl_config_rec_new_from_string (layouts);
 | 
			
		||||
        if (!eek_xkl_layout_set_layouts (EEK_XKL_LAYOUT(layout),
 | 
			
		||||
                                         rec->layouts)) {
 | 
			
		||||
            g_object_unref (rec);
 | 
			
		||||
            g_object_unref (layout);
 | 
			
		||||
            return FALSE;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!eek_xkl_layout_set_variants (EEK_XKL_LAYOUT(layout),
 | 
			
		||||
                                          rec->variants)) {
 | 
			
		||||
            g_object_unref (rec);
 | 
			
		||||
            g_object_unref (layout);
 | 
			
		||||
            return FALSE;
 | 
			
		||||
        }            
 | 
			
		||||
 | 
			
		||||
        g_object_unref (rec);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (options) {
 | 
			
		||||
        gchar **_options;
 | 
			
		||||
 | 
			
		||||
        _options = g_strsplit (options, ",", -1);
 | 
			
		||||
        if (!eek_xkl_layout_set_options (EEK_XKL_LAYOUT(layout), _options)) {
 | 
			
		||||
            g_strfreev (_options);
 | 
			
		||||
            g_object_unref (layout);
 | 
			
		||||
            return FALSE;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    client->keyboard = eek_keyboard_new (layout, CSW, CSH);
 | 
			
		||||
    eek_keyboard_set_modifier_behavior (client->keyboard,
 | 
			
		||||
                                        EEK_MODIFIER_BEHAVIOR_LATCH);
 | 
			
		||||
 | 
			
		||||
    keyboard_name = g_strdup_printf ("keyboard%d", keyboard_serial++);
 | 
			
		||||
    eek_element_set_name (EEK_ELEMENT(client->keyboard), keyboard_name);
 | 
			
		||||
    g_free (keyboard_name);
 | 
			
		||||
 | 
			
		||||
    keyboard_id = eekboard_context_add_keyboard (client->context,
 | 
			
		||||
                                                 client->keyboard,
 | 
			
		||||
                                                 NULL);
 | 
			
		||||
    eekboard_context_set_keyboard (client->context, keyboard_id, NULL);
 | 
			
		||||
    if (show)
 | 
			
		||||
        eekboard_context_show_keyboard (client->context, NULL);
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_xkl_state_changed (XklEngine           *xklengine,
 | 
			
		||||
                      XklEngineStateChange type,
 | 
			
		||||
                      gint                 value,
 | 
			
		||||
                      gboolean             restore,
 | 
			
		||||
                      gpointer             user_data)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = user_data;
 | 
			
		||||
 | 
			
		||||
    if (type == GROUP_CHANGED && client->keyboard) {
 | 
			
		||||
        gint group = eek_element_get_group (EEK_ELEMENT(client->keyboard));
 | 
			
		||||
        if (group != value) {
 | 
			
		||||
            eekboard_context_set_group (client->context, value, NULL);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_FAKEKEY
 | 
			
		||||
G_INLINE_FUNC FakeKeyModifier
 | 
			
		||||
get_fakekey_modifiers (EekModifierType modifiers)
 | 
			
		||||
{
 | 
			
		||||
    FakeKeyModifier retval = 0;
 | 
			
		||||
 | 
			
		||||
    if (modifiers & EEK_SHIFT_MASK)
 | 
			
		||||
        retval |= FAKEKEYMOD_SHIFT;
 | 
			
		||||
    if (modifiers & EEK_CONTROL_MASK)
 | 
			
		||||
        retval |= FAKEKEYMOD_CONTROL;
 | 
			
		||||
    if (modifiers & EEK_MOD1_MASK)
 | 
			
		||||
        retval |= FAKEKEYMOD_ALT;
 | 
			
		||||
    if (modifiers & EEK_META_MASK)
 | 
			
		||||
        retval |= FAKEKEYMOD_META;
 | 
			
		||||
 | 
			
		||||
    return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_key_pressed (EekKeyboard *keyboard,
 | 
			
		||||
                EekKey      *key,
 | 
			
		||||
                gpointer     user_data)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = user_data;
 | 
			
		||||
    EekSymbol *symbol;
 | 
			
		||||
 | 
			
		||||
    g_assert (client->fakekey);
 | 
			
		||||
 | 
			
		||||
    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
			
		||||
    if (EEK_IS_KEYSYM(symbol) && !eek_symbol_is_modifier (symbol)) {
 | 
			
		||||
        guint xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
 | 
			
		||||
        guint keycode =
 | 
			
		||||
            XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (client->display), xkeysym);
 | 
			
		||||
        EekModifierType modifiers =
 | 
			
		||||
            eek_keyboard_get_modifiers (client->keyboard);
 | 
			
		||||
        FakeKeyModifier fakekey_modifiers = get_fakekey_modifiers (modifiers);
 | 
			
		||||
 | 
			
		||||
        fakekey_send_keyevent (client->fakekey,
 | 
			
		||||
                               keycode,
 | 
			
		||||
                               TRUE,
 | 
			
		||||
                               fakekey_modifiers);
 | 
			
		||||
        fakekey_send_keyevent (client->fakekey,
 | 
			
		||||
                               keycode,
 | 
			
		||||
                               FALSE,
 | 
			
		||||
                               fakekey_modifiers);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_key_released (EekKeyboard *keyboard,
 | 
			
		||||
                 EekKey      *key,
 | 
			
		||||
                 gpointer     user_data)
 | 
			
		||||
{
 | 
			
		||||
    EekboardDesktopClient *client = user_data;
 | 
			
		||||
 | 
			
		||||
    g_assert (client->fakekey);
 | 
			
		||||
    fakekey_release (client->fakekey);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
eekboard_desktop_client_enable_fakekey (EekboardDesktopClient *client)
 | 
			
		||||
{
 | 
			
		||||
    if (!client->display) {
 | 
			
		||||
        client->display = gdk_display_get_default ();
 | 
			
		||||
    }
 | 
			
		||||
    g_assert (client->display);
 | 
			
		||||
 | 
			
		||||
    if (!client->fakekey) {
 | 
			
		||||
        client->fakekey = fakekey_init (GDK_DISPLAY_XDISPLAY (client->display));
 | 
			
		||||
    }
 | 
			
		||||
    g_assert (client->fakekey);
 | 
			
		||||
 | 
			
		||||
    client->key_pressed_handler =
 | 
			
		||||
        g_signal_connect (client->keyboard, "key-pressed",
 | 
			
		||||
                          G_CALLBACK(on_key_pressed), client);
 | 
			
		||||
    client->key_released_handler =
 | 
			
		||||
        g_signal_connect (client->keyboard, "key-released",
 | 
			
		||||
                          G_CALLBACK(on_key_released), client);
 | 
			
		||||
 | 
			
		||||
    return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
eekboard_desktop_client_disable_fakekey (EekboardDesktopClient *client)
 | 
			
		||||
{
 | 
			
		||||
    if (client->fakekey)
 | 
			
		||||
        fakekey_release (client->fakekey);
 | 
			
		||||
 | 
			
		||||
    if (g_signal_handler_is_connected (client->keyboard,
 | 
			
		||||
                                       client->key_pressed_handler))
 | 
			
		||||
        g_signal_handler_disconnect (client->keyboard,
 | 
			
		||||
                                     client->key_pressed_handler);
 | 
			
		||||
    if (g_signal_handler_is_connected (client->keyboard,
 | 
			
		||||
                                       client->key_released_handler))
 | 
			
		||||
        g_signal_handler_disconnect (client->keyboard,
 | 
			
		||||
                                     client->key_released_handler);
 | 
			
		||||
}
 | 
			
		||||
#endif  /* HAVE_FAKEKEY */
 | 
			
		||||
@ -1,64 +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 EEKBOARD_DESKTOP_CLIENT_H
 | 
			
		||||
#define EEKBOARD_DESKTOP_CLIENT_H 1
 | 
			
		||||
 | 
			
		||||
#include <gio/gio.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define EEKBOARD_TYPE_DESKTOP_CLIENT (eekboard_desktop_client_get_type())
 | 
			
		||||
#define EEKBOARD_DESKTOP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EEKBOARD_TYPE_DESKTOP_CLIENT, EekboardDesktopClient))
 | 
			
		||||
#define EEKBOARD_DESKTOP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EEKBOARD_TYPE_DESKTOP_CLIENT, EekboardDesktopClientClass))
 | 
			
		||||
#define EEKBOARD_IS_DESKTOP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EEKBOARD_TYPE_DESKTOP_CLIENT))
 | 
			
		||||
#define EEKBOARD_IS_DESKTOP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EEKBOARD_TYPE_DESKTOP_CLIENT))
 | 
			
		||||
#define EEKBOARD_DESKTOP_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EEKBOARD_TYPE_DESKTOP_CLIENT, EekboardDesktopClientClass))
 | 
			
		||||
 | 
			
		||||
typedef struct _EekboardDesktopClient EekboardDesktopClient;
 | 
			
		||||
 | 
			
		||||
EekboardDesktopClient * eekboard_desktop_client_new
 | 
			
		||||
                        (GDBusConnection       *connection);
 | 
			
		||||
 | 
			
		||||
gboolean                eekboard_desktop_client_set_xkl_config
 | 
			
		||||
                        (EekboardDesktopClient *client,
 | 
			
		||||
                         const gchar           *model,
 | 
			
		||||
                         const gchar           *layouts,
 | 
			
		||||
                         const gchar           *options);
 | 
			
		||||
 | 
			
		||||
gboolean                eekboard_desktop_client_enable_xkl
 | 
			
		||||
                        (EekboardDesktopClient *client);
 | 
			
		||||
void                    eekboard_desktop_client_disable_xkl
 | 
			
		||||
                        (EekboardDesktopClient *client);
 | 
			
		||||
 | 
			
		||||
gboolean                eekboard_desktop_client_enable_cspi_focus
 | 
			
		||||
                        (EekboardDesktopClient *client);
 | 
			
		||||
void                    eekboard_desktop_client_disable_cspi_focus
 | 
			
		||||
                        (EekboardDesktopClient *client);
 | 
			
		||||
 | 
			
		||||
gboolean                eekboard_desktop_client_enable_cspi_keystroke
 | 
			
		||||
                        (EekboardDesktopClient *client);
 | 
			
		||||
void                    eekboard_desktop_client_disable_cspi_keystroke
 | 
			
		||||
                        (EekboardDesktopClient *client);
 | 
			
		||||
 | 
			
		||||
gboolean                eekboard_desktop_client_enable_fakekey
 | 
			
		||||
                        (EekboardDesktopClient *client);
 | 
			
		||||
void                    eekboard_desktop_client_disable_fakekey
 | 
			
		||||
                        (EekboardDesktopClient *client);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
#endif  /* EEKBOARD_DESKTOP_CLIENT_H */
 | 
			
		||||
@ -22,30 +22,34 @@
 | 
			
		||||
#include <gtk/gtk.h>
 | 
			
		||||
#include <glib/gi18n.h>
 | 
			
		||||
 | 
			
		||||
#include <X11/Xatom.h>
 | 
			
		||||
#include <gdk/gdkx.h>
 | 
			
		||||
 | 
			
		||||
#include "eek/eek.h"
 | 
			
		||||
 | 
			
		||||
#if HAVE_CLUTTER_GTK
 | 
			
		||||
#include <clutter-gtk/clutter-gtk.h>
 | 
			
		||||
#include "eek/eek-clutter.h"
 | 
			
		||||
#else  /* HAVE_CLUTTER_GTK */
 | 
			
		||||
#endif
 | 
			
		||||
#include "eek/eek-gtk.h"
 | 
			
		||||
#endif  /* !HAVE_CLUTTER_GTK */
 | 
			
		||||
 | 
			
		||||
#include "server-context.h"
 | 
			
		||||
 | 
			
		||||
#define CSW 640
 | 
			
		||||
#define CSH 480
 | 
			
		||||
#define DEFAULT_THEME (THEMEDIR "/default.css")
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
    PROP_0,
 | 
			
		||||
    PROP_OBJECT_PATH,
 | 
			
		||||
    PROP_CONNECTION,
 | 
			
		||||
    PROP_UI_TOOLKIT,
 | 
			
		||||
    PROP_LAST
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const gchar introspection_xml[] =
 | 
			
		||||
    "<node>"
 | 
			
		||||
    "  <interface name='com.redhat.Eekboard.Context'>"
 | 
			
		||||
    "  <interface name='org.fedorahosted.Eekboard.Context'>"
 | 
			
		||||
    "    <method name='AddKeyboard'>"
 | 
			
		||||
    "      <arg direction='in' type='v' name='keyboard'/>"
 | 
			
		||||
    "      <arg direction='out' type='u' name='keyboard_id'/>"
 | 
			
		||||
@ -85,6 +89,12 @@ static const gchar introspection_xml[] =
 | 
			
		||||
    "  </interface>"
 | 
			
		||||
    "</node>";
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
    UI_TOOLKIT_GTK,
 | 
			
		||||
    UI_TOOLKIT_CLUTTER,
 | 
			
		||||
    UI_TOOLKIT_DEFAULT = UI_TOOLKIT_GTK
 | 
			
		||||
} ServerContextUIToolkitType;
 | 
			
		||||
 | 
			
		||||
typedef struct _ServerContextClass ServerContextClass;
 | 
			
		||||
 | 
			
		||||
struct _ServerContext {
 | 
			
		||||
@ -94,6 +104,7 @@ struct _ServerContext {
 | 
			
		||||
    guint registration_id;
 | 
			
		||||
    char *object_path;
 | 
			
		||||
    char *client_connection;
 | 
			
		||||
    char *client_name;
 | 
			
		||||
 | 
			
		||||
    gboolean enabled;
 | 
			
		||||
    gboolean last_keyboard_visible;
 | 
			
		||||
@ -108,6 +119,9 @@ struct _ServerContext {
 | 
			
		||||
    gulong key_pressed_handler;
 | 
			
		||||
    gulong key_released_handler;
 | 
			
		||||
    gulong notify_visible_handler;
 | 
			
		||||
 | 
			
		||||
    GSettings *settings;
 | 
			
		||||
    ServerContextUIToolkitType ui_toolkit;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ServerContextClass {
 | 
			
		||||
@ -140,7 +154,10 @@ on_allocation_changed (ClutterActor          *stage,
 | 
			
		||||
                       ClutterAllocationFlags flags,
 | 
			
		||||
                       gpointer               user_data)
 | 
			
		||||
{
 | 
			
		||||
    ClutterActor *actor = user_data;
 | 
			
		||||
    ClutterActor *actor =
 | 
			
		||||
        clutter_container_find_child_by_name (CLUTTER_CONTAINER(stage),
 | 
			
		||||
                                              "keyboard");
 | 
			
		||||
 | 
			
		||||
    clutter_actor_set_size (actor,
 | 
			
		||||
                            box->x2 - box->x1,
 | 
			
		||||
                            box->y2 - box->y1);
 | 
			
		||||
@ -180,8 +197,59 @@ on_notify_visible (GObject *object, GParamSpec *spec, gpointer user_data)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_realize (GtkWidget *widget,
 | 
			
		||||
            gpointer   user_data)
 | 
			
		||||
on_realize_set_dock (GtkWidget *widget,
 | 
			
		||||
                     gpointer   user_data)
 | 
			
		||||
{
 | 
			
		||||
#ifdef HAVE_XDOCK
 | 
			
		||||
    GdkWindow *window = gtk_widget_get_window (widget);
 | 
			
		||||
    Atom atoms[2] = { None, None };
 | 
			
		||||
    gint x, y, width, height, depth;
 | 
			
		||||
    long vals[12];
 | 
			
		||||
 | 
			
		||||
    /* set window type to dock */
 | 
			
		||||
    atoms[0] = XInternAtom (GDK_WINDOW_XDISPLAY (window),
 | 
			
		||||
                            "_NET_WM_WINDOW_TYPE_DOCK", False);
 | 
			
		||||
  
 | 
			
		||||
    XChangeProperty (GDK_WINDOW_XDISPLAY (window),
 | 
			
		||||
                     GDK_WINDOW_XID (window),
 | 
			
		||||
                     XInternAtom (GDK_WINDOW_XDISPLAY (window),
 | 
			
		||||
                                  "_NET_WM_WINDOW_TYPE", False),
 | 
			
		||||
                     XA_ATOM, 32, PropModeReplace,
 | 
			
		||||
                     (guchar *)atoms, 
 | 
			
		||||
                     1);
 | 
			
		||||
  
 | 
			
		||||
    /* set bottom strut */
 | 
			
		||||
#if GTK_CHECK_VERSION(3,0,0)
 | 
			
		||||
    gdk_window_get_geometry (window, &x, &y, &width, &height);
 | 
			
		||||
#else
 | 
			
		||||
    gdk_window_get_geometry (window, &x, &y, &width, &height, &depth);
 | 
			
		||||
#endif  /* GTK_CHECK_VERSION(3,0,0) */
 | 
			
		||||
 | 
			
		||||
    vals[0] = 0;
 | 
			
		||||
    vals[1] = 0;
 | 
			
		||||
    vals[2] = 0;
 | 
			
		||||
    vals[3] = height;
 | 
			
		||||
    vals[4] = 0;
 | 
			
		||||
    vals[5] = 0;
 | 
			
		||||
    vals[6] = 0;
 | 
			
		||||
    vals[7] = 0;
 | 
			
		||||
    vals[8] = 0;
 | 
			
		||||
    vals[9] = 0;
 | 
			
		||||
    vals[10] = x;
 | 
			
		||||
    vals[11] = x + width;
 | 
			
		||||
 | 
			
		||||
    XChangeProperty (GDK_WINDOW_XDISPLAY (window),
 | 
			
		||||
                     GDK_WINDOW_XID (window),
 | 
			
		||||
                     XInternAtom (GDK_WINDOW_XDISPLAY (window),
 | 
			
		||||
                                  "_NET_WM_STRUT_PARTIAL", False),
 | 
			
		||||
                     XA_CARDINAL, 32, PropModeReplace,
 | 
			
		||||
                     (guchar *)vals, 12);
 | 
			
		||||
#endif  /* HAVE_XDOCK */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_realize_set_non_maximizable (GtkWidget *widget,
 | 
			
		||||
                                gpointer   user_data)
 | 
			
		||||
{
 | 
			
		||||
    ServerContext *context = user_data;
 | 
			
		||||
 | 
			
		||||
@ -195,8 +263,6 @@ on_realize (GtkWidget *widget,
 | 
			
		||||
                              GDK_FUNC_CLOSE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_THEME (THEMEDIR "/default.css")
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
set_geometry (ServerContext *context)
 | 
			
		||||
{
 | 
			
		||||
@ -212,36 +278,60 @@ set_geometry (ServerContext *context)
 | 
			
		||||
    gdk_screen_get_monitor_geometry (screen, monitor, &rect);
 | 
			
		||||
    eek_element_get_bounds (EEK_ELEMENT(context->keyboard), &bounds);
 | 
			
		||||
 | 
			
		||||
    g_signal_handlers_disconnect_by_func (context->window,
 | 
			
		||||
                                          on_realize_set_dock,
 | 
			
		||||
                                          context);
 | 
			
		||||
    g_signal_handlers_disconnect_by_func (context->window,
 | 
			
		||||
                                          on_realize_set_non_maximizable,
 | 
			
		||||
                                          context);
 | 
			
		||||
 | 
			
		||||
    if (context->fullscreen) {
 | 
			
		||||
        gint width = rect.width, height = rect.height / 2;
 | 
			
		||||
 | 
			
		||||
        if (width * bounds.height > height * bounds.width)
 | 
			
		||||
            width = (height / bounds.height) * bounds.width;
 | 
			
		||||
        else
 | 
			
		||||
            height = (width / bounds.width) * bounds.height;
 | 
			
		||||
 | 
			
		||||
        gtk_widget_set_size_request (context->widget, width, height);
 | 
			
		||||
 | 
			
		||||
        gtk_window_move (GTK_WINDOW(context->window),
 | 
			
		||||
                         (rect.width - width) / 2,
 | 
			
		||||
                         rect.height - height);
 | 
			
		||||
 | 
			
		||||
        gtk_window_set_decorated (GTK_WINDOW(context->window), FALSE);
 | 
			
		||||
        gtk_window_set_resizable (GTK_WINDOW(context->window), FALSE);
 | 
			
		||||
        gtk_widget_set_size_request (context->widget,
 | 
			
		||||
                                     rect.width,
 | 
			
		||||
                                     rect.height / 2);
 | 
			
		||||
        gtk_window_move (GTK_WINDOW(context->window),
 | 
			
		||||
                         0,
 | 
			
		||||
                         rect.height / 2);
 | 
			
		||||
        gtk_window_set_opacity (GTK_WINDOW(context->window), 0.8);
 | 
			
		||||
 | 
			
		||||
        g_signal_connect_after (context->window, "realize",
 | 
			
		||||
                                G_CALLBACK(on_realize_set_dock),
 | 
			
		||||
                                context);
 | 
			
		||||
    } else {
 | 
			
		||||
        if (context->ui_toolkit == UI_TOOLKIT_CLUTTER) {
 | 
			
		||||
#if HAVE_CLUTTER_GTK
 | 
			
		||||
        ClutterActor *stage =
 | 
			
		||||
            gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
 | 
			
		||||
        clutter_stage_set_user_resizable (CLUTTER_STAGE(stage), TRUE);
 | 
			
		||||
        clutter_stage_set_minimum_size (CLUTTER_STAGE(stage),
 | 
			
		||||
                                        bounds.width / 3,
 | 
			
		||||
                                        bounds.height / 3);
 | 
			
		||||
        g_signal_connect (stage,
 | 
			
		||||
                          "allocation-changed",
 | 
			
		||||
                          G_CALLBACK(on_allocation_changed),
 | 
			
		||||
                          actor);
 | 
			
		||||
            ClutterActor *stage =
 | 
			
		||||
                gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
 | 
			
		||||
            clutter_stage_set_user_resizable (CLUTTER_STAGE(stage), TRUE);
 | 
			
		||||
            clutter_stage_set_minimum_size (CLUTTER_STAGE(stage),
 | 
			
		||||
                                            bounds.width / 3,
 | 
			
		||||
                                            bounds.height / 3);
 | 
			
		||||
            g_signal_connect (stage,
 | 
			
		||||
                              "allocation-changed",
 | 
			
		||||
                              G_CALLBACK(on_allocation_changed),
 | 
			
		||||
                              NULL);
 | 
			
		||||
#else
 | 
			
		||||
            g_return_if_reached ();
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
        gtk_widget_set_size_request (context->widget,
 | 
			
		||||
                                     bounds.width,
 | 
			
		||||
                                     bounds.height);
 | 
			
		||||
#endif
 | 
			
		||||
        gtk_window_move (GTK_WINDOW(context->window),
 | 
			
		||||
                         MAX(rect.width - 20 - bounds.width, 0),
 | 
			
		||||
                         MAX(rect.height - 40 - bounds.height, 0));
 | 
			
		||||
        g_signal_connect_after (context->window, "realize",
 | 
			
		||||
                                G_CALLBACK(on_realize_set_non_maximizable),
 | 
			
		||||
                                context);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -260,20 +350,26 @@ update_widget (ServerContext *context)
 | 
			
		||||
 | 
			
		||||
    theme = eek_theme_new (DEFAULT_THEME, NULL, NULL);
 | 
			
		||||
    eek_element_get_bounds (EEK_ELEMENT(context->keyboard), &bounds);
 | 
			
		||||
    if (context->ui_toolkit == UI_TOOLKIT_CLUTTER) {
 | 
			
		||||
#if HAVE_CLUTTER_GTK
 | 
			
		||||
    context->widget = gtk_clutter_embed_new ();
 | 
			
		||||
    stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
 | 
			
		||||
    actor = eek_clutter_keyboard_new (context->keyboard);
 | 
			
		||||
    if (theme)
 | 
			
		||||
        eek_clutter_keyboard_set_theme (EEK_CLUTTER_KEYBOARD(actor), theme);
 | 
			
		||||
    clutter_container_add_actor (CLUTTER_CONTAINER(stage), actor);
 | 
			
		||||
        context->widget = gtk_clutter_embed_new ();
 | 
			
		||||
        stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
 | 
			
		||||
        actor = eek_clutter_keyboard_new (context->keyboard);
 | 
			
		||||
        clutter_actor_set_name (actor, "keyboard");
 | 
			
		||||
        if (theme)
 | 
			
		||||
            eek_clutter_keyboard_set_theme (EEK_CLUTTER_KEYBOARD(actor), theme);
 | 
			
		||||
        clutter_container_add_actor (CLUTTER_CONTAINER(stage), actor);
 | 
			
		||||
 | 
			
		||||
    clutter_stage_set_color (CLUTTER_STAGE(stage), &stage_color);
 | 
			
		||||
        clutter_stage_set_color (CLUTTER_STAGE(stage), &stage_color);
 | 
			
		||||
#else
 | 
			
		||||
    context->widget = eek_gtk_keyboard_new (context->keyboard);
 | 
			
		||||
    if (theme)
 | 
			
		||||
        eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme);
 | 
			
		||||
        g_return_if_reached ();
 | 
			
		||||
#endif
 | 
			
		||||
    } else {
 | 
			
		||||
        context->widget = eek_gtk_keyboard_new (context->keyboard);
 | 
			
		||||
        if (theme)
 | 
			
		||||
            eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget),
 | 
			
		||||
                                        theme);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!context->window) {
 | 
			
		||||
        context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 | 
			
		||||
@ -285,16 +381,15 @@ update_widget (ServerContext *context)
 | 
			
		||||
 | 
			
		||||
        gtk_widget_set_can_focus (context->window, FALSE);
 | 
			
		||||
        g_object_set (G_OBJECT(context->window), "accept_focus", FALSE, NULL);
 | 
			
		||||
        gtk_window_set_title (GTK_WINDOW(context->window), _("Keyboard"));
 | 
			
		||||
        gtk_window_set_title (GTK_WINDOW(context->window),
 | 
			
		||||
                              context->client_name ?
 | 
			
		||||
                              context->client_name :
 | 
			
		||||
                              _("Keyboard"));
 | 
			
		||||
        gtk_window_set_icon_name (GTK_WINDOW(context->window), "eekboard");
 | 
			
		||||
        gtk_window_set_keep_above (GTK_WINDOW(context->window), TRUE);
 | 
			
		||||
 | 
			
		||||
        g_signal_connect (context->window, "realize",
 | 
			
		||||
                          G_CALLBACK(on_realize), context);
 | 
			
		||||
 | 
			
		||||
        set_geometry (context);
 | 
			
		||||
    }
 | 
			
		||||
    gtk_container_add (GTK_CONTAINER(context->window), context->widget);
 | 
			
		||||
    set_geometry (context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@ -305,6 +400,7 @@ server_context_set_property (GObject      *object,
 | 
			
		||||
{
 | 
			
		||||
    ServerContext *context = SERVER_CONTEXT(object);
 | 
			
		||||
    GDBusConnection *connection;
 | 
			
		||||
    const gchar *ui_toolkit;
 | 
			
		||||
 | 
			
		||||
    switch (prop_id) {
 | 
			
		||||
    case PROP_OBJECT_PATH:
 | 
			
		||||
@ -318,6 +414,17 @@ server_context_set_property (GObject      *object,
 | 
			
		||||
            g_object_unref (context->connection);
 | 
			
		||||
        context->connection = g_object_ref (connection);
 | 
			
		||||
        break;
 | 
			
		||||
    case PROP_UI_TOOLKIT:
 | 
			
		||||
        ui_toolkit = g_value_get_string (value);
 | 
			
		||||
        if (g_strcmp0 (ui_toolkit, "gtk") == 0)
 | 
			
		||||
            context->ui_toolkit = UI_TOOLKIT_GTK;
 | 
			
		||||
#if HAVE_CLUTTER_GTK
 | 
			
		||||
        else if (g_strcmp0 (ui_toolkit, "clutter") == 0)
 | 
			
		||||
            context->ui_toolkit = UI_TOOLKIT_CLUTTER;
 | 
			
		||||
#endif  /* HAVE_CLUTTER_GTK */
 | 
			
		||||
        else
 | 
			
		||||
            g_warning ("unknown UI toolkit %s", ui_toolkit);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        g_object_set_property (object,
 | 
			
		||||
                               g_param_spec_get_name (pspec),
 | 
			
		||||
@ -362,6 +469,11 @@ server_context_dispose (GObject *object)
 | 
			
		||||
        context->introspection_data = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (context->settings) {
 | 
			
		||||
        g_object_unref (context->settings);
 | 
			
		||||
        context->settings = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    G_OBJECT_CLASS (server_context_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -372,6 +484,7 @@ server_context_finalize (GObject *object)
 | 
			
		||||
 | 
			
		||||
    g_free (context->object_path);
 | 
			
		||||
    g_free (context->client_connection);
 | 
			
		||||
    g_free (context->client_name);
 | 
			
		||||
 | 
			
		||||
    G_OBJECT_CLASS (server_context_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
@ -422,11 +535,30 @@ server_context_class_init (ServerContextClass *klass)
 | 
			
		||||
    g_object_class_install_property (gobject_class,
 | 
			
		||||
                                     PROP_CONNECTION,
 | 
			
		||||
                                     pspec);
 | 
			
		||||
 | 
			
		||||
    pspec = g_param_spec_string ("ui-toolkit",
 | 
			
		||||
                                 "UI toolkit",
 | 
			
		||||
                                 "UI toolkit",
 | 
			
		||||
                                 NULL,
 | 
			
		||||
                                 G_PARAM_WRITABLE);
 | 
			
		||||
    g_object_class_install_property (gobject_class,
 | 
			
		||||
                                     PROP_UI_TOOLKIT,
 | 
			
		||||
                                     pspec);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_monitors_changed (GdkScreen *screen,
 | 
			
		||||
                     gpointer   user_data)
 | 
			
		||||
{
 | 
			
		||||
    ServerContext *context = user_data;
 | 
			
		||||
    if (context->window)
 | 
			
		||||
        set_geometry (context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
server_context_init (ServerContext *context)
 | 
			
		||||
{
 | 
			
		||||
    GdkScreen *screen;
 | 
			
		||||
    GError *error;
 | 
			
		||||
 | 
			
		||||
    context->connection = NULL;
 | 
			
		||||
@ -451,6 +583,19 @@ server_context_init (ServerContext *context)
 | 
			
		||||
    context->window = NULL;
 | 
			
		||||
    context->key_pressed_handler = 0;
 | 
			
		||||
    context->key_released_handler = 0;
 | 
			
		||||
 | 
			
		||||
    context->ui_toolkit = UI_TOOLKIT_DEFAULT;
 | 
			
		||||
 | 
			
		||||
    context->settings = g_settings_new ("org.fedorahosted.eekboard");
 | 
			
		||||
    g_settings_bind (context->settings, "ui-toolkit",
 | 
			
		||||
                     context, "ui-toolkit",
 | 
			
		||||
                     G_SETTINGS_BIND_GET);
 | 
			
		||||
 | 
			
		||||
    screen = gdk_screen_get_default ();
 | 
			
		||||
    g_signal_connect (screen,
 | 
			
		||||
                      "monitors-changed",
 | 
			
		||||
                      G_CALLBACK(on_monitors_changed),
 | 
			
		||||
                      context);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@ -797,6 +942,7 @@ void
 | 
			
		||||
server_context_set_client_connection (ServerContext *context,
 | 
			
		||||
                                      const gchar   *client_connection)
 | 
			
		||||
{
 | 
			
		||||
    g_free (context->client_connection);
 | 
			
		||||
    context->client_connection = g_strdup (client_connection);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -805,3 +951,11 @@ server_context_get_client_connection (ServerContext *context)
 | 
			
		||||
{
 | 
			
		||||
    return context->client_connection;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
server_context_set_client_name (ServerContext *context,
 | 
			
		||||
                                const gchar   *client_name)
 | 
			
		||||
{
 | 
			
		||||
    g_free (context->client_name);
 | 
			
		||||
    context->client_name = g_strdup (client_name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -22,8 +22,8 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define SERVER_CONTEXT_PATH "/com/redhat/Eekboard/Context_%d"
 | 
			
		||||
#define SERVER_CONTEXT_INTERFACE "com.redhat.Eekboard.Context"
 | 
			
		||||
#define SERVER_CONTEXT_PATH "/org/fedorahosted/Eekboard/Context_%d"
 | 
			
		||||
#define SERVER_CONTEXT_INTERFACE "org.fedorahosted.Eekboard.Context"
 | 
			
		||||
 | 
			
		||||
#define SERVER_TYPE_CONTEXT (server_context_get_type())
 | 
			
		||||
#define SERVER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_CONTEXT, ServerContext))
 | 
			
		||||
@ -43,6 +43,9 @@ void           server_context_set_client_connection
 | 
			
		||||
                                           const gchar     *client_connection);
 | 
			
		||||
const gchar   *server_context_get_client_connection
 | 
			
		||||
                                          (ServerContext   *context);
 | 
			
		||||
void           server_context_set_client_name
 | 
			
		||||
                                          (ServerContext   *context,
 | 
			
		||||
                                           const gchar     *client_name);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
#endif  /* SERVER_CONTEXT_H */
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,7 @@ static guint signals[LAST_SIGNAL] = { 0, };
 | 
			
		||||
 | 
			
		||||
static const gchar introspection_xml[] =
 | 
			
		||||
    "<node>"
 | 
			
		||||
    "  <interface name='com.redhat.Eekboard.Server'>"
 | 
			
		||||
    "  <interface name='org.fedorahosted.Eekboard.Server'>"
 | 
			
		||||
    "    <method name='CreateContext'>"
 | 
			
		||||
    "      <arg direction='in' type='s' name='client_name'/>"
 | 
			
		||||
    "      <arg direction='out' type='s' name='object_path'/>"
 | 
			
		||||
@ -321,6 +321,7 @@ handle_method_call (GDBusConnection       *connection,
 | 
			
		||||
        object_path = g_strdup_printf (SERVER_CONTEXT_PATH, context_id++);
 | 
			
		||||
        context = server_context_new (object_path, server->connection);
 | 
			
		||||
        server_context_set_client_connection (context, sender);
 | 
			
		||||
        server_context_set_client_name (context, client_name);
 | 
			
		||||
        g_hash_table_insert (server->context_hash,
 | 
			
		||||
                             object_path,
 | 
			
		||||
                             context);
 | 
			
		||||
@ -367,6 +368,17 @@ handle_method_call (GDBusConnection       *connection,
 | 
			
		||||
        if (server->context_stack) {
 | 
			
		||||
            ServerContext *context = server->context_stack->data;
 | 
			
		||||
 | 
			
		||||
            if (g_strcmp0 (server_context_get_client_connection (context),
 | 
			
		||||
                           sender) != 0) {
 | 
			
		||||
                g_dbus_method_invocation_return_error
 | 
			
		||||
                    (invocation,
 | 
			
		||||
                     G_IO_ERROR,
 | 
			
		||||
                     G_IO_ERROR_FAILED_HANDLED,
 | 
			
		||||
                     "the current context not owned by %s",
 | 
			
		||||
                     sender);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
                
 | 
			
		||||
            server_context_set_enabled (context, FALSE);
 | 
			
		||||
            server->context_stack = g_slist_next (server->context_stack);
 | 
			
		||||
            g_object_unref (context);
 | 
			
		||||
 | 
			
		||||
@ -22,8 +22,8 @@
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define SERVER_SERVER_PATH "/com/redhat/Eekboard/Server"
 | 
			
		||||
#define SERVER_SERVER_INTERFACE "com.redhat.Eekboard.Server"
 | 
			
		||||
#define SERVER_SERVER_PATH "/org/fedorahosted/Eekboard/Server"
 | 
			
		||||
#define SERVER_SERVER_INTERFACE "org.fedorahosted.Eekboard.Server"
 | 
			
		||||
 | 
			
		||||
#define SERVER_TYPE_SERVER (server_server_get_type())
 | 
			
		||||
#define SERVER_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_SERVER, ServerServer))
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,7 @@
 | 
			
		||||
#include <gdk/gdkx.h>
 | 
			
		||||
#include <glib/gi18n.h>
 | 
			
		||||
 | 
			
		||||
#include "eek/eek-xml.h"
 | 
			
		||||
#include "eek/eek.h"
 | 
			
		||||
#include "eek/eek-xkl.h"
 | 
			
		||||
 | 
			
		||||
#if HAVE_CLUTTER_GTK
 | 
			
		||||
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user