Compare commits
	
		
			41 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 | 
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -47,7 +47,6 @@ tests/eek-xml-test
 | 
				
			|||||||
src/eekboard
 | 
					src/eekboard
 | 
				
			||||||
src/eekboard-server
 | 
					src/eekboard-server
 | 
				
			||||||
src/eekboard-xml
 | 
					src/eekboard-xml
 | 
				
			||||||
src/eekboard-server.service
 | 
					 | 
				
			||||||
docs/reference/eek/*.stamp
 | 
					docs/reference/eek/*.stamp
 | 
				
			||||||
docs/reference/eek/*.txt
 | 
					docs/reference/eek/*.txt
 | 
				
			||||||
docs/reference/eek/eek.types
 | 
					docs/reference/eek/eek.types
 | 
				
			||||||
@ -76,6 +75,8 @@ po/stamp-it
 | 
				
			|||||||
po/.intltool-merge-cache
 | 
					po/.intltool-merge-cache
 | 
				
			||||||
bindings/vala/*.vapi
 | 
					bindings/vala/*.vapi
 | 
				
			||||||
py-compile
 | 
					py-compile
 | 
				
			||||||
 | 
					data/org.fedorahosted.eekboard.gschema.xml
 | 
				
			||||||
 | 
					data/eekboard-server.service
 | 
				
			||||||
data/*.desktop
 | 
					data/*.desktop
 | 
				
			||||||
examples/eekboard-inscript/eekboard-inscript
 | 
					examples/eekboard-inscript/eekboard-inscript
 | 
				
			||||||
examples/simple-client/simple-client
 | 
					examples/simple-client/simple-client
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								README
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								README
									
									
									
									
									
								
							@ -8,7 +8,7 @@ tools to implement desktop virtual keyboards.
 | 
				
			|||||||
** Dependencies
 | 
					** Dependencies
 | 
				
			||||||
 | 
					
 | 
				
			||||||
REQUIRED: GLib2, GTK, PangoCairo, libxklavier, libcroco
 | 
					REQUIRED: GLib2, GTK, PangoCairo, libxklavier, libcroco
 | 
				
			||||||
OPTIONAL: fakekey, at-spi2-core, Clutter, Clutter-Gtk, Python, Vala, gobject-introspection
 | 
					OPTIONAL: libXtst, at-spi2-core, IBus, Clutter, Clutter-Gtk, Python, Vala, gobject-introspection
 | 
				
			||||||
 | 
					
 | 
				
			||||||
** Build from git repo
 | 
					** Build from git repo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -26,25 +26,49 @@ dist_vapi_DATA = \
 | 
				
			|||||||
MAINTAINERCLEANFILES = $(dist_vapi_DATA)
 | 
					MAINTAINERCLEANFILES = $(dist_vapi_DATA)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eek-$(EEK_API_VERSION).vapi:
 | 
					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-$(EEK_API_VERSION)/eek-$(EEK_API_VERSION).gi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eek-clutter-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
 | 
					eek-clutter-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
 | 
				
			||||||
	vapigen --vapidir=$(builddir) --library eek-clutter-$(EEK_API_VERSION) \
 | 
						$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
 | 
				
			||||||
		--pkg eek-$(EEK_API_VERSION) --pkg clutter-1.0 \
 | 
							--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-clutter-$(EEK_API_VERSION)/eek-clutter-$(EEK_API_VERSION).gi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eek-gtk-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
 | 
					eek-gtk-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
 | 
				
			||||||
	vapigen --vapidir=$(builddir) --library eek-gtk-$(EEK_API_VERSION) \
 | 
						$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
 | 
				
			||||||
		--pkg eek-$(EEK_API_VERSION) --pkg gtk+-2.0 \
 | 
							--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-gtk-$(EEK_API_VERSION)/eek-gtk-$(EEK_API_VERSION).gi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eek-xkb-$(EEK_API_VERSION).vapi: eek-$(EEK_API_VERSION).vapi
 | 
					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 eek-$(EEK_API_VERSION) \
 | 
				
			||||||
 | 
							--pkg gio-2.0 \
 | 
				
			||||||
		eek-xkb-$(EEK_API_VERSION)/eek-xkb-$(EEK_API_VERSION).gi
 | 
							eek-xkb-$(EEK_API_VERSION)/eek-xkb-$(EEK_API_VERSION).gi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eek-xkl-$(EEK_API_VERSION).vapi: eek-xkb-$(EEK_API_VERSION).vapi
 | 
					eek-xkl-$(EEK_API_VERSION).vapi: eek-xkb-$(EEK_API_VERSION).vapi
 | 
				
			||||||
	vapigen --vapidir=$(builddir) --library eek-xkl-$(EEK_API_VERSION) \
 | 
						$(VAPIGEN_V)$(VAPIGEN) --vapidir=$(builddir) \
 | 
				
			||||||
		--pkg eek-$(EEK_API_VERSION) --pkg eek-xkb-$(EEK_API_VERSION) \
 | 
							--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
 | 
							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.90/eek/eek-container.h
 | 
				
			||||||
include/eek-0.1/eek/eek-element.h
 | 
					include/eek-0.90/eek/eek-element.h
 | 
				
			||||||
include/eek-0.1/eek/eek-container.h
 | 
					include/eek-0.90/eek/eek-enumtypes.h
 | 
				
			||||||
include/eek-0.1/eek/eek-keyboard.h
 | 
					include/eek-0.90/eek/eek-keyboard.h
 | 
				
			||||||
include/eek-0.1/eek/eek-section.h
 | 
					include/eek-0.90/eek/eek-key.h
 | 
				
			||||||
include/eek-0.1/eek/eek-key.h
 | 
					include/eek-0.90/eek/eek-keysym.h
 | 
				
			||||||
include/eek-0.1/eek/eek-types.h
 | 
					include/eek-0.90/eek/eek-layout.h
 | 
				
			||||||
include/eek-0.1/eek/eek-keysym.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
 | 
					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.90/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
 | 
					 | 
				
			||||||
lib/libeek-clutter.so
 | 
					lib/libeek-clutter.so
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -1,85 +1,28 @@
 | 
				
			|||||||
<?xml version="1.0"?>
 | 
					<?xml version="1.0"?>
 | 
				
			||||||
<api version="1.0">
 | 
					<api version="1.0">
 | 
				
			||||||
	<namespace name="EekClutter">
 | 
						<namespace name="EekClutter">
 | 
				
			||||||
		<object name="EekClutterDrawingContext" parent="GInitiallyUnowned" type-name="EekClutterDrawingContext" get-type="eek_clutter_drawing_context_get_type">
 | 
							<object name="EekClutterKeyboard" parent="ClutterGroup" type-name="EekClutterKeyboard" get-type="eek_clutter_keyboard_get_type">
 | 
				
			||||||
			<method name="get_category_font" symbol="eek_clutter_drawing_context_get_category_font">
 | 
								<implements>
 | 
				
			||||||
				<return-type type="PangoFontDescription*"/>
 | 
									<interface name="ClutterScriptable"/>
 | 
				
			||||||
				<parameters>
 | 
									<interface name="ClutterAnimatable"/>
 | 
				
			||||||
					<parameter name="context" type="EekClutterDrawingContext*"/>
 | 
									<interface name="AtkImplementor"/>
 | 
				
			||||||
					<parameter name="category" type="EekKeysymCategory"/>
 | 
									<interface name="ClutterContainer"/>
 | 
				
			||||||
				</parameters>
 | 
								</implements>
 | 
				
			||||||
			</method>
 | 
								<constructor name="new" symbol="eek_clutter_keyboard_new">
 | 
				
			||||||
			<method name="get_outline_texture" symbol="eek_clutter_drawing_context_get_outline_texture">
 | 
					 | 
				
			||||||
				<return-type type="ClutterActor*"/>
 | 
									<return-type type="ClutterActor*"/>
 | 
				
			||||||
				<parameters>
 | 
									<parameters>
 | 
				
			||||||
					<parameter name="context" type="EekClutterDrawingContext*"/>
 | 
										<parameter name="keyboard" type="EekKeyboard*"/>
 | 
				
			||||||
					<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"/>
 | 
					 | 
				
			||||||
				</parameters>
 | 
									</parameters>
 | 
				
			||||||
			</constructor>
 | 
								</constructor>
 | 
				
			||||||
		</object>
 | 
								<method name="set_theme" symbol="eek_clutter_keyboard_set_theme">
 | 
				
			||||||
		<object name="EekClutterKeyboard" parent="EekKeyboard" type-name="EekClutterKeyboard" get-type="eek_clutter_keyboard_get_type">
 | 
									<return-type type="void"/>
 | 
				
			||||||
			<method name="get_actor" symbol="eek_clutter_keyboard_get_actor">
 | 
					 | 
				
			||||||
				<return-type type="ClutterActor*"/>
 | 
					 | 
				
			||||||
				<parameters>
 | 
									<parameters>
 | 
				
			||||||
					<parameter name="keyboard" type="EekClutterKeyboard*"/>
 | 
										<parameter name="keyboard" type="EekClutterKeyboard*"/>
 | 
				
			||||||
 | 
										<parameter name="theme" type="EekTheme*"/>
 | 
				
			||||||
				</parameters>
 | 
									</parameters>
 | 
				
			||||||
			</method>
 | 
								</method>
 | 
				
			||||||
			<constructor name="new" symbol="eek_clutter_keyboard_new">
 | 
								<property name="keyboard" type="EekKeyboard*" readable="0" writable="1" construct="0" construct-only="1"/>
 | 
				
			||||||
				<return-type type="EekKeyboard*"/>
 | 
					 | 
				
			||||||
			</constructor>
 | 
					 | 
				
			||||||
		</object>
 | 
							</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_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>
 | 
						</namespace>
 | 
				
			||||||
</api>
 | 
					</api>
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,2 @@
 | 
				
			|||||||
include/eek-0.1/eek/eek-gtk-keyboard.h
 | 
					include/eek-0.90/eek/eek-gtk-keyboard.h
 | 
				
			||||||
include/eek-0.1/eek/eek-gtk.h
 | 
					 | 
				
			||||||
lib/libeek-gtk.so
 | 
					lib/libeek-gtk.so
 | 
				
			||||||
 | 
				
			|||||||
@ -1,18 +1,26 @@
 | 
				
			|||||||
<?xml version="1.0"?>
 | 
					<?xml version="1.0"?>
 | 
				
			||||||
<api version="1.0">
 | 
					<api version="1.0">
 | 
				
			||||||
	<namespace name="EekGtk">
 | 
						<namespace name="EekGtk">
 | 
				
			||||||
		<object name="EekGtkKeyboard" parent="EekKeyboard" type-name="EekGtkKeyboard" get-type="eek_gtk_keyboard_get_type">
 | 
							<object name="EekGtkKeyboard" parent="GtkDrawingArea" type-name="EekGtkKeyboard" get-type="eek_gtk_keyboard_get_type">
 | 
				
			||||||
			<method name="get_widget" symbol="eek_gtk_keyboard_get_widget">
 | 
								<implements>
 | 
				
			||||||
 | 
									<interface name="AtkImplementor"/>
 | 
				
			||||||
 | 
									<interface name="GtkBuildable"/>
 | 
				
			||||||
 | 
								</implements>
 | 
				
			||||||
 | 
								<constructor name="new" symbol="eek_gtk_keyboard_new">
 | 
				
			||||||
				<return-type type="GtkWidget*"/>
 | 
									<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>
 | 
									<parameters>
 | 
				
			||||||
					<parameter name="keyboard" type="EekGtkKeyboard*"/>
 | 
										<parameter name="keyboard" type="EekGtkKeyboard*"/>
 | 
				
			||||||
 | 
										<parameter name="theme" type="EekTheme*"/>
 | 
				
			||||||
				</parameters>
 | 
									</parameters>
 | 
				
			||||||
			</method>
 | 
								</method>
 | 
				
			||||||
			<constructor name="new" symbol="eek_gtk_keyboard_new">
 | 
								<property name="keyboard" type="EekKeyboard*" readable="0" writable="1" construct="0" construct-only="1"/>
 | 
				
			||||||
				<return-type type="EekKeyboard*"/>
 | 
					 | 
				
			||||||
			</constructor>
 | 
					 | 
				
			||||||
		</object>
 | 
							</object>
 | 
				
			||||||
		<constant name="EEK_GTK_H" type="int" value="1"/>
 | 
					 | 
				
			||||||
		<constant name="EEK_GTK_KEYBOARD_H" type="int" value="1"/>
 | 
							<constant name="EEK_GTK_KEYBOARD_H" type="int" value="1"/>
 | 
				
			||||||
	</namespace>
 | 
						</namespace>
 | 
				
			||||||
</api>
 | 
					</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
 | 
					lib/libeek-xkb.so
 | 
				
			||||||
 | 
				
			|||||||
@ -1,10 +1,7 @@
 | 
				
			|||||||
<?xml version="1.0"?>
 | 
					<?xml version="1.0"?>
 | 
				
			||||||
<api version="1.0">
 | 
					<api version="1.0">
 | 
				
			||||||
	<namespace name="EekXkb">
 | 
						<namespace name="EekXkb">
 | 
				
			||||||
		<object name="EekXkbLayout" parent="GInitiallyUnowned" type-name="EekXkbLayout" get-type="eek_xkb_layout_get_type">
 | 
							<object name="EekXkbLayout" parent="EekLayout" type-name="EekXkbLayout" get-type="eek_xkb_layout_get_type">
 | 
				
			||||||
			<implements>
 | 
					 | 
				
			||||||
				<interface name="EekLayout"/>
 | 
					 | 
				
			||||||
			</implements>
 | 
					 | 
				
			||||||
			<method name="get_geometry" symbol="eek_xkb_layout_get_geometry">
 | 
								<method name="get_geometry" symbol="eek_xkb_layout_get_geometry">
 | 
				
			||||||
				<return-type type="gchar*"/>
 | 
									<return-type type="gchar*"/>
 | 
				
			||||||
				<parameters>
 | 
									<parameters>
 | 
				
			||||||
@ -49,6 +46,19 @@
 | 
				
			|||||||
				</parameters>
 | 
									</parameters>
 | 
				
			||||||
			</method>
 | 
								</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">
 | 
								<method name="set_symbols" symbol="eek_xkb_layout_set_symbols">
 | 
				
			||||||
				<return-type type="gboolean"/>
 | 
									<return-type type="gboolean"/>
 | 
				
			||||||
				<parameters>
 | 
									<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
 | 
					lib/libeek-xkl.so
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -2,9 +2,6 @@
 | 
				
			|||||||
<api version="1.0">
 | 
					<api version="1.0">
 | 
				
			||||||
	<namespace name="EekXkl">
 | 
						<namespace name="EekXkl">
 | 
				
			||||||
		<object name="EekXklLayout" parent="EekXkbLayout" type-name="EekXklLayout" get-type="eek_xkl_layout_get_type">
 | 
							<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">
 | 
								<method name="disable_option" symbol="eek_xkl_layout_disable_option">
 | 
				
			||||||
				<return-type type="gboolean"/>
 | 
									<return-type type="gboolean"/>
 | 
				
			||||||
				<parameters>
 | 
									<parameters>
 | 
				
			||||||
@ -53,6 +50,25 @@
 | 
				
			|||||||
			<constructor name="new" symbol="eek_xkl_layout_new">
 | 
								<constructor name="new" symbol="eek_xkl_layout_new">
 | 
				
			||||||
				<return-type type="EekLayout*"/>
 | 
									<return-type type="EekLayout*"/>
 | 
				
			||||||
			</constructor>
 | 
								</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">
 | 
								<method name="set_layouts" symbol="eek_xkl_layout_set_layouts">
 | 
				
			||||||
				<return-type type="gboolean"/>
 | 
									<return-type type="gboolean"/>
 | 
				
			||||||
				<parameters>
 | 
									<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
 | 
				
			||||||
							
								
								
									
										209
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										209
									
								
								configure.ac
									
									
									
									
									
								
							@ -20,7 +20,7 @@ AC_PREREQ(2.63)
 | 
				
			|||||||
dnl AC_CONFIG_SRCDIR([configure.ac])
 | 
					dnl AC_CONFIG_SRCDIR([configure.ac])
 | 
				
			||||||
AC_CONFIG_MACRO_DIR([m4])
 | 
					AC_CONFIG_MACRO_DIR([m4])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AC_INIT([eekboard], [0.90.7], [ueno@unixuser.org])
 | 
					AC_INIT([eekboard], [1.0.1], [ueno@unixuser.org])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dnl Init automake
 | 
					dnl Init automake
 | 
				
			||||||
AM_INIT_AUTOMAKE
 | 
					AM_INIT_AUTOMAKE
 | 
				
			||||||
@ -89,6 +89,8 @@ PKG_CHECK_MODULES([GLIB2], [glib-2.0 >= 2.26.0], ,
 | 
				
			|||||||
  [AC_MSG_ERROR([GLib2 not found])])
 | 
					  [AC_MSG_ERROR([GLib2 not found])])
 | 
				
			||||||
PKG_CHECK_MODULES([GIO2], [gio-2.0], ,
 | 
					PKG_CHECK_MODULES([GIO2], [gio-2.0], ,
 | 
				
			||||||
  [AC_MSG_ERROR([Gio2 not found])])
 | 
					  [AC_MSG_ERROR([Gio2 not found])])
 | 
				
			||||||
 | 
					GLIB_GSETTINGS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo], ,
 | 
					PKG_CHECK_MODULES([PANGOCAIRO], [pangocairo], ,
 | 
				
			||||||
  [AC_MSG_ERROR([PangoCairo not found])])
 | 
					  [AC_MSG_ERROR([PangoCairo not found])])
 | 
				
			||||||
PKG_CHECK_MODULES([GTK], [
 | 
					PKG_CHECK_MODULES([GTK], [
 | 
				
			||||||
@ -102,114 +104,192 @@ PKG_CHECK_MODULES([LIBXKLAVIER], [libxklavier x11], ,
 | 
				
			|||||||
PKG_CHECK_MODULES([LIBCROCO], [libcroco-0.6], ,
 | 
					PKG_CHECK_MODULES([LIBCROCO], [libcroco-0.6], ,
 | 
				
			||||||
  [AC_MSG_ERROR([libcroco not found])])
 | 
					  [AC_MSG_ERROR([libcroco not found])])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dnl use libfakekey to generate key events
 | 
					dnl use XTest to generate key events
 | 
				
			||||||
AC_MSG_CHECKING([whether you enable fakekey])
 | 
					AC_MSG_CHECKING([whether you enable XTest])
 | 
				
			||||||
AC_ARG_ENABLE(fakekey,
 | 
					AC_ARG_ENABLE(xtest,
 | 
				
			||||||
              AS_HELP_STRING([--enable-fakekey=no/yes],
 | 
					              AS_HELP_STRING([--enable-xtest=no/yes],
 | 
				
			||||||
                             [Enable fakekey default=yes]),,
 | 
					                             [Enable XTest default=yes]),
 | 
				
			||||||
              enable_fakekey=yes)
 | 
					              enable_xtest=$enableval,
 | 
				
			||||||
 | 
					              enable_xtest=yes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if test x$enable_fakekey = xyes; then
 | 
					if test x$enable_xtest = xyes; then
 | 
				
			||||||
  PKG_CHECK_MODULES([FAKEKEY], [libfakekey], ,
 | 
					  PKG_CHECK_MODULES([XTEST], [xtst], , enable_xtest=no)
 | 
				
			||||||
    [AC_MSG_ERROR([fakekey not found])])
 | 
					  if test x$enable_xtest = xyes; then
 | 
				
			||||||
  AC_DEFINE([HAVE_FAKEKEY], [1], [Define if fakekey is found])
 | 
					    AC_DEFINE([HAVE_XTEST], [1], [Define if XTest is found])
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
AM_CONDITIONAL(ENABLE_FAKEKEY, [test x$enable_fakekey = xyes])
 | 
					AM_CONDITIONAL(ENABLE_XTEST, [test x$enable_xtest = xyes])
 | 
				
			||||||
AC_MSG_RESULT($enable_fakekey)
 | 
					AC_MSG_RESULT($enable_xtest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dnl use X to mark the fullscreen window as dock
 | 
				
			||||||
 | 
					AC_MSG_CHECKING([whether you enable X dock])
 | 
				
			||||||
 | 
					AC_ARG_ENABLE(x-dock,
 | 
				
			||||||
 | 
					              AS_HELP_STRING([--enable-x-dock=no/yes],
 | 
				
			||||||
 | 
					                             [Enable X dock default=yes]),
 | 
				
			||||||
 | 
					              enable_x_dock=$enableval,
 | 
				
			||||||
 | 
					              enable_x_dock=yes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test x$enable_x_dock = xyes; then
 | 
				
			||||||
 | 
					  PKG_CHECK_MODULES([XDOCK], [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
 | 
					dnl use AT-SPI 2 to capture focus/keystroke events
 | 
				
			||||||
AC_MSG_CHECKING([whether you enable AT-SPI 2 event handling])
 | 
					AC_MSG_CHECKING([whether you enable AT-SPI 2 event handling])
 | 
				
			||||||
AC_ARG_ENABLE(atspi,
 | 
					AC_ARG_ENABLE(atspi,
 | 
				
			||||||
              AS_HELP_STRING([--enable-atspi=no/yes],
 | 
					              AS_HELP_STRING([--enable-atspi=no/yes],
 | 
				
			||||||
                             [Enable AT-SPI 2 event handling default=no]),,
 | 
					                             [Enable AT-SPI 2 event handling default=yes]),
 | 
				
			||||||
              enable_atspi=no)
 | 
					              enable_atspi=$enableval,
 | 
				
			||||||
 | 
					              enable_atspi=yes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if test x$enable_atspi = xyes; then
 | 
					if test x$enable_atspi = xyes; then
 | 
				
			||||||
  PKG_CHECK_MODULES([ATSPI2], [atspi-2 dbus-glib-1], ,
 | 
					  PKG_CHECK_MODULES([ATSPI2], [atspi-2 dbus-glib-1], , enable_atspi=no)
 | 
				
			||||||
    [AC_MSG_ERROR([AT-SPI 2 not found])])
 | 
					  if test x$enable_atspi = xyes; then
 | 
				
			||||||
  AC_DEFINE([HAVE_ATSPI], [1], [Define if AT-SPI 2 is found])
 | 
					    AC_DEFINE([HAVE_ATSPI], [1], [Define if AT-SPI 2 is found])
 | 
				
			||||||
 | 
					    focus_listeners="atspi $focus_listeners"
 | 
				
			||||||
 | 
					    keystroke_listeners="atspi $keystroke_listeners"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
AC_MSG_RESULT($enable_atspi)
 | 
					AC_MSG_RESULT($enable_atspi)
 | 
				
			||||||
AM_CONDITIONAL(ENABLE_ATSPI, [test x$enable_atspi = xyes])
 | 
					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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dnl Python language binding
 | 
					dnl Python language binding
 | 
				
			||||||
AC_MSG_CHECKING([whether you enable Python language support])
 | 
					AC_MSG_CHECKING([whether you enable Python language support])
 | 
				
			||||||
AC_ARG_ENABLE(python,
 | 
					AC_ARG_ENABLE(python,
 | 
				
			||||||
              AS_HELP_STRING([--enable-python=no/yes],
 | 
					              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)
 | 
					              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
 | 
					if test x"$enable_python" = x"yes"; then
 | 
				
			||||||
    # check python
 | 
					  if test x$enable_python = xyes; then
 | 
				
			||||||
    AM_PATH_PYTHON([2.5])
 | 
					    AC_PATH_PROGS(PYTHON_CONFIG, [python$PYTHON_VERSION-config python-config])
 | 
				
			||||||
    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"$PYTHON_CONFIG" != x""; then
 | 
					    if test x"$PYTHON_CONFIG" != x""; then
 | 
				
			||||||
        PYTHON_CFLAGS=`$PYTHON_CONFIG --includes`
 | 
					      PYTHON_CFLAGS=`$PYTHON_CONFIG --includes`
 | 
				
			||||||
        PYTHON_LIBS=`$PYTHON_CONFIG --libs`
 | 
					      PYTHON_LIBS=`$PYTHON_CONFIG --libs`
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        PYTHON_CFLAGS=`$PYTHON $srcdir/python-config.py --includes`
 | 
					      PYTHON_CFLAGS=`$PYTHON $srcdir/python-config.py --includes`
 | 
				
			||||||
        PYTHON_LIBS=`$PYTHON $srcdir/python-config.py --libs`
 | 
					      PYTHON_LIBS=`$PYTHON $srcdir/python-config.py --libs`
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
    PYTHON_INCLUDES="$PYTHON_CFLAGS"
 | 
					    PYTHON_INCLUDES="$PYTHON_CFLAGS"
 | 
				
			||||||
    AC_SUBST(PYTHON_CFLAGS)
 | 
					    AC_SUBST(PYTHON_CFLAGS)
 | 
				
			||||||
    AC_SUBST(PYTHON_INCLUDES)
 | 
					    AC_SUBST(PYTHON_INCLUDES)
 | 
				
			||||||
    AC_SUBST(PYTHON_LIBS)
 | 
					    AC_SUBST(PYTHON_LIBS)
 | 
				
			||||||
else
 | 
					  fi
 | 
				
			||||||
    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
 | 
					dnl Vala langauge binding
 | 
				
			||||||
AC_MSG_CHECKING([whether you enable Vala language support])
 | 
					AC_MSG_CHECKING([whether you enable Vala language support])
 | 
				
			||||||
AC_ARG_ENABLE(vala,
 | 
					AC_ARG_ENABLE(vala,
 | 
				
			||||||
              AS_HELP_STRING([--enable-vala=no/yes],
 | 
					              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)
 | 
					              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)
 | 
					AC_MSG_RESULT($enable_vala)
 | 
				
			||||||
AM_CONDITIONAL(ENABLE_VALA, [test x$enable_vala = xyes])
 | 
					AM_CONDITIONAL(ENABLE_VALA, [test x$enable_vala = xyes])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dnl standalone application
 | 
					dnl clutter
 | 
				
			||||||
AC_MSG_CHECKING([whether you enable eekboard])
 | 
					AC_MSG_CHECKING([whether you enable clutter])
 | 
				
			||||||
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])
 | 
					 | 
				
			||||||
AC_ARG_ENABLE(clutter,
 | 
					AC_ARG_ENABLE(clutter,
 | 
				
			||||||
              AS_HELP_STRING([--enable-clutter=no/yes],
 | 
					              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)
 | 
					              enable_clutter=no)
 | 
				
			||||||
AC_MSG_RESULT($enable_clutter)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
if test x$enable_clutter = xyes; then
 | 
					if test x$enable_clutter = xyes; then
 | 
				
			||||||
  PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], ,
 | 
					  PKG_CHECK_MODULES([CLUTTER], [clutter-1.0], , enable_clutter=no)
 | 
				
			||||||
    [AC_MSG_ERROR([Clutter not found -- install it or add --disable-clutter])])
 | 
					  if test x$enable_clutter = xyes; then
 | 
				
			||||||
  AC_DEFINE([HAVE_CLUTTER], [1], [Define if Clutter is found])
 | 
					    AC_DEFINE([HAVE_CLUTTER], [1], [Define if clutter is found])
 | 
				
			||||||
  have_clutter_gtk=0
 | 
					  fi
 | 
				
			||||||
  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])
 | 
					 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
AM_CONDITIONAL(ENABLE_CLUTTER, [test x$enable_clutter = xyes])
 | 
					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])
 | 
					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
 | 
					dnl define GETTEXT_* variables
 | 
				
			||||||
GETTEXT_PACKAGE=$PACKAGE
 | 
					GETTEXT_PACKAGE=$PACKAGE
 | 
				
			||||||
AC_SUBST(GETTEXT_PACKAGE)
 | 
					AC_SUBST(GETTEXT_PACKAGE)
 | 
				
			||||||
@ -217,8 +297,6 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define to the read-only
 | 
				
			|||||||
AM_GLIB_GNU_GETTEXT
 | 
					AM_GLIB_GNU_GETTEXT
 | 
				
			||||||
AM_GLIB_DEFINE_LOCALEDIR(EEKBOARD_LOCALEDIR)
 | 
					AM_GLIB_DEFINE_LOCALEDIR(EEKBOARD_LOCALEDIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GOBJECT_INTROSPECTION_CHECK([0.9.0])
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
AC_CONFIG_HEADERS([config.h])
 | 
					AC_CONFIG_HEADERS([config.h])
 | 
				
			||||||
AC_CONFIG_FILES([Makefile
 | 
					AC_CONFIG_FILES([Makefile
 | 
				
			||||||
eek/Makefile
 | 
					eek/Makefile
 | 
				
			||||||
@ -266,5 +344,6 @@ Build options:
 | 
				
			|||||||
  Build Vala binding        $enable_vala
 | 
					  Build Vala binding        $enable_vala
 | 
				
			||||||
  Build Python binding      $enable_python
 | 
					  Build Python binding      $enable_python
 | 
				
			||||||
  Build document            $enable_gtk_doc
 | 
					  Build document            $enable_gtk_doc
 | 
				
			||||||
  Support accessibility     $enable_atspi
 | 
					  Focus listeners           $focus_listeners
 | 
				
			||||||
 | 
					  Keystroke listeners       $keystroke_listeners
 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,17 @@
 | 
				
			|||||||
SUBDIRS = icons themes keyboards
 | 
					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
 | 
					desktopdir = $(datadir)/applications
 | 
				
			||||||
desktop_in_files = eekboard.desktop.in
 | 
					desktop_in_files = eekboard.desktop.in
 | 
				
			||||||
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
 | 
					desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
 | 
				
			||||||
@ -12,8 +24,8 @@ endif
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@INTLTOOL_DESKTOP_RULE@
 | 
					@INTLTOOL_DESKTOP_RULE@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CLEANFILES = $(desktop_DATA)
 | 
					CLEANFILES = $(service_DATA) $(desktop_DATA) $(gsettings_SCHEMAS)
 | 
				
			||||||
EXTRA_DIST = $(desktop_in_files)
 | 
					EXTRA_DIST = $(service_in_files) $(desktop_in_files) $(gsettings_schemas_in_files)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ENABLE_ATSPI
 | 
					if ENABLE_ATSPI
 | 
				
			||||||
CLEANFILES += $(autostart_DATA)
 | 
					CLEANFILES += $(autostart_DATA)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,3 @@
 | 
				
			|||||||
[D-BUS Service]
 | 
					[D-BUS Service]
 | 
				
			||||||
Name=com.redhat.Eekboard.Server
 | 
					Name=org.fedorahosted.Eekboard.Server
 | 
				
			||||||
Exec=@bindir@/eekboard-server
 | 
					Exec=@bindir@/eekboard-server
 | 
				
			||||||
							
								
								
									
										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>
 | 
				
			||||||
@ -96,7 +96,7 @@ libeek_la_SOURCES =				\
 | 
				
			|||||||
	$(srcdir)/eek-enumtypes.c		\
 | 
						$(srcdir)/eek-enumtypes.c		\
 | 
				
			||||||
	$(srcdir)/eek-marshalers.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
 | 
					libeek_la_LIBADD = $(GIO2_LIBS) $(PANGOCAIRO_LIBS) $(LIBCROCO_LIBS) -lm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ENABLE_CLUTTER
 | 
					if ENABLE_CLUTTER
 | 
				
			||||||
@ -116,7 +116,7 @@ libeek_clutter_sources =			\
 | 
				
			|||||||
	$(srcdir)/eek-clutter-renderer.c
 | 
						$(srcdir)/eek-clutter-renderer.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libeek_clutter_la_SOURCES = $(libeek_clutter_sources)
 | 
					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)
 | 
					libeek_clutter_la_LIBADD = libeek.la $(CLUTTER_LIBS)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -130,7 +130,7 @@ libeek_gtk_sources =				\
 | 
				
			|||||||
	$(srcdir)/eek-gtk-renderer.c
 | 
						$(srcdir)/eek-gtk-renderer.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libeek_gtk_la_SOURCES = $(libeek_gtk_sources)
 | 
					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_gtk_la_LIBADD = libeek.la $(GTK_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libeek_xkb_public_headers =			\
 | 
					libeek_xkb_public_headers =			\
 | 
				
			||||||
@ -141,7 +141,7 @@ libeek_xkb_sources =				\
 | 
				
			|||||||
	$(srcdir)/eek-xkb-layout.c
 | 
						$(srcdir)/eek-xkb-layout.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libeek_xkb_la_SOURCES = $(libeek_xkb_sources)
 | 
					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_xkb_la_LIBADD = libeek.la $(XKB_LIBS) $(GTK_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libeek_xkl_public_headers =			\
 | 
					libeek_xkl_public_headers =			\
 | 
				
			||||||
@ -152,7 +152,7 @@ libeek_xkl_sources =				\
 | 
				
			|||||||
	$(srcdir)/eek-xkl-layout.c
 | 
						$(srcdir)/eek-xkl-layout.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libeek_xkl_la_SOURCES = $(libeek_xkl_sources)
 | 
					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)
 | 
					libeek_xkl_la_LIBADD = libeek-xkb.la $(LIBXKLAVIER_LIBS) $(GTK_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek
 | 
					eekdir = $(includedir)/eek-$(EEK_API_VERSION)/eek
 | 
				
			||||||
 | 
				
			|||||||
@ -23,8 +23,8 @@ includedir=@includedir@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Name: EEK
 | 
					Name: EEK
 | 
				
			||||||
Description: A Library to Create Keyboard-like UI
 | 
					Description: A Library to Create Keyboard-like UI
 | 
				
			||||||
URL: http://ueno.github.com/eekboard/
 | 
					URL: http://fedorahosted.org/eekboard/
 | 
				
			||||||
Version: @VERSION@
 | 
					Version: @VERSION@
 | 
				
			||||||
Requires: gobject-2.0
 | 
					Requires: gobject-2.0 gio-2.0
 | 
				
			||||||
Libs: -L${libdir} -leek
 | 
					Libs: -L${libdir} -leek
 | 
				
			||||||
Cflags: -I${includedir}/eek-@EEK_API_VERSION@
 | 
					Cflags: -I${includedir}/eek-@EEK_API_VERSION@
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ includedir=@includedir@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Name: libeek-clutter
 | 
					Name: libeek-clutter
 | 
				
			||||||
Description: A Library to Create Keyboard-like UI (Clutter Support)
 | 
					Description: A Library to Create Keyboard-like UI (Clutter Support)
 | 
				
			||||||
URL: http://ueno.github.com/eekboard/
 | 
					URL: http://fedorahosted.org/eekboard/
 | 
				
			||||||
Version: @VERSION@
 | 
					Version: @VERSION@
 | 
				
			||||||
Requires: eek-@EEK_API_VERSION@ clutter-1.0
 | 
					Requires: eek-@EEK_API_VERSION@ clutter-1.0
 | 
				
			||||||
Libs: -L${libdir} -leek-clutter
 | 
					Libs: -L${libdir} -leek-clutter
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_CLUTTER_KEYBOARD_H
 | 
				
			||||||
#define EEK_CLUTTER_KEYBOARD_H 1
 | 
					#define EEK_CLUTTER_KEYBOARD_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_CONTAINER_H
 | 
				
			||||||
#define EEK_CONTAINER_H 1
 | 
					#define EEK_CONTAINER_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_ELEMENT_H
 | 
				
			||||||
#define EEK_ELEMENT_H 1
 | 
					#define EEK_ELEMENT_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,9 @@
 | 
				
			|||||||
/*** BEGIN file-header ***/
 | 
					/*** 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__
 | 
					#ifndef __EEK_ENUMTYPES_H__
 | 
				
			||||||
#define __EEK_ENUMTYPES_H__
 | 
					#define __EEK_ENUMTYPES_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ includedir=@includedir@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Name: libeek-gtk
 | 
					Name: libeek-gtk
 | 
				
			||||||
Description: A Library to Create Keyboard-like UI (GTK Support)
 | 
					Description: A Library to Create Keyboard-like UI (GTK Support)
 | 
				
			||||||
URL: http://ueno.github.com/eekboard/
 | 
					URL: http://fedorahosted.org/eekboard/
 | 
				
			||||||
Version: @VERSION@
 | 
					Version: @VERSION@
 | 
				
			||||||
Requires: eek-@EEK_API_VERSION@ gtk+-@GTK_API_VERSION@
 | 
					Requires: eek-@EEK_API_VERSION@ gtk+-@GTK_API_VERSION@
 | 
				
			||||||
Libs: -L${libdir} -leek-gtk
 | 
					Libs: -L${libdir} -leek-gtk
 | 
				
			||||||
 | 
				
			|||||||
@ -201,20 +201,32 @@ eek_gtk_keyboard_real_button_press_event (GtkWidget      *self,
 | 
				
			|||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean
 | 
					static void
 | 
				
			||||||
eek_gtk_keyboard_real_button_release_event (GtkWidget      *self,
 | 
					clear_dragged_key (EekGtkKeyboard *keyboard)
 | 
				
			||||||
                                            GdkEventButton *event)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(self);
 | 
					    EekGtkKeyboardPrivate *priv = EEK_GTK_KEYBOARD_GET_PRIVATE(keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (priv->dragged_key) {
 | 
					    if (priv->dragged_key) {
 | 
				
			||||||
        g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
 | 
					        g_signal_emit_by_name (priv->dragged_key, "released", priv->keyboard);
 | 
				
			||||||
        priv->dragged_key = NULL;
 | 
					        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;
 | 
					    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
 | 
					static void
 | 
				
			||||||
eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
 | 
					eek_gtk_keyboard_set_keyboard (EekGtkKeyboard *self,
 | 
				
			||||||
                               EekKeyboard    *keyboard)
 | 
					                               EekKeyboard    *keyboard)
 | 
				
			||||||
@ -308,6 +320,7 @@ eek_gtk_keyboard_class_init (EekGtkKeyboardClass *klass)
 | 
				
			|||||||
                              sizeof (EekGtkKeyboardPrivate));
 | 
					                              sizeof (EekGtkKeyboardPrivate));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    widget_class->realize = eek_gtk_keyboard_real_realize;
 | 
					    widget_class->realize = eek_gtk_keyboard_real_realize;
 | 
				
			||||||
 | 
					    widget_class->unmap = eek_gtk_keyboard_real_unmap;
 | 
				
			||||||
#if GTK_CHECK_VERSION (2, 91, 2)
 | 
					#if GTK_CHECK_VERSION (2, 91, 2)
 | 
				
			||||||
    widget_class->draw = eek_gtk_keyboard_real_draw;
 | 
					    widget_class->draw = eek_gtk_keyboard_real_draw;
 | 
				
			||||||
#else  /* GTK_CHECK_VERSION (2, 91, 2) */
 | 
					#else  /* GTK_CHECK_VERSION (2, 91, 2) */
 | 
				
			||||||
@ -434,6 +447,7 @@ on_key_released (EekKeyboard *keyboard,
 | 
				
			|||||||
                     large_bounds.width,
 | 
					                     large_bounds.width,
 | 
				
			||||||
                     large_bounds.height);
 | 
					                     large_bounds.height);
 | 
				
			||||||
    cairo_clip (cr);
 | 
					    cairo_clip (cr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    eek_renderer_render_keyboard (priv->renderer, cr);
 | 
					    eek_renderer_render_keyboard (priv->renderer, cr);
 | 
				
			||||||
    cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
 | 
					    cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
 | 
				
			||||||
    cairo_destroy (cr);
 | 
					    cairo_destroy (cr);
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_GTK_KEYBOARD_H
 | 
				
			||||||
#define EEK_GTK_KEYBOARD_H 1
 | 
					#define EEK_GTK_KEYBOARD_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_KEY_H
 | 
				
			||||||
#define EEK_KEY_H 1
 | 
					#define EEK_KEY_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_KEYBOARD_H
 | 
				
			||||||
#define EEK_KEYBOARD_H 1
 | 
					#define EEK_KEYBOARD_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_KEYSYM_H
 | 
				
			||||||
#define EEK_KEYSYM_H 1
 | 
					#define EEK_KEYSYM_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,10 @@
 | 
				
			|||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_LAYOUT_H
 | 
				
			||||||
#define EEK_LAYOUT_H 1
 | 
					#define EEK_LAYOUT_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -647,6 +647,7 @@ eek_renderer_real_render_keyboard (EekRenderer *self,
 | 
				
			|||||||
                                   cairo_t     *cr)
 | 
					                                   cairo_t     *cr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self);
 | 
					    EekRendererPrivate *priv = EEK_RENDERER_GET_PRIVATE(self);
 | 
				
			||||||
 | 
					    cairo_pattern_t *source;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_return_if_fail (priv->keyboard);
 | 
					    g_return_if_fail (priv->keyboard);
 | 
				
			||||||
    g_return_if_fail (priv->allocation_width > 0.0);
 | 
					    g_return_if_fail (priv->allocation_width > 0.0);
 | 
				
			||||||
@ -656,6 +657,8 @@ eek_renderer_real_render_keyboard (EekRenderer *self,
 | 
				
			|||||||
        priv->keyboard_surface = create_keyboard_surface (self);
 | 
					        priv->keyboard_surface = create_keyboard_surface (self);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    cairo_set_source_surface (cr, priv->keyboard_surface, 0.0, 0.0);
 | 
					    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);
 | 
					    cairo_paint (cr);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_SECTION_H
 | 
				
			||||||
#define EEK_SECTION_H 1
 | 
					#define EEK_SECTION_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,10 @@
 | 
				
			|||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef EEK_SERIALIZABLE_H
 | 
				
			||||||
#define EEK_SERIALIZABLE_H 1
 | 
					#define EEK_SERIALIZABLE_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_SYMBOL_H
 | 
				
			||||||
#define EEK_SYMBOL_H 1
 | 
					#define EEK_SYMBOL_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,9 @@
 | 
				
			|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
 | 
					/* -*- 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__
 | 
					#ifndef __EEK_THEME_H__
 | 
				
			||||||
#define __EEK_THEME_H__
 | 
					#define __EEK_THEME_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_TYPES_H
 | 
				
			||||||
#define EEK_TYPES_H 1
 | 
					#define EEK_TYPES_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ includedir=@includedir@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Name: libeek-xkb
 | 
					Name: libeek-xkb
 | 
				
			||||||
Description: A Library to Create Keyboard-like UI (XKB Support)
 | 
					Description: A Library to Create Keyboard-like UI (XKB Support)
 | 
				
			||||||
URL: http://ueno.github.com/eekboard/
 | 
					URL: http://fedorahosted.org/eekboard/
 | 
				
			||||||
Version: @VERSION@
 | 
					Version: @VERSION@
 | 
				
			||||||
Requires: eek-@EEK_API_VERSION@ gtk+-x11-@GTK_API_VERSION@
 | 
					Requires: eek-@EEK_API_VERSION@ gtk+-x11-@GTK_API_VERSION@
 | 
				
			||||||
Libs: -L${libdir} -leek-xkb
 | 
					Libs: -L${libdir} -leek-xkb
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_XKB_LAYOUT_H
 | 
				
			||||||
#define EEK_XKB_LAYOUT_H 1
 | 
					#define EEK_XKB_LAYOUT_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -23,7 +23,7 @@ includedir=@includedir@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Name: libeek-xkl
 | 
					Name: libeek-xkl
 | 
				
			||||||
Description: A Library to Create Keyboard-like UI (Libxklavier Support)
 | 
					Description: A Library to Create Keyboard-like UI (Libxklavier Support)
 | 
				
			||||||
URL: http://ueno.github.com/eekboard/
 | 
					URL: http://fedorahosted.org/eekboard/
 | 
				
			||||||
Version: @VERSION@
 | 
					Version: @VERSION@
 | 
				
			||||||
Requires: eek-xkb-@EEK_API_VERSION@ libxklavier
 | 
					Requires: eek-xkb-@EEK_API_VERSION@ libxklavier
 | 
				
			||||||
Libs: -L${libdir} -leek-xkl
 | 
					Libs: -L${libdir} -leek-xkl
 | 
				
			||||||
 | 
				
			|||||||
@ -17,6 +17,11 @@
 | 
				
			|||||||
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
 * 02110-1301 USA
 | 
					 * 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
 | 
					#ifndef EEK_XKL_LAYOUT_H
 | 
				
			||||||
#define EEK_XKL_LAYOUT_H 1
 | 
					#define EEK_XKL_LAYOUT_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,10 @@
 | 
				
			|||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef EEK_XML_LAYOUT_H
 | 
				
			||||||
#define EEK_XML_LAYOUT_H 1
 | 
					#define EEK_XML_LAYOUT_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -16,6 +16,10 @@
 | 
				
			|||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef EEK_XML_H
 | 
				
			||||||
#define EEK_XML_H 1
 | 
					#define EEK_XML_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -20,6 +20,8 @@
 | 
				
			|||||||
#ifndef EEK_H
 | 
					#ifndef EEK_H
 | 
				
			||||||
#define EEK_H 1
 | 
					#define EEK_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define __EEK_H_INSIDE__ 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eek-keyboard.h"
 | 
					#include "eek-keyboard.h"
 | 
				
			||||||
#include "eek-section.h"
 | 
					#include "eek-section.h"
 | 
				
			||||||
#include "eek-key.h"
 | 
					#include "eek-key.h"
 | 
				
			||||||
 | 
				
			|||||||
@ -47,6 +47,8 @@
 | 
				
			|||||||
0xFFE5 "⇪" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
					0xFFE5 "⇪" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
				
			||||||
0xFFE9 "Alt" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
					0xFFE9 "Alt" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
				
			||||||
0xFFEA "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
 | 
					0xFFEB "Super" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
				
			||||||
0xFFEC "Super" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
					0xFFEC "Super" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
				
			||||||
0xFFED "Hyper" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
					0xFFED "Hyper" EEK_SYMBOL_CATEGORY_KEYNAME
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,7 @@ libeekboard_sources =				\
 | 
				
			|||||||
	eekboard-context.c
 | 
						eekboard-context.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
libeekboard_la_SOURCES = $(libeekboard_sources)
 | 
					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)
 | 
					libeekboard_la_LIBADD = $(top_builddir)/eek/libeek.la $(GIO2_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard
 | 
					eekboarddir = $(includedir)/eekboard-$(EEK_API_VERSION)/eekboard
 | 
				
			||||||
 | 
				
			|||||||
@ -25,6 +25,6 @@ Name: Eekboard
 | 
				
			|||||||
Description: A Library to Create Keyboard-like UI
 | 
					Description: A Library to Create Keyboard-like UI
 | 
				
			||||||
URL: http://ueno.github.com/eekboard/
 | 
					URL: http://ueno.github.com/eekboard/
 | 
				
			||||||
Version: @VERSION@
 | 
					Version: @VERSION@
 | 
				
			||||||
Requires: gobject-2.0
 | 
					Requires: eek-@EEK_API_VERSION@
 | 
				
			||||||
Libs: -L${libdir} -leek
 | 
					Libs: -L${libdir} -leek
 | 
				
			||||||
Cflags: -I${includedir}/eekboard-@EEK_API_VERSION@
 | 
					Cflags: -I${includedir}/eekboard-@EEK_API_VERSION@
 | 
				
			||||||
 | 
				
			|||||||
@ -368,9 +368,9 @@ eekboard_context_new (GDBusConnection *connection,
 | 
				
			|||||||
        g_initable_new (EEKBOARD_TYPE_CONTEXT,
 | 
					        g_initable_new (EEKBOARD_TYPE_CONTEXT,
 | 
				
			||||||
                        cancellable,
 | 
					                        cancellable,
 | 
				
			||||||
                        &error,
 | 
					                        &error,
 | 
				
			||||||
                        "g-name", "com.redhat.Eekboard.Server",
 | 
					                        "g-name", "org.fedorahosted.Eekboard.Server",
 | 
				
			||||||
                        "g-connection", connection,
 | 
					                        "g-connection", connection,
 | 
				
			||||||
                        "g-interface-name", "com.redhat.Eekboard.Context",
 | 
					                        "g-interface-name", "org.fedorahosted.Eekboard.Context",
 | 
				
			||||||
                        "g-object-path", object_path,
 | 
					                        "g-object-path", object_path,
 | 
				
			||||||
                        NULL);
 | 
					                        NULL);
 | 
				
			||||||
    if (initable != NULL) {
 | 
					    if (initable != NULL) {
 | 
				
			||||||
 | 
				
			|||||||
@ -15,6 +15,11 @@
 | 
				
			|||||||
 * You should have received a copy of the GNU General Public License
 | 
					 * You should have received a copy of the GNU General Public License
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef EEKBOARD_CONTEXT_H
 | 
				
			||||||
#define EEKBOARD_CONTEXT_H 1
 | 
					#define EEKBOARD_CONTEXT_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -143,9 +143,9 @@ eekboard_eekboard_new (GDBusConnection *connection,
 | 
				
			|||||||
                        cancellable,
 | 
					                        cancellable,
 | 
				
			||||||
                        &error,
 | 
					                        &error,
 | 
				
			||||||
                        "g-connection", connection,
 | 
					                        "g-connection", connection,
 | 
				
			||||||
                        "g-name", "com.redhat.Eekboard.Server",
 | 
					                        "g-name", "org.fedorahosted.Eekboard.Server",
 | 
				
			||||||
                        "g-interface-name", "com.redhat.Eekboard.Server",
 | 
					                        "g-interface-name", "org.fedorahosted.Eekboard.Server",
 | 
				
			||||||
                        "g-object-path", "/com/redhat/Eekboard/Server",
 | 
					                        "g-object-path", "/org/fedorahosted/Eekboard/Server",
 | 
				
			||||||
                        NULL);
 | 
					                        NULL);
 | 
				
			||||||
    if (initable != NULL) {
 | 
					    if (initable != NULL) {
 | 
				
			||||||
        EekboardEekboard *eekboard = EEKBOARD_EEKBOARD (initable);
 | 
					        EekboardEekboard *eekboard = EEKBOARD_EEKBOARD (initable);
 | 
				
			||||||
 | 
				
			|||||||
@ -15,6 +15,11 @@
 | 
				
			|||||||
 * You should have received a copy of the GNU General Public License
 | 
					 * You should have received a copy of the GNU General Public License
 | 
				
			||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * 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
 | 
					#ifndef EEKBOARD_EEKBOARD_H
 | 
				
			||||||
#define EEKBOARD_EEKBOARD_H 1
 | 
					#define EEKBOARD_EEKBOARD_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -18,6 +18,8 @@
 | 
				
			|||||||
#ifndef EEKBOARD_H
 | 
					#ifndef EEKBOARD_H
 | 
				
			||||||
#define EEKBOARD_H 1
 | 
					#define EEKBOARD_H 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define __EEKBOARD_H_INSIDE__ 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eekboard/eekboard-eekboard.h"
 | 
					#include "eekboard/eekboard-eekboard.h"
 | 
				
			||||||
#include "eekboard/eekboard-context.h"
 | 
					#include "eekboard/eekboard-context.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -16,7 +16,6 @@
 | 
				
			|||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
					# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 | 
				
			||||||
# 02110-1301 USA
 | 
					# 02110-1301 USA
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ENABLE_EEKBOARD
 | 
					 | 
				
			||||||
bin_PROGRAMS = \
 | 
					bin_PROGRAMS = \
 | 
				
			||||||
	eekboard \
 | 
						eekboard \
 | 
				
			||||||
	eekboard-server \
 | 
						eekboard-server \
 | 
				
			||||||
@ -42,11 +41,11 @@ eekboard_LDADD = \
 | 
				
			|||||||
	$(XKB_LIBS) \
 | 
						$(XKB_LIBS) \
 | 
				
			||||||
	$(LIBXKLAVIER_LIBS)
 | 
						$(LIBXKLAVIER_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ENABLE_FAKEKEY
 | 
					if ENABLE_XTEST
 | 
				
			||||||
eekboard_CFLAGS += \
 | 
					eekboard_CFLAGS += \
 | 
				
			||||||
	$(FAKEKEY_CFLAGS)
 | 
						$(XTEST_CFLAGS)
 | 
				
			||||||
eekboard_LDADD += \
 | 
					eekboard_LDADD += \
 | 
				
			||||||
	$(FAKEKEY_LIBS)
 | 
						$(XTEST_LIBS)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ENABLE_ATSPI
 | 
					if ENABLE_ATSPI
 | 
				
			||||||
@ -56,6 +55,13 @@ eekboard_LDADD += \
 | 
				
			|||||||
	$(ATSPI2_LIBS)
 | 
						$(ATSPI2_LIBS)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if ENABLE_IBUS
 | 
				
			||||||
 | 
					eekboard_CFLAGS += \
 | 
				
			||||||
 | 
						$(IBUS_CFLAGS)
 | 
				
			||||||
 | 
					eekboard_LDADD += \
 | 
				
			||||||
 | 
						$(IBUS_LIBS)
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eekboard_headers = client.h
 | 
					eekboard_headers = client.h
 | 
				
			||||||
eekboard_SOURCES = client.c client-main.c
 | 
					eekboard_SOURCES = client.c client-main.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -72,9 +78,14 @@ eekboard_server_LDADD = \
 | 
				
			|||||||
	$(GIO2_LIBS) \
 | 
						$(GIO2_LIBS) \
 | 
				
			||||||
	$(GTK_LIBS)
 | 
						$(GTK_LIBS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if ENABLE_CLUTTER
 | 
					if ENABLE_CLUTTER_GTK
 | 
				
			||||||
eekboard_server_CFLAGS += $(CLUTTER_CFLAGS) $(CLUTTER_GTK_CFLAGS)
 | 
					eekboard_server_CFLAGS += $(CLUTTER_GTK_CFLAGS)
 | 
				
			||||||
eekboard_server_LDADD += $(CLUTTER_LIBS) $(top_builddir)/eek/libeek-clutter.la $(CLUTTER_GTK_LIBS)
 | 
					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
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
eekboard_server_headers = server-server.h server-context.h
 | 
					eekboard_server_headers = server-server.h server-context.h
 | 
				
			||||||
@ -116,14 +127,3 @@ noinst_HEADERS = \
 | 
				
			|||||||
	$(eekboard_server_headers) \
 | 
						$(eekboard_server_headers) \
 | 
				
			||||||
	$(eekboard_xml_headers) \
 | 
						$(eekboard_xml_headers) \
 | 
				
			||||||
	$(libxklutil_la_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
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,9 @@
 | 
				
			|||||||
#include <dbus/dbus.h>
 | 
					#include <dbus/dbus.h>
 | 
				
			||||||
#include <atspi/atspi.h>
 | 
					#include <atspi/atspi.h>
 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					#endif  /* HAVE_ATSPI */
 | 
				
			||||||
 | 
					#ifdef HAVE_IBUS
 | 
				
			||||||
 | 
					#include <ibus.h>
 | 
				
			||||||
 | 
					#endif  /* HAVE_IBUS */
 | 
				
			||||||
#include <gtk/gtk.h>
 | 
					#include <gtk/gtk.h>
 | 
				
			||||||
#include <glib/gi18n.h>
 | 
					#include <glib/gi18n.h>
 | 
				
			||||||
#include "eekboard/eekboard.h"
 | 
					#include "eekboard/eekboard.h"
 | 
				
			||||||
@ -56,9 +59,11 @@ static const GOptionEntry options[] = {
 | 
				
			|||||||
     N_("Connect to the given D-Bus address")},
 | 
					     N_("Connect to the given D-Bus address")},
 | 
				
			||||||
    {"use-system-layout", 'x', 0, G_OPTION_ARG_NONE, &opt_use_system_layout,
 | 
					    {"use-system-layout", 'x', 0, G_OPTION_ARG_NONE, &opt_use_system_layout,
 | 
				
			||||||
     N_("Use system keyboard layout")},
 | 
					     N_("Use system keyboard layout")},
 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					#if ENABLE_FOCUS_LISTENER
 | 
				
			||||||
    {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
 | 
					    {"listen-focus", 'f', 0, G_OPTION_ARG_NONE, &opt_focus,
 | 
				
			||||||
     N_("Listen focus change events with AT-SPI")},
 | 
					     N_("Listen focus change events")},
 | 
				
			||||||
 | 
					#endif  /* ENABLE_FOCUS_LISTENER */
 | 
				
			||||||
 | 
					#ifdef HAVE_ATSPI
 | 
				
			||||||
    {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
 | 
					    {"listen-keystroke", 's', 0, G_OPTION_ARG_NONE, &opt_keystroke,
 | 
				
			||||||
     N_("Listen keystroke events with AT-SPI")},
 | 
					     N_("Listen keystroke events with AT-SPI")},
 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					#endif  /* HAVE_ATSPI */
 | 
				
			||||||
@ -108,6 +113,12 @@ on_destroyed (EekboardEekboard *eekboard,
 | 
				
			|||||||
    g_main_loop_quit (loop);
 | 
					    g_main_loop_quit (loop);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
					    FOCUS_NONE,
 | 
				
			||||||
 | 
					    FOCUS_ATSPI,
 | 
				
			||||||
 | 
					    FOCUS_IBUS
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
main (int argc, char **argv)
 | 
					main (int argc, char **argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -119,6 +130,8 @@ main (int argc, char **argv)
 | 
				
			|||||||
    GError *error;
 | 
					    GError *error;
 | 
				
			||||||
    GOptionContext *option_context;
 | 
					    GOptionContext *option_context;
 | 
				
			||||||
    GMainLoop *loop;
 | 
					    GMainLoop *loop;
 | 
				
			||||||
 | 
					    gint focus;
 | 
				
			||||||
 | 
					    GSettings *settings;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!gtk_init_check (&argc, &argv)) {
 | 
					    if (!gtk_init_check (&argc, &argv)) {
 | 
				
			||||||
        g_printerr ("Can't init GTK\n");
 | 
					        g_printerr ("Can't init GTK\n");
 | 
				
			||||||
@ -167,59 +180,104 @@ main (int argc, char **argv)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    client = eekboard_client_new (connection);
 | 
					    client = eekboard_client_new (connection);
 | 
				
			||||||
 | 
					    g_object_unref (connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (client == NULL) {
 | 
					    if (client == NULL) {
 | 
				
			||||||
        g_printerr ("Can't create a client\n");
 | 
					        g_printerr ("Can't create a client\n");
 | 
				
			||||||
        exit (1);
 | 
					        exit (1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					    settings = g_settings_new ("org.fedorahosted.eekboard");
 | 
				
			||||||
    if (opt_focus || opt_keystroke) {
 | 
					    focus = FOCUS_NONE;
 | 
				
			||||||
        GSettings *settings = g_settings_new ("org.gnome.desktop.interface");
 | 
					    if (opt_focus) {
 | 
				
			||||||
 | 
					        gchar *focus_listener = g_settings_get_string (settings,
 | 
				
			||||||
 | 
					                                                       "focus-listener");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (g_settings_get_boolean (settings, "toolkit-accessibility")) {
 | 
					        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);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					#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) {
 | 
					            if (atspi_init () != 0) {
 | 
				
			||||||
                g_printerr ("Can't init AT-SPI 2\n");
 | 
					                g_printerr ("Can't init AT-SPI 2\n");
 | 
				
			||||||
 | 
					                g_object_unref (client);
 | 
				
			||||||
                exit (1);
 | 
					                exit (1);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (opt_focus &&
 | 
					            if (focus == FOCUS_ATSPI &&
 | 
				
			||||||
                !eekboard_client_enable_atspi_focus (client)) {
 | 
					                !eekboard_client_enable_atspi_focus (client)) {
 | 
				
			||||||
                g_printerr ("Can't register focus change event listeners\n");
 | 
					                g_printerr ("Can't register AT-SPI focus change event listeners\n");
 | 
				
			||||||
 | 
					                g_object_unref (client);
 | 
				
			||||||
                exit (1);
 | 
					                exit (1);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (opt_keystroke &&
 | 
					            if (opt_keystroke &&
 | 
				
			||||||
                !eekboard_client_enable_atspi_keystroke (client)) {
 | 
					                !eekboard_client_enable_atspi_keystroke (client)) {
 | 
				
			||||||
                g_printerr ("Can't register keystroke event listeners\n");
 | 
					                g_printerr ("Can't register AT-SPI keystroke event listeners\n");
 | 
				
			||||||
 | 
					                g_object_unref (client);
 | 
				
			||||||
                exit (1);
 | 
					                exit (1);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            g_printerr ("Desktop accessibility support is disabled\n");
 | 
					            g_printerr ("Desktop accessibility support is disabled\n");
 | 
				
			||||||
 | 
					            g_object_unref (client);
 | 
				
			||||||
            exit (1);
 | 
					            exit (1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					#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)) {
 | 
					    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_printerr ("Can't use --use-system-layout option with keyboard options\n");
 | 
				
			||||||
 | 
					        g_object_unref (client);
 | 
				
			||||||
        exit (1);
 | 
					        exit (1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (opt_use_system_layout) {
 | 
					    if (!eekboard_client_enable_xkl (client)) {
 | 
				
			||||||
        if (!eekboard_client_enable_xkl (client)) {
 | 
					        g_printerr ("Can't register xklavier event listeners\n");
 | 
				
			||||||
            g_printerr ("Can't register xklavier event listeners\n");
 | 
					        g_object_unref (client);
 | 
				
			||||||
            exit (1);
 | 
					        exit (1);
 | 
				
			||||||
        }
 | 
					    }
 | 
				
			||||||
    } else if (opt_model || opt_layouts || opt_options) {
 | 
					
 | 
				
			||||||
        if (!eekboard_client_set_xkl_config (client,
 | 
					    if (opt_use_system_layout || opt_model || opt_layouts || opt_options) {
 | 
				
			||||||
                                             opt_model,
 | 
					        if (!eekboard_client_load_keyboard_from_xkl (client,
 | 
				
			||||||
                                             opt_layouts,
 | 
					                                                     opt_model,
 | 
				
			||||||
                                             opt_options)) {
 | 
					                                                     opt_layouts,
 | 
				
			||||||
            g_printerr ("Can't set xklavier config\n");
 | 
					                                                     opt_options)) {
 | 
				
			||||||
 | 
					            g_printerr ("Can't load keyboard from xklavier config\n");
 | 
				
			||||||
 | 
					            g_object_unref (client);
 | 
				
			||||||
            exit (1);
 | 
					            exit (1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        gchar *file;
 | 
					        gchar *file;
 | 
				
			||||||
 | 
					        gboolean success;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!opt_keyboard)
 | 
					        if (!opt_keyboard)
 | 
				
			||||||
            opt_keyboard = DEFAULT_LAYOUT;
 | 
					            opt_keyboard = DEFAULT_LAYOUT;
 | 
				
			||||||
@ -228,20 +286,22 @@ main (int argc, char **argv)
 | 
				
			|||||||
            file = g_strdup (opt_keyboard);
 | 
					            file = g_strdup (opt_keyboard);
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            file = g_strdup_printf ("%s/%s.xml", KEYBOARDDIR, opt_keyboard);
 | 
					            file = g_strdup_printf ("%s/%s.xml", KEYBOARDDIR, opt_keyboard);
 | 
				
			||||||
        if (!eekboard_client_load_keyboard_from_file (client, file)) {
 | 
					        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_printerr ("Can't load keyboard file %s\n", file);
 | 
				
			||||||
            g_free (file);
 | 
					            g_object_unref (client);
 | 
				
			||||||
            exit (1);
 | 
					            exit (1);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        g_free (file);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_FAKEKEY
 | 
					#ifdef HAVE_XTEST
 | 
				
			||||||
    if (!eekboard_client_enable_fakekey (client)) {
 | 
					    if (!eekboard_client_enable_xtest (client)) {
 | 
				
			||||||
        g_printerr ("Can't init fakekey\n");
 | 
					        g_printerr ("Can't init xtest\n");
 | 
				
			||||||
 | 
					        g_object_unref (client);
 | 
				
			||||||
        exit (1);
 | 
					        exit (1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
#endif  /* HAVE_FAKEKEY */
 | 
					#endif  /* HAVE_XTEST */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    loop = g_main_loop_new (NULL, FALSE);
 | 
					    loop = g_main_loop_new (NULL, FALSE);
 | 
				
			||||||
    if (!opt_focus) {
 | 
					    if (!opt_focus) {
 | 
				
			||||||
@ -253,7 +313,8 @@ main (int argc, char **argv)
 | 
				
			|||||||
        g_object_unref (context);
 | 
					        g_object_unref (context);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (opt_fullscreen) {
 | 
					    if (opt_fullscreen ||
 | 
				
			||||||
 | 
					        g_settings_get_boolean (settings, "start-fullscreen")) {
 | 
				
			||||||
        g_object_get (client, "context", &context, NULL);
 | 
					        g_object_get (client, "context", &context, NULL);
 | 
				
			||||||
        eekboard_context_set_fullscreen (context, TRUE, NULL);
 | 
					        eekboard_context_set_fullscreen (context, TRUE, NULL);
 | 
				
			||||||
        g_object_unref (context);
 | 
					        g_object_unref (context);
 | 
				
			||||||
@ -265,6 +326,8 @@ main (int argc, char **argv)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    g_main_loop_run (loop);
 | 
					    g_main_loop_run (loop);
 | 
				
			||||||
    g_main_loop_unref (loop);
 | 
					    g_main_loop_unref (loop);
 | 
				
			||||||
 | 
					    g_object_unref (client);
 | 
				
			||||||
 | 
					    g_object_unref (settings);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										594
									
								
								src/client.c
									
									
									
									
									
								
							
							
						
						
									
										594
									
								
								src/client.c
									
									
									
									
									
								
							@ -28,9 +28,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <gdk/gdkx.h>
 | 
					#include <gdk/gdkx.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_FAKEKEY
 | 
					#ifdef HAVE_XTEST
 | 
				
			||||||
#include <fakekey/fakekey.h>
 | 
					#include <X11/extensions/XTest.h>
 | 
				
			||||||
#endif  /* HAVE_FAKEKEY */
 | 
					#include <X11/XKBlib.h>
 | 
				
			||||||
 | 
					#endif  /* HAVE_XTEST */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_IBUS
 | 
				
			||||||
 | 
					#include <ibus.h>
 | 
				
			||||||
 | 
					#endif  /* HAVE_IBUS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eek/eek.h"
 | 
					#include "eek/eek.h"
 | 
				
			||||||
#include "eek/eek-xkl.h"
 | 
					#include "eek/eek-xkl.h"
 | 
				
			||||||
@ -38,6 +43,8 @@
 | 
				
			|||||||
#include "client.h"
 | 
					#include "client.h"
 | 
				
			||||||
#include "xklutil.h"
 | 
					#include "xklutil.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CSW 640
 | 
					#define CSW 640
 | 
				
			||||||
#define CSH 480
 | 
					#define CSH 480
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -58,9 +65,10 @@ struct _EekboardClient {
 | 
				
			|||||||
    EekboardContext *context;
 | 
					    EekboardContext *context;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    EekKeyboard *keyboard;
 | 
					    EekKeyboard *keyboard;
 | 
				
			||||||
    GdkDisplay *display;
 | 
					 | 
				
			||||||
    XklEngine *xkl_engine;
 | 
					    XklEngine *xkl_engine;
 | 
				
			||||||
    XklConfigRegistry *xkl_config_registry;
 | 
					    XklConfigRegistry *xkl_config_registry;
 | 
				
			||||||
 | 
					    gboolean use_xkl_layout;
 | 
				
			||||||
 | 
					    gint group;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    gulong xkl_config_changed_handler;
 | 
					    gulong xkl_config_changed_handler;
 | 
				
			||||||
    gulong xkl_state_changed_handler;
 | 
					    gulong xkl_state_changed_handler;
 | 
				
			||||||
@ -68,15 +76,25 @@ struct _EekboardClient {
 | 
				
			|||||||
    gulong key_pressed_handler;
 | 
					    gulong key_pressed_handler;
 | 
				
			||||||
    gulong key_released_handler;
 | 
					    gulong key_released_handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    gboolean follows_focus;
 | 
				
			||||||
 | 
					    guint hide_keyboard_timeout_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					#ifdef HAVE_ATSPI
 | 
				
			||||||
    AtspiAccessible *acc;
 | 
					    AtspiAccessible *acc;
 | 
				
			||||||
    gboolean follows_focus;
 | 
					 | 
				
			||||||
    AtspiDeviceListener *keystroke_listener;
 | 
					    AtspiDeviceListener *keystroke_listener;
 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					#endif  /* HAVE_ATSPI */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_FAKEKEY
 | 
					#ifdef HAVE_IBUS
 | 
				
			||||||
    FakeKey *fakekey;
 | 
					    IBusBus *ibus_bus;
 | 
				
			||||||
#endif  /* HAVE_FAKEKEY */
 | 
					    guint ibus_focus_message_filter;
 | 
				
			||||||
 | 
					#endif  /* HAVE_IBUS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_XTEST
 | 
				
			||||||
 | 
					    KeyCode modifier_keycodes[8]; 
 | 
				
			||||||
 | 
					    XkbDescRec *xkb;
 | 
				
			||||||
 | 
					#endif  /* HAVE_XTEST */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GSettings *settings;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _EekboardClientClass {
 | 
					struct _EekboardClientClass {
 | 
				
			||||||
@ -107,11 +125,15 @@ static gboolean        keystroke_listener_cb (const AtspiDeviceEvent *stroke,
 | 
				
			|||||||
static gboolean        set_keyboard         (EekboardClient         *client,
 | 
					static gboolean        set_keyboard         (EekboardClient         *client,
 | 
				
			||||||
                                             gboolean                show,
 | 
					                                             gboolean                show,
 | 
				
			||||||
                                             EekLayout              *layout);
 | 
					                                             EekLayout              *layout);
 | 
				
			||||||
static gboolean        set_xkl_keyboard     (EekboardClient         *client,
 | 
					static gboolean        set_keyboard_from_xkl (EekboardClient         *client,
 | 
				
			||||||
                                             gboolean                show,
 | 
					                                              gboolean                show,
 | 
				
			||||||
                                             const gchar            *model,
 | 
					                                              const gchar            *model,
 | 
				
			||||||
                                             const gchar            *layouts,
 | 
					                                              const gchar            *layouts,
 | 
				
			||||||
                                             const gchar            *options);
 | 
					                                              const gchar            *options);
 | 
				
			||||||
 | 
					#ifdef HAVE_XTEST
 | 
				
			||||||
 | 
					static void            update_modifier_keycodes
 | 
				
			||||||
 | 
					                                            (EekboardClient         *client);
 | 
				
			||||||
 | 
					#endif  /* HAVE_XTEST */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_client_set_property (GObject      *object,
 | 
					eekboard_client_set_property (GObject      *object,
 | 
				
			||||||
@ -151,9 +173,9 @@ eekboard_client_set_property (GObject      *object,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
eekboard_client_get_property (GObject    *object,
 | 
					eekboard_client_get_property (GObject    *object,
 | 
				
			||||||
                                     guint       prop_id,
 | 
					                              guint       prop_id,
 | 
				
			||||||
                                     GValue     *value,
 | 
					                              GValue     *value,
 | 
				
			||||||
                                     GParamSpec *pspec)
 | 
					                              GParamSpec *pspec)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardClient *client = EEKBOARD_CLIENT(object);
 | 
					    EekboardClient *client = EEKBOARD_CLIENT(object);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -184,9 +206,17 @@ eekboard_client_dispose (GObject *object)
 | 
				
			|||||||
    eekboard_client_disable_atspi_keystroke (client);
 | 
					    eekboard_client_disable_atspi_keystroke (client);
 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					#endif  /* HAVE_ATSPI */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_FAKEKEY
 | 
					#ifdef HAVE_IBUS
 | 
				
			||||||
    eekboard_client_disable_fakekey (client);
 | 
					    eekboard_client_disable_ibus_focus (client);
 | 
				
			||||||
#endif  /* HAVE_FAKEKEY */
 | 
					    if (client->ibus_bus) {
 | 
				
			||||||
 | 
					        g_object_unref (client->ibus_bus);
 | 
				
			||||||
 | 
					        client->ibus_bus = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif  /* HAVE_IBUS */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_XTEST
 | 
				
			||||||
 | 
					    eekboard_client_disable_xtest (client);
 | 
				
			||||||
 | 
					#endif  /* HAVE_XTEST */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (client->context) {
 | 
					    if (client->context) {
 | 
				
			||||||
        if (client->eekboard) {
 | 
					        if (client->eekboard) {
 | 
				
			||||||
@ -207,15 +237,9 @@ eekboard_client_dispose (GObject *object)
 | 
				
			|||||||
        client->keyboard = NULL;
 | 
					        client->keyboard = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_FAKEKEY
 | 
					    if (client->settings) {
 | 
				
			||||||
    if (client->fakekey) {
 | 
					        g_object_unref (client->settings);
 | 
				
			||||||
        client->fakekey = NULL;
 | 
					        client->settings = NULL;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
#endif  /* HAVE_FAKEKEY */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (client->display) {
 | 
					 | 
				
			||||||
        gdk_display_close (client->display);
 | 
					 | 
				
			||||||
        client->display = NULL;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    G_OBJECT_CLASS (eekboard_client_parent_class)->dispose (object);
 | 
					    G_OBJECT_CLASS (eekboard_client_parent_class)->dispose (object);
 | 
				
			||||||
@ -264,7 +288,6 @@ eekboard_client_init (EekboardClient *client)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    client->eekboard = NULL;
 | 
					    client->eekboard = NULL;
 | 
				
			||||||
    client->context = NULL;
 | 
					    client->context = NULL;
 | 
				
			||||||
    client->display = NULL;
 | 
					 | 
				
			||||||
    client->xkl_engine = NULL;
 | 
					    client->xkl_engine = NULL;
 | 
				
			||||||
    client->xkl_config_registry = NULL;
 | 
					    client->xkl_config_registry = NULL;
 | 
				
			||||||
    client->keyboard = NULL;
 | 
					    client->keyboard = NULL;
 | 
				
			||||||
@ -272,47 +295,52 @@ eekboard_client_init (EekboardClient *client)
 | 
				
			|||||||
    client->key_released_handler = 0;
 | 
					    client->key_released_handler = 0;
 | 
				
			||||||
    client->xkl_config_changed_handler = 0;
 | 
					    client->xkl_config_changed_handler = 0;
 | 
				
			||||||
    client->xkl_state_changed_handler = 0;
 | 
					    client->xkl_state_changed_handler = 0;
 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					#if ENABLE_FOCUS_LISTENER
 | 
				
			||||||
    client->follows_focus = FALSE;
 | 
					    client->follows_focus = FALSE;
 | 
				
			||||||
 | 
					    client->hide_keyboard_timeout_id = 0;
 | 
				
			||||||
 | 
					#endif  /* ENABLE_FOCUS_LISTENER */
 | 
				
			||||||
 | 
					#ifdef HAVE_ATSPI
 | 
				
			||||||
    client->keystroke_listener = NULL;
 | 
					    client->keystroke_listener = NULL;
 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					#endif  /* HAVE_ATSPI */
 | 
				
			||||||
#ifdef HAVE_FAKEKEY
 | 
					#ifdef HAVE_IBUS
 | 
				
			||||||
    client->fakekey = NULL;
 | 
					    client->ibus_bus = NULL;
 | 
				
			||||||
#endif  /* HAVE_FAKEKEY */
 | 
					    client->ibus_focus_message_filter = 0;
 | 
				
			||||||
 | 
					#endif  /* HAVE_IBUS */
 | 
				
			||||||
 | 
					    client->settings = g_settings_new ("org.fedorahosted.eekboard");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean
 | 
					gboolean
 | 
				
			||||||
eekboard_client_set_xkl_config (EekboardClient *client,
 | 
					eekboard_client_load_keyboard_from_xkl (EekboardClient *client,
 | 
				
			||||||
                                        const gchar *model,
 | 
					                                        const gchar    *model,
 | 
				
			||||||
                                        const gchar *layouts,
 | 
					                                        const gchar    *layouts,
 | 
				
			||||||
                                        const gchar *options)
 | 
					                                        const gchar    *options)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					    client->use_xkl_layout = TRUE;
 | 
				
			||||||
    return set_xkl_keyboard (client,
 | 
					
 | 
				
			||||||
                             !client->follows_focus,
 | 
					#if ENABLE_FOCUS_LISTENER
 | 
				
			||||||
                             model,
 | 
					    return set_keyboard_from_xkl (client,
 | 
				
			||||||
                             layouts,
 | 
					                                  !client->follows_focus,
 | 
				
			||||||
                             options);
 | 
					                                  model,
 | 
				
			||||||
#else
 | 
					                                  layouts,
 | 
				
			||||||
    return set_xkl_keyboard (client,
 | 
					                                  options);
 | 
				
			||||||
                             TRUE,
 | 
					#else  /* ENABLE_FOCUS_LISTENER */
 | 
				
			||||||
                             model,
 | 
					    return set_keyboard_from_xkl (client,
 | 
				
			||||||
                             layouts,
 | 
					                                  TRUE,
 | 
				
			||||||
                             options);
 | 
					                                  model,
 | 
				
			||||||
#endif
 | 
					                                  layouts,
 | 
				
			||||||
 | 
					                                  options);
 | 
				
			||||||
 | 
					#endif  /* !ENABLE_FOCUS_LISTENER */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean
 | 
					gboolean
 | 
				
			||||||
eekboard_client_enable_xkl (EekboardClient *client)
 | 
					eekboard_client_enable_xkl (EekboardClient *client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (!client->display) {
 | 
					    GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
        client->display = gdk_display_get_default ();
 | 
					    g_assert (display);
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    g_assert (client->display);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!client->xkl_engine) {
 | 
					    if (!client->xkl_engine) {
 | 
				
			||||||
        client->xkl_engine =
 | 
					        client->xkl_engine =
 | 
				
			||||||
            xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (client->display));
 | 
					            xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (display));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    g_assert (client->xkl_engine);
 | 
					    g_assert (client->xkl_engine);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -336,22 +364,18 @@ eekboard_client_enable_xkl (EekboardClient *client)
 | 
				
			|||||||
                           (GdkFilterFunc) filter_xkl_event,
 | 
					                           (GdkFilterFunc) filter_xkl_event,
 | 
				
			||||||
                           client);
 | 
					                           client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    client->use_xkl_layout = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
 | 
					    xkl_engine_start_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					    return TRUE;
 | 
				
			||||||
    return set_xkl_keyboard (client,
 | 
					 | 
				
			||||||
                             !client->follows_focus,
 | 
					 | 
				
			||||||
                             NULL,
 | 
					 | 
				
			||||||
                             NULL,
 | 
					 | 
				
			||||||
                             NULL);
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
    return set_xkl_keyboard (client, TRUE, NULL, NULL, NULL);
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
eekboard_client_disable_xkl (EekboardClient *client)
 | 
					eekboard_client_disable_xkl (EekboardClient *client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    client->use_xkl_layout = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (client->xkl_engine)
 | 
					    if (client->xkl_engine)
 | 
				
			||||||
        xkl_engine_stop_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
 | 
					        xkl_engine_stop_listen (client->xkl_engine, XKLL_TRACK_KEYBOARD_STATE);
 | 
				
			||||||
    if (g_signal_handler_is_connected (client->xkl_engine,
 | 
					    if (g_signal_handler_is_connected (client->xkl_engine,
 | 
				
			||||||
@ -496,7 +520,8 @@ focus_listener_cb (const AtspiEvent *event,
 | 
				
			|||||||
            if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
 | 
					            if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
 | 
				
			||||||
                client->acc = accessible;
 | 
					                client->acc = accessible;
 | 
				
			||||||
                eekboard_context_show_keyboard (client->context, NULL);
 | 
					                eekboard_context_show_keyboard (client->context, NULL);
 | 
				
			||||||
            } else if (event->detail1 == 0 && accessible == client->acc) {
 | 
					            } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
 | 
				
			||||||
 | 
					                       event->detail1 == 0 && accessible == client->acc) {
 | 
				
			||||||
                client->acc = NULL;
 | 
					                client->acc = NULL;
 | 
				
			||||||
                eekboard_context_hide_keyboard (client->context, NULL);
 | 
					                eekboard_context_hide_keyboard (client->context, NULL);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -505,7 +530,8 @@ focus_listener_cb (const AtspiEvent *event,
 | 
				
			|||||||
            if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
 | 
					            if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
 | 
				
			||||||
                client->acc = accessible;
 | 
					                client->acc = accessible;
 | 
				
			||||||
                eekboard_context_show_keyboard (client->context, NULL);
 | 
					                eekboard_context_show_keyboard (client->context, NULL);
 | 
				
			||||||
            } else if (event->detail1 == 0) {
 | 
					            } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
 | 
				
			||||||
 | 
					                       event->detail1 == 0) {
 | 
				
			||||||
                client->acc = NULL;
 | 
					                client->acc = NULL;
 | 
				
			||||||
                eekboard_context_hide_keyboard (client->context, NULL);
 | 
					                eekboard_context_hide_keyboard (client->context, NULL);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@ -546,12 +572,134 @@ keystroke_listener_cb (const AtspiDeviceEvent *stroke,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
#endif  /* HAVE_ATSPI */
 | 
					#endif  /* HAVE_ATSPI */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_IBUS
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					add_match_rule (GDBusConnection *connection,
 | 
				
			||||||
 | 
					                const gchar     *match_rule)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  GError *error;
 | 
				
			||||||
 | 
					  GDBusMessage *message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  message = g_dbus_message_new_method_call ("org.freedesktop.DBus", /* name */
 | 
				
			||||||
 | 
					                                            "/org/freedesktop/DBus", /* path */
 | 
				
			||||||
 | 
					                                            "org.freedesktop.DBus", /* interface */
 | 
				
			||||||
 | 
					                                            "AddMatch");
 | 
				
			||||||
 | 
					  g_dbus_message_set_body (message, g_variant_new ("(s)", match_rule));
 | 
				
			||||||
 | 
					  error = NULL;
 | 
				
			||||||
 | 
					  g_dbus_connection_send_message (connection,
 | 
				
			||||||
 | 
					                                  message,
 | 
				
			||||||
 | 
					                                  G_DBUS_SEND_MESSAGE_FLAGS_NONE,
 | 
				
			||||||
 | 
					                                  NULL,
 | 
				
			||||||
 | 
					                                  &error);
 | 
				
			||||||
 | 
					  g_object_unref (message);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					on_hide_keyboard_timeout (EekboardClient *client)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    eekboard_context_hide_keyboard (client->context, NULL);
 | 
				
			||||||
 | 
					    client->hide_keyboard_timeout_id = 0;
 | 
				
			||||||
 | 
					    return FALSE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static GDBusMessage *
 | 
				
			||||||
 | 
					focus_message_filter (GDBusConnection *connection,
 | 
				
			||||||
 | 
					                      GDBusMessage    *message,
 | 
				
			||||||
 | 
					                      gboolean         incoming,
 | 
				
			||||||
 | 
					                      gpointer         user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekboardClient *client = user_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (incoming &&
 | 
				
			||||||
 | 
					        g_strcmp0 (g_dbus_message_get_interface (message),
 | 
				
			||||||
 | 
					                   IBUS_INTERFACE_INPUT_CONTEXT) == 0) {
 | 
				
			||||||
 | 
					        const gchar *member = g_dbus_message_get_member (message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (g_strcmp0 (member, "FocusIn") == 0) {
 | 
				
			||||||
 | 
					            if (client->hide_keyboard_timeout_id > 0) {
 | 
				
			||||||
 | 
					                g_source_remove (client->hide_keyboard_timeout_id);
 | 
				
			||||||
 | 
					                client->hide_keyboard_timeout_id = 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            eekboard_context_show_keyboard (client->context, NULL);
 | 
				
			||||||
 | 
					        } else if (g_settings_get_boolean (client->settings, "auto-hide") &&
 | 
				
			||||||
 | 
					                   g_strcmp0 (member, "FocusOut") == 0) {
 | 
				
			||||||
 | 
					            gdouble delay = g_settings_get_double (client->settings,
 | 
				
			||||||
 | 
					                                                   "auto-hide-delay");
 | 
				
			||||||
 | 
					            client->hide_keyboard_timeout_id =
 | 
				
			||||||
 | 
					                g_timeout_add ((guint)(delay * 1000),
 | 
				
			||||||
 | 
					                               (GSourceFunc)on_hide_keyboard_timeout,
 | 
				
			||||||
 | 
					                               client);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return message;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					_ibus_connect_focus_handlers (IBusBus *bus, gpointer user_data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    EekboardClient *client = user_data;
 | 
				
			||||||
 | 
					    GDBusConnection *connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    connection = ibus_bus_get_connection (bus);
 | 
				
			||||||
 | 
					    add_match_rule (connection,
 | 
				
			||||||
 | 
					                    "type='method_call',"
 | 
				
			||||||
 | 
					                    "interface='" IBUS_INTERFACE_INPUT_CONTEXT "',"
 | 
				
			||||||
 | 
					                    "member='FocusIn'");
 | 
				
			||||||
 | 
					    add_match_rule (connection,
 | 
				
			||||||
 | 
					                    "type='method_call',"
 | 
				
			||||||
 | 
					                    "interface='" IBUS_INTERFACE_INPUT_CONTEXT "',"
 | 
				
			||||||
 | 
					                    "member='FocusOut'");
 | 
				
			||||||
 | 
					    client->ibus_focus_message_filter =
 | 
				
			||||||
 | 
					        g_dbus_connection_add_filter (connection,
 | 
				
			||||||
 | 
					                                      focus_message_filter,
 | 
				
			||||||
 | 
					                                      client,
 | 
				
			||||||
 | 
					                                      NULL);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					gboolean
 | 
				
			||||||
 | 
					eekboard_client_enable_ibus_focus (EekboardClient *client)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (!client->ibus_bus) {
 | 
				
			||||||
 | 
					        client->ibus_bus = ibus_bus_new ();
 | 
				
			||||||
 | 
					        g_object_ref (client->ibus_bus);
 | 
				
			||||||
 | 
					        g_signal_connect (client->ibus_bus, "connected",
 | 
				
			||||||
 | 
					                          G_CALLBACK(_ibus_connect_focus_handlers),
 | 
				
			||||||
 | 
					                          client);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (ibus_bus_is_connected (client->ibus_bus))
 | 
				
			||||||
 | 
					        _ibus_connect_focus_handlers (client->ibus_bus, client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    client->follows_focus = TRUE;
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					eekboard_client_disable_ibus_focus (EekboardClient *client)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GDBusConnection *connection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    client->follows_focus = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (client->ibus_bus) {
 | 
				
			||||||
 | 
					        if (client->ibus_focus_message_filter != 0) {
 | 
				
			||||||
 | 
					            connection = ibus_bus_get_connection (client->ibus_bus);
 | 
				
			||||||
 | 
					            g_dbus_connection_remove_filter (connection,
 | 
				
			||||||
 | 
					                                             client->ibus_focus_message_filter);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        g_object_unref (client->ibus_bus);
 | 
				
			||||||
 | 
					        client->ibus_bus = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif  /* HAVE_ATSPI */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EekboardClient *
 | 
					EekboardClient *
 | 
				
			||||||
eekboard_client_new (GDBusConnection *connection)
 | 
					eekboard_client_new (GDBusConnection *connection)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardClient *client = g_object_new (EEKBOARD_TYPE_CLIENT,
 | 
					    EekboardClient *client = g_object_new (EEKBOARD_TYPE_CLIENT,
 | 
				
			||||||
                                                  "connection", connection,
 | 
					                                           "connection", connection,
 | 
				
			||||||
                                                  NULL);
 | 
					                                           NULL);
 | 
				
			||||||
    if (client->context)
 | 
					    if (client->context)
 | 
				
			||||||
        return client;
 | 
					        return client;
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
@ -576,13 +724,14 @@ on_xkl_config_changed (XklEngine *xklengine,
 | 
				
			|||||||
    EekboardClient *client = user_data;
 | 
					    EekboardClient *client = user_data;
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    retval = set_xkl_keyboard (client, FALSE, NULL, NULL, NULL);
 | 
					    if (client->use_xkl_layout) {
 | 
				
			||||||
    g_return_if_fail (retval);
 | 
					        retval = set_keyboard_from_xkl (client, FALSE, NULL, NULL, NULL);
 | 
				
			||||||
 | 
					        g_return_if_fail (retval);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_FAKEKEY
 | 
					#ifdef HAVE_XTEST
 | 
				
			||||||
    if (client->fakekey)
 | 
					    update_modifier_keycodes (client);
 | 
				
			||||||
        fakekey_reload_keysyms (client->fakekey);
 | 
					#endif  /* HAVE_XTEST */
 | 
				
			||||||
#endif  /* HAVE_FAKEKEY */
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
@ -612,11 +761,11 @@ set_keyboard (EekboardClient *client,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static gboolean
 | 
					static gboolean
 | 
				
			||||||
set_xkl_keyboard (EekboardClient *client,
 | 
					set_keyboard_from_xkl (EekboardClient *client,
 | 
				
			||||||
                  gboolean        show,
 | 
					                       gboolean        show,
 | 
				
			||||||
                  const gchar    *model,
 | 
					                       const gchar    *model,
 | 
				
			||||||
                  const gchar    *layouts,
 | 
					                       const gchar    *layouts,
 | 
				
			||||||
                  const gchar    *options)
 | 
					                       const gchar    *options)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekLayout *layout;
 | 
					    EekLayout *layout;
 | 
				
			||||||
    gboolean retval;
 | 
					    gboolean retval;
 | 
				
			||||||
@ -679,29 +828,182 @@ on_xkl_state_changed (XklEngine           *xklengine,
 | 
				
			|||||||
    EekboardClient *client = user_data;
 | 
					    EekboardClient *client = user_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (type == GROUP_CHANGED && client->keyboard) {
 | 
					    if (type == GROUP_CHANGED && client->keyboard) {
 | 
				
			||||||
        gint group = eek_element_get_group (EEK_ELEMENT(client->keyboard));
 | 
					        if (client->use_xkl_layout) {
 | 
				
			||||||
        if (group != value) {
 | 
					            gint group = eek_element_get_group (EEK_ELEMENT(client->keyboard));
 | 
				
			||||||
            eekboard_context_set_group (client->context, value, NULL);
 | 
					            if (group != value) {
 | 
				
			||||||
 | 
					                eekboard_context_set_group (client->context, value, NULL);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        client->group = value;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_XTEST
 | 
				
			||||||
 | 
					/* The following functions for keyboard mapping change are direct
 | 
				
			||||||
 | 
					   translation of the code in Caribou (in libcaribou/xadapter.vala):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   - get_replaced_keycode (Caribou: get_reserved_keycode)
 | 
				
			||||||
 | 
					   - replace_keycode
 | 
				
			||||||
 | 
					   - get_keycode_from_gdk_keymap (Caribou: best_keycode_keyval_match)
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					static guint
 | 
				
			||||||
 | 
					get_replaced_keycode (EekboardClient *client)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
 | 
					    Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
 | 
				
			||||||
 | 
					    gint i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = client->xkb->max_key_code; i >= client->xkb->min_key_code; --i)
 | 
				
			||||||
 | 
					        if (client->xkb->map->key_sym_map[i].kt_index[0] == XkbOneLevelIndex &&
 | 
				
			||||||
 | 
					            XKeycodeToKeysym (xdisplay, i, 0) != 0)
 | 
				
			||||||
 | 
					            return i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return XKeysymToKeycode (xdisplay, 0x0023); /* XK_numbersign */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Replace keysym assigned to KEYCODE to KEYSYM.  Both args are used
 | 
				
			||||||
 | 
					   as in-out.  If KEYCODE points to 0, this function picks a keycode
 | 
				
			||||||
 | 
					   from the current map and replace the associated keysym to KEYSYM.
 | 
				
			||||||
 | 
					   In that case, the replaced keycode is stored in KEYCODE and the old
 | 
				
			||||||
 | 
					   keysym is stored in KEYSYM.  If otherwise (KEYCODE points to
 | 
				
			||||||
 | 
					   non-zero keycode), it simply changes the current map with the
 | 
				
			||||||
 | 
					   specified KEYCODE and KEYSYM. */
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					replace_keycode (EekboardClient *client,
 | 
				
			||||||
 | 
					                 guint          *keycode,
 | 
				
			||||||
 | 
					                 guint          *keysym)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
 | 
					    Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
 | 
				
			||||||
 | 
					    guint offset;
 | 
				
			||||||
 | 
					    XkbMapChangesRec changes;
 | 
				
			||||||
 | 
					    guint replaced_keycode, replaced_keysym;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_assert (keycode != NULL);
 | 
				
			||||||
 | 
					    g_assert (keysym != NULL && *keysym != 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    replaced_keycode = get_replaced_keycode (client);
 | 
				
			||||||
 | 
					    if (replaced_keycode == 0)
 | 
				
			||||||
 | 
					        return FALSE;
 | 
				
			||||||
 | 
					    replaced_keysym = XKeycodeToKeysym (xdisplay, replaced_keycode, 0);
 | 
				
			||||||
 | 
					    XFlush (xdisplay);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    offset = client->xkb->map->key_sym_map[replaced_keycode].offset;
 | 
				
			||||||
 | 
					    client->xkb->map->syms[offset] = *keysym;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    changes.changed = XkbKeySymsMask;
 | 
				
			||||||
 | 
					    changes.first_key_sym = replaced_keycode;
 | 
				
			||||||
 | 
					    changes.num_key_syms = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    XkbChangeMap (xdisplay, client->xkb, &changes);
 | 
				
			||||||
 | 
					    XFlush (xdisplay);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    *keycode = replaced_keycode;
 | 
				
			||||||
 | 
					    *keysym = replaced_keysym;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static gboolean
 | 
				
			||||||
 | 
					get_keycode_from_gdk_keymap (EekboardClient *client,
 | 
				
			||||||
 | 
					                             guint           keysym,
 | 
				
			||||||
 | 
					                             guint          *keycode,
 | 
				
			||||||
 | 
					                             guint          *modifiers)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GdkKeymap *keymap = gdk_keymap_get_default ();
 | 
				
			||||||
 | 
					    GdkKeymapKey *keys, *best_match;
 | 
				
			||||||
 | 
					    gint n_keys, i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!gdk_keymap_get_entries_for_keyval (keymap, keysym, &keys, &n_keys))
 | 
				
			||||||
 | 
					        return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < n_keys; i++)
 | 
				
			||||||
 | 
					        if (keys[i].group == client->group)
 | 
				
			||||||
 | 
					            best_match = &keys[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    *keycode = best_match->keycode;
 | 
				
			||||||
 | 
					    *modifiers = best_match->level == 1 ? EEK_SHIFT_MASK : 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    g_free (keys);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return TRUE;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					send_fake_modifier_key_event (EekboardClient *client,
 | 
				
			||||||
 | 
					                              EekModifierType modifiers,
 | 
				
			||||||
 | 
					                              gboolean        is_pressed)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
 | 
					    gint i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < G_N_ELEMENTS(client->modifier_keycodes); i++) {
 | 
				
			||||||
 | 
					        if (modifiers & (1 << i)) {
 | 
				
			||||||
 | 
					            guint keycode = client->modifier_keycodes[i];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            g_return_if_fail (keycode > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (display),
 | 
				
			||||||
 | 
					                               keycode,
 | 
				
			||||||
 | 
					                               is_pressed,
 | 
				
			||||||
 | 
					                               CurrentTime);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef HAVE_FAKEKEY
 | 
					static void
 | 
				
			||||||
G_INLINE_FUNC FakeKeyModifier
 | 
					send_fake_key_event (EekboardClient *client,
 | 
				
			||||||
get_fakekey_modifiers (EekModifierType modifiers)
 | 
					                     EekKey         *key,
 | 
				
			||||||
 | 
					                     gboolean        is_pressed)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    FakeKeyModifier retval = 0;
 | 
					    GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
 | 
					    EekSymbol *symbol;
 | 
				
			||||||
 | 
					    EekModifierType keyboard_modifiers, modifiers;
 | 
				
			||||||
 | 
					    guint xkeysym;
 | 
				
			||||||
 | 
					    guint keycode, replaced_keysym = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (modifiers & EEK_SHIFT_MASK)
 | 
					    symbol = eek_key_get_symbol_with_fallback (key, 0, 0);
 | 
				
			||||||
        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;
 | 
					    /* Ignore special keys and modifiers */
 | 
				
			||||||
 | 
					    if (!EEK_IS_KEYSYM(symbol) || eek_symbol_is_modifier (symbol))
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
 | 
				
			||||||
 | 
					    g_return_if_fail (xkeysym > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    modifiers = 0;
 | 
				
			||||||
 | 
					    if (!get_keycode_from_gdk_keymap (client, xkeysym, &keycode, &modifiers)) {
 | 
				
			||||||
 | 
					        keycode = 0;
 | 
				
			||||||
 | 
					        replaced_keysym = xkeysym;
 | 
				
			||||||
 | 
					        if (!replace_keycode (client, &keycode, &replaced_keysym)) {
 | 
				
			||||||
 | 
					            g_warning ("failed to lookup X keysym %X", xkeysym);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    /* Clear level shift modifiers */
 | 
				
			||||||
 | 
					    keyboard_modifiers = eek_keyboard_get_modifiers (client->keyboard);
 | 
				
			||||||
 | 
					    keyboard_modifiers &= ~EEK_SHIFT_MASK;
 | 
				
			||||||
 | 
					    keyboard_modifiers &= ~EEK_LOCK_MASK;
 | 
				
			||||||
 | 
					    keyboard_modifiers &= ~eek_keyboard_get_alt_gr_mask (client->keyboard);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    modifiers |= keyboard_modifiers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    send_fake_modifier_key_event (client, modifiers, is_pressed);
 | 
				
			||||||
 | 
					    XSync (GDK_DISPLAY_XDISPLAY (display), False);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (display),
 | 
				
			||||||
 | 
					                                xkeysym);
 | 
				
			||||||
 | 
					    g_return_if_fail (keycode > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (display),
 | 
				
			||||||
 | 
					                       keycode,
 | 
				
			||||||
 | 
					                       is_pressed,
 | 
				
			||||||
 | 
					                       CurrentTime);
 | 
				
			||||||
 | 
					    XSync (GDK_DISPLAY_XDISPLAY (display), False);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (replaced_keysym)
 | 
				
			||||||
 | 
					        replace_keycode (client, &keycode, &replaced_keysym);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -710,35 +1012,8 @@ on_key_pressed (EekKeyboard *keyboard,
 | 
				
			|||||||
                gpointer     user_data)
 | 
					                gpointer     user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardClient *client = user_data;
 | 
					    EekboardClient *client = user_data;
 | 
				
			||||||
    EekSymbol *symbol;
 | 
					    send_fake_key_event (client, key, TRUE);
 | 
				
			||||||
 | 
					    send_fake_key_event (client, key, FALSE);
 | 
				
			||||||
    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;
 | 
					 | 
				
			||||||
        guint keycode;
 | 
					 | 
				
			||||||
        EekModifierType modifiers;
 | 
					 | 
				
			||||||
        FakeKeyModifier fakekey_modifiers;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        xkeysym = eek_keysym_get_xkeysym (EEK_KEYSYM(symbol));
 | 
					 | 
				
			||||||
        g_return_if_fail (xkeysym > 0);
 | 
					 | 
				
			||||||
        keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (client->display),
 | 
					 | 
				
			||||||
                                    xkeysym);
 | 
					 | 
				
			||||||
        g_return_if_fail (keycode > 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        modifiers = eek_keyboard_get_modifiers (client->keyboard);
 | 
					 | 
				
			||||||
        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
 | 
					static void
 | 
				
			||||||
@ -746,24 +1021,57 @@ on_key_released (EekKeyboard *keyboard,
 | 
				
			|||||||
                 EekKey      *key,
 | 
					                 EekKey      *key,
 | 
				
			||||||
                 gpointer     user_data)
 | 
					                 gpointer     user_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EekboardClient *client = user_data;
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    g_assert (client->fakekey);
 | 
					static void
 | 
				
			||||||
    fakekey_release (client->fakekey);
 | 
					update_modifier_keycodes (EekboardClient *client)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
 | 
					    XModifierKeymap *mods;
 | 
				
			||||||
 | 
					    gint i, j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    mods = XGetModifierMapping (GDK_DISPLAY_XDISPLAY (display));
 | 
				
			||||||
 | 
					    for (i = 0; i < 8; i++) {
 | 
				
			||||||
 | 
					        client->modifier_keycodes[i] = 0;
 | 
				
			||||||
 | 
					        for (j = 0; j < mods->max_keypermod; j++) {
 | 
				
			||||||
 | 
					            KeyCode keycode = mods->modifiermap[mods->max_keypermod * i + j];
 | 
				
			||||||
 | 
					            if (keycode != 0) {
 | 
				
			||||||
 | 
					                client->modifier_keycodes[i] = keycode;
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean
 | 
					gboolean
 | 
				
			||||||
eekboard_client_enable_fakekey (EekboardClient *client)
 | 
					eekboard_client_enable_xtest (EekboardClient *client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (!client->display) {
 | 
					    GdkDisplay *display = gdk_display_get_default ();
 | 
				
			||||||
        client->display = gdk_display_get_default ();
 | 
					    int opcode, event_base, error_base, major_version, minor_version;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    g_assert (client->display);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!client->fakekey) {
 | 
					    g_assert (display);
 | 
				
			||||||
        client->fakekey = fakekey_init (GDK_DISPLAY_XDISPLAY (client->display));
 | 
					
 | 
				
			||||||
 | 
					    if (!XTestQueryExtension (GDK_DISPLAY_XDISPLAY (display),
 | 
				
			||||||
 | 
					                              &event_base, &error_base,
 | 
				
			||||||
 | 
					                              &major_version, &minor_version)) {
 | 
				
			||||||
 | 
					        g_warning ("XTest extension is not available");
 | 
				
			||||||
 | 
					        return FALSE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    g_assert (client->fakekey);
 | 
					
 | 
				
			||||||
 | 
					    if (!XkbQueryExtension (GDK_DISPLAY_XDISPLAY (display),
 | 
				
			||||||
 | 
					                            &opcode, &event_base, &error_base,
 | 
				
			||||||
 | 
					                            &major_version, &minor_version)) {
 | 
				
			||||||
 | 
					        g_warning ("Xkb extension is not available");
 | 
				
			||||||
 | 
					        return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!client->xkb)
 | 
				
			||||||
 | 
					        client->xkb = XkbGetMap (GDK_DISPLAY_XDISPLAY (display),
 | 
				
			||||||
 | 
					                                 XkbKeySymsMask,
 | 
				
			||||||
 | 
					                                 XkbUseCoreKbd);
 | 
				
			||||||
 | 
					    g_assert (client->xkb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    update_modifier_keycodes (client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    client->key_pressed_handler =
 | 
					    client->key_pressed_handler =
 | 
				
			||||||
        g_signal_connect (client->keyboard, "key-pressed",
 | 
					        g_signal_connect (client->keyboard, "key-pressed",
 | 
				
			||||||
@ -776,10 +1084,12 @@ eekboard_client_enable_fakekey (EekboardClient *client)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
eekboard_client_disable_fakekey (EekboardClient *client)
 | 
					eekboard_client_disable_xtest (EekboardClient *client)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (client->fakekey)
 | 
					    if (client->xkb) {
 | 
				
			||||||
        fakekey_release (client->fakekey);
 | 
					        XkbFreeKeyboard (client->xkb, 0, TRUE);	/* free_all = TRUE */
 | 
				
			||||||
 | 
					        client->xkb = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (g_signal_handler_is_connected (client->keyboard,
 | 
					    if (g_signal_handler_is_connected (client->keyboard,
 | 
				
			||||||
                                       client->key_pressed_handler))
 | 
					                                       client->key_pressed_handler))
 | 
				
			||||||
@ -810,13 +1120,13 @@ eekboard_client_load_keyboard_from_file (EekboardClient *client,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    layout = eek_xml_layout_new (G_INPUT_STREAM(input));
 | 
					    layout = eek_xml_layout_new (G_INPUT_STREAM(input));
 | 
				
			||||||
    g_object_unref (input);
 | 
					    g_object_unref (input);
 | 
				
			||||||
#ifdef HAVE_ATSPI
 | 
					#if ENABLE_FOCUS_LISTENER
 | 
				
			||||||
    retval = set_keyboard (client, !client->follows_focus, layout);
 | 
					    retval = set_keyboard (client, !client->follows_focus, layout);
 | 
				
			||||||
#else
 | 
					#else  /* ENABLE_FOCUS_LISTENER */
 | 
				
			||||||
    retval = set_keyboard (client, TRUE, layout);
 | 
					    retval = set_keyboard (client, TRUE, layout);
 | 
				
			||||||
#endif
 | 
					#endif  /* !ENABLE_FOCUS_LISTENER */
 | 
				
			||||||
    g_object_unref (layout);
 | 
					    g_object_unref (layout);
 | 
				
			||||||
    return retval;
 | 
					    return retval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  /* HAVE_FAKEKEY */
 | 
					#endif  /* HAVE_XTEST */
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										37
									
								
								src/client.h
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								src/client.h
									
									
									
									
									
								
							@ -31,31 +31,38 @@ G_BEGIN_DECLS
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct _EekboardClient EekboardClient;
 | 
					typedef struct _EekboardClient EekboardClient;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EekboardClient * eekboard_client_new             (GDBusConnection *connection);
 | 
					EekboardClient * eekboard_client_new           (GDBusConnection *connection);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean         eekboard_client_load_keyboard_from_file
 | 
					gboolean         eekboard_client_load_keyboard_from_file
 | 
				
			||||||
                                                 (EekboardClient  *client,
 | 
					                                               (EekboardClient  *client,
 | 
				
			||||||
                                                  const gchar     *file);
 | 
					                                                const gchar     *file);
 | 
				
			||||||
gboolean         eekboard_client_set_xkl_config  (EekboardClient  *client,
 | 
					 | 
				
			||||||
                                                  const gchar     *model,
 | 
					 | 
				
			||||||
                                                  const gchar     *layouts,
 | 
					 | 
				
			||||||
                                                  const gchar     *options);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean         eekboard_client_enable_xkl      (EekboardClient  *client);
 | 
					gboolean         eekboard_client_load_keyboard_from_xkl
 | 
				
			||||||
void             eekboard_client_disable_xkl     (EekboardClient  *client);
 | 
					                                               (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
 | 
					gboolean         eekboard_client_enable_atspi_focus
 | 
				
			||||||
                                                 (EekboardClient  *client);
 | 
					                                               (EekboardClient  *client);
 | 
				
			||||||
void             eekboard_client_disable_atspi_focus
 | 
					void             eekboard_client_disable_atspi_focus
 | 
				
			||||||
                                                 (EekboardClient  *client);
 | 
					                                               (EekboardClient  *client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean         eekboard_client_enable_atspi_keystroke
 | 
					gboolean         eekboard_client_enable_atspi_keystroke
 | 
				
			||||||
                                                 (EekboardClient  *client);
 | 
					                                               (EekboardClient  *client);
 | 
				
			||||||
void             eekboard_client_disable_atspi_keystroke
 | 
					void             eekboard_client_disable_atspi_keystroke
 | 
				
			||||||
                                                 (EekboardClient  *client);
 | 
					                                               (EekboardClient  *client);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
gboolean         eekboard_client_enable_fakekey  (EekboardClient  *client);
 | 
					gboolean         eekboard_client_enable_xtest  (EekboardClient  *client);
 | 
				
			||||||
void             eekboard_client_disable_fakekey (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
 | 
					G_END_DECLS
 | 
				
			||||||
#endif  /* EEKBOARD_CLIENT_H */
 | 
					#endif  /* EEKBOARD_CLIENT_H */
 | 
				
			||||||
 | 
				
			|||||||
@ -22,30 +22,34 @@
 | 
				
			|||||||
#include <gtk/gtk.h>
 | 
					#include <gtk/gtk.h>
 | 
				
			||||||
#include <glib/gi18n.h>
 | 
					#include <glib/gi18n.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <X11/Xatom.h>
 | 
				
			||||||
 | 
					#include <gdk/gdkx.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eek/eek.h"
 | 
					#include "eek/eek.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if HAVE_CLUTTER_GTK
 | 
					#if HAVE_CLUTTER_GTK
 | 
				
			||||||
#include <clutter-gtk/clutter-gtk.h>
 | 
					#include <clutter-gtk/clutter-gtk.h>
 | 
				
			||||||
#include "eek/eek-clutter.h"
 | 
					#include "eek/eek-clutter.h"
 | 
				
			||||||
#else  /* HAVE_CLUTTER_GTK */
 | 
					#endif
 | 
				
			||||||
#include "eek/eek-gtk.h"
 | 
					#include "eek/eek-gtk.h"
 | 
				
			||||||
#endif  /* !HAVE_CLUTTER_GTK */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "server-context.h"
 | 
					#include "server-context.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CSW 640
 | 
					#define CSW 640
 | 
				
			||||||
#define CSH 480
 | 
					#define CSH 480
 | 
				
			||||||
 | 
					#define DEFAULT_THEME (THEMEDIR "/default.css")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum {
 | 
					enum {
 | 
				
			||||||
    PROP_0,
 | 
					    PROP_0,
 | 
				
			||||||
    PROP_OBJECT_PATH,
 | 
					    PROP_OBJECT_PATH,
 | 
				
			||||||
    PROP_CONNECTION,
 | 
					    PROP_CONNECTION,
 | 
				
			||||||
 | 
					    PROP_UI_TOOLKIT,
 | 
				
			||||||
    PROP_LAST
 | 
					    PROP_LAST
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const gchar introspection_xml[] =
 | 
					static const gchar introspection_xml[] =
 | 
				
			||||||
    "<node>"
 | 
					    "<node>"
 | 
				
			||||||
    "  <interface name='com.redhat.Eekboard.Context'>"
 | 
					    "  <interface name='org.fedorahosted.Eekboard.Context'>"
 | 
				
			||||||
    "    <method name='AddKeyboard'>"
 | 
					    "    <method name='AddKeyboard'>"
 | 
				
			||||||
    "      <arg direction='in' type='v' name='keyboard'/>"
 | 
					    "      <arg direction='in' type='v' name='keyboard'/>"
 | 
				
			||||||
    "      <arg direction='out' type='u' name='keyboard_id'/>"
 | 
					    "      <arg direction='out' type='u' name='keyboard_id'/>"
 | 
				
			||||||
@ -85,6 +89,12 @@ static const gchar introspection_xml[] =
 | 
				
			|||||||
    "  </interface>"
 | 
					    "  </interface>"
 | 
				
			||||||
    "</node>";
 | 
					    "</node>";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef enum {
 | 
				
			||||||
 | 
					    UI_TOOLKIT_GTK,
 | 
				
			||||||
 | 
					    UI_TOOLKIT_CLUTTER,
 | 
				
			||||||
 | 
					    UI_TOOLKIT_DEFAULT = UI_TOOLKIT_GTK
 | 
				
			||||||
 | 
					} ServerContextUIToolkitType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct _ServerContextClass ServerContextClass;
 | 
					typedef struct _ServerContextClass ServerContextClass;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _ServerContext {
 | 
					struct _ServerContext {
 | 
				
			||||||
@ -109,6 +119,9 @@ struct _ServerContext {
 | 
				
			|||||||
    gulong key_pressed_handler;
 | 
					    gulong key_pressed_handler;
 | 
				
			||||||
    gulong key_released_handler;
 | 
					    gulong key_released_handler;
 | 
				
			||||||
    gulong notify_visible_handler;
 | 
					    gulong notify_visible_handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    GSettings *settings;
 | 
				
			||||||
 | 
					    ServerContextUIToolkitType ui_toolkit;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _ServerContextClass {
 | 
					struct _ServerContextClass {
 | 
				
			||||||
@ -184,8 +197,59 @@ on_notify_visible (GObject *object, GParamSpec *spec, gpointer user_data)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
on_realize (GtkWidget *widget,
 | 
					on_realize_set_dock (GtkWidget *widget,
 | 
				
			||||||
            gpointer   user_data)
 | 
					                     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;
 | 
					    ServerContext *context = user_data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -199,8 +263,6 @@ on_realize (GtkWidget *widget,
 | 
				
			|||||||
                              GDK_FUNC_CLOSE);
 | 
					                              GDK_FUNC_CLOSE);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define DEFAULT_THEME (THEMEDIR "/default.css")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
set_geometry (ServerContext *context)
 | 
					set_geometry (ServerContext *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -216,35 +278,60 @@ set_geometry (ServerContext *context)
 | 
				
			|||||||
    gdk_screen_get_monitor_geometry (screen, monitor, &rect);
 | 
					    gdk_screen_get_monitor_geometry (screen, monitor, &rect);
 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(context->keyboard), &bounds);
 | 
					    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) {
 | 
					    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_decorated (GTK_WINDOW(context->window), FALSE);
 | 
				
			||||||
        gtk_window_set_resizable (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);
 | 
					        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 {
 | 
					    } else {
 | 
				
			||||||
 | 
					        if (context->ui_toolkit == UI_TOOLKIT_CLUTTER) {
 | 
				
			||||||
#if HAVE_CLUTTER_GTK
 | 
					#if HAVE_CLUTTER_GTK
 | 
				
			||||||
        ClutterActor *stage =
 | 
					            ClutterActor *stage =
 | 
				
			||||||
            gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
 | 
					                gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
 | 
				
			||||||
        clutter_stage_set_user_resizable (CLUTTER_STAGE(stage), TRUE);
 | 
					            clutter_stage_set_user_resizable (CLUTTER_STAGE(stage), TRUE);
 | 
				
			||||||
        clutter_stage_set_minimum_size (CLUTTER_STAGE(stage),
 | 
					            clutter_stage_set_minimum_size (CLUTTER_STAGE(stage),
 | 
				
			||||||
                                        bounds.width / 3,
 | 
					                                            bounds.width / 3,
 | 
				
			||||||
                                        bounds.height / 3);
 | 
					                                            bounds.height / 3);
 | 
				
			||||||
        g_signal_connect (stage,
 | 
					            g_signal_connect (stage,
 | 
				
			||||||
                          "allocation-changed",
 | 
					                              "allocation-changed",
 | 
				
			||||||
                          G_CALLBACK(on_allocation_changed),
 | 
					                              G_CALLBACK(on_allocation_changed),
 | 
				
			||||||
                          NULL);
 | 
					                              NULL);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					            g_return_if_reached ();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        gtk_widget_set_size_request (context->widget,
 | 
					        gtk_widget_set_size_request (context->widget,
 | 
				
			||||||
                                     bounds.width,
 | 
					                                     bounds.width,
 | 
				
			||||||
                                     bounds.height);
 | 
					                                     bounds.height);
 | 
				
			||||||
        gtk_window_move (GTK_WINDOW(context->window),
 | 
					        gtk_window_move (GTK_WINDOW(context->window),
 | 
				
			||||||
                         MAX(rect.width - 20 - bounds.width, 0),
 | 
					                         MAX(rect.width - 20 - bounds.width, 0),
 | 
				
			||||||
                         MAX(rect.height - 40 - bounds.height, 0));
 | 
					                         MAX(rect.height - 40 - bounds.height, 0));
 | 
				
			||||||
 | 
					        g_signal_connect_after (context->window, "realize",
 | 
				
			||||||
 | 
					                                G_CALLBACK(on_realize_set_non_maximizable),
 | 
				
			||||||
 | 
					                                context);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -263,21 +350,26 @@ update_widget (ServerContext *context)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    theme = eek_theme_new (DEFAULT_THEME, NULL, NULL);
 | 
					    theme = eek_theme_new (DEFAULT_THEME, NULL, NULL);
 | 
				
			||||||
    eek_element_get_bounds (EEK_ELEMENT(context->keyboard), &bounds);
 | 
					    eek_element_get_bounds (EEK_ELEMENT(context->keyboard), &bounds);
 | 
				
			||||||
 | 
					    if (context->ui_toolkit == UI_TOOLKIT_CLUTTER) {
 | 
				
			||||||
#if HAVE_CLUTTER_GTK
 | 
					#if HAVE_CLUTTER_GTK
 | 
				
			||||||
    context->widget = gtk_clutter_embed_new ();
 | 
					        context->widget = gtk_clutter_embed_new ();
 | 
				
			||||||
    stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
 | 
					        stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(context->widget));
 | 
				
			||||||
    actor = eek_clutter_keyboard_new (context->keyboard);
 | 
					        actor = eek_clutter_keyboard_new (context->keyboard);
 | 
				
			||||||
    clutter_actor_set_name (actor, "keyboard");
 | 
					        clutter_actor_set_name (actor, "keyboard");
 | 
				
			||||||
    if (theme)
 | 
					        if (theme)
 | 
				
			||||||
        eek_clutter_keyboard_set_theme (EEK_CLUTTER_KEYBOARD(actor), theme);
 | 
					            eek_clutter_keyboard_set_theme (EEK_CLUTTER_KEYBOARD(actor), theme);
 | 
				
			||||||
    clutter_container_add_actor (CLUTTER_CONTAINER(stage), actor);
 | 
					        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
 | 
					#else
 | 
				
			||||||
    context->widget = eek_gtk_keyboard_new (context->keyboard);
 | 
					        g_return_if_reached ();
 | 
				
			||||||
    if (theme)
 | 
					 | 
				
			||||||
        eek_gtk_keyboard_set_theme (EEK_GTK_KEYBOARD(context->widget), theme);
 | 
					 | 
				
			||||||
#endif
 | 
					#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) {
 | 
					    if (!context->window) {
 | 
				
			||||||
        context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 | 
					        context->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 | 
				
			||||||
@ -295,13 +387,9 @@ update_widget (ServerContext *context)
 | 
				
			|||||||
                              _("Keyboard"));
 | 
					                              _("Keyboard"));
 | 
				
			||||||
        gtk_window_set_icon_name (GTK_WINDOW(context->window), "eekboard");
 | 
					        gtk_window_set_icon_name (GTK_WINDOW(context->window), "eekboard");
 | 
				
			||||||
        gtk_window_set_keep_above (GTK_WINDOW(context->window), TRUE);
 | 
					        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);
 | 
					    gtk_container_add (GTK_CONTAINER(context->window), context->widget);
 | 
				
			||||||
 | 
					    set_geometry (context);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
@ -312,6 +400,7 @@ server_context_set_property (GObject      *object,
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    ServerContext *context = SERVER_CONTEXT(object);
 | 
					    ServerContext *context = SERVER_CONTEXT(object);
 | 
				
			||||||
    GDBusConnection *connection;
 | 
					    GDBusConnection *connection;
 | 
				
			||||||
 | 
					    const gchar *ui_toolkit;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch (prop_id) {
 | 
					    switch (prop_id) {
 | 
				
			||||||
    case PROP_OBJECT_PATH:
 | 
					    case PROP_OBJECT_PATH:
 | 
				
			||||||
@ -325,6 +414,17 @@ server_context_set_property (GObject      *object,
 | 
				
			|||||||
            g_object_unref (context->connection);
 | 
					            g_object_unref (context->connection);
 | 
				
			||||||
        context->connection = g_object_ref (connection);
 | 
					        context->connection = g_object_ref (connection);
 | 
				
			||||||
        break;
 | 
					        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:
 | 
					    default:
 | 
				
			||||||
        g_object_set_property (object,
 | 
					        g_object_set_property (object,
 | 
				
			||||||
                               g_param_spec_get_name (pspec),
 | 
					                               g_param_spec_get_name (pspec),
 | 
				
			||||||
@ -369,6 +469,11 @@ server_context_dispose (GObject *object)
 | 
				
			|||||||
        context->introspection_data = NULL;
 | 
					        context->introspection_data = NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (context->settings) {
 | 
				
			||||||
 | 
					        g_object_unref (context->settings);
 | 
				
			||||||
 | 
					        context->settings = NULL;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    G_OBJECT_CLASS (server_context_parent_class)->dispose (object);
 | 
					    G_OBJECT_CLASS (server_context_parent_class)->dispose (object);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -430,11 +535,30 @@ server_context_class_init (ServerContextClass *klass)
 | 
				
			|||||||
    g_object_class_install_property (gobject_class,
 | 
					    g_object_class_install_property (gobject_class,
 | 
				
			||||||
                                     PROP_CONNECTION,
 | 
					                                     PROP_CONNECTION,
 | 
				
			||||||
                                     pspec);
 | 
					                                     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
 | 
					static void
 | 
				
			||||||
server_context_init (ServerContext *context)
 | 
					server_context_init (ServerContext *context)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    GdkScreen *screen;
 | 
				
			||||||
    GError *error;
 | 
					    GError *error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    context->connection = NULL;
 | 
					    context->connection = NULL;
 | 
				
			||||||
@ -459,6 +583,19 @@ server_context_init (ServerContext *context)
 | 
				
			|||||||
    context->window = NULL;
 | 
					    context->window = NULL;
 | 
				
			||||||
    context->key_pressed_handler = 0;
 | 
					    context->key_pressed_handler = 0;
 | 
				
			||||||
    context->key_released_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
 | 
					static void
 | 
				
			||||||
 | 
				
			|||||||
@ -22,8 +22,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SERVER_CONTEXT_PATH "/com/redhat/Eekboard/Context_%d"
 | 
					#define SERVER_CONTEXT_PATH "/org/fedorahosted/Eekboard/Context_%d"
 | 
				
			||||||
#define SERVER_CONTEXT_INTERFACE "com.redhat.Eekboard.Context"
 | 
					#define SERVER_CONTEXT_INTERFACE "org.fedorahosted.Eekboard.Context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SERVER_TYPE_CONTEXT (server_context_get_type())
 | 
					#define SERVER_TYPE_CONTEXT (server_context_get_type())
 | 
				
			||||||
#define SERVER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_CONTEXT, ServerContext))
 | 
					#define SERVER_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_CONTEXT, ServerContext))
 | 
				
			||||||
 | 
				
			|||||||
@ -40,7 +40,7 @@ static guint signals[LAST_SIGNAL] = { 0, };
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static const gchar introspection_xml[] =
 | 
					static const gchar introspection_xml[] =
 | 
				
			||||||
    "<node>"
 | 
					    "<node>"
 | 
				
			||||||
    "  <interface name='com.redhat.Eekboard.Server'>"
 | 
					    "  <interface name='org.fedorahosted.Eekboard.Server'>"
 | 
				
			||||||
    "    <method name='CreateContext'>"
 | 
					    "    <method name='CreateContext'>"
 | 
				
			||||||
    "      <arg direction='in' type='s' name='client_name'/>"
 | 
					    "      <arg direction='in' type='s' name='client_name'/>"
 | 
				
			||||||
    "      <arg direction='out' type='s' name='object_path'/>"
 | 
					    "      <arg direction='out' type='s' name='object_path'/>"
 | 
				
			||||||
 | 
				
			|||||||
@ -22,8 +22,8 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
G_BEGIN_DECLS
 | 
					G_BEGIN_DECLS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SERVER_SERVER_PATH "/com/redhat/Eekboard/Server"
 | 
					#define SERVER_SERVER_PATH "/org/fedorahosted/Eekboard/Server"
 | 
				
			||||||
#define SERVER_SERVER_INTERFACE "com.redhat.Eekboard.Server"
 | 
					#define SERVER_SERVER_INTERFACE "org.fedorahosted.Eekboard.Server"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SERVER_TYPE_SERVER (server_server_get_type())
 | 
					#define SERVER_TYPE_SERVER (server_server_get_type())
 | 
				
			||||||
#define SERVER_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_SERVER, ServerServer))
 | 
					#define SERVER_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SERVER_TYPE_SERVER, ServerServer))
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,7 @@
 | 
				
			|||||||
#include <gdk/gdkx.h>
 | 
					#include <gdk/gdkx.h>
 | 
				
			||||||
#include <glib/gi18n.h>
 | 
					#include <glib/gi18n.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eek/eek-xml.h"
 | 
					#include "eek/eek.h"
 | 
				
			||||||
#include "eek/eek-xkl.h"
 | 
					#include "eek/eek-xkl.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if HAVE_CLUTTER_GTK
 | 
					#if HAVE_CLUTTER_GTK
 | 
				
			||||||
 | 
				
			|||||||
@ -25,7 +25,7 @@
 | 
				
			|||||||
#include "config.h"
 | 
					#include "config.h"
 | 
				
			||||||
#endif  /* HAVE_CONFIG_H */
 | 
					#endif  /* HAVE_CONFIG_H */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "eek/eek-xml.h"
 | 
					#include "eek/eek.h"
 | 
				
			||||||
#include "eek/eek-xkl.h"
 | 
					#include "eek/eek-xkl.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user