Compare commits
	
		
			15 Commits
		
	
	
		
			3.24.4
			...
			wip/garnac
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7e3f96d972 | ||
| 
						 | 
					5f91d34f88 | ||
| 
						 | 
					d0a708b42c | ||
| 
						 | 
					d940d5e581 | ||
| 
						 | 
					70f69e5de4 | ||
| 
						 | 
					c2ce0e6795 | ||
| 
						 | 
					adbd566f83 | ||
| 
						 | 
					f511f65a14 | ||
| 
						 | 
					0942d68f1a | ||
| 
						 | 
					73d5d837db | ||
| 
						 | 
					ea5b691ac6 | ||
| 
						 | 
					53d1b11386 | ||
| 
						 | 
					85e8feca67 | ||
| 
						 | 
					fb47374629 | ||
| 
						 | 
					9a92d5fe89 | 
							
								
								
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -41,14 +41,8 @@ stamp-h1
 | 
			
		||||
*~
 | 
			
		||||
stamp-it
 | 
			
		||||
.intltool-merge-cache
 | 
			
		||||
ABOUT-NLS
 | 
			
		||||
POTFILES
 | 
			
		||||
Makevars.template
 | 
			
		||||
po/*.header
 | 
			
		||||
po/*.pot
 | 
			
		||||
po/*.sed
 | 
			
		||||
po/*.sin
 | 
			
		||||
Rules-quot
 | 
			
		||||
libmutter.pc
 | 
			
		||||
mutter
 | 
			
		||||
mutter-restart-helper
 | 
			
		||||
@@ -83,10 +77,7 @@ src/relative-pointer-unstable-v*-protocol.c
 | 
			
		||||
src/relative-pointer-unstable-v*-server-protocol.h
 | 
			
		||||
src/pointer-constraints-unstable-v*-protocol.c
 | 
			
		||||
src/pointer-constraints-unstable-v*-server-protocol.h
 | 
			
		||||
src/xdg-foreign-unstable-v*-protocol.c
 | 
			
		||||
src/xdg-foreign-unstable-v*-server-protocol.h
 | 
			
		||||
src/meta/meta-version.h
 | 
			
		||||
src/libmutter-*.pc
 | 
			
		||||
doc/reference/*.args
 | 
			
		||||
doc/reference/*.bak
 | 
			
		||||
doc/reference/*.hierarchy
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										285
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										285
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,288 +1,3 @@
 | 
			
		||||
3.24.4
 | 
			
		||||
======
 | 
			
		||||
* Fix wacom cursor offset on wayland [Jason; #784009]
 | 
			
		||||
* Do not throttle motion events on tablet tools [Carlos; #783535]
 | 
			
		||||
* Handle left-handed mode on pen/eraser devices [Carlos; #782027]
 | 
			
		||||
* Fix crash when decreasing number of workspaces [Florian; #784223]
 | 
			
		||||
* Fix crash when moving across on-adjacent monitors [Jonas; #783630]
 | 
			
		||||
* Fix window moving/resizing via tablet tools [Jason; #777333]
 | 
			
		||||
* Improve stability of tablet plugs/unplugs [Carlos; #784881]
 | 
			
		||||
* Implement tablet rings/strips configuration [Carlos; #782033]
 | 
			
		||||
* Support tablet wheel events on wayland [Jason; #783716]
 | 
			
		||||
* Misc. bug fixes [Carlos, Jonas; #784402, #784867, #781723]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Carlos Garnacho, Jason Gerecke, Florian Müllner
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Jordi Mas [ca]
 | 
			
		||||
 | 
			
		||||
3.24.3
 | 
			
		||||
======
 | 
			
		||||
* Fix handling of tiled monitors [Jonas; #781723]
 | 
			
		||||
* Fix swapped red and blue channels in CoglTexture data [Carlos; #779234]
 | 
			
		||||
* Fix glitches when opening a window maximized [Olivier; #781353, #782183]
 | 
			
		||||
* Implement support for disable-while-typing option [Evan; #764852]
 | 
			
		||||
* Consider subsurfaces when grabbing [mindtree; #781811]
 | 
			
		||||
* Fix handling of left-handed mode on pen/eraser devices [Carlos; #782027]
 | 
			
		||||
* Fix output cycling in non-display-attached tablets [Carlos; #782032]
 | 
			
		||||
* Fix wacom cursor offset on wayland [Jason; #784009]
 | 
			
		||||
* Handle EXIF orientation of backgrounds [Silvère; #783125]
 | 
			
		||||
* Misc. bug fixes [Jonas, Bastien, Ikey, Carlos; #782156, #780407, #757661,
 | 
			
		||||
  #783113, #781703]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  mitchmindtree, Jonas Ådahl, Ikey Doherty, Olivier Fourdan, Carlos Garnacho,
 | 
			
		||||
  Jason Gerecke, Silvère Latchurié, Bastien Nocera, Evan Welsh
 | 
			
		||||
 | 
			
		||||
3.24.2
 | 
			
		||||
======
 | 
			
		||||
* Don't crash when wayland clients commit to destroyed surfaces [Jonas; #781391]
 | 
			
		||||
* Fix frame updates on hide-titlebar-when-maximized changes [Florian; #781862]
 | 
			
		||||
* Fix accessible screen coordinates on X11 [Florian; #781902]
 | 
			
		||||
* Fix copy+paste of UTF8 strings between X11 and wayland [Carlos; #782472]
 | 
			
		||||
* Fix non-wayland builds [Chris; #780533]
 | 
			
		||||
* Misc. bug fixes [Philip, Matthias, Nigel; #781242, #780215, #759085]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Philip Chimento, Carlos Garnacho, Matthias Liertzer,
 | 
			
		||||
  Florian Müllner, Nigel Taylor, Chris Vine
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Jordi Mas [ca]
 | 
			
		||||
 | 
			
		||||
3.24.1
 | 
			
		||||
======
 | 
			
		||||
* Always sync window geometry on state changes [Jonas; #780292]
 | 
			
		||||
* Use EGL instead of GLX when drawing using GLES [Jonas; #771636]
 | 
			
		||||
* Fix HiDPI detection on vertical monitor layouts [Carlos; #777687]
 | 
			
		||||
* Get double-click timing from desktop mouse settings [Armin; #771576]
 | 
			
		||||
* Scale relative motion deltas with monitor scale [Jonas, Carlos; #778119]
 | 
			
		||||
* Use texture fallback when setting hardware cursor fails [Jente; #770020]
 | 
			
		||||
* Fix lock-up when using additional theme variants [Shantanu; #780254]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Carlos Garnacho, Shantanu Goel, Jente Hidskes, Armin Krezović,
 | 
			
		||||
  Florian Müllner
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Yuras Shumovich [be], Yosef Or Boczko [he], Tom Tryfonidis [el]
 | 
			
		||||
 | 
			
		||||
3.24.0
 | 
			
		||||
======
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Yuri Myasoedov [ru], Rūdolfs Mazurs [lv], Jordi Mas [ca]
 | 
			
		||||
 | 
			
		||||
3.23.92
 | 
			
		||||
=======
 | 
			
		||||
* Properly handle EGLOutput acquire errors [Jonas, Miguel; #779112]
 | 
			
		||||
* Fix crash when a window closes during Alt+Tab [Rui; #779483]
 | 
			
		||||
* Implement DnD handling code in wayland [Hyungwon; #765003]
 | 
			
		||||
* Fix fallout from pixel conversion optimization in 3.23.91 [Carlos; #779234]
 | 
			
		||||
* Fix mouse input stopping to work in applications [Carlos; #763246]
 | 
			
		||||
* Fix DnD between QT5 and GTK3 applications on wayland [Carlos; #779757]
 | 
			
		||||
* Make EDID reading less fragile [Jonas; #779837]
 | 
			
		||||
* Add support for tablet grouping [Carlos; #779986]
 | 
			
		||||
* Misc. bug fixes and cleanups [Rui, Jonas; #779436, #779001, #779745]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Miguel A. Vico, Olivier Fourdan, Carlos Garnacho,
 | 
			
		||||
  Hyungwon Hwang, Rui Matos
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Chao-Hsiung Liao [zh_TW], Sveinn í Felli [is], Ask Hjorth Larsen [da],
 | 
			
		||||
  Changwoo Ryu [ko], Aurimas Černius [lt], GNOME Translation Robot [gd],
 | 
			
		||||
  Marek Černocký [cs], Fran Dieguez [gl], Dušan Kazik [sk]
 | 
			
		||||
 | 
			
		||||
3.23.91
 | 
			
		||||
=======
 | 
			
		||||
* Give libinput read-only access to /sys [Carlos; #778472]
 | 
			
		||||
* Allow edge-scrolling without 2-finger-scroll capable devices [Rui; #778554]
 | 
			
		||||
* Fullscreen windows on the requested monitor on wayland [Rui; #772525]
 | 
			
		||||
* Implement threaded swap_event fallback for NVIDIA driver [Owen; #779039]
 | 
			
		||||
* Avoid pixel conversions when storing textures from cairo [Carlos; #779234]
 | 
			
		||||
* Misc. bug fixes [Piotr, Rui, Florian; #772218, #776919, #778831, #642652]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Piotr Drąg, Carlos Garnacho, Rui Matos, Florian Müllner, Owen W. Taylor
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Inaki Larranaga Murgoitio [eu], Daniel Mustieles [es], Claude Paroz [fr],
 | 
			
		||||
  Mario Blättermann [de], Kjartan Maraas [nb], Piotr Drąg [pl],
 | 
			
		||||
  Andika Triwidada [id], Anders Jonsson [sv], Milo Casagrande [it],
 | 
			
		||||
  Fabio Tomat [fur], Rafael Fontenelle [pt_BR],
 | 
			
		||||
  Мирослав Николић [sr, sr@latin], Balázs Meskó [hu], Chao-Hsiung Liao [zh_TW]
 | 
			
		||||
 | 
			
		||||
3.23.90
 | 
			
		||||
=======
 | 
			
		||||
* Fix window menu placement with HiDPI [Jonas; #776055]
 | 
			
		||||
* Improve EGLStream support [Jonas; #773629]
 | 
			
		||||
* Start moving low-level monitor configuration into mutter [Jonas; #777732]
 | 
			
		||||
* Fix erroneous key event repeats [Rui; #774989]
 | 
			
		||||
* Don't hardcode seat ID in ClutterDeviceManager [Carlos; #778092]
 | 
			
		||||
* Fix "ghost" cursors in multi-monitor setups [Jonas; #771056]
 | 
			
		||||
* Use eglGetPlatformDisplay [Adam; #772422]
 | 
			
		||||
* Fix erratic raise_or_lower behavior [Jose; #705200]
 | 
			
		||||
* Fix coordinate mapping of absolute devices [Carlos; #774115]
 | 
			
		||||
* Show OSD on tablet mode switches [Carlos; #771098]
 | 
			
		||||
* Make mutter libs parallel installable [Jonas; #777317]
 | 
			
		||||
* Only apply keymap when not running nested [Jonas; #777800]
 | 
			
		||||
* Set right scale for tablet tool cursors on HiDPI [Carlos; #778474]
 | 
			
		||||
* Adjust server-side shadows to match Adwaita [Juraj; #744667]
 | 
			
		||||
* Misc. bug fixes [Jonas, Bastien, Carlos, Peter, Lionel, Jeremy, Florian;
 | 
			
		||||
  #774891, #777389, #777691, #778262, #776543, #778684, #778699, #744667]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Jeremy Bicha, Piotr Drąg, Juraj Fiala, Carlos Garnacho,
 | 
			
		||||
  Peter Hutterer, Adam Jackson, Lionel Landwerlin, Jose Marino, Rui Matos,
 | 
			
		||||
  Florian Müllner, Bastien Nocera
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Kjartan Maraas [nb], Mandy Wang [zh_CN], Marek Černocký [cs],
 | 
			
		||||
  Anders Jonsson [sv], Dušan Kazik [sk], Piotr Drąg [pl], Matej Urbančič [sl]
 | 
			
		||||
 | 
			
		||||
3.23.3
 | 
			
		||||
======
 | 
			
		||||
* Fix frequent freezes in multihead setups on wayland [Rui; #774557]
 | 
			
		||||
* Preserve root window mask on XSelectionRequest [Olivier; #776128]
 | 
			
		||||
* Misc. bug fixes [Carlos, Florian, Rui, Olivier; #775478, #774891, #775986,
 | 
			
		||||
  #776036]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Olivier Fourdan, Carlos Garnacho, Rui Matos, Florian Müllner
 | 
			
		||||
 | 
			
		||||
3.23.2
 | 
			
		||||
======
 | 
			
		||||
* Stack docks below other windows on fullscreen monitors [Rui; #772937]
 | 
			
		||||
* Fix popup grabs blocking screen lock on wayland [Rui; #771235]
 | 
			
		||||
* Handle touchpad pinch gestures with more than two fingers [Carlos; #765937]
 | 
			
		||||
* Implement drawing tablet support on X11 [Carlos; #773779]
 | 
			
		||||
* Fix some Wine games starting minimized [Carlos; #774333]
 | 
			
		||||
* Fix switching between two finger- and edge scrolling on wayland [Rui; #771744]
 | 
			
		||||
* Implement support for EGLStream/EGLDevice [Jonas; #773629]
 | 
			
		||||
* Add size_changed vfunc to handle async client size changes [Rui; #770345]
 | 
			
		||||
* Change focus window on clicks with any modifiers [Rui; #746642]
 | 
			
		||||
* Misc. bug fixes and cleanups [Carlos, Daniel, Jonas, Rui; #771067, #774330, #774613,
 | 
			
		||||
  #771297, #774135, #774827, #774923]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner, Daniel Stone
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Kjartan Maraas [nb]
 | 
			
		||||
 | 
			
		||||
3.23.1
 | 
			
		||||
======
 | 
			
		||||
* Fix handling of Escape shortcut in force-quit dialog [Landry; #737109]
 | 
			
		||||
* Improve pointer constraints support [Jonas; #771859]
 | 
			
		||||
* Really fix framebuffer capture origin offset [Rui; #771502]
 | 
			
		||||
* Fix session going into idle mode immediately on startup [Rui; #772839]
 | 
			
		||||
* Fix mirror mode with stage views [Rui; #773115]
 | 
			
		||||
* Fall back to X with connectors spread across multiple GPUs [Ray; #771442]
 | 
			
		||||
* Fix various crashes on wayland [Jonas, Carlos; #771646, #771858, #772929]
 | 
			
		||||
* Fix various placement issues on wayland [Olivier, Jonas, Sjoerd; #772729,
 | 
			
		||||
  #768039, #771841, #771841, #773141]
 | 
			
		||||
* Misc. bug fixes [Rui, Jonas, Olivier; #771019, #773116, #772914, #773210]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Landry MINOZA,
 | 
			
		||||
  Sjoerd Simons, Ray Strode
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Theppitak Karoonboonyanan [th], Kjartan Maraas [nb], Hannie Dumoleyn [nl],
 | 
			
		||||
  liushuyu [zh_CN]
 | 
			
		||||
 | 
			
		||||
3.22.1
 | 
			
		||||
======
 | 
			
		||||
* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745]
 | 
			
		||||
* Fall back gracefully if DRM plane rotation fails [Carlos; #772512]
 | 
			
		||||
* Approximate native monitor backend behavior to X [Rui; #772176]
 | 
			
		||||
* Fix crash on VT switch on wayland [Jonas; #771646]
 | 
			
		||||
* Expose Flatpak ID for application matching [Florian; #772613, #772614]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner, Olav Vitters
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Inaki Larranaga Murgoitio [eu], Milo Casagrande [it]
 | 
			
		||||
 | 
			
		||||
3.22.0
 | 
			
		||||
======
 | 
			
		||||
* Fix wayland crashes [Jonas; #771305, #771345, #770940, #771495]
 | 
			
		||||
* Fix display rotation on wayland [Jonas; #770672]
 | 
			
		||||
* Fix framebuffer capture origin offset [Rui; #771502]
 | 
			
		||||
* Misc. bug fixes [Jonas, Florian, Carlos; #770937, #771536, #771628, #771549]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Ask Hjorth Larsen [da], Charles Monzat [fr], Stas Solovey [ru],
 | 
			
		||||
  Tom Tryfonidis [el], David King [en_GB]
 | 
			
		||||
 | 
			
		||||
3.21.92
 | 
			
		||||
=======
 | 
			
		||||
* Fix absolute pointer motion events on wayland [Jonas; #770557]
 | 
			
		||||
* Default to using stage views [Jonas; #770366]
 | 
			
		||||
* Fix animated cursors on wayland [Rui; #749913]
 | 
			
		||||
* Fix various crashes on wayland [Jonas; #757568, #770727, #770992]
 | 
			
		||||
* Fix screen capture for stage views not at (0, 0) [Jonas; #770127]
 | 
			
		||||
* Compress motion events instead of discarding them [Jonas; #771049]
 | 
			
		||||
* Fix XWayland pointer warp emulation [Jonas; #771050]
 | 
			
		||||
* Add common monitor modes in KMS backend [Rui; #744544]
 | 
			
		||||
* Temporarily use g-s-d schemas for tablet configuration [Carlos; #771315]
 | 
			
		||||
* Misc. bug fixes [Jonas, Carlos; #770402, #770647, #770991, #770994, #770929]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Florian Müllner
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Changwoo Ryu [ko], Baurzhan Muftakhidinov [kk], Anders Jonsson [sv],
 | 
			
		||||
  Tiago Santos [pt], Rafael Fontenelle [pt_BR], Mario Blättermann [de],
 | 
			
		||||
  Alexander Shopov [bg], Rūdolfs Mazurs [lv], Fran Dieguez [gl],
 | 
			
		||||
  Trần Ngọc Quân [vi], Piotr Drąg [pl], Мирослав Николић [sr, sr@latin]
 | 
			
		||||
 | 
			
		||||
3.21.91
 | 
			
		||||
=======
 | 
			
		||||
* Add support for xdg-foreign protocol [Jonas; #769786]
 | 
			
		||||
* Support monitor rotation on wayland [Carlos; #745079]
 | 
			
		||||
* Port xdg-shell implementation to unstable v6 [Jonas; #769936]
 | 
			
		||||
* Handle unsupported buffer sizes more gracefully [Olivier; #770387]
 | 
			
		||||
* Use the same output naming logic as the X server on wayland [Rui; #770338]
 | 
			
		||||
* Fix replies in gnome-shell's chat notifications on wayland [Florian; #758167]
 | 
			
		||||
* Misc. bug fixes and cleanups [Bastien, Sjoerd, Jonas; #769276, #769636,
 | 
			
		||||
  #770131, #770324, #769731]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Florian Müllner,
 | 
			
		||||
  Bastien Nocera, Sjoerd Simons
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Piotr Drąg [pl], Mario Blättermann [de], Andika Triwidada [id],
 | 
			
		||||
  Enrico Nicoletto [pt_BR], Мирослав Николић [sr, sr@latin]
 | 
			
		||||
 | 
			
		||||
3.21.90
 | 
			
		||||
=======
 | 
			
		||||
* Consider XDG_SESSION_TYPE when determining session type [Jouke; #759388]
 | 
			
		||||
* Re-add support for edge scrolling on some touchpads [Bastien; #768245]
 | 
			
		||||
* Support mouse and trackball acceleration profile [Jonas; #769179]
 | 
			
		||||
* Draw monitor contentn to individual framebuffer [Jonas; #768976]
 | 
			
		||||
* Support virtual input devices [Jonas, Carlos; #765009]
 | 
			
		||||
* Set correct output scale on hotplug [Jonas; #769505]
 | 
			
		||||
* Misc. bug fixes and cleanups [Florian, Jonas, Thomas, Bastien, Carlos;
 | 
			
		||||
  #769014, #769024, #769054, #769070, #769036, #769305, #769578, #769800,
 | 
			
		||||
  #769073]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Jonas Ådahl, Carlos Garnacho, Thomas Hindoe Paaboel Andersen, Simon McVittie,
 | 
			
		||||
  Alberts Muktupāvels, Florian Müllner, Bastien Nocera, Jouke Witteveen
 | 
			
		||||
 | 
			
		||||
Translations:
 | 
			
		||||
  Daniel Mustieles [es], Aurimas Černius [lt], Dušan Kazik [sk],
 | 
			
		||||
  Fabio Tomat [fur], Balázs Úr [hu], Yosef Or Boczko [he], Marek Černocký [cs],
 | 
			
		||||
  Matej Urbančič [sl]
 | 
			
		||||
 | 
			
		||||
3.21.4
 | 
			
		||||
======
 | 
			
		||||
* Fix missing frame border around GTK+ dialogs [Florian; #745060]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								autogen.sh
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								autogen.sh
									
									
									
									
									
								
							@@ -6,23 +6,16 @@ test -z "$srcdir" && srcdir=.
 | 
			
		||||
 | 
			
		||||
REQUIRED_AUTOMAKE_VERSION=1.11
 | 
			
		||||
 | 
			
		||||
olddir="$(pwd)"
 | 
			
		||||
 | 
			
		||||
cd "${srcdir}"
 | 
			
		||||
 | 
			
		||||
(test -f configure.ac \
 | 
			
		||||
  && test -d src) || {
 | 
			
		||||
(test -f $srcdir/configure.ac \
 | 
			
		||||
  && test -d $srcdir/src) || {
 | 
			
		||||
    echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
 | 
			
		||||
    echo " top-level mutter directory"
 | 
			
		||||
    echo " top-level metacity directory"
 | 
			
		||||
    exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
aclocal --install || exit 1
 | 
			
		||||
intltoolize --force --copy --automake || exit 1
 | 
			
		||||
autoreconf --verbose --force --install || exit 1
 | 
			
		||||
 | 
			
		||||
cd "${olddir}"
 | 
			
		||||
 | 
			
		||||
if [ "$NOCONFIGURE" = "" ]; then
 | 
			
		||||
    "${srcdir}/configure" "$@" || exit 1
 | 
			
		||||
fi
 | 
			
		||||
which gnome-autogen.sh || {
 | 
			
		||||
    echo "You need to install gnome-common from GNOME Subversion (or from"
 | 
			
		||||
    echo "your distribution's package manager)."
 | 
			
		||||
    exit 1
 | 
			
		||||
}
 | 
			
		||||
. gnome-autogen.sh
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,6 @@ AM_CPPFLAGS = \
 | 
			
		||||
	-I$(top_builddir)/clutter		\
 | 
			
		||||
	-I$(top_srcdir)/../cogl			\
 | 
			
		||||
	-I$(top_builddir)/../cogl		\
 | 
			
		||||
	-I$(top_builddir)/../cogl/cogl		\
 | 
			
		||||
	$(CLUTTER_DEPRECATED_CFLAGS)		\
 | 
			
		||||
	$(CLUTTER_DEBUG_CFLAGS)			\
 | 
			
		||||
	$(CLUTTER_HIDDEN_VISIBILITY_CFLAGS)	\
 | 
			
		||||
@@ -37,7 +36,7 @@ AM_CFLAGS = $(CLUTTER_CFLAGS) $(MAINTAINER_CFLAGS)
 | 
			
		||||
INTROSPECTION_GIRS =
 | 
			
		||||
 | 
			
		||||
# the base include path for headers
 | 
			
		||||
clutter_base_includedir = $(includedir)/mutter/clutter-$(LIBMUTTER_API_VERSION)
 | 
			
		||||
clutter_base_includedir = $(includedir)/mutter/clutter-$(CLUTTER_API_VERSION)
 | 
			
		||||
clutter_includedir = $(clutter_base_includedir)/clutter
 | 
			
		||||
clutter_deprecateddir = $(clutter_base_includedir)/clutter/deprecated
 | 
			
		||||
 | 
			
		||||
@@ -113,6 +112,7 @@ source_h =					\
 | 
			
		||||
	clutter-snap-constraint.h	\
 | 
			
		||||
	clutter-stage.h 		\
 | 
			
		||||
	clutter-stage-manager.h	\
 | 
			
		||||
	clutter-stage-view.h		\
 | 
			
		||||
	clutter-tap-action.h		\
 | 
			
		||||
	clutter-test-utils.h		\
 | 
			
		||||
	clutter-texture.h 		\
 | 
			
		||||
@@ -198,6 +198,7 @@ source_c = \
 | 
			
		||||
	clutter-snap-constraint.c	\
 | 
			
		||||
	clutter-stage.c		\
 | 
			
		||||
	clutter-stage-manager.c	\
 | 
			
		||||
	clutter-stage-view.c	\
 | 
			
		||||
	clutter-stage-window.c	\
 | 
			
		||||
	clutter-tap-action.c		\
 | 
			
		||||
	clutter-test-utils.c		\
 | 
			
		||||
@@ -239,7 +240,6 @@ source_h_priv = \
 | 
			
		||||
	clutter-settings-private.h		\
 | 
			
		||||
	clutter-stage-manager-private.h		\
 | 
			
		||||
	clutter-stage-private.h			\
 | 
			
		||||
	clutter-stage-view.h			\
 | 
			
		||||
	clutter-stage-window.h			\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
@@ -248,7 +248,6 @@ source_c_priv = \
 | 
			
		||||
	clutter-easing.c		\
 | 
			
		||||
	clutter-event-translator.c	\
 | 
			
		||||
	clutter-id-pool.c 		\
 | 
			
		||||
	clutter-stage-view.c		\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
# deprecated installed headers
 | 
			
		||||
@@ -356,7 +355,7 @@ EXTRA_DIST += clutter-version.h.in clutter-version.h
 | 
			
		||||
# key symbol update script
 | 
			
		||||
EXTRA_DIST += clutter-keysyms-update.pl
 | 
			
		||||
 | 
			
		||||
pc_files += mutter-clutter-$(LIBMUTTER_API_VERSION).pc
 | 
			
		||||
pc_files += mutter-clutter-$(CLUTTER_API_VERSION).pc
 | 
			
		||||
 | 
			
		||||
# in order to be compatible with Clutter < 1.10, when we shipped a single
 | 
			
		||||
# shared library whose name was determined by the single backend it
 | 
			
		||||
@@ -414,13 +413,11 @@ x11_source_c_priv = \
 | 
			
		||||
x11_source_c += \
 | 
			
		||||
	x11/clutter-device-manager-xi2.c	\
 | 
			
		||||
	x11/clutter-input-device-xi2.c	\
 | 
			
		||||
	x11/clutter-input-device-tool-xi2.c \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
x11_source_h_priv += \
 | 
			
		||||
	x11/clutter-device-manager-xi2.h	\
 | 
			
		||||
	x11/clutter-input-device-xi2.h	\
 | 
			
		||||
	x11/clutter-input-device-tool-xi2.h \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
x11_source_c += \
 | 
			
		||||
@@ -442,10 +439,10 @@ x11_introspection = $(x11_source_c) $(x11_source_h)
 | 
			
		||||
clutterx11_includedir = $(clutter_includedir)/x11
 | 
			
		||||
clutterx11_include_HEADERS = $(x11_source_h)
 | 
			
		||||
 | 
			
		||||
mutter-clutter-x11-@LIBMUTTER_API_VERSION@.pc: mutter-clutter-$(LIBMUTTER_API_VERSION).pc
 | 
			
		||||
mutter-clutter-x11-$(CLUTTER_API_VERSION).pc: mutter-clutter-$(CLUTTER_API_VERSION).pc
 | 
			
		||||
	$(QUIET_GEN)cp -f $< $(@F)
 | 
			
		||||
 | 
			
		||||
pc_files += mutter-clutter-x11-$(LIBMUTTER_API_VERSION).pc
 | 
			
		||||
pc_files += mutter-clutter-x11-$(CLUTTER_API_VERSION).pc
 | 
			
		||||
 | 
			
		||||
# Shared cogl backend files
 | 
			
		||||
cogl_source_h =
 | 
			
		||||
@@ -583,17 +580,17 @@ nodist_clutter_include_HEADERS = clutter-config.h $(built_source_h)
 | 
			
		||||
clutter_deprecated_HEADERS = $(deprecated_h)
 | 
			
		||||
 | 
			
		||||
mutterlibdir = $(libdir)/mutter
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-clutter-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-clutter-@CLUTTER_API_VERSION@.la
 | 
			
		||||
 | 
			
		||||
libmutter_clutter_@LIBMUTTER_API_VERSION@_la_LIBADD = \
 | 
			
		||||
libmutter_clutter_@CLUTTER_API_VERSION@_la_LIBADD = \
 | 
			
		||||
	$(LIBM) \
 | 
			
		||||
	$(CLUTTER_LIBS) \
 | 
			
		||||
	$(top_builddir)/../cogl/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la \
 | 
			
		||||
	$(top_builddir)/../cogl/cogl-pango/libmutter-cogl-pango-$(LIBMUTTER_API_VERSION).la \
 | 
			
		||||
	$(top_builddir)/../cogl/cogl-path/libmutter-cogl-path-$(LIBMUTTER_API_VERSION).la \
 | 
			
		||||
	$(top_builddir)/../cogl/cogl/libmutter-cogl.la \
 | 
			
		||||
	$(top_builddir)/../cogl/cogl-pango/libmutter-cogl-pango.la \
 | 
			
		||||
	$(top_builddir)/../cogl/cogl-path/libmutter-cogl-path.la \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
libmutter_clutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
 | 
			
		||||
libmutter_clutter_@CLUTTER_API_VERSION@_la_SOURCES = \
 | 
			
		||||
	$(backend_source_c) \
 | 
			
		||||
	$(backend_source_h) \
 | 
			
		||||
	$(backend_source_c_priv) \
 | 
			
		||||
@@ -611,12 +608,12 @@ libmutter_clutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
 | 
			
		||||
	$(cally_sources_private) \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
nodist_libmutter_clutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
 | 
			
		||||
nodist_libmutter_clutter_@CLUTTER_API_VERSION@_la_SOURCES = \
 | 
			
		||||
	$(backend_source_built) \
 | 
			
		||||
	$(built_source_c) \
 | 
			
		||||
	$(built_source_h)
 | 
			
		||||
 | 
			
		||||
libmutter_clutter_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
 | 
			
		||||
libmutter_clutter_@CLUTTER_API_VERSION@_la_LDFLAGS = \
 | 
			
		||||
	$(CLUTTER_LINK_FLAGS) \
 | 
			
		||||
	$(CLUTTER_LT_LDFLAGS) \
 | 
			
		||||
	-export-dynamic \
 | 
			
		||||
@@ -630,13 +627,13 @@ install-exec-local:
 | 
			
		||||
	    rm -f $$lib.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION); \
 | 
			
		||||
	  ) ; \
 | 
			
		||||
	  (cd $(DESTDIR)$(mutterlibdir) && \
 | 
			
		||||
	    { ln -s -f libmutter-clutter-$(LIBMUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib.0 || \
 | 
			
		||||
	      { rm -f $$lib.0 && ln -s libmutter-clutter-$(LIBMUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib.0; }; \
 | 
			
		||||
	    { ln -s -f libmutter-clutter-$(CLUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib.0 || \
 | 
			
		||||
	      { rm -f $$lib.0 && ln -s libmutter-clutter-1.0.so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib.0; }; \
 | 
			
		||||
	    } \
 | 
			
		||||
	  ) ; \
 | 
			
		||||
	  (cd $(DESTDIR)$(mutterlibdir) && \
 | 
			
		||||
	    { ln -s -f libmutter-clutter-$(LIBMUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib || \
 | 
			
		||||
	      { rm -f $$lib && ln -s libmutter-clutter-$(LIBMUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib; }; \
 | 
			
		||||
	    { ln -s -f libmutter-clutter-$(CLUTTER_API_VERSION).so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib || \
 | 
			
		||||
	      { rm -f $$lib && ln -s libmutter-clutter-1.0.so.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION) $$lib; }; \
 | 
			
		||||
	    } \
 | 
			
		||||
	  ) ; \
 | 
			
		||||
	done
 | 
			
		||||
@@ -644,65 +641,59 @@ install-exec-local:
 | 
			
		||||
# gobject-introspection rules
 | 
			
		||||
-include $(INTROSPECTION_MAKEFILE)
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_SCANNER_ARGS = \
 | 
			
		||||
	--add-include-path=$(top_builddir)/../cogl/cogl \
 | 
			
		||||
	--add-include-path=$(top_builddir)/../cogl/cogl-pango
 | 
			
		||||
INTROSPECTION_COMPILER_ARGS = \
 | 
			
		||||
	--includedir=$(top_builddir)/../cogl/cogl \
 | 
			
		||||
	--includedir=$(top_builddir)/../cogl/cogl-pango
 | 
			
		||||
INTROSPECTION_SCANNER_ENV = \
 | 
			
		||||
	PKG_CONFIG_PATH=$(top_builddir)/../cogl/cogl/:$(top_builddir)/../cogl/cogl-pango/:$${PKG_CONFIG_PATH}
 | 
			
		||||
INTROSPECTION_SCANNER_ARGS = --add-include-path=$(top_builddir)/../cogl/cogl --add-include-path=$(top_builddir)/../cogl/cogl-pango
 | 
			
		||||
INTROSPECTION_COMPILER_ARGS = --includedir=$(top_builddir)/../cogl/cogl --includedir=$(top_builddir)/../cogl/cogl-pango
 | 
			
		||||
 | 
			
		||||
Clutter-@LIBMUTTER_API_VERSION@.gir: libmutter-clutter-@LIBMUTTER_API_VERSION@.la Makefile
 | 
			
		||||
Clutter-@CLUTTER_API_VERSION@.gir: libmutter-clutter-@CLUTTER_API_VERSION@.la Makefile
 | 
			
		||||
 | 
			
		||||
Clutter_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = Clutter
 | 
			
		||||
Clutter_@LIBMUTTER_API_VERSION@_gir_VERSION = @LIBMUTTER_API_VERSION@
 | 
			
		||||
Clutter_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-clutter-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
Clutter_@LIBMUTTER_API_VERSION@_gir_FILES = \
 | 
			
		||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = Clutter
 | 
			
		||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_VERSION = @CLUTTER_API_VERSION@
 | 
			
		||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_LIBS = libmutter-clutter-@CLUTTER_API_VERSION@.la
 | 
			
		||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_FILES = \
 | 
			
		||||
	$(clutter_include_HEADERS) \
 | 
			
		||||
	$(clutter_deprecated_HEADERS) \
 | 
			
		||||
	$(nodist_clutter_include_HEADERS) \
 | 
			
		||||
	$(source_c) \
 | 
			
		||||
	$(deprecated_c) \
 | 
			
		||||
	$(built_source_c)
 | 
			
		||||
Clutter_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
 | 
			
		||||
Clutter_@LIBMUTTER_API_VERSION@_gir_INCLUDES = GL-1.0 GObject-2.0 cairo-1.0 Cogl-@LIBMUTTER_API_VERSION@ CoglPango-@LIBMUTTER_API_VERSION@ Atk-1.0 Json-1.0
 | 
			
		||||
Clutter_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \
 | 
			
		||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
 | 
			
		||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_INCLUDES = GL-1.0 GObject-2.0 cairo-1.0 Cogl-1.0 CoglPango-1.0 Atk-1.0 Json-1.0
 | 
			
		||||
Clutter_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
 | 
			
		||||
	--warn-all \
 | 
			
		||||
	--c-include='clutter/clutter.h' \
 | 
			
		||||
	--pkg-export=mutter-clutter-@LIBMUTTER_API_VERSION@
 | 
			
		||||
	--pkg-export=mutter-clutter-@CLUTTER_API_VERSION@
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_GIRS += Clutter-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
INTROSPECTION_GIRS += Clutter-@CLUTTER_API_VERSION@.gir
 | 
			
		||||
 | 
			
		||||
Cally-@LIBMUTTER_API_VERSION@.gir: Makefile Clutter-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
Cally-@CLUTTER_API_VERSION@.gir: Makefile Clutter-@CLUTTER_API_VERSION@.gir
 | 
			
		||||
 | 
			
		||||
Cally_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = Cally
 | 
			
		||||
Cally_@LIBMUTTER_API_VERSION@_gir_VERSION = @LIBMUTTER_API_VERSION@
 | 
			
		||||
Cally_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-clutter-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
Cally_@LIBMUTTER_API_VERSION@_gir_FILES = $(cally_sources_h) $(cally_sources_c)
 | 
			
		||||
Cally_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
 | 
			
		||||
Cally_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \
 | 
			
		||||
Cally_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = Cally
 | 
			
		||||
Cally_@CLUTTER_API_VERSION_AM@_gir_VERSION = @CLUTTER_API_VERSION@
 | 
			
		||||
Cally_@CLUTTER_API_VERSION_AM@_gir_LIBS = libmutter-clutter-@CLUTTER_API_VERSION@.la
 | 
			
		||||
Cally_@CLUTTER_API_VERSION_AM@_gir_FILES = $(cally_sources_h) $(cally_sources_c)
 | 
			
		||||
Cally_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
 | 
			
		||||
Cally_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
 | 
			
		||||
	--warn-all \
 | 
			
		||||
	--c-include='cally/cally.h' \
 | 
			
		||||
	--pkg-export=mutter-cally-@LIBMUTTER_API_VERSION@ \
 | 
			
		||||
	--include-uninstalled=$(top_builddir)/clutter/Clutter-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
	--pkg-export=mutter-cally-@CLUTTER_API_VERSION@ \
 | 
			
		||||
	--include-uninstalled=$(top_builddir)/clutter/Clutter-@CLUTTER_API_VERSION@.gir
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_GIRS += Cally-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
INTROSPECTION_GIRS += Cally-@CLUTTER_API_VERSION@.gir
 | 
			
		||||
 | 
			
		||||
ClutterX11-@LIBMUTTER_API_VERSION@.gir: Makefile Clutter-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
ClutterX11-@CLUTTER_API_VERSION@.gir: Makefile Clutter-@CLUTTER_API_VERSION@.gir
 | 
			
		||||
 | 
			
		||||
ClutterX11_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = ClutterX11
 | 
			
		||||
ClutterX11_@LIBMUTTER_API_VERSION@_gir_INCLUDES = xlib-2.0
 | 
			
		||||
ClutterX11_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-clutter-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
ClutterX11_@LIBMUTTER_API_VERSION@_gir_FILES = $(x11_introspection)
 | 
			
		||||
ClutterX11_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
 | 
			
		||||
ClutterX11_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \
 | 
			
		||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = ClutterX11
 | 
			
		||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_INCLUDES = xlib-2.0
 | 
			
		||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_LIBS = libmutter-clutter-@CLUTTER_API_VERSION@.la
 | 
			
		||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_FILES = $(x11_introspection)
 | 
			
		||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
 | 
			
		||||
ClutterX11_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
 | 
			
		||||
	--warn-all \
 | 
			
		||||
	--c-include='clutter/x11/clutter-x11.h' \
 | 
			
		||||
	--pkg-export=mutter-clutter-x11-@LIBMUTTER_API_VERSION@ \
 | 
			
		||||
	--include-uninstalled=$(top_builddir)/clutter/Clutter-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
	--pkg-export=mutter-clutter-x11-@CLUTTER_API_VERSION@ \
 | 
			
		||||
	--include-uninstalled=$(top_builddir)/clutter/Clutter-@CLUTTER_API_VERSION@.gir
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_GIRS += ClutterX11-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
INTROSPECTION_GIRS += ClutterX11-@CLUTTER_API_VERSION@.gir
 | 
			
		||||
 | 
			
		||||
# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
 | 
			
		||||
# install anything - we need to install inside our prefix.
 | 
			
		||||
 
 | 
			
		||||
@@ -781,7 +781,7 @@ _cally_actor_get_top_level_origin (ClutterActor *actor,
 | 
			
		||||
                   "position of the stage");
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
#endif
 | 
			
		||||
#else
 | 
			
		||||
    {
 | 
			
		||||
      static gboolean yet_warned = FALSE;
 | 
			
		||||
 | 
			
		||||
@@ -793,6 +793,7 @@ _cally_actor_get_top_level_origin (ClutterActor *actor,
 | 
			
		||||
                     "atk_component_get_extents() with ATK_XY_SCREEN.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if (xp)
 | 
			
		||||
    *xp = x;
 | 
			
		||||
 
 | 
			
		||||
@@ -401,7 +401,7 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
 | 
			
		||||
  gboolean res;
 | 
			
		||||
  cairo_t *cr;
 | 
			
		||||
 | 
			
		||||
  g_assert (priv->height > 0 && priv->width > 0);
 | 
			
		||||
  g_assert (priv->width > 0 && priv->width > 0);
 | 
			
		||||
 | 
			
		||||
  priv->dirty = TRUE;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,6 @@
 | 
			
		||||
struct _ClutterClonePrivate
 | 
			
		||||
{
 | 
			
		||||
  ClutterActor *clone_source;
 | 
			
		||||
  gulong source_destroy_id;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE_WITH_PRIVATE (ClutterClone, clutter_clone, CLUTTER_TYPE_ACTOR)
 | 
			
		||||
@@ -377,13 +376,6 @@ clutter_clone_new (ClutterActor *source)
 | 
			
		||||
  return g_object_new (CLUTTER_TYPE_CLONE, "source", source,  NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
on_source_destroyed (ClutterActor *source,
 | 
			
		||||
                     ClutterClone *self)
 | 
			
		||||
{
 | 
			
		||||
  clutter_clone_set_source_internal (self, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_clone_set_source_internal (ClutterClone *self,
 | 
			
		||||
				   ClutterActor *source)
 | 
			
		||||
@@ -395,8 +387,6 @@ clutter_clone_set_source_internal (ClutterClone *self,
 | 
			
		||||
 | 
			
		||||
  if (priv->clone_source != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      g_signal_handler_disconnect (priv->clone_source, priv->source_destroy_id);
 | 
			
		||||
      priv->source_destroy_id = 0;
 | 
			
		||||
      _clutter_actor_detach_clone (priv->clone_source, CLUTTER_ACTOR (self));
 | 
			
		||||
      g_object_unref (priv->clone_source);
 | 
			
		||||
      priv->clone_source = NULL;
 | 
			
		||||
@@ -406,8 +396,6 @@ clutter_clone_set_source_internal (ClutterClone *self,
 | 
			
		||||
    {
 | 
			
		||||
      priv->clone_source = g_object_ref (source);
 | 
			
		||||
      _clutter_actor_attach_clone (priv->clone_source, CLUTTER_ACTOR (self));
 | 
			
		||||
      priv->source_destroy_id = g_signal_connect (priv->clone_source, "destroy",
 | 
			
		||||
                                                  G_CALLBACK (on_source_destroyed), self);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_SOURCE]);
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,7 @@
 | 
			
		||||
#include "clutter-debug.h"
 | 
			
		||||
 | 
			
		||||
/* XXX - keep in sync with the ClutterStaticColor enumeration order */
 | 
			
		||||
static const ClutterColor static_colors[] = {
 | 
			
		||||
static const ClutterColor const static_colors[] = {
 | 
			
		||||
  /* CGA/EGA color palette */
 | 
			
		||||
  { 0xff, 0xff, 0xff, 0xff },   /* white */
 | 
			
		||||
  { 0x00, 0x00, 0x00, 0xff },   /* black */
 | 
			
		||||
 
 | 
			
		||||
@@ -154,15 +154,6 @@ struct _ClutterInputDeviceClass
 | 
			
		||||
                                 guint              *evdev_keycode);
 | 
			
		||||
  void (* update_from_tool) (ClutterInputDevice     *device,
 | 
			
		||||
                             ClutterInputDeviceTool *tool);
 | 
			
		||||
 | 
			
		||||
  gboolean (* is_mode_switch_button) (ClutterInputDevice *device,
 | 
			
		||||
                                      guint               group,
 | 
			
		||||
                                      guint               button);
 | 
			
		||||
  gint (* get_group_n_modes) (ClutterInputDevice *device,
 | 
			
		||||
                              gint                group);
 | 
			
		||||
 | 
			
		||||
  gboolean (* is_grouped) (ClutterInputDevice *device,
 | 
			
		||||
                           ClutterInputDevice *other_device);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Platform-dependent interface */
 | 
			
		||||
@@ -197,10 +188,6 @@ void            _clutter_device_manager_select_stage_events     (ClutterDeviceMa
 | 
			
		||||
                                                                 ClutterStage         *stage);
 | 
			
		||||
ClutterBackend *_clutter_device_manager_get_backend             (ClutterDeviceManager *device_manager);
 | 
			
		||||
 | 
			
		||||
void            _clutter_device_manager_compress_motion         (ClutterDeviceManager *device_manger,
 | 
			
		||||
                                                                 ClutterEvent         *event,
 | 
			
		||||
                                                                 const ClutterEvent   *to_discard);
 | 
			
		||||
 | 
			
		||||
/* input device */
 | 
			
		||||
gboolean        _clutter_input_device_has_sequence              (ClutterInputDevice   *device,
 | 
			
		||||
                                                                 ClutterEventSequence *sequence);
 | 
			
		||||
 
 | 
			
		||||
@@ -48,7 +48,6 @@
 | 
			
		||||
#include "clutter-private.h"
 | 
			
		||||
#include "clutter-stage-private.h"
 | 
			
		||||
#include "clutter-virtual-input-device.h"
 | 
			
		||||
#include "clutter-input-device-tool.h"
 | 
			
		||||
 | 
			
		||||
struct _ClutterDeviceManagerPrivate
 | 
			
		||||
{
 | 
			
		||||
@@ -71,7 +70,6 @@ enum
 | 
			
		||||
{
 | 
			
		||||
  DEVICE_ADDED,
 | 
			
		||||
  DEVICE_REMOVED,
 | 
			
		||||
  TOOL_CHANGED,
 | 
			
		||||
 | 
			
		||||
  LAST_SIGNAL
 | 
			
		||||
};
 | 
			
		||||
@@ -186,16 +184,6 @@ clutter_device_manager_class_init (ClutterDeviceManagerClass *klass)
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 1,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE);
 | 
			
		||||
 | 
			
		||||
  manager_signals[TOOL_CHANGED] =
 | 
			
		||||
    g_signal_new (I_("tool-changed"),
 | 
			
		||||
                  G_TYPE_FROM_CLASS (klass),
 | 
			
		||||
                  G_SIGNAL_RUN_LAST,
 | 
			
		||||
                  0, NULL, NULL,
 | 
			
		||||
                  _clutter_marshal_VOID__OBJECT_OBJECT,
 | 
			
		||||
                  G_TYPE_NONE, 2,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE,
 | 
			
		||||
                  CLUTTER_TYPE_INPUT_DEVICE_TOOL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -470,20 +458,3 @@ clutter_device_manager_create_virtual_device (ClutterDeviceManager   *device_man
 | 
			
		||||
  return manager_class->create_virtual_device (device_manager,
 | 
			
		||||
                                               device_type);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_device_manager_compress_motion (ClutterDeviceManager *device_manager,
 | 
			
		||||
                                         ClutterEvent         *event,
 | 
			
		||||
                                         const ClutterEvent   *to_discard)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerClass *manager_class;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager));
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager);
 | 
			
		||||
  if (!manager_class->compress_motion)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  manager_class->compress_motion (device_manager, event, to_discard);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -83,14 +83,11 @@ struct _ClutterDeviceManagerClass
 | 
			
		||||
                                           ClutterInputDevice     *device);
 | 
			
		||||
  void                (* select_stage_events) (ClutterDeviceManager *manager,
 | 
			
		||||
                                               ClutterStage       *stage);
 | 
			
		||||
  ClutterVirtualInputDevice *(* create_virtual_device) (ClutterDeviceManager  *device_manager,
 | 
			
		||||
  ClutterVirtualInputDevice *(* create_virtual_device) (ClutterDeviceManager  *manager,
 | 
			
		||||
                                                        ClutterInputDeviceType device_type);
 | 
			
		||||
  void                (* compress_motion) (ClutterDeviceManager *device_manger,
 | 
			
		||||
                                           ClutterEvent         *event,
 | 
			
		||||
                                           const ClutterEvent   *to_discard);
 | 
			
		||||
 | 
			
		||||
  /* padding */
 | 
			
		||||
  gpointer _padding[6];
 | 
			
		||||
  gpointer _padding[7];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_2
 | 
			
		||||
 
 | 
			
		||||
@@ -1990,28 +1990,22 @@ clutter_event_remove_filter (guint id)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_event_get_touchpad_gesture_finger_count:
 | 
			
		||||
 * @event: a touchpad swipe/pinch event
 | 
			
		||||
 * clutter_event_get_gesture_swipe_finger_count:
 | 
			
		||||
 * @event: a touchpad swipe event
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the number of fingers that is triggering the touchpad gesture.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: the number of fingers in the gesture.
 | 
			
		||||
 * Returns: the number of fingers swiping.
 | 
			
		||||
 *
 | 
			
		||||
 * Since: 1.24
 | 
			
		||||
 **/
 | 
			
		||||
guint
 | 
			
		||||
clutter_event_get_touchpad_gesture_finger_count (const ClutterEvent *event)
 | 
			
		||||
clutter_event_get_gesture_swipe_finger_count (const ClutterEvent *event)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (event != NULL, 0);
 | 
			
		||||
  g_return_val_if_fail (event->type == CLUTTER_TOUCHPAD_SWIPE ||
 | 
			
		||||
                        event->type == CLUTTER_TOUCHPAD_PINCH, 0);
 | 
			
		||||
  g_return_val_if_fail (event->type == CLUTTER_TOUCHPAD_SWIPE, 0);
 | 
			
		||||
 | 
			
		||||
  if (event->type == CLUTTER_TOUCHPAD_SWIPE)
 | 
			
		||||
    return event->touchpad_swipe.n_fingers;
 | 
			
		||||
  else if (event->type == CLUTTER_TOUCHPAD_PINCH)
 | 
			
		||||
    return event->touchpad_pinch.n_fingers;
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
  return event->touchpad_swipe.n_fingers;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -2179,61 +2173,3 @@ clutter_event_get_mode_group (const ClutterEvent *event)
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_event_get_pad_event_details:
 | 
			
		||||
 * @event: a pad event
 | 
			
		||||
 * @number: (out) (optional): ring/strip/button number
 | 
			
		||||
 * @mode: (out) (optional): pad mode as per the event
 | 
			
		||||
 * @value: (out) (optional): event axis value
 | 
			
		||||
 *
 | 
			
		||||
 * Returns the details of a pad event.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns: #TRUE if event details could be obtained
 | 
			
		||||
 **/
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_event_get_pad_event_details (const ClutterEvent *event,
 | 
			
		||||
                                     guint              *number,
 | 
			
		||||
                                     guint              *mode,
 | 
			
		||||
                                     gdouble            *value)
 | 
			
		||||
{
 | 
			
		||||
  guint n, m;
 | 
			
		||||
  gdouble v;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (event != NULL, FALSE);
 | 
			
		||||
  g_return_val_if_fail (event->type == CLUTTER_PAD_BUTTON_PRESS ||
 | 
			
		||||
                        event->type == CLUTTER_PAD_BUTTON_RELEASE ||
 | 
			
		||||
                        event->type == CLUTTER_PAD_RING ||
 | 
			
		||||
                        event->type == CLUTTER_PAD_STRIP, FALSE);
 | 
			
		||||
 | 
			
		||||
  switch (event->type)
 | 
			
		||||
    {
 | 
			
		||||
    case CLUTTER_PAD_BUTTON_PRESS:
 | 
			
		||||
    case CLUTTER_PAD_BUTTON_RELEASE:
 | 
			
		||||
      n = event->pad_button.button;
 | 
			
		||||
      m = event->pad_button.mode;
 | 
			
		||||
      v = 0.0;
 | 
			
		||||
      break;
 | 
			
		||||
    case CLUTTER_PAD_RING:
 | 
			
		||||
      n = event->pad_ring.ring_number;
 | 
			
		||||
      m = event->pad_ring.mode;
 | 
			
		||||
      v = event->pad_ring.angle;
 | 
			
		||||
      break;
 | 
			
		||||
    case CLUTTER_PAD_STRIP:
 | 
			
		||||
      n = event->pad_strip.strip_number;
 | 
			
		||||
      m = event->pad_strip.mode;
 | 
			
		||||
      v = event->pad_strip.value;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (number)
 | 
			
		||||
    *number = n;
 | 
			
		||||
  if (mode)
 | 
			
		||||
    *mode = m;
 | 
			
		||||
  if (value)
 | 
			
		||||
    *value = v;
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -459,7 +459,6 @@ struct _ClutterTouchpadPinchEvent
 | 
			
		||||
  gfloat dy;
 | 
			
		||||
  gfloat angle_delta;
 | 
			
		||||
  gfloat scale;
 | 
			
		||||
  guint n_fingers;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -508,7 +507,6 @@ struct _ClutterPadButtonEvent
 | 
			
		||||
  guint32 button;
 | 
			
		||||
  guint32 group;
 | 
			
		||||
  ClutterInputDevice *device;
 | 
			
		||||
  guint32 mode;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterPadStripEvent
 | 
			
		||||
@@ -524,7 +522,6 @@ struct _ClutterPadStripEvent
 | 
			
		||||
  guint32 strip_number;
 | 
			
		||||
  guint32 group;
 | 
			
		||||
  gdouble value;
 | 
			
		||||
  guint32 mode;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterPadRingEvent
 | 
			
		||||
@@ -540,7 +537,6 @@ struct _ClutterPadRingEvent
 | 
			
		||||
  guint32 ring_number;
 | 
			
		||||
  guint32 group;
 | 
			
		||||
  gdouble angle;
 | 
			
		||||
  guint32 mode;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -756,7 +752,7 @@ CLUTTER_AVAILABLE_IN_1_2
 | 
			
		||||
const ClutterEvent *    clutter_get_current_event               (void);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_24
 | 
			
		||||
guint                   clutter_event_get_touchpad_gesture_finger_count (const ClutterEvent  *event);
 | 
			
		||||
guint                   clutter_event_get_gesture_swipe_finger_count (const ClutterEvent     *event);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_24
 | 
			
		||||
gdouble                 clutter_event_get_gesture_pinch_angle_delta  (const ClutterEvent     *event);
 | 
			
		||||
@@ -778,12 +774,6 @@ ClutterScrollFinishFlags clutter_event_get_scroll_finish_flags       (const Clut
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
guint                    clutter_event_get_mode_group                (const ClutterEvent     *event);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
gboolean                 clutter_event_get_pad_event_details         (const ClutterEvent     *event,
 | 
			
		||||
                                                                      guint                  *number,
 | 
			
		||||
                                                                      guint                  *mode,
 | 
			
		||||
                                                                      gdouble                *value);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2175,63 +2175,6 @@ clutter_input_device_get_n_mode_groups (ClutterInputDevice *device)
 | 
			
		||||
  return device->n_mode_groups;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gint
 | 
			
		||||
clutter_input_device_get_group_n_modes (ClutterInputDevice *device,
 | 
			
		||||
                                        gint                group)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceClass *device_class;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), 0);
 | 
			
		||||
  g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
 | 
			
		||||
                        CLUTTER_PAD_DEVICE, 0);
 | 
			
		||||
  g_return_val_if_fail (group >= 0, 0);
 | 
			
		||||
 | 
			
		||||
  device_class = CLUTTER_INPUT_DEVICE_GET_CLASS (device);
 | 
			
		||||
 | 
			
		||||
  if (device_class->get_group_n_modes)
 | 
			
		||||
    return device_class->get_group_n_modes (device, group);
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_input_device_is_mode_switch_button (ClutterInputDevice *device,
 | 
			
		||||
                                            guint               group,
 | 
			
		||||
                                            guint               button)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceClass *device_class;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
 | 
			
		||||
  g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
 | 
			
		||||
                        CLUTTER_PAD_DEVICE, FALSE);
 | 
			
		||||
 | 
			
		||||
  device_class = CLUTTER_INPUT_DEVICE_GET_CLASS (device);
 | 
			
		||||
 | 
			
		||||
  if (device_class->is_mode_switch_button)
 | 
			
		||||
    return device_class->is_mode_switch_button (device, group, button);
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gint
 | 
			
		||||
clutter_input_device_get_mode_switch_button_group (ClutterInputDevice *device,
 | 
			
		||||
                                                   guint               button)
 | 
			
		||||
{
 | 
			
		||||
  gint group;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), -1);
 | 
			
		||||
  g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
 | 
			
		||||
                        CLUTTER_PAD_DEVICE, -1);
 | 
			
		||||
 | 
			
		||||
  for (group = 0; group < device->n_mode_groups; group++)
 | 
			
		||||
    {
 | 
			
		||||
      if (clutter_input_device_is_mode_switch_button (device, group, button))
 | 
			
		||||
        return group;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const gchar *
 | 
			
		||||
clutter_input_device_get_device_node (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
@@ -2243,15 +2186,10 @@ clutter_input_device_get_device_node (ClutterInputDevice *device)
 | 
			
		||||
ClutterInputDeviceMapping
 | 
			
		||||
clutter_input_device_get_mapping_mode (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceType device_type;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device),
 | 
			
		||||
                        CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
 | 
			
		||||
 | 
			
		||||
  device_type = clutter_input_device_get_device_type (device);
 | 
			
		||||
  g_return_val_if_fail (device_type == CLUTTER_TABLET_DEVICE ||
 | 
			
		||||
                        device_type == CLUTTER_PEN_DEVICE ||
 | 
			
		||||
                        device_type == CLUTTER_ERASER_DEVICE,
 | 
			
		||||
  g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
 | 
			
		||||
                        CLUTTER_TABLET_DEVICE,
 | 
			
		||||
                        CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
 | 
			
		||||
 | 
			
		||||
  return device->mapping_mode;
 | 
			
		||||
@@ -2261,14 +2199,9 @@ void
 | 
			
		||||
clutter_input_device_set_mapping_mode (ClutterInputDevice        *device,
 | 
			
		||||
                                       ClutterInputDeviceMapping  mapping)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceType device_type;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
 | 
			
		||||
 | 
			
		||||
  device_type = clutter_input_device_get_device_type (device);
 | 
			
		||||
  g_return_if_fail (device_type == CLUTTER_TABLET_DEVICE ||
 | 
			
		||||
                    device_type == CLUTTER_PEN_DEVICE ||
 | 
			
		||||
                    device_type == CLUTTER_ERASER_DEVICE);
 | 
			
		||||
  g_return_if_fail (clutter_input_device_get_device_type (device) ==
 | 
			
		||||
                    CLUTTER_TABLET_DEVICE);
 | 
			
		||||
 | 
			
		||||
  if (device->mapping_mode == mapping)
 | 
			
		||||
    return;
 | 
			
		||||
@@ -2276,13 +2209,3 @@ clutter_input_device_set_mapping_mode (ClutterInputDevice        *device,
 | 
			
		||||
  device->mapping_mode = mapping;
 | 
			
		||||
  g_object_notify (G_OBJECT (device), "mapping-mode");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_input_device_is_grouped (ClutterInputDevice *device,
 | 
			
		||||
                                 ClutterInputDevice *other_device)
 | 
			
		||||
{
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (other_device), FALSE);
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_INPUT_DEVICE_GET_CLASS (device)->is_grouped (device, other_device);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -147,18 +147,6 @@ gint                    clutter_input_device_get_n_strips       (ClutterInputDev
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
gint                    clutter_input_device_get_n_mode_groups  (ClutterInputDevice *device);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
gint                    clutter_input_device_get_group_n_modes  (ClutterInputDevice *device,
 | 
			
		||||
                                                                 gint                group);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
gboolean                clutter_input_device_is_mode_switch_button (ClutterInputDevice *device,
 | 
			
		||||
                                                                    guint               group,
 | 
			
		||||
								    guint               button);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
gint                    clutter_input_device_get_mode_switch_button_group (ClutterInputDevice *device,
 | 
			
		||||
                                                                           guint               button);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
const gchar *           clutter_input_device_get_device_node    (ClutterInputDevice *device);
 | 
			
		||||
 | 
			
		||||
@@ -168,9 +156,6 @@ ClutterInputDeviceMapping clutter_input_device_get_mapping_mode (ClutterInputDev
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void                      clutter_input_device_set_mapping_mode (ClutterInputDevice        *device,
 | 
			
		||||
                                                                 ClutterInputDeviceMapping  mapping);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
gboolean                  clutter_input_device_is_grouped       (ClutterInputDevice *device,
 | 
			
		||||
                                                                 ClutterInputDevice *other_device);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -719,8 +719,14 @@ clutter_get_text_direction (void)
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      /* Re-use GTK+'s LTR/RTL handling */
 | 
			
		||||
      const char *e = g_dgettext ("gtk30", "default:LTR");
 | 
			
		||||
      /* Translators: Leave this UNTRANSLATED if your language is
 | 
			
		||||
       * left-to-right.  If your language is right-to-left
 | 
			
		||||
       * (e.g. Hebrew, Arabic), translate it to "default:RTL".
 | 
			
		||||
       *
 | 
			
		||||
       * Do NOT translate it to non-English e.g. "predefinito:LTR"! If
 | 
			
		||||
       * it isn't default:LTR or default:RTL it will not work.
 | 
			
		||||
       */
 | 
			
		||||
      char *e = _("default:LTR");
 | 
			
		||||
 | 
			
		||||
      if (strcmp (e, "default:RTL") == 0)
 | 
			
		||||
        dir = CLUTTER_TEXT_DIRECTION_RTL;
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,6 @@ VOID:OBJECT
 | 
			
		||||
VOID:OBJECT,FLAGS
 | 
			
		||||
VOID:OBJECT,FLOAT,FLOAT
 | 
			
		||||
VOID:OBJECT,FLOAT,FLOAT,FLAGS
 | 
			
		||||
VOID:OBJECT,OBJECT
 | 
			
		||||
VOID:OBJECT,PARAM
 | 
			
		||||
VOID:OBJECT,POINTER
 | 
			
		||||
VOID:OBJECT,UINT
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,6 @@ enum
 | 
			
		||||
 | 
			
		||||
  PROP_LAYOUT,
 | 
			
		||||
  PROP_FRAMEBUFFER,
 | 
			
		||||
  PROP_OFFSCREEN,
 | 
			
		||||
 | 
			
		||||
  PROP_LAST
 | 
			
		||||
};
 | 
			
		||||
@@ -38,10 +37,6 @@ typedef struct _ClutterStageViewPrivate
 | 
			
		||||
{
 | 
			
		||||
  cairo_rectangle_int_t layout;
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
 | 
			
		||||
  CoglOffscreen *offscreen;
 | 
			
		||||
  CoglPipeline *pipeline;
 | 
			
		||||
 | 
			
		||||
  guint dirty_viewport   : 1;
 | 
			
		||||
  guint dirty_projection : 1;
 | 
			
		||||
} ClutterStageViewPrivate;
 | 
			
		||||
@@ -60,18 +55,6 @@ clutter_stage_view_get_layout (ClutterStageView      *view,
 | 
			
		||||
 | 
			
		||||
CoglFramebuffer *
 | 
			
		||||
clutter_stage_view_get_framebuffer (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  if (priv->offscreen)
 | 
			
		||||
    return priv->offscreen;
 | 
			
		||||
  else
 | 
			
		||||
    return priv->framebuffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CoglFramebuffer *
 | 
			
		||||
clutter_stage_view_get_onscreen (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
@@ -79,68 +62,6 @@ clutter_stage_view_get_onscreen (ClutterStageView *view)
 | 
			
		||||
  return priv->framebuffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_view_ensure_offscreen_blit_pipeline (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
  ClutterStageViewClass *view_class =
 | 
			
		||||
    CLUTTER_STAGE_VIEW_GET_CLASS (view);
 | 
			
		||||
 | 
			
		||||
  g_assert (priv->offscreen != NULL);
 | 
			
		||||
 | 
			
		||||
  if (priv->pipeline)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  priv->pipeline =
 | 
			
		||||
    cogl_pipeline_new (cogl_framebuffer_get_context (priv->offscreen));
 | 
			
		||||
  cogl_pipeline_set_layer_filters (priv->pipeline, 0,
 | 
			
		||||
                                   COGL_PIPELINE_FILTER_NEAREST,
 | 
			
		||||
                                   COGL_PIPELINE_FILTER_NEAREST);
 | 
			
		||||
  cogl_pipeline_set_layer_texture (priv->pipeline, 0,
 | 
			
		||||
                                   cogl_offscreen_get_texture (priv->offscreen));
 | 
			
		||||
  cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 0,
 | 
			
		||||
                                     COGL_PIPELINE_WRAP_MODE_CLAMP_TO_EDGE);
 | 
			
		||||
 | 
			
		||||
  if (view_class->setup_offscreen_blit_pipeline)
 | 
			
		||||
    view_class->setup_offscreen_blit_pipeline (view, priv->pipeline);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_view_invalidate_offscreen_blit_pipeline (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  g_clear_pointer (&priv->pipeline, cogl_object_unref);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_view_blit_offscreen (ClutterStageView            *view,
 | 
			
		||||
                                   const cairo_rectangle_int_t *rect)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
  CoglMatrix matrix;
 | 
			
		||||
 | 
			
		||||
  clutter_stage_view_ensure_offscreen_blit_pipeline (view);
 | 
			
		||||
  cogl_framebuffer_push_matrix (priv->framebuffer);
 | 
			
		||||
 | 
			
		||||
  /* Set transform so 0,0 is on the top left corner and 1,1 on
 | 
			
		||||
   * the bottom right corner.
 | 
			
		||||
   */
 | 
			
		||||
  cogl_matrix_init_identity (&matrix);
 | 
			
		||||
  cogl_matrix_translate (&matrix, -1, 1, 0);
 | 
			
		||||
  cogl_matrix_scale (&matrix, 2, -2, 0);
 | 
			
		||||
  cogl_framebuffer_set_projection_matrix (priv->framebuffer, &matrix);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_draw_rectangle (priv->framebuffer,
 | 
			
		||||
                                   priv->pipeline,
 | 
			
		||||
                                   0, 0, 1, 1);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_pop_matrix (priv->framebuffer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gboolean
 | 
			
		||||
clutter_stage_view_is_dirty_viewport (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
@@ -179,35 +100,6 @@ clutter_stage_view_set_dirty_projection (ClutterStageView *view,
 | 
			
		||||
  priv->dirty_projection = dirty;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_view_get_offscreen_transformation_matrix (ClutterStageView *view,
 | 
			
		||||
                                                        CoglMatrix       *matrix)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewClass *view_class = CLUTTER_STAGE_VIEW_GET_CLASS (view);
 | 
			
		||||
 | 
			
		||||
  view_class->get_offscreen_transformation_matrix (view, matrix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_stage_view_transform_to_onscreen (ClutterStageView *view,
 | 
			
		||||
                                          gfloat           *x,
 | 
			
		||||
                                          gfloat           *y)
 | 
			
		||||
{
 | 
			
		||||
  gfloat z = 0, w = 1;
 | 
			
		||||
  CoglMatrix matrix;
 | 
			
		||||
 | 
			
		||||
  clutter_stage_view_get_offscreen_transformation_matrix (view, &matrix);
 | 
			
		||||
  cogl_matrix_get_inverse (&matrix, &matrix);
 | 
			
		||||
  cogl_matrix_transform_point (&matrix, x, y, &z, &w);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_default_get_offscreen_transformation_matrix (ClutterStageView *view,
 | 
			
		||||
                                                           CoglMatrix       *matrix)
 | 
			
		||||
{
 | 
			
		||||
  cogl_matrix_init_identity (matrix);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_view_get_property (GObject    *object,
 | 
			
		||||
                                 guint       prop_id,
 | 
			
		||||
@@ -226,11 +118,6 @@ clutter_stage_view_get_property (GObject    *object,
 | 
			
		||||
    case PROP_FRAMEBUFFER:
 | 
			
		||||
      g_value_set_boxed (value, priv->framebuffer);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_OFFSCREEN:
 | 
			
		||||
      g_value_set_boxed (value, priv->offscreen);
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -254,11 +141,6 @@ clutter_stage_view_set_property (GObject      *object,
 | 
			
		||||
    case PROP_FRAMEBUFFER:
 | 
			
		||||
      priv->framebuffer = g_value_dup_boxed (value);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_OFFSCREEN:
 | 
			
		||||
      priv->offscreen = g_value_dup_boxed (value);
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -270,20 +152,11 @@ clutter_stage_view_dispose (GObject *object)
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  g_clear_pointer (&priv->framebuffer, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->offscreen, cogl_object_unref);
 | 
			
		||||
  g_clear_pointer (&priv->pipeline, cogl_object_unref);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_stage_view_parent_class)->dispose (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_stage_view_init (ClutterStageView *view)
 | 
			
		||||
{
 | 
			
		||||
  ClutterStageViewPrivate *priv =
 | 
			
		||||
    clutter_stage_view_get_instance_private (view);
 | 
			
		||||
 | 
			
		||||
  priv->dirty_viewport = TRUE;
 | 
			
		||||
  priv->dirty_projection = TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -291,9 +164,6 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  klass->get_offscreen_transformation_matrix =
 | 
			
		||||
    clutter_stage_default_get_offscreen_transformation_matrix;
 | 
			
		||||
 | 
			
		||||
  object_class->get_property = clutter_stage_view_get_property;
 | 
			
		||||
  object_class->set_property = clutter_stage_view_set_property;
 | 
			
		||||
  object_class->dispose = clutter_stage_view_dispose;
 | 
			
		||||
@@ -309,19 +179,10 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
 | 
			
		||||
  obj_props[PROP_FRAMEBUFFER] =
 | 
			
		||||
    g_param_spec_boxed ("framebuffer",
 | 
			
		||||
                        "View framebuffer",
 | 
			
		||||
                        "The front buffer of the view",
 | 
			
		||||
                        "The framebuffer of the view",
 | 
			
		||||
                        COGL_TYPE_HANDLE,
 | 
			
		||||
                        G_PARAM_READWRITE |
 | 
			
		||||
                        G_PARAM_STATIC_STRINGS);
 | 
			
		||||
 | 
			
		||||
  obj_props[PROP_OFFSCREEN] =
 | 
			
		||||
    g_param_spec_boxed ("offscreen",
 | 
			
		||||
                        "Offscreen buffer",
 | 
			
		||||
                        "Framebuffer used as intermediate buffer",
 | 
			
		||||
                        COGL_TYPE_HANDLE,
 | 
			
		||||
                        G_PARAM_READWRITE |
 | 
			
		||||
			G_PARAM_CONSTRUCT_ONLY |
 | 
			
		||||
                        G_PARAM_STATIC_STRINGS);
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_properties (object_class, PROP_LAST, obj_props);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -33,12 +33,6 @@ G_DECLARE_DERIVABLE_TYPE (ClutterStageView, clutter_stage_view,
 | 
			
		||||
struct _ClutterStageViewClass
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass parent_class;
 | 
			
		||||
 | 
			
		||||
  void (* setup_offscreen_blit_pipeline) (ClutterStageView *view,
 | 
			
		||||
                                          CoglPipeline     *pipeline);
 | 
			
		||||
 | 
			
		||||
  void (* get_offscreen_transformation_matrix) (ClutterStageView *view,
 | 
			
		||||
                                                CoglMatrix       *matrix);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
@@ -47,18 +41,6 @@ void clutter_stage_view_get_layout (ClutterStageView      *view,
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
CoglFramebuffer *clutter_stage_view_get_framebuffer (ClutterStageView *view);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
CoglFramebuffer *clutter_stage_view_get_onscreen (ClutterStageView *view);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void             clutter_stage_view_invalidate_offscreen_blit_pipeline (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void             clutter_stage_view_transform_to_onscreen (ClutterStageView *view,
 | 
			
		||||
                                                           gfloat           *x,
 | 
			
		||||
                                                           gfloat           *y);
 | 
			
		||||
 | 
			
		||||
void clutter_stage_view_blit_offscreen (ClutterStageView            *view,
 | 
			
		||||
					const cairo_rectangle_int_t *clip);
 | 
			
		||||
 | 
			
		||||
gboolean clutter_stage_view_is_dirty_viewport (ClutterStageView *view);
 | 
			
		||||
 | 
			
		||||
@@ -70,8 +52,4 @@ gboolean clutter_stage_view_is_dirty_projection (ClutterStageView *view);
 | 
			
		||||
void clutter_stage_view_set_dirty_projection (ClutterStageView *view,
 | 
			
		||||
                                              gboolean          dirty);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_stage_view_get_offscreen_transformation_matrix (ClutterStageView *view,
 | 
			
		||||
                                                             CoglMatrix       *matrix);
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_STAGE_VIEW_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -971,7 +971,6 @@ _clutter_stage_process_queued_events (ClutterStage *stage)
 | 
			
		||||
      ClutterEvent *next_event;
 | 
			
		||||
      ClutterInputDevice *device;
 | 
			
		||||
      ClutterInputDevice *next_device;
 | 
			
		||||
      ClutterInputDeviceType device_type;
 | 
			
		||||
      gboolean check_device = FALSE;
 | 
			
		||||
 | 
			
		||||
      event = l->data;
 | 
			
		||||
@@ -987,16 +986,8 @@ _clutter_stage_process_queued_events (ClutterStage *stage)
 | 
			
		||||
      if (device != NULL && next_device != NULL)
 | 
			
		||||
        check_device = TRUE;
 | 
			
		||||
 | 
			
		||||
      device_type = clutter_input_device_get_device_type (device);
 | 
			
		||||
 | 
			
		||||
      /* Skip consecutive motion events coming from the same device,
 | 
			
		||||
       * except those of tablet tools, since users of these events
 | 
			
		||||
       * want no precision loss.
 | 
			
		||||
       */
 | 
			
		||||
      if (priv->throttle_motion_events && next_event != NULL &&
 | 
			
		||||
          device_type != CLUTTER_TABLET_DEVICE &&
 | 
			
		||||
          device_type != CLUTTER_PEN_DEVICE &&
 | 
			
		||||
          device_type != CLUTTER_ERASER_DEVICE)
 | 
			
		||||
      /* Skip consecutive motion events coming from the same device */
 | 
			
		||||
      if (priv->throttle_motion_events && next_event != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          if (event->type == CLUTTER_MOTION &&
 | 
			
		||||
              (next_event->type == CLUTTER_MOTION ||
 | 
			
		||||
@@ -1007,16 +998,6 @@ _clutter_stage_process_queued_events (ClutterStage *stage)
 | 
			
		||||
                            "Omitting motion event at %d, %d",
 | 
			
		||||
                            (int) event->motion.x,
 | 
			
		||||
                            (int) event->motion.y);
 | 
			
		||||
 | 
			
		||||
              if (next_event->type == CLUTTER_MOTION)
 | 
			
		||||
                {
 | 
			
		||||
                  ClutterDeviceManager *device_manager =
 | 
			
		||||
                    clutter_device_manager_get_default ();
 | 
			
		||||
 | 
			
		||||
                  _clutter_device_manager_compress_motion (device_manager,
 | 
			
		||||
                                                           next_event, event);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              goto next_event;
 | 
			
		||||
            }
 | 
			
		||||
          else if (event->type == CLUTTER_TOUCH_UPDATE &&
 | 
			
		||||
@@ -1413,6 +1394,8 @@ _clutter_stage_do_pick_on_view (ClutterStage     *stage,
 | 
			
		||||
                                      view_layout.height);
 | 
			
		||||
 | 
			
		||||
  _clutter_stage_window_get_dirty_pixel (priv->impl, view, &dirty_x, &dirty_y);
 | 
			
		||||
  dirty_x -= view_layout.x;
 | 
			
		||||
  dirty_y -= view_layout.y;
 | 
			
		||||
 | 
			
		||||
  if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS)))
 | 
			
		||||
    {
 | 
			
		||||
@@ -1463,10 +1446,10 @@ _clutter_stage_do_pick_on_view (ClutterStage     *stage,
 | 
			
		||||
     used. The format is requested as pre-multiplied because Cogl
 | 
			
		||||
     assumes that all pixels in the framebuffer are premultiplied so
 | 
			
		||||
     it avoids a conversion. */
 | 
			
		||||
  cogl_framebuffer_read_pixels (fb,
 | 
			
		||||
                                read_x, read_y, 1, 1,
 | 
			
		||||
                                COGL_PIXEL_FORMAT_RGBA_8888_PRE,
 | 
			
		||||
                                pixel);
 | 
			
		||||
  cogl_read_pixels (read_x, read_y, 1, 1,
 | 
			
		||||
                    COGL_READ_PIXELS_COLOR_BUFFER,
 | 
			
		||||
                    COGL_PIXEL_FORMAT_RGBA_8888_PRE,
 | 
			
		||||
                    pixel);
 | 
			
		||||
 | 
			
		||||
  if (G_UNLIKELY (clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS))
 | 
			
		||||
    {
 | 
			
		||||
@@ -4693,7 +4676,6 @@ capture_view (ClutterStage          *stage,
 | 
			
		||||
  uint8_t *data;
 | 
			
		||||
  int stride;
 | 
			
		||||
  CoglBitmap *bitmap;
 | 
			
		||||
  cairo_rectangle_int_t view_layout;
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
 | 
			
		||||
@@ -4718,11 +4700,8 @@ capture_view (ClutterStage          *stage,
 | 
			
		||||
                                     stride,
 | 
			
		||||
                                     data);
 | 
			
		||||
 | 
			
		||||
  clutter_stage_view_get_layout (view, &view_layout);
 | 
			
		||||
 | 
			
		||||
  cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
 | 
			
		||||
                                            rect->x - view_layout.x,
 | 
			
		||||
                                            rect->y - view_layout.y,
 | 
			
		||||
                                            rect->x, rect->y,
 | 
			
		||||
                                            COGL_READ_PIXELS_COLOR_BUFFER,
 | 
			
		||||
                                            bitmap);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,6 @@
 | 
			
		||||
#include "clutter-stage-cogl.h"
 | 
			
		||||
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
 | 
			
		||||
#include "clutter-actor-private.h"
 | 
			
		||||
#include "clutter-backend-private.h"
 | 
			
		||||
@@ -358,7 +357,7 @@ swap_framebuffer (ClutterStageWindow    *stage_window,
 | 
			
		||||
                  cairo_rectangle_int_t *swap_region,
 | 
			
		||||
                  gboolean               swap_with_damage)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view);
 | 
			
		||||
  CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
  int damage[4], ndamage;
 | 
			
		||||
 | 
			
		||||
  damage[0] = swap_region->x;
 | 
			
		||||
@@ -420,12 +419,6 @@ paint_stage (ClutterStageCogl            *stage_cogl,
 | 
			
		||||
 | 
			
		||||
  _clutter_stage_maybe_setup_viewport (stage, view);
 | 
			
		||||
  _clutter_stage_paint_view (stage, view, clip);
 | 
			
		||||
 | 
			
		||||
  if (clutter_stage_view_get_onscreen (view) !=
 | 
			
		||||
      clutter_stage_view_get_framebuffer (view))
 | 
			
		||||
    {
 | 
			
		||||
      clutter_stage_view_blit_offscreen (view, clip);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -445,42 +438,6 @@ fill_current_damage_history_and_step (ClutterStageView *view)
 | 
			
		||||
  view_priv->damage_index++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
transform_swap_region_to_onscreen (ClutterStageView      *view,
 | 
			
		||||
                                   cairo_rectangle_int_t *swap_region)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *framebuffer;
 | 
			
		||||
  cairo_rectangle_int_t layout;
 | 
			
		||||
  gfloat x1, y1, x2, y2;
 | 
			
		||||
  gint width, height;
 | 
			
		||||
 | 
			
		||||
  framebuffer = clutter_stage_view_get_onscreen (view);
 | 
			
		||||
  clutter_stage_view_get_layout (view, &layout);
 | 
			
		||||
 | 
			
		||||
  x1 = (float) swap_region->x / layout.width;
 | 
			
		||||
  y1 = (float) swap_region->y / layout.height;
 | 
			
		||||
  x2 = (float) (swap_region->x + swap_region->width) / layout.width;
 | 
			
		||||
  y2 = (float) (swap_region->y + swap_region->height) / layout.height;
 | 
			
		||||
 | 
			
		||||
  clutter_stage_view_transform_to_onscreen (view, &x1, &y1);
 | 
			
		||||
  clutter_stage_view_transform_to_onscreen (view, &x2, &y2);
 | 
			
		||||
 | 
			
		||||
  width = cogl_framebuffer_get_width (framebuffer);
 | 
			
		||||
  height = cogl_framebuffer_get_height (framebuffer);
 | 
			
		||||
 | 
			
		||||
  x1 = floor (x1 * width);
 | 
			
		||||
  y1 = floor (height - (y1 * height));
 | 
			
		||||
  x2 = ceil (x2 * width);
 | 
			
		||||
  y2 = ceil (height - (y2 * height));
 | 
			
		||||
 | 
			
		||||
  *swap_region = (cairo_rectangle_int_t) {
 | 
			
		||||
    .x = x1,
 | 
			
		||||
    .y = y1,
 | 
			
		||||
    .width = x2 - x1,
 | 
			
		||||
    .height = y2 - y1
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
                                ClutterStageView   *view)
 | 
			
		||||
@@ -751,12 +708,6 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
 | 
			
		||||
 | 
			
		||||
  if (do_swap_buffer)
 | 
			
		||||
    {
 | 
			
		||||
      if (clutter_stage_view_get_onscreen (view) !=
 | 
			
		||||
          clutter_stage_view_get_framebuffer (view))
 | 
			
		||||
        {
 | 
			
		||||
          transform_swap_region_to_onscreen (view, &swap_region);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      return swap_framebuffer (stage_window,
 | 
			
		||||
                               view,
 | 
			
		||||
                               &swap_region,
 | 
			
		||||
@@ -806,9 +757,7 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
 | 
			
		||||
                                    int                *x,
 | 
			
		||||
                                    int                *y)
 | 
			
		||||
{
 | 
			
		||||
  CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
 | 
			
		||||
  gboolean has_buffer_age =
 | 
			
		||||
    cogl_is_onscreen (framebuffer) &&
 | 
			
		||||
    cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
 | 
			
		||||
  cairo_rectangle_int_t *rect;
 | 
			
		||||
 | 
			
		||||
@@ -822,13 +771,10 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
 | 
			
		||||
      ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (view);
 | 
			
		||||
      ClutterStageViewCoglPrivate *view_priv =
 | 
			
		||||
        clutter_stage_view_cogl_get_instance_private (view_cogl);
 | 
			
		||||
      cairo_rectangle_int_t view_layout;
 | 
			
		||||
 | 
			
		||||
      clutter_stage_view_get_layout (view, &view_layout);
 | 
			
		||||
 | 
			
		||||
      rect = &view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - 1)];
 | 
			
		||||
      *x = rect->x - view_layout.x;
 | 
			
		||||
      *y = rect->y - view_layout.y;
 | 
			
		||||
      *x = rect->x;
 | 
			
		||||
      *y = rect->y;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -102,9 +102,6 @@ struct _ClutterDeviceManagerEvdevPrivate
 | 
			
		||||
  gpointer                        constrain_data;
 | 
			
		||||
  GDestroyNotify                  constrain_data_notify;
 | 
			
		||||
 | 
			
		||||
  ClutterRelativeMotionFilter relative_motion_filter;
 | 
			
		||||
  gpointer relative_motion_filter_user_data;
 | 
			
		||||
 | 
			
		||||
  ClutterStageManager *stage_manager;
 | 
			
		||||
  guint stage_added_handler;
 | 
			
		||||
  guint stage_removed_handler;
 | 
			
		||||
@@ -127,7 +124,6 @@ G_DEFINE_TYPE_WITH_CODE (ClutterDeviceManagerEvdev,
 | 
			
		||||
static ClutterOpenDeviceCallback  device_open_callback;
 | 
			
		||||
static ClutterCloseDeviceCallback device_close_callback;
 | 
			
		||||
static gpointer                   device_callback_data;
 | 
			
		||||
static gchar *                    evdev_seat_id;
 | 
			
		||||
 | 
			
		||||
#ifdef CLUTTER_ENABLE_DEBUG
 | 
			
		||||
static const char *device_type_str[] = {
 | 
			
		||||
@@ -267,22 +263,6 @@ _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev *mana
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_device_manager_evdev_filter_relative_motion (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
                                                      ClutterInputDevice        *device,
 | 
			
		||||
                                                      float                      x,
 | 
			
		||||
                                                      float                      y,
 | 
			
		||||
                                                      float                     *dx,
 | 
			
		||||
                                                      float                     *dy)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerEvdevPrivate *priv = manager_evdev->priv;
 | 
			
		||||
 | 
			
		||||
  if (!priv->relative_motion_filter)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  priv->relative_motion_filter (device, x, y, dx, dy,
 | 
			
		||||
                                priv->relative_motion_filter_user_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterEvent *
 | 
			
		||||
new_absolute_motion_event (ClutterInputDevice *input_device,
 | 
			
		||||
@@ -331,9 +311,6 @@ new_absolute_motion_event (ClutterInputDevice *input_device,
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
  event->motion.x = x;
 | 
			
		||||
  event->motion.y = y;
 | 
			
		||||
  clutter_input_device_evdev_translate_coordinates (input_device, stage,
 | 
			
		||||
                                                    &event->motion.x,
 | 
			
		||||
                                                    &event->motion.y);
 | 
			
		||||
  event->motion.axes = axes;
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
 | 
			
		||||
@@ -377,23 +354,11 @@ notify_relative_tool_motion (ClutterInputDevice *input_device,
 | 
			
		||||
                             gfloat              dy,
 | 
			
		||||
                             gdouble            *axes)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
  ClutterEvent *event;
 | 
			
		||||
  ClutterSeatEvdev *seat;
 | 
			
		||||
  gfloat x, y;
 | 
			
		||||
 | 
			
		||||
  device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
 | 
			
		||||
  seat = _clutter_input_device_evdev_get_seat (device_evdev);
 | 
			
		||||
  x = input_device->current_x + dx;
 | 
			
		||||
  y = input_device->current_y + dy;
 | 
			
		||||
 | 
			
		||||
  _clutter_device_manager_evdev_filter_relative_motion (seat->manager_evdev,
 | 
			
		||||
                                                        input_device,
 | 
			
		||||
                                                        seat->pointer_x,
 | 
			
		||||
                                                        seat->pointer_y,
 | 
			
		||||
                                                        &dx,
 | 
			
		||||
                                                        &dy);
 | 
			
		||||
 | 
			
		||||
  event = new_absolute_motion_event (input_device, time_us, x, y, axes);
 | 
			
		||||
  _clutter_evdev_event_set_relative_motion (event, dx, dy, 0, 0);
 | 
			
		||||
 | 
			
		||||
@@ -544,10 +509,6 @@ notify_touch_event (ClutterInputDevice *input_device,
 | 
			
		||||
  event->touch.device = seat->core_pointer;
 | 
			
		||||
  event->touch.x = x;
 | 
			
		||||
  event->touch.y = y;
 | 
			
		||||
  clutter_input_device_evdev_translate_coordinates (input_device, stage,
 | 
			
		||||
                                                    &event->touch.x,
 | 
			
		||||
                                                    &event->touch.y);
 | 
			
		||||
 | 
			
		||||
  /* "NULL" sequences are special cased in clutter */
 | 
			
		||||
  event->touch.sequence = GINT_TO_POINTER (slot + 1);
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
@@ -569,8 +530,7 @@ notify_pinch_gesture_event (ClutterInputDevice          *input_device,
 | 
			
		||||
                            gdouble                      dx,
 | 
			
		||||
                            gdouble                      dy,
 | 
			
		||||
                            gdouble                      angle_delta,
 | 
			
		||||
                            gdouble                      scale,
 | 
			
		||||
                            guint                        n_fingers)
 | 
			
		||||
                            gdouble                      scale)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
  ClutterSeatEvdev *seat;
 | 
			
		||||
@@ -601,7 +561,6 @@ notify_pinch_gesture_event (ClutterInputDevice          *input_device,
 | 
			
		||||
  event->touchpad_pinch.dy = dy;
 | 
			
		||||
  event->touchpad_pinch.angle_delta = angle_delta;
 | 
			
		||||
  event->touchpad_pinch.scale = scale;
 | 
			
		||||
  event->touchpad_pinch.n_fingers = n_fingers;
 | 
			
		||||
 | 
			
		||||
  _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
 | 
			
		||||
 | 
			
		||||
@@ -699,7 +658,6 @@ notify_pad_button (ClutterInputDevice *input_device,
 | 
			
		||||
                   guint64             time_us,
 | 
			
		||||
                   guint32             button,
 | 
			
		||||
                   guint32             mode_group,
 | 
			
		||||
                   guint32             mode,
 | 
			
		||||
                   guint32             pressed)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
@@ -725,7 +683,6 @@ notify_pad_button (ClutterInputDevice *input_device,
 | 
			
		||||
  event->pad_button.stage = stage;
 | 
			
		||||
  event->pad_button.button = button;
 | 
			
		||||
  event->pad_button.group = mode_group;
 | 
			
		||||
  event->pad_button.mode = mode;
 | 
			
		||||
  clutter_event_set_device (event, input_device);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
  clutter_event_set_time (event, us2ms (time_us));
 | 
			
		||||
@@ -741,7 +698,6 @@ notify_pad_strip (ClutterInputDevice *input_device,
 | 
			
		||||
                  guint32             strip_number,
 | 
			
		||||
                  guint32             strip_source,
 | 
			
		||||
                  guint32             mode_group,
 | 
			
		||||
                  guint32             mode,
 | 
			
		||||
                  gdouble             value)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
@@ -771,7 +727,6 @@ notify_pad_strip (ClutterInputDevice *input_device,
 | 
			
		||||
  event->pad_strip.strip_number = strip_number;
 | 
			
		||||
  event->pad_strip.value = value;
 | 
			
		||||
  event->pad_strip.group = mode_group;
 | 
			
		||||
  event->pad_strip.mode = mode;
 | 
			
		||||
  clutter_event_set_device (event, input_device);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
  clutter_event_set_time (event, us2ms (time_us));
 | 
			
		||||
@@ -787,7 +742,6 @@ notify_pad_ring (ClutterInputDevice *input_device,
 | 
			
		||||
                 guint32             ring_number,
 | 
			
		||||
                 guint32             ring_source,
 | 
			
		||||
                 guint32             mode_group,
 | 
			
		||||
                 guint32             mode,
 | 
			
		||||
                 gdouble             angle)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev;
 | 
			
		||||
@@ -817,7 +771,6 @@ notify_pad_ring (ClutterInputDevice *input_device,
 | 
			
		||||
  event->pad_ring.ring_number = ring_number;
 | 
			
		||||
  event->pad_ring.angle = angle;
 | 
			
		||||
  event->pad_ring.group = mode_group;
 | 
			
		||||
  event->pad_ring.mode = mode;
 | 
			
		||||
  clutter_event_set_device (event, input_device);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
  clutter_event_set_time (event, us2ms (time_us));
 | 
			
		||||
@@ -956,9 +909,13 @@ evdev_add_device (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
       * which are located on the main seat. Make whatever seat comes first the
 | 
			
		||||
       * main seat. */
 | 
			
		||||
      if (priv->main_seat->libinput_seat == NULL)
 | 
			
		||||
        seat = priv->main_seat;
 | 
			
		||||
        {
 | 
			
		||||
          seat = priv->main_seat;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        seat = clutter_seat_evdev_new (manager_evdev);
 | 
			
		||||
        {
 | 
			
		||||
          seat = clutter_seat_evdev_new (manager_evdev);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      clutter_seat_evdev_set_libinput_seat (seat, libinput_seat);
 | 
			
		||||
      priv->seats = g_slist_append (priv->seats, seat);
 | 
			
		||||
@@ -1255,17 +1212,11 @@ input_device_update_tool (ClutterInputDevice          *input_device,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (evdev_device->last_tool != tool)
 | 
			
		||||
    {
 | 
			
		||||
      evdev_device->last_tool = tool;
 | 
			
		||||
      g_signal_emit_by_name (clutter_device_manager_get_default (),
 | 
			
		||||
                             "tool-changed", input_device, tool);
 | 
			
		||||
    }
 | 
			
		||||
  evdev_device->last_tool = tool;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gdouble *
 | 
			
		||||
translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event,
 | 
			
		||||
                       ClutterInputDeviceTool            *tool)
 | 
			
		||||
translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event)
 | 
			
		||||
{
 | 
			
		||||
  GArray *axes = g_array_new (FALSE, FALSE, sizeof (gdouble));
 | 
			
		||||
  struct libinput_tablet_tool *libinput_tool;
 | 
			
		||||
@@ -1287,7 +1238,6 @@ translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event,
 | 
			
		||||
  if (libinput_tablet_tool_has_pressure (libinput_tool))
 | 
			
		||||
    {
 | 
			
		||||
      value = libinput_event_tablet_tool_get_pressure (tablet_event);
 | 
			
		||||
      value = clutter_input_device_tool_evdev_translate_pressure (tool, value);
 | 
			
		||||
      g_array_append_val (axes, value);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -1671,7 +1621,6 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
        struct libinput_event_gesture *gesture_event =
 | 
			
		||||
          libinput_event_get_gesture_event (event);
 | 
			
		||||
        ClutterTouchpadGesturePhase phase;
 | 
			
		||||
        guint n_fingers;
 | 
			
		||||
        guint64 time_us;
 | 
			
		||||
 | 
			
		||||
        if (libinput_event_get_type (event) == LIBINPUT_EVENT_GESTURE_PINCH_BEGIN)
 | 
			
		||||
@@ -1680,10 +1629,9 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
          phase = libinput_event_gesture_get_cancelled (gesture_event) ?
 | 
			
		||||
            CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL : CLUTTER_TOUCHPAD_GESTURE_PHASE_END;
 | 
			
		||||
 | 
			
		||||
        n_fingers = libinput_event_gesture_get_finger_count (gesture_event);
 | 
			
		||||
        device = libinput_device_get_user_data (libinput_device);
 | 
			
		||||
        time_us = libinput_event_gesture_get_time_usec (gesture_event);
 | 
			
		||||
        notify_pinch_gesture_event (device, phase, time_us, 0, 0, 0, 0, n_fingers);
 | 
			
		||||
        notify_pinch_gesture_event (device, phase, time_us, 0, 0, 0, 0);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
 | 
			
		||||
@@ -1691,10 +1639,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
        struct libinput_event_gesture *gesture_event =
 | 
			
		||||
          libinput_event_get_gesture_event (event);
 | 
			
		||||
        gdouble angle_delta, scale, dx, dy;
 | 
			
		||||
        guint n_fingers;
 | 
			
		||||
        guint64 time_us;
 | 
			
		||||
 | 
			
		||||
        n_fingers = libinput_event_gesture_get_finger_count (gesture_event);
 | 
			
		||||
        device = libinput_device_get_user_data (libinput_device);
 | 
			
		||||
        time_us = libinput_event_gesture_get_time_usec (gesture_event);
 | 
			
		||||
        angle_delta = libinput_event_gesture_get_angle_delta (gesture_event);
 | 
			
		||||
@@ -1704,7 +1650,7 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
 | 
			
		||||
        notify_pinch_gesture_event (device,
 | 
			
		||||
                                    CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
 | 
			
		||||
                                    time_us, dx, dy, angle_delta, scale, n_fingers);
 | 
			
		||||
                                    time_us, dx, dy, angle_delta, scale);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
 | 
			
		||||
@@ -1765,8 +1711,7 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
        if (!stage)
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
        axes = translate_tablet_axes (tablet_event,
 | 
			
		||||
                                      evdev_device->last_tool);
 | 
			
		||||
        axes = translate_tablet_axes (tablet_event);
 | 
			
		||||
        if (!axes)
 | 
			
		||||
          break;
 | 
			
		||||
 | 
			
		||||
@@ -1806,11 +1751,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
 | 
			
		||||
        libinput_tool = libinput_event_tablet_tool_get_tool (tablet_event);
 | 
			
		||||
 | 
			
		||||
        if (state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN)
 | 
			
		||||
          input_device_update_tool (device, libinput_tool);
 | 
			
		||||
        input_device_update_tool (device, libinput_tool);
 | 
			
		||||
        notify_proximity (device, time, state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN);
 | 
			
		||||
        if (state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_OUT)
 | 
			
		||||
          input_device_update_tool (device, NULL);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    case LIBINPUT_EVENT_TABLET_TOOL_BUTTON:
 | 
			
		||||
@@ -1852,7 +1794,7 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
    case LIBINPUT_EVENT_TABLET_PAD_BUTTON:
 | 
			
		||||
      {
 | 
			
		||||
        guint64 time;
 | 
			
		||||
        guint32 button_state, button, group, mode;
 | 
			
		||||
        guint32 button_state, button, group;
 | 
			
		||||
        struct libinput_tablet_pad_mode_group *mode_group;
 | 
			
		||||
        struct libinput_event_tablet_pad *pad_event =
 | 
			
		||||
          libinput_event_get_tablet_pad_event (event);
 | 
			
		||||
@@ -1862,18 +1804,17 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
 | 
			
		||||
        mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
 | 
			
		||||
        group = libinput_tablet_pad_mode_group_get_index (mode_group);
 | 
			
		||||
        mode = libinput_event_tablet_pad_get_mode (pad_event);
 | 
			
		||||
 | 
			
		||||
        button = libinput_event_tablet_pad_get_button_number (pad_event);
 | 
			
		||||
        button_state = libinput_event_tablet_pad_get_button_state (pad_event) ==
 | 
			
		||||
                       LIBINPUT_BUTTON_STATE_PRESSED;
 | 
			
		||||
        notify_pad_button (device, time, button, group, mode, button_state);
 | 
			
		||||
        notify_pad_button (device, time, button, group, button_state);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    case LIBINPUT_EVENT_TABLET_PAD_STRIP:
 | 
			
		||||
      {
 | 
			
		||||
        guint64 time;
 | 
			
		||||
        guint32 number, source, group, mode;
 | 
			
		||||
        guint32 number, source, group;
 | 
			
		||||
        struct libinput_tablet_pad_mode_group *mode_group;
 | 
			
		||||
        struct libinput_event_tablet_pad *pad_event =
 | 
			
		||||
          libinput_event_get_tablet_pad_event (event);
 | 
			
		||||
@@ -1887,15 +1828,14 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
 | 
			
		||||
        mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
 | 
			
		||||
        group = libinput_tablet_pad_mode_group_get_index (mode_group);
 | 
			
		||||
        mode = libinput_event_tablet_pad_get_mode (pad_event);
 | 
			
		||||
 | 
			
		||||
        notify_pad_strip (device, time, number, source, group, mode, value);
 | 
			
		||||
        notify_pad_strip (device, time, number, source, group, value);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    case LIBINPUT_EVENT_TABLET_PAD_RING:
 | 
			
		||||
      {
 | 
			
		||||
        guint64 time;
 | 
			
		||||
        guint32 number, source, group, mode;
 | 
			
		||||
        guint32 number, source, group;
 | 
			
		||||
        struct libinput_tablet_pad_mode_group *mode_group;
 | 
			
		||||
        struct libinput_event_tablet_pad *pad_event =
 | 
			
		||||
          libinput_event_get_tablet_pad_event (event);
 | 
			
		||||
@@ -1909,9 +1849,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
 | 
			
		||||
        mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
 | 
			
		||||
        group = libinput_tablet_pad_mode_group_get_index (mode_group);
 | 
			
		||||
        mode = libinput_event_tablet_pad_get_mode (pad_event);
 | 
			
		||||
 | 
			
		||||
        notify_pad_ring (device, time, number, source, group, mode, angle);
 | 
			
		||||
        notify_pad_ring (device, time, number, source, group, angle);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    default:
 | 
			
		||||
@@ -2035,31 +1974,6 @@ clutter_device_manager_evdev_create_virtual_device (ClutterDeviceManager  *manag
 | 
			
		||||
                       NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_evdev_compress_motion (ClutterDeviceManager *device_manger,
 | 
			
		||||
                                              ClutterEvent         *event,
 | 
			
		||||
                                              const ClutterEvent   *to_discard)
 | 
			
		||||
{
 | 
			
		||||
  double dx, dy;
 | 
			
		||||
  double dx_unaccel, dy_unaccel;
 | 
			
		||||
  double dst_dx = 0.0, dst_dy = 0.0;
 | 
			
		||||
  double dst_dx_unaccel = 0.0, dst_dy_unaccel = 0.0;
 | 
			
		||||
 | 
			
		||||
  if (!clutter_evdev_event_get_relative_motion (to_discard,
 | 
			
		||||
                                                &dx, &dy,
 | 
			
		||||
                                                &dx_unaccel, &dy_unaccel))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  clutter_evdev_event_get_relative_motion (event,
 | 
			
		||||
                                           &dst_dx, &dst_dy,
 | 
			
		||||
                                           &dst_dx_unaccel, &dst_dy_unaccel);
 | 
			
		||||
  _clutter_evdev_event_set_relative_motion (event,
 | 
			
		||||
                                            dx + dst_dx,
 | 
			
		||||
                                            dy + dst_dy,
 | 
			
		||||
                                            dx_unaccel + dst_dx_unaccel,
 | 
			
		||||
                                            dy_unaccel + dst_dy_unaccel);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * GObject implementation
 | 
			
		||||
 */
 | 
			
		||||
@@ -2093,8 +2007,7 @@ clutter_device_manager_evdev_constructed (GObject *gobject)
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (libinput_udev_assign_seat (priv->libinput,
 | 
			
		||||
                                 evdev_seat_id ? evdev_seat_id : "seat0") == -1)
 | 
			
		||||
  if (libinput_udev_assign_seat (priv->libinput, "seat0") == -1)
 | 
			
		||||
    {
 | 
			
		||||
      g_critical ("Failed to assign a seat to the libinput object.");
 | 
			
		||||
      libinput_unref (priv->libinput);
 | 
			
		||||
@@ -2201,7 +2114,6 @@ clutter_device_manager_evdev_class_init (ClutterDeviceManagerEvdevClass *klass)
 | 
			
		||||
  manager_class->get_core_device = clutter_device_manager_evdev_get_core_device;
 | 
			
		||||
  manager_class->get_device = clutter_device_manager_evdev_get_device;
 | 
			
		||||
  manager_class->create_virtual_device = clutter_device_manager_evdev_create_virtual_device;
 | 
			
		||||
  manager_class->compress_motion = clutter_device_manager_evdev_compress_motion;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -2327,12 +2239,6 @@ _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev *mana
 | 
			
		||||
  return next_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev)
 | 
			
		||||
{
 | 
			
		||||
  dispatch_libinput (manager_evdev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
compare_ids (gconstpointer a,
 | 
			
		||||
             gconstpointer b)
 | 
			
		||||
@@ -2602,60 +2508,6 @@ clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
 | 
			
		||||
  xkb_state_update_mask (state, depressed_mods, latched_mods, locked_mods, 0, 0, idx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_evdev_set_keyboard_numlock: (skip)
 | 
			
		||||
 * @evdev: the #ClutterDeviceManager created by the evdev backend
 | 
			
		||||
 * @numlock_set: TRUE to set NumLock ON, FALSE otherwise.
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the NumLock state on the backend's #xkb_state .
 | 
			
		||||
 *
 | 
			
		||||
 * Stability: unstable
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_evdev_set_keyboard_numlock (ClutterDeviceManager *evdev,
 | 
			
		||||
                                    gboolean              numlock_state)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerEvdev *manager_evdev;
 | 
			
		||||
  ClutterDeviceManagerEvdevPrivate *priv;
 | 
			
		||||
  GSList *iter;
 | 
			
		||||
  xkb_mod_mask_t numlock;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER_EVDEV (evdev));
 | 
			
		||||
 | 
			
		||||
  manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev);
 | 
			
		||||
  priv = manager_evdev->priv;
 | 
			
		||||
  numlock = (1 << xkb_keymap_mod_get_index(priv->keymap, "Mod2"));
 | 
			
		||||
 | 
			
		||||
  for (iter = priv->seats; iter; iter = iter->next)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterSeatEvdev *seat = iter->data;
 | 
			
		||||
      xkb_mod_mask_t depressed_mods;
 | 
			
		||||
      xkb_mod_mask_t latched_mods;
 | 
			
		||||
      xkb_mod_mask_t locked_mods;
 | 
			
		||||
      xkb_mod_mask_t group_mods;
 | 
			
		||||
 | 
			
		||||
      depressed_mods = xkb_state_serialize_mods (seat->xkb, XKB_STATE_MODS_DEPRESSED);
 | 
			
		||||
      latched_mods = xkb_state_serialize_mods (seat->xkb, XKB_STATE_MODS_LATCHED);
 | 
			
		||||
      locked_mods = xkb_state_serialize_mods (seat->xkb, XKB_STATE_MODS_LOCKED);
 | 
			
		||||
      group_mods = xkb_state_serialize_layout (seat->xkb, XKB_STATE_LAYOUT_EFFECTIVE);
 | 
			
		||||
 | 
			
		||||
      if (numlock_state)
 | 
			
		||||
        locked_mods |= numlock;
 | 
			
		||||
      else
 | 
			
		||||
        locked_mods &= ~numlock;
 | 
			
		||||
 | 
			
		||||
      xkb_state_update_mask (seat->xkb,
 | 
			
		||||
                             depressed_mods,
 | 
			
		||||
                             latched_mods,
 | 
			
		||||
                             locked_mods,
 | 
			
		||||
                             0, 0,
 | 
			
		||||
                             group_mods);
 | 
			
		||||
 | 
			
		||||
      clutter_seat_evdev_sync_leds (seat);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_evdev_set_pointer_constrain_callback:
 | 
			
		||||
 * @evdev: the #ClutterDeviceManager created by the evdev backend
 | 
			
		||||
@@ -2692,23 +2544,6 @@ clutter_evdev_set_pointer_constrain_callback (ClutterDeviceManager            *e
 | 
			
		||||
  priv->constrain_data_notify = user_data_notify;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_evdev_set_relative_motion_filter (ClutterDeviceManager       *evdev,
 | 
			
		||||
                                          ClutterRelativeMotionFilter filter,
 | 
			
		||||
                                          gpointer                    user_data)
 | 
			
		||||
{
 | 
			
		||||
  ClutterDeviceManagerEvdev *manager_evdev;
 | 
			
		||||
  ClutterDeviceManagerEvdevPrivate *priv;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER_EVDEV (evdev));
 | 
			
		||||
 | 
			
		||||
  manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev);
 | 
			
		||||
  priv = manager_evdev->priv;
 | 
			
		||||
 | 
			
		||||
  priv->relative_motion_filter = filter;
 | 
			
		||||
  priv->relative_motion_filter_user_data = user_data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_evdev_set_keyboard_repeat:
 | 
			
		||||
 * @evdev: the #ClutterDeviceManager created by the evdev backend
 | 
			
		||||
@@ -2860,18 +2695,3 @@ clutter_evdev_warp_pointer (ClutterInputDevice   *pointer_device,
 | 
			
		||||
{
 | 
			
		||||
  notify_absolute_motion (pointer_device, ms2us(time_), x, y, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * clutter_evdev_set_seat_id:
 | 
			
		||||
 * @seat_id: The seat ID
 | 
			
		||||
 *
 | 
			
		||||
 * Sets the seat to assign to the libinput context.
 | 
			
		||||
 *
 | 
			
		||||
 * For reliable effects, this function must be called before clutter_init().
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
clutter_evdev_set_seat_id (const gchar *seat_id)
 | 
			
		||||
{
 | 
			
		||||
  g_free (evdev_seat_id);
 | 
			
		||||
  evdev_seat_id = g_strdup (seat_id);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -76,15 +76,6 @@ void _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev
 | 
			
		||||
                                                      float                     *new_x,
 | 
			
		||||
                                                      float                     *new_y);
 | 
			
		||||
 | 
			
		||||
void _clutter_device_manager_evdev_filter_relative_motion (ClutterDeviceManagerEvdev *manager_evdev,
 | 
			
		||||
                                                           ClutterInputDevice        *device,
 | 
			
		||||
                                                           float                      x,
 | 
			
		||||
                                                           float                      y,
 | 
			
		||||
                                                           float                     *dx,
 | 
			
		||||
                                                           float                     *dy);
 | 
			
		||||
 | 
			
		||||
void _clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev);
 | 
			
		||||
 | 
			
		||||
static inline guint64
 | 
			
		||||
us (guint64 us)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -57,9 +57,6 @@ void  clutter_evdev_set_device_callbacks (ClutterOpenDeviceCallback  open_callba
 | 
			
		||||
                                          ClutterCloseDeviceCallback close_callback,
 | 
			
		||||
                                          gpointer                   user_data);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void  clutter_evdev_set_seat_id (const gchar *seat_id);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_10
 | 
			
		||||
void  clutter_evdev_release_devices (void);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_10
 | 
			
		||||
@@ -97,18 +94,6 @@ void  clutter_evdev_set_pointer_constrain_callback (ClutterDeviceManager
 | 
			
		||||
						    gpointer                         user_data,
 | 
			
		||||
						    GDestroyNotify                   user_data_notify);
 | 
			
		||||
 | 
			
		||||
typedef void (*ClutterRelativeMotionFilter) (ClutterInputDevice *device,
 | 
			
		||||
                                             float               x,
 | 
			
		||||
                                             float               y,
 | 
			
		||||
                                             float              *dx,
 | 
			
		||||
                                             float              *dy,
 | 
			
		||||
                                             gpointer            user_data);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_MUTTER
 | 
			
		||||
void clutter_evdev_set_relative_motion_filter (ClutterDeviceManager       *evdev,
 | 
			
		||||
                                               ClutterRelativeMotionFilter filter,
 | 
			
		||||
                                               gpointer                    user_data);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_16
 | 
			
		||||
void               clutter_evdev_set_keyboard_map   (ClutterDeviceManager *evdev,
 | 
			
		||||
						     struct xkb_keymap    *keymap);
 | 
			
		||||
@@ -120,10 +105,6 @@ CLUTTER_AVAILABLE_IN_1_20
 | 
			
		||||
void clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
 | 
			
		||||
                                              xkb_layout_index_t    idx);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_26
 | 
			
		||||
void clutter_evdev_set_keyboard_numlock (ClutterDeviceManager *evdev,
 | 
			
		||||
                                         gboolean              numlock_state);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_1_18
 | 
			
		||||
void clutter_evdev_set_keyboard_repeat (ClutterDeviceManager *evdev,
 | 
			
		||||
                                        gboolean              repeat,
 | 
			
		||||
@@ -165,14 +146,6 @@ gboolean clutter_evdev_event_get_relative_motion (const ClutterEvent *event,
 | 
			
		||||
                                                  double             *dx_unaccel,
 | 
			
		||||
                                                  double             *dy_unaccel);
 | 
			
		||||
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_evdev_input_device_tool_set_pressure_curve (ClutterInputDeviceTool *tool,
 | 
			
		||||
                                                         gdouble                 curve[4]);
 | 
			
		||||
CLUTTER_AVAILABLE_IN_ALL
 | 
			
		||||
void clutter_evdev_input_device_tool_set_button_code    (ClutterInputDeviceTool *tool,
 | 
			
		||||
                                                         guint                   button,
 | 
			
		||||
                                                         guint                   evcode);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_EVDEV_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -35,8 +35,6 @@
 | 
			
		||||
#include "clutter-input-device-evdev.h"
 | 
			
		||||
#include "clutter-device-manager-evdev.h"
 | 
			
		||||
 | 
			
		||||
#include "cairo-gobject.h"
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterInputDeviceClass        ClutterInputDeviceEvdevClass;
 | 
			
		||||
 | 
			
		||||
#define clutter_input_device_evdev_get_type _clutter_input_device_evdev_get_type
 | 
			
		||||
@@ -45,15 +43,6 @@ G_DEFINE_TYPE (ClutterInputDeviceEvdev,
 | 
			
		||||
               clutter_input_device_evdev,
 | 
			
		||||
               CLUTTER_TYPE_INPUT_DEVICE)
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  PROP_0,
 | 
			
		||||
  PROP_DEVICE_MATRIX,
 | 
			
		||||
  PROP_OUTPUT_ASPECT_RATIO,
 | 
			
		||||
  N_PROPS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static GParamSpec *obj_props[N_PROPS] = { 0 };
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_evdev_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
@@ -70,53 +59,6 @@ clutter_input_device_evdev_finalize (GObject *object)
 | 
			
		||||
  G_OBJECT_CLASS (clutter_input_device_evdev_parent_class)->finalize (object);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_evdev_set_property (GObject      *object,
 | 
			
		||||
                                         guint         prop_id,
 | 
			
		||||
                                         const GValue *value,
 | 
			
		||||
                                         GParamSpec   *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device = CLUTTER_INPUT_DEVICE_EVDEV (object);
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_DEVICE_MATRIX:
 | 
			
		||||
      {
 | 
			
		||||
        const cairo_matrix_t *matrix = g_value_get_boxed (value);
 | 
			
		||||
        cairo_matrix_init_identity (&device->device_matrix);
 | 
			
		||||
        cairo_matrix_multiply (&device->device_matrix,
 | 
			
		||||
                               &device->device_matrix, matrix);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    case PROP_OUTPUT_ASPECT_RATIO:
 | 
			
		||||
      device->output_ratio = g_value_get_double (value);
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_evdev_get_property (GObject    *object,
 | 
			
		||||
                                         guint       prop_id,
 | 
			
		||||
                                         GValue     *value,
 | 
			
		||||
                                         GParamSpec *pspec)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device = CLUTTER_INPUT_DEVICE_EVDEV (object);
 | 
			
		||||
 | 
			
		||||
  switch (prop_id)
 | 
			
		||||
    {
 | 
			
		||||
    case PROP_DEVICE_MATRIX:
 | 
			
		||||
      g_value_set_boxed (value, &device->device_matrix);
 | 
			
		||||
      break;
 | 
			
		||||
    case PROP_OUTPUT_ASPECT_RATIO:
 | 
			
		||||
      g_value_set_double (value, device->output_ratio);
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_input_device_evdev_keycode_to_evdev (ClutterInputDevice *device,
 | 
			
		||||
                                             guint hardware_keycode,
 | 
			
		||||
@@ -163,89 +105,22 @@ clutter_input_device_evdev_update_from_tool (ClutterInputDevice     *device,
 | 
			
		||||
  if (libinput_tablet_tool_has_slider (evdev_tool->tool))
 | 
			
		||||
    _clutter_input_device_add_axis (device, CLUTTER_INPUT_AXIS_SLIDER, -1, 1, 0);
 | 
			
		||||
 | 
			
		||||
  if (libinput_tablet_tool_has_wheel (evdev_tool->tool))
 | 
			
		||||
    _clutter_input_device_add_axis (device, CLUTTER_INPUT_AXIS_WHEEL, -180, 180, 0);
 | 
			
		||||
 | 
			
		||||
  g_object_thaw_notify (G_OBJECT (device));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_input_device_evdev_is_mode_switch_button (ClutterInputDevice *device,
 | 
			
		||||
                                                  guint               group,
 | 
			
		||||
                                                  guint               button)
 | 
			
		||||
{
 | 
			
		||||
  struct libinput_device *libinput_device;
 | 
			
		||||
  struct libinput_tablet_pad_mode_group *mode_group;
 | 
			
		||||
 | 
			
		||||
  libinput_device = clutter_evdev_input_device_get_libinput_device (device);
 | 
			
		||||
  mode_group = libinput_device_tablet_pad_get_mode_group (libinput_device, group);
 | 
			
		||||
 | 
			
		||||
  return libinput_tablet_pad_mode_group_button_is_toggle (mode_group, button) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gint
 | 
			
		||||
clutter_input_device_evdev_get_group_n_modes (ClutterInputDevice *device,
 | 
			
		||||
                                              gint                group)
 | 
			
		||||
{
 | 
			
		||||
  struct libinput_device *libinput_device;
 | 
			
		||||
  struct libinput_tablet_pad_mode_group *mode_group;
 | 
			
		||||
 | 
			
		||||
  libinput_device = clutter_evdev_input_device_get_libinput_device (device);
 | 
			
		||||
  mode_group = libinput_device_tablet_pad_get_mode_group (libinput_device, group);
 | 
			
		||||
 | 
			
		||||
  return libinput_tablet_pad_mode_group_get_num_modes (mode_group);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_input_device_evdev_is_grouped (ClutterInputDevice *device,
 | 
			
		||||
                                       ClutterInputDevice *other_device)
 | 
			
		||||
{
 | 
			
		||||
  struct libinput_device *libinput_device, *other_libinput_device;
 | 
			
		||||
 | 
			
		||||
  libinput_device = clutter_evdev_input_device_get_libinput_device (device);
 | 
			
		||||
  other_libinput_device = clutter_evdev_input_device_get_libinput_device (other_device);
 | 
			
		||||
 | 
			
		||||
  return libinput_device_get_device_group (libinput_device) ==
 | 
			
		||||
    libinput_device_get_device_group (other_libinput_device);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_evdev_class_init (ClutterInputDeviceEvdevClass *klass)
 | 
			
		||||
{
 | 
			
		||||
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
 | 
			
		||||
 | 
			
		||||
  object_class->finalize = clutter_input_device_evdev_finalize;
 | 
			
		||||
  object_class->set_property = clutter_input_device_evdev_set_property;
 | 
			
		||||
  object_class->get_property = clutter_input_device_evdev_get_property;
 | 
			
		||||
 | 
			
		||||
  klass->keycode_to_evdev = clutter_input_device_evdev_keycode_to_evdev;
 | 
			
		||||
  klass->update_from_tool = clutter_input_device_evdev_update_from_tool;
 | 
			
		||||
  klass->is_mode_switch_button = clutter_input_device_evdev_is_mode_switch_button;
 | 
			
		||||
  klass->get_group_n_modes = clutter_input_device_evdev_get_group_n_modes;
 | 
			
		||||
  klass->is_grouped = clutter_input_device_evdev_is_grouped;
 | 
			
		||||
 | 
			
		||||
  obj_props[PROP_DEVICE_MATRIX] =
 | 
			
		||||
    g_param_spec_boxed ("device-matrix",
 | 
			
		||||
			P_("Device input matrix"),
 | 
			
		||||
			P_("Device input matrix"),
 | 
			
		||||
			CAIRO_GOBJECT_TYPE_MATRIX,
 | 
			
		||||
			CLUTTER_PARAM_READWRITE);
 | 
			
		||||
  obj_props[PROP_OUTPUT_ASPECT_RATIO] =
 | 
			
		||||
    g_param_spec_double ("output-aspect-ratio",
 | 
			
		||||
                         P_("Output aspect ratio"),
 | 
			
		||||
                         P_("Output aspect ratio"),
 | 
			
		||||
                         0, G_MAXDOUBLE, 0,
 | 
			
		||||
                         CLUTTER_PARAM_READWRITE);
 | 
			
		||||
 | 
			
		||||
  g_object_class_install_properties (object_class, N_PROPS, obj_props);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_evdev_init (ClutterInputDeviceEvdev *self)
 | 
			
		||||
{
 | 
			
		||||
  cairo_matrix_init_identity (&self->device_matrix);
 | 
			
		||||
  self->device_aspect_ratio = 0;
 | 
			
		||||
  self->output_ratio = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@@ -268,7 +143,6 @@ _clutter_input_device_evdev_new (ClutterDeviceManager *manager,
 | 
			
		||||
  gchar *vendor, *product;
 | 
			
		||||
  gint device_id, n_rings = 0, n_strips = 0, n_groups = 1;
 | 
			
		||||
  gchar *node_path;
 | 
			
		||||
  gdouble width, height;
 | 
			
		||||
 | 
			
		||||
  type = _clutter_input_device_evdev_determine_type (libinput_device);
 | 
			
		||||
  vendor = g_strdup_printf ("%.4x", libinput_device_get_id_vendor (libinput_device));
 | 
			
		||||
@@ -308,9 +182,6 @@ _clutter_input_device_evdev_new (ClutterDeviceManager *manager,
 | 
			
		||||
  g_free (vendor);
 | 
			
		||||
  g_free (product);
 | 
			
		||||
 | 
			
		||||
  if (libinput_device_get_size (libinput_device, &width, &height) == 0)
 | 
			
		||||
    device->device_aspect_ratio = width / height;
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_INPUT_DEVICE (device);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -442,39 +313,3 @@ clutter_evdev_event_sequence_get_slot (const ClutterEventSequence *sequence)
 | 
			
		||||
 | 
			
		||||
  return GPOINTER_TO_INT (sequence) - 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_device_evdev_translate_coordinates (ClutterInputDevice *device,
 | 
			
		||||
                                                  ClutterStage       *stage,
 | 
			
		||||
                                                  gfloat             *x,
 | 
			
		||||
                                                  gfloat             *y)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (device);
 | 
			
		||||
  double min_x = 0, min_y = 0, max_x = 1, max_y = 1;
 | 
			
		||||
  gdouble stage_width, stage_height;
 | 
			
		||||
  double x_d, y_d;
 | 
			
		||||
 | 
			
		||||
  stage_width = clutter_actor_get_width (CLUTTER_ACTOR (stage));
 | 
			
		||||
  stage_height = clutter_actor_get_height (CLUTTER_ACTOR (stage));
 | 
			
		||||
  x_d = *x / stage_width;
 | 
			
		||||
  y_d = *y / stage_height;
 | 
			
		||||
 | 
			
		||||
  /* Apply aspect ratio */
 | 
			
		||||
  if (device_evdev->output_ratio > 0 &&
 | 
			
		||||
      device_evdev->device_aspect_ratio > 0)
 | 
			
		||||
    {
 | 
			
		||||
      gdouble ratio = device_evdev->device_aspect_ratio / device_evdev->output_ratio;
 | 
			
		||||
 | 
			
		||||
      if (ratio > 1)
 | 
			
		||||
        x_d *= ratio;
 | 
			
		||||
      else if (ratio < 1)
 | 
			
		||||
        y_d *= 1 / ratio;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  cairo_matrix_transform_point (&device_evdev->device_matrix, &min_x, &min_y);
 | 
			
		||||
  cairo_matrix_transform_point (&device_evdev->device_matrix, &max_x, &max_y);
 | 
			
		||||
  cairo_matrix_transform_point (&device_evdev->device_matrix, &x_d, &y_d);
 | 
			
		||||
 | 
			
		||||
  *x = CLAMP (x_d, MIN (min_x, max_x), MAX (min_x, max_x)) * stage_width;
 | 
			
		||||
  *y = CLAMP (y_d, MIN (min_y, max_y), MAX (min_y, max_y)) * stage_height;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -66,10 +66,6 @@ struct _ClutterInputDeviceEvdev
 | 
			
		||||
  struct libinput_device *libinput_device;
 | 
			
		||||
  ClutterSeatEvdev *seat;
 | 
			
		||||
  ClutterInputDeviceTool *last_tool;
 | 
			
		||||
 | 
			
		||||
  cairo_matrix_t device_matrix;
 | 
			
		||||
  gdouble device_aspect_ratio; /* w:h */
 | 
			
		||||
  gdouble output_ratio;        /* w:h */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
GType                     _clutter_input_device_evdev_get_type        (void) G_GNUC_CONST;
 | 
			
		||||
@@ -106,11 +102,6 @@ void  			  _clutter_evdev_event_set_relative_motion (ClutterEvent *event,
 | 
			
		||||
								    double        dx_unaccel,
 | 
			
		||||
								    double        dy_unaccel);
 | 
			
		||||
 | 
			
		||||
void                      clutter_input_device_evdev_translate_coordinates (ClutterInputDevice *device,
 | 
			
		||||
                                                                            ClutterStage       *stage,
 | 
			
		||||
                                                                            gfloat             *x,
 | 
			
		||||
                                                                            gfloat             *y);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -26,7 +26,6 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "clutter-input-device-tool-evdev.h"
 | 
			
		||||
#include "clutter-evdev.h"
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (ClutterInputDeviceToolEvdev, clutter_input_device_tool_evdev,
 | 
			
		||||
               CLUTTER_TYPE_INPUT_DEVICE_TOOL)
 | 
			
		||||
@@ -36,7 +35,6 @@ clutter_input_device_tool_evdev_finalize (GObject *object)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceToolEvdev *tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (object);
 | 
			
		||||
 | 
			
		||||
  g_hash_table_unref (tool->button_map);
 | 
			
		||||
  libinput_tablet_tool_unref (tool->tool);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (clutter_input_device_tool_evdev_parent_class)->finalize (object);
 | 
			
		||||
@@ -53,7 +51,6 @@ clutter_input_device_tool_evdev_class_init (ClutterInputDeviceToolEvdevClass *kl
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_tool_evdev_init (ClutterInputDeviceToolEvdev *tool)
 | 
			
		||||
{
 | 
			
		||||
  tool->button_map = g_hash_table_new (NULL, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterInputDeviceTool *
 | 
			
		||||
@@ -73,96 +70,3 @@ clutter_input_device_tool_evdev_new (struct libinput_tablet_tool *tool,
 | 
			
		||||
 | 
			
		||||
  return CLUTTER_INPUT_DEVICE_TOOL (evdev_tool);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_evdev_input_device_tool_set_pressure_curve (ClutterInputDeviceTool *tool,
 | 
			
		||||
                                                    gdouble                 curve[4])
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceToolEvdev *evdev_tool;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL_EVDEV (tool));
 | 
			
		||||
  g_return_if_fail (curve[0] >= 0 && curve[0] <= 1 &&
 | 
			
		||||
                    curve[1] >= 0 && curve[1] <= 1 &&
 | 
			
		||||
                    curve[2] >= 0 && curve[2] <= 1 &&
 | 
			
		||||
                    curve[3] >= 0 && curve[3] <= 1);
 | 
			
		||||
 | 
			
		||||
  evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
 | 
			
		||||
  evdev_tool->pressure_curve[0] = curve[0];
 | 
			
		||||
  evdev_tool->pressure_curve[1] = curve[1];
 | 
			
		||||
  evdev_tool->pressure_curve[2] = curve[2];
 | 
			
		||||
  evdev_tool->pressure_curve[3] = curve[3];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_evdev_input_device_tool_set_button_code (ClutterInputDeviceTool *tool,
 | 
			
		||||
                                                 guint                   button,
 | 
			
		||||
                                                 guint                   evcode)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceToolEvdev *evdev_tool;
 | 
			
		||||
 | 
			
		||||
  g_return_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL_EVDEV (tool));
 | 
			
		||||
 | 
			
		||||
  evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
 | 
			
		||||
 | 
			
		||||
  if (evcode == 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_hash_table_remove (evdev_tool->button_map, GUINT_TO_POINTER (button));
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      g_hash_table_insert (evdev_tool->button_map, GUINT_TO_POINTER (button),
 | 
			
		||||
                           GUINT_TO_POINTER (evcode));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gdouble
 | 
			
		||||
calculate_bezier_position (gdouble pos,
 | 
			
		||||
                           gdouble x1,
 | 
			
		||||
                           gdouble y1,
 | 
			
		||||
                           gdouble x2,
 | 
			
		||||
                           gdouble y2)
 | 
			
		||||
{
 | 
			
		||||
  gdouble int1_y, int2_y;
 | 
			
		||||
 | 
			
		||||
  pos = CLAMP (pos, 0, 1);
 | 
			
		||||
 | 
			
		||||
  /* Intersection between 0,0 and x1,y1 */
 | 
			
		||||
  int1_y = pos * y1;
 | 
			
		||||
 | 
			
		||||
  /* Intersection between x2,y2 and 1,1 */
 | 
			
		||||
  int2_y = (pos * (1 - y2)) + y2;
 | 
			
		||||
 | 
			
		||||
  /* Find the new position in the line traced by the previous points */
 | 
			
		||||
  return (pos * (int2_y - int1_y)) + int1_y;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gdouble
 | 
			
		||||
clutter_input_device_tool_evdev_translate_pressure (ClutterInputDeviceTool *tool,
 | 
			
		||||
                                                    gdouble                 pressure)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceToolEvdev *evdev_tool;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL (tool), pressure);
 | 
			
		||||
 | 
			
		||||
  evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
 | 
			
		||||
 | 
			
		||||
  return calculate_bezier_position (CLAMP (pressure, 0, 1),
 | 
			
		||||
                                    evdev_tool->pressure_curve[0],
 | 
			
		||||
                                    evdev_tool->pressure_curve[1],
 | 
			
		||||
                                    evdev_tool->pressure_curve[2],
 | 
			
		||||
                                    evdev_tool->pressure_curve[3]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
guint
 | 
			
		||||
clutter_input_device_tool_evdev_get_button_code (ClutterInputDeviceTool *tool,
 | 
			
		||||
                                                 guint                   button)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceToolEvdev *evdev_tool;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE_TOOL (tool), 0);
 | 
			
		||||
 | 
			
		||||
  evdev_tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (tool);
 | 
			
		||||
 | 
			
		||||
  return GPOINTER_TO_UINT (g_hash_table_lookup (evdev_tool->button_map,
 | 
			
		||||
                                                GUINT_TO_POINTER (button)));
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -59,8 +59,6 @@ struct _ClutterInputDeviceToolEvdev
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceTool parent_instance;
 | 
			
		||||
  struct libinput_tablet_tool *tool;
 | 
			
		||||
  GHashTable *button_map;
 | 
			
		||||
  gdouble pressure_curve[4];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterInputDeviceToolEvdevClass
 | 
			
		||||
@@ -74,11 +72,6 @@ ClutterInputDeviceTool * clutter_input_device_tool_evdev_new      (struct libinp
 | 
			
		||||
                                                                   guint64                      serial,
 | 
			
		||||
                                                                   ClutterInputDeviceToolType   type);
 | 
			
		||||
 | 
			
		||||
gdouble                  clutter_input_device_tool_evdev_translate_pressure (ClutterInputDeviceTool *tool,
 | 
			
		||||
                                                                             gdouble                 pressure);
 | 
			
		||||
guint                    clutter_input_device_tool_evdev_get_button_code    (ClutterInputDeviceTool *tool,
 | 
			
		||||
                                                                             guint                   button);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_TOOL_H__ */
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,6 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-event-private.h"
 | 
			
		||||
#include "clutter-input-device-evdev.h"
 | 
			
		||||
#include "clutter-input-device-tool-evdev.h"
 | 
			
		||||
#include "clutter-main.h"
 | 
			
		||||
 | 
			
		||||
/* Try to keep the pointer inside the stage. Hopefully no one is using
 | 
			
		||||
@@ -186,19 +185,15 @@ keyboard_repeat (gpointer data)
 | 
			
		||||
{
 | 
			
		||||
  ClutterSeatEvdev *seat = data;
 | 
			
		||||
  GSource *source;
 | 
			
		||||
 | 
			
		||||
  /* There might be events queued in libinput that could cancel the
 | 
			
		||||
     repeat timer. */
 | 
			
		||||
  _clutter_device_manager_evdev_dispatch (seat->manager_evdev);
 | 
			
		||||
  if (!seat->repeat_timer)
 | 
			
		||||
    return G_SOURCE_REMOVE;
 | 
			
		||||
  guint32 time_ms;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
 | 
			
		||||
  source = g_main_context_find_source_by_id (NULL, seat->repeat_timer);
 | 
			
		||||
  time_ms = g_source_get_time (source) / 1000;
 | 
			
		||||
 | 
			
		||||
  clutter_seat_evdev_notify_key (seat,
 | 
			
		||||
                                 seat->repeat_device,
 | 
			
		||||
                                 g_source_get_time (source),
 | 
			
		||||
                                 ms2us (time_ms),
 | 
			
		||||
                                 seat->repeat_key,
 | 
			
		||||
                                 AUTOREPEAT_VALUE,
 | 
			
		||||
                                 FALSE);
 | 
			
		||||
@@ -405,13 +400,6 @@ clutter_seat_evdev_notify_relative_motion (ClutterSeatEvdev   *seat,
 | 
			
		||||
  if (!_clutter_input_device_get_stage (input_device))
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  _clutter_device_manager_evdev_filter_relative_motion (seat->manager_evdev,
 | 
			
		||||
                                                        input_device,
 | 
			
		||||
                                                        seat->pointer_x,
 | 
			
		||||
                                                        seat->pointer_y,
 | 
			
		||||
                                                        &dx,
 | 
			
		||||
                                                        &dy);
 | 
			
		||||
 | 
			
		||||
  new_x = seat->pointer_x + dx;
 | 
			
		||||
  new_y = seat->pointer_y + dy;
 | 
			
		||||
  event = new_absolute_motion_event (seat, input_device,
 | 
			
		||||
@@ -433,7 +421,7 @@ void clutter_seat_evdev_notify_absolute_motion (ClutterSeatEvdev   *seat,
 | 
			
		||||
{
 | 
			
		||||
  ClutterEvent *event;
 | 
			
		||||
 | 
			
		||||
  event = new_absolute_motion_event (seat, input_device, time_us, x, y, axes);
 | 
			
		||||
  event = new_absolute_motion_event (seat, input_device, time_us, x, x, axes);
 | 
			
		||||
 | 
			
		||||
  queue_event (event);
 | 
			
		||||
}
 | 
			
		||||
@@ -445,7 +433,6 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev   *seat,
 | 
			
		||||
                                  uint32_t            button,
 | 
			
		||||
                                  uint32_t            state)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceEvdev *device_evdev = (ClutterInputDeviceEvdev *) input_device;
 | 
			
		||||
  ClutterStage *stage;
 | 
			
		||||
  ClutterEvent *event = NULL;
 | 
			
		||||
  gint button_nr;
 | 
			
		||||
@@ -541,21 +528,13 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev   *seat,
 | 
			
		||||
  clutter_event_set_device (event, seat->core_pointer);
 | 
			
		||||
  clutter_event_set_source_device (event, input_device);
 | 
			
		||||
 | 
			
		||||
  if (device_evdev->last_tool)
 | 
			
		||||
    {
 | 
			
		||||
      /* Apply the button event code as per the tool mapping */
 | 
			
		||||
      guint mapped_button;
 | 
			
		||||
 | 
			
		||||
      mapped_button = clutter_input_device_tool_evdev_get_button_code (device_evdev->last_tool,
 | 
			
		||||
                                                                       button_nr);
 | 
			
		||||
      if (mapped_button != 0)
 | 
			
		||||
        button = mapped_button;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  _clutter_evdev_event_set_event_code (event, button);
 | 
			
		||||
 | 
			
		||||
  if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterInputDeviceEvdev *device_evdev =
 | 
			
		||||
        CLUTTER_INPUT_DEVICE_EVDEV (input_device);
 | 
			
		||||
 | 
			
		||||
      clutter_event_set_device_tool (event, device_evdev->last_tool);
 | 
			
		||||
      clutter_event_set_device (event, input_device);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -71,9 +71,17 @@ update_button_count (ClutterVirtualInputDeviceEvdev *virtual_evdev,
 | 
			
		||||
                     uint32_t                        state)
 | 
			
		||||
{
 | 
			
		||||
  if (state)
 | 
			
		||||
    return ++virtual_evdev->button_count[button];
 | 
			
		||||
    {
 | 
			
		||||
      return ++virtual_evdev->button_count[button];
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    return --virtual_evdev->button_count[button];
 | 
			
		||||
    {
 | 
			
		||||
      /* Handle cases where we newer saw the initial pressed event. */
 | 
			
		||||
      if (virtual_evdev->button_count[button] == 0)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
      return --virtual_evdev->button_count[button];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static EvdevButtonType
 | 
			
		||||
@@ -124,9 +132,6 @@ release_pressed_buttons (ClutterVirtualInputDevice *virtual_device)
 | 
			
		||||
 | 
			
		||||
  for (code = 0; code < G_N_ELEMENTS (virtual_evdev->button_count); code++)
 | 
			
		||||
    {
 | 
			
		||||
      if (virtual_evdev->button_count[code] == 0)
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      switch (get_button_type (code))
 | 
			
		||||
        {
 | 
			
		||||
        case EVDEV_BUTTON_TYPE_KEY:
 | 
			
		||||
@@ -197,11 +202,10 @@ clutter_virtual_input_device_evdev_notify_button (ClutterVirtualInputDevice *vir
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  button_count = update_button_count (virtual_evdev, button, button_state);
 | 
			
		||||
  if (button_count < 0 || button_count > 1)
 | 
			
		||||
  if (button_count > 1)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Received multiple virtual 0x%x button %s (ignoring)", button,
 | 
			
		||||
                 button_state == CLUTTER_BUTTON_STATE_PRESSED ? "presses" : "releases");
 | 
			
		||||
      update_button_count (virtual_evdev, button, 1 - button_state);
 | 
			
		||||
      g_warning ("Received multiple virtual 0x%x button presses (ignoring)",
 | 
			
		||||
                 button);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -229,11 +233,10 @@ clutter_virtual_input_device_evdev_notify_key (ClutterVirtualInputDevice *virtua
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  key_count = update_button_count (virtual_evdev, key, key_state);
 | 
			
		||||
  if (key_count < 0 || key_count > 1)
 | 
			
		||||
  if (key_count > 1)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Received multiple virtual 0x%x key %s (ignoring)", key,
 | 
			
		||||
		 key_state == CLUTTER_KEY_STATE_PRESSED ? "presses" : "releases");
 | 
			
		||||
      update_button_count (virtual_evdev, key, 1 - key_state);
 | 
			
		||||
      g_warning ("Received multiple virtual 0x%x key presses (ignoring)",
 | 
			
		||||
                 key);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -360,11 +363,10 @@ clutter_virtual_input_device_evdev_notify_keyval (ClutterVirtualInputDevice *vir
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  key_count = update_button_count (virtual_evdev, evcode, key_state);
 | 
			
		||||
  if (key_count < 0 || key_count > 1)
 | 
			
		||||
  if (key_count > 1)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Received multiple virtual 0x%x key %s (ignoring)", keycode,
 | 
			
		||||
		 key_state == CLUTTER_KEY_STATE_PRESSED ? "presses" : "releases");
 | 
			
		||||
      update_button_count (virtual_evdev, evcode, 1 - key_state);
 | 
			
		||||
      g_warning ("Received multiple virtual 0x%x key presses (ignoring)",
 | 
			
		||||
                 keycode);
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,8 @@ exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@/mutter
 | 
			
		||||
includedir=@includedir@/mutter
 | 
			
		||||
 | 
			
		||||
apiversion=@LIBMUTTER_API_VERSION@
 | 
			
		||||
requires=@CLUTTER_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@
 | 
			
		||||
apiversion=@CLUTTER_API_VERSION@
 | 
			
		||||
requires=@CLUTTER_REQUIRES@ mutter-cogl-1.0
 | 
			
		||||
requires_private=@CLUTTER_REQUIRES_PRIVATE@
 | 
			
		||||
backends=@CLUTTER_BACKENDS@
 | 
			
		||||
 | 
			
		||||
@@ -17,7 +17,7 @@ cogl_driver=deprecated
 | 
			
		||||
 | 
			
		||||
Name: Mutter Clutter
 | 
			
		||||
Description: Mutter's Clutter Private Library
 | 
			
		||||
Version: @MUTTER_VERSION@
 | 
			
		||||
Version: @VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-clutter-${apiversion}
 | 
			
		||||
Cflags: -I${includedir}/clutter-${apiversion}
 | 
			
		||||
Requires: ${requires}
 | 
			
		||||
 
 | 
			
		||||
@@ -29,8 +29,6 @@
 | 
			
		||||
 | 
			
		||||
#include "clutter-backend-x11.h"
 | 
			
		||||
#include "clutter-input-device-xi2.h"
 | 
			
		||||
#include "clutter-input-device-tool-xi2.h"
 | 
			
		||||
#include "clutter-virtual-input-device-x11.h"
 | 
			
		||||
#include "clutter-stage-x11.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-backend.h"
 | 
			
		||||
@@ -66,14 +64,6 @@ static const char *clutter_input_axis_atom_names[] = {
 | 
			
		||||
 | 
			
		||||
#define N_AXIS_ATOMS    G_N_ELEMENTS (clutter_input_axis_atom_names)
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  PAD_AXIS_FIRST  = 3, /* First axes are always x/y/pressure, ignored in pads */
 | 
			
		||||
  PAD_AXIS_STRIP1 = PAD_AXIS_FIRST,
 | 
			
		||||
  PAD_AXIS_STRIP2,
 | 
			
		||||
  PAD_AXIS_RING1,
 | 
			
		||||
  PAD_AXIS_RING2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static Atom clutter_input_axis_atoms[N_AXIS_ATOMS] = { 0, };
 | 
			
		||||
 | 
			
		||||
static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
 | 
			
		||||
@@ -367,36 +357,6 @@ get_device_node_path (ClutterBackendX11  *backend_x11,
 | 
			
		||||
  return node_path;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
get_pad_features (XIDeviceInfo *info,
 | 
			
		||||
                  guint        *n_rings,
 | 
			
		||||
                  guint        *n_strips)
 | 
			
		||||
{
 | 
			
		||||
  gint i, rings = 0, strips = 0;
 | 
			
		||||
 | 
			
		||||
  for (i = PAD_AXIS_FIRST; i < info->num_classes; i++)
 | 
			
		||||
    {
 | 
			
		||||
      XIValuatorClassInfo *valuator = (XIValuatorClassInfo*) info->classes[i];
 | 
			
		||||
      int axis = valuator->number;
 | 
			
		||||
 | 
			
		||||
      if (valuator->type != XIValuatorClass)
 | 
			
		||||
        continue;
 | 
			
		||||
      if (valuator->max <= 1)
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      /* Ring/strip axes are fixed in pad devices as handled by the
 | 
			
		||||
       * wacom driver. Match those to detect pad features.
 | 
			
		||||
       */
 | 
			
		||||
      if (axis == PAD_AXIS_STRIP1 || axis == PAD_AXIS_STRIP2)
 | 
			
		||||
        strips++;
 | 
			
		||||
      else if (axis == PAD_AXIS_RING1 || axis == PAD_AXIS_RING2)
 | 
			
		||||
        rings++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  *n_rings = rings;
 | 
			
		||||
  *n_strips = strips;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterInputDevice *
 | 
			
		||||
create_device (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
               ClutterBackendX11       *backend_x11,
 | 
			
		||||
@@ -406,7 +366,7 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
  ClutterInputDevice *retval;
 | 
			
		||||
  ClutterInputMode mode;
 | 
			
		||||
  gboolean is_enabled;
 | 
			
		||||
  guint num_touches = 0, num_rings = 0, num_strips = 0;
 | 
			
		||||
  guint num_touches = 0;
 | 
			
		||||
  gchar *vendor_id = NULL, *product_id = NULL, *node_path = NULL;
 | 
			
		||||
 | 
			
		||||
  if (info->use == XIMasterKeyboard || info->use == XISlaveKeyboard)
 | 
			
		||||
@@ -434,8 +394,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
        source = CLUTTER_ERASER_DEVICE;
 | 
			
		||||
      else if (strstr (name, "cursor") != NULL)
 | 
			
		||||
        source = CLUTTER_CURSOR_DEVICE;
 | 
			
		||||
      else if (strstr (name, " pad") != NULL)
 | 
			
		||||
        source = CLUTTER_PAD_DEVICE;
 | 
			
		||||
      else if (strstr (name, "wacom") != NULL || strstr (name, "pen") != NULL)
 | 
			
		||||
        source = CLUTTER_PEN_DEVICE;
 | 
			
		||||
      else if (strstr (name, "touchpad") != NULL)
 | 
			
		||||
@@ -474,12 +432,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
      node_path = get_device_node_path (backend_x11, info);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (source == CLUTTER_PAD_DEVICE)
 | 
			
		||||
    {
 | 
			
		||||
      is_enabled = TRUE;
 | 
			
		||||
      get_pad_features (info, &num_rings, &num_strips);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  retval = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_XI2,
 | 
			
		||||
                         "name", info->name,
 | 
			
		||||
                         "id", info->deviceid,
 | 
			
		||||
@@ -492,8 +444,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
                         "vendor-id", vendor_id,
 | 
			
		||||
                         "product-id", product_id,
 | 
			
		||||
                         "device-node", node_path,
 | 
			
		||||
                         "n-rings", num_rings,
 | 
			
		||||
                         "n-strips", num_strips,
 | 
			
		||||
                         NULL);
 | 
			
		||||
 | 
			
		||||
  translate_device_classes (backend_x11->xdpy, retval,
 | 
			
		||||
@@ -510,46 +460,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
pad_passive_button_grab (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  XIGrabModifiers xi_grab_mods = { XIAnyModifier, };
 | 
			
		||||
  XIEventMask xi_event_mask;
 | 
			
		||||
  gint device_id, rc;
 | 
			
		||||
 | 
			
		||||
  device_id = clutter_input_device_get_device_id (device);
 | 
			
		||||
 | 
			
		||||
  xi_event_mask.deviceid = device_id;
 | 
			
		||||
  xi_event_mask.mask_len = XIMaskLen (XI_LASTEVENT);
 | 
			
		||||
  xi_event_mask.mask = g_new0 (unsigned char, xi_event_mask.mask_len);
 | 
			
		||||
 | 
			
		||||
  XISetMask (xi_event_mask.mask, XI_Motion);
 | 
			
		||||
  XISetMask (xi_event_mask.mask, XI_ButtonPress);
 | 
			
		||||
  XISetMask (xi_event_mask.mask, XI_ButtonRelease);
 | 
			
		||||
 | 
			
		||||
  clutter_x11_trap_x_errors ();
 | 
			
		||||
  rc = XIGrabButton (clutter_x11_get_default_display (),
 | 
			
		||||
                     device_id, XIAnyButton,
 | 
			
		||||
                     clutter_x11_get_root_window (), None,
 | 
			
		||||
                     XIGrabModeSync, XIGrabModeSync,
 | 
			
		||||
                     True, &xi_event_mask, 1, &xi_grab_mods);
 | 
			
		||||
  if (rc != 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_warning ("Could not passively grab pad device: %s",
 | 
			
		||||
                 clutter_input_device_get_device_name (device));
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      XIAllowEvents (clutter_x11_get_default_display (),
 | 
			
		||||
                     device_id, XIAsyncDevice,
 | 
			
		||||
                     CLUTTER_CURRENT_TIME);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_x11_untrap_x_errors ();
 | 
			
		||||
 | 
			
		||||
  g_free (xi_event_mask.mask);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterInputDevice *
 | 
			
		||||
add_device (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
            ClutterBackendX11       *backend_x11,
 | 
			
		||||
@@ -584,9 +494,6 @@ add_device (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
    g_warning ("Unhandled device: %s",
 | 
			
		||||
               clutter_input_device_get_device_name (device));
 | 
			
		||||
 | 
			
		||||
  if (clutter_input_device_get_device_type (device) == CLUTTER_PAD_DEVICE)
 | 
			
		||||
    pad_passive_button_grab (device);
 | 
			
		||||
 | 
			
		||||
  /* relationships between devices and signal emissions are not
 | 
			
		||||
   * necessary while we're constructing the device manager instance
 | 
			
		||||
   */
 | 
			
		||||
@@ -893,54 +800,6 @@ translate_axes (ClutterInputDevice *device,
 | 
			
		||||
  return retval;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
translate_pad_axis (ClutterInputDevice *device,
 | 
			
		||||
                    XIValuatorState    *valuators,
 | 
			
		||||
                    ClutterEventType   *evtype,
 | 
			
		||||
                    guint              *number,
 | 
			
		||||
                    gdouble            *value)
 | 
			
		||||
{
 | 
			
		||||
  double *values;
 | 
			
		||||
  gint i;
 | 
			
		||||
 | 
			
		||||
  values = valuators->values;
 | 
			
		||||
 | 
			
		||||
  for (i = PAD_AXIS_FIRST; i < valuators->mask_len * 8; i++)
 | 
			
		||||
    {
 | 
			
		||||
      gdouble val;
 | 
			
		||||
      guint axis_number = 0;
 | 
			
		||||
 | 
			
		||||
      if (!XIMaskIsSet (valuators->mask, i))
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      val = *values++;
 | 
			
		||||
      if (val <= 0)
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      _clutter_input_device_translate_axis (device, i, val, value);
 | 
			
		||||
 | 
			
		||||
      if (i == PAD_AXIS_RING1 || i == PAD_AXIS_RING2)
 | 
			
		||||
        {
 | 
			
		||||
          *evtype = CLUTTER_PAD_RING;
 | 
			
		||||
          (*value) *= 360.0;
 | 
			
		||||
        }
 | 
			
		||||
      else if (i == PAD_AXIS_STRIP1 || i == PAD_AXIS_STRIP2)
 | 
			
		||||
        {
 | 
			
		||||
          *evtype = CLUTTER_PAD_STRIP;
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        continue;
 | 
			
		||||
 | 
			
		||||
      if (i == PAD_AXIS_STRIP2 || i == PAD_AXIS_RING2)
 | 
			
		||||
        axis_number++;
 | 
			
		||||
 | 
			
		||||
      *number = axis_number;
 | 
			
		||||
      return TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
translate_coords (ClutterStageX11 *stage_x11,
 | 
			
		||||
                  gdouble          event_x,
 | 
			
		||||
@@ -1047,126 +906,6 @@ clutter_device_manager_xi2_select_stage_events (ClutterDeviceManager *manager,
 | 
			
		||||
  g_free (mask);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static guint
 | 
			
		||||
device_get_tool_serial (ClutterBackendX11  *backend_x11,
 | 
			
		||||
                        ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  gulong nitems, bytes_after;
 | 
			
		||||
  guint32 *data = NULL;
 | 
			
		||||
  guint serial_id = 0;
 | 
			
		||||
  int rc, format;
 | 
			
		||||
  Atom type;
 | 
			
		||||
  Atom prop;
 | 
			
		||||
 | 
			
		||||
  prop = XInternAtom (backend_x11->xdpy, "Wacom Serial IDs", True);
 | 
			
		||||
  if (prop == None)
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
  clutter_x11_trap_x_errors ();
 | 
			
		||||
  rc = XIGetProperty (backend_x11->xdpy,
 | 
			
		||||
                      clutter_input_device_get_device_id (device),
 | 
			
		||||
                      prop, 0, 4, FALSE, XA_INTEGER, &type, &format, &nitems, &bytes_after,
 | 
			
		||||
                      (guchar **) &data);
 | 
			
		||||
  clutter_x11_untrap_x_errors ();
 | 
			
		||||
 | 
			
		||||
  if (rc == Success && type == XA_INTEGER && format == 32 && nitems >= 4)
 | 
			
		||||
    serial_id = data[3];
 | 
			
		||||
 | 
			
		||||
  XFree (data);
 | 
			
		||||
 | 
			
		||||
  return serial_id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
handle_property_event (ClutterDeviceManagerXI2 *manager_xi2,
 | 
			
		||||
                       XIEvent                 *event)
 | 
			
		||||
{
 | 
			
		||||
  XIPropertyEvent *xev = (XIPropertyEvent *) event;
 | 
			
		||||
  ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
 | 
			
		||||
  Atom serial_ids_prop = XInternAtom (backend_x11->xdpy, "Wacom Serial IDs", True);
 | 
			
		||||
  ClutterInputDevice *device;
 | 
			
		||||
 | 
			
		||||
  device = g_hash_table_lookup (manager_xi2->devices_by_id,
 | 
			
		||||
                                GINT_TO_POINTER (xev->deviceid));
 | 
			
		||||
  if (!device)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (xev->property == serial_ids_prop)
 | 
			
		||||
    {
 | 
			
		||||
      ClutterInputDeviceTool *tool = NULL;
 | 
			
		||||
      ClutterInputDeviceToolType type;
 | 
			
		||||
      guint serial_id;
 | 
			
		||||
 | 
			
		||||
      serial_id = device_get_tool_serial (backend_x11, device);
 | 
			
		||||
 | 
			
		||||
      if (serial_id != 0)
 | 
			
		||||
        {
 | 
			
		||||
          tool = g_hash_table_lookup (manager_xi2->tools_by_serial,
 | 
			
		||||
                                      GUINT_TO_POINTER (serial_id));
 | 
			
		||||
          if (!tool)
 | 
			
		||||
            {
 | 
			
		||||
              type = clutter_input_device_get_device_type (device) == CLUTTER_ERASER_DEVICE ?
 | 
			
		||||
                CLUTTER_INPUT_DEVICE_TOOL_ERASER : CLUTTER_INPUT_DEVICE_TOOL_PEN;
 | 
			
		||||
              tool = clutter_input_device_tool_xi2_new (serial_id, type);
 | 
			
		||||
              g_hash_table_insert (manager_xi2->tools_by_serial,
 | 
			
		||||
                                   GUINT_TO_POINTER (serial_id),
 | 
			
		||||
                                   tool);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
      clutter_input_device_xi2_update_tool (device, tool);
 | 
			
		||||
      g_signal_emit_by_name (manager_xi2, "tool-changed", device, tool);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
translate_pad_event (ClutterEvent       *event,
 | 
			
		||||
                     XIDeviceEvent      *xev,
 | 
			
		||||
                     ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  gdouble value;
 | 
			
		||||
  guint number;
 | 
			
		||||
 | 
			
		||||
  if (!translate_pad_axis (device, &xev->valuators,
 | 
			
		||||
                           &event->any.type,
 | 
			
		||||
                           &number, &value))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  /* When touching a ring/strip a first XI_Motion event
 | 
			
		||||
   * is generated. Use it to reset the pad state, so
 | 
			
		||||
   * later events actually have a directionality.
 | 
			
		||||
   */
 | 
			
		||||
  if (xev->evtype == XI_Motion)
 | 
			
		||||
    value = -1;
 | 
			
		||||
 | 
			
		||||
  if (event->any.type == CLUTTER_PAD_RING)
 | 
			
		||||
    {
 | 
			
		||||
      event->pad_ring.ring_number = number;
 | 
			
		||||
      event->pad_ring.angle = value;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      event->pad_strip.strip_number = number;
 | 
			
		||||
      event->pad_strip.value = value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  event->any.time = xev->time;
 | 
			
		||||
  clutter_event_set_device (event, device);
 | 
			
		||||
  clutter_event_set_source_device (event, device);
 | 
			
		||||
 | 
			
		||||
  CLUTTER_NOTE (EVENT,
 | 
			
		||||
                "%s: win:0x%x, device:%d '%s', time:%d "
 | 
			
		||||
                "(value:%f)",
 | 
			
		||||
                event->any.type == CLUTTER_PAD_RING
 | 
			
		||||
                ? "pad ring  "
 | 
			
		||||
                : "pad strip",
 | 
			
		||||
                (unsigned int) stage_x11->xwin,
 | 
			
		||||
                device->id,
 | 
			
		||||
                device->device_name,
 | 
			
		||||
                event->any.time, value);
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterTranslateReturn
 | 
			
		||||
clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
 | 
			
		||||
                                            gpointer                native,
 | 
			
		||||
@@ -1198,8 +937,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
 | 
			
		||||
    return CLUTTER_TRANSLATE_REMOVE;
 | 
			
		||||
 | 
			
		||||
  if (!(xi_event->evtype == XI_HierarchyChanged ||
 | 
			
		||||
        xi_event->evtype == XI_DeviceChanged ||
 | 
			
		||||
        xi_event->evtype == XI_PropertyEvent))
 | 
			
		||||
        xi_event->evtype == XI_DeviceChanged))
 | 
			
		||||
    {
 | 
			
		||||
      stage = get_event_stage (translator, xi_event);
 | 
			
		||||
      if (stage == NULL || CLUTTER_ACTOR_IN_DESTRUCTION (stage))
 | 
			
		||||
@@ -1340,59 +1078,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
 | 
			
		||||
            stage != NULL)
 | 
			
		||||
          _clutter_input_device_set_stage (device, stage);
 | 
			
		||||
 | 
			
		||||
	if (clutter_input_device_get_device_type (source_device) == CLUTTER_PAD_DEVICE)
 | 
			
		||||
          {
 | 
			
		||||
            /* We got these events because of the passive button grab */
 | 
			
		||||
            XIAllowEvents (clutter_x11_get_default_display (),
 | 
			
		||||
                           xev->sourceid,
 | 
			
		||||
                           XIAsyncDevice,
 | 
			
		||||
                           xev->time);
 | 
			
		||||
 | 
			
		||||
            event->any.stage = stage;
 | 
			
		||||
 | 
			
		||||
            if (xev->detail >= 4 && xev->detail <= 7)
 | 
			
		||||
              {
 | 
			
		||||
                retval = CLUTTER_TRANSLATE_REMOVE;
 | 
			
		||||
 | 
			
		||||
                if (xi_event->evtype == XI_ButtonPress &&
 | 
			
		||||
                    translate_pad_event (event, xev, source_device))
 | 
			
		||||
                  retval = CLUTTER_TRANSLATE_QUEUE;
 | 
			
		||||
 | 
			
		||||
                break;
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
            event->any.type =
 | 
			
		||||
              (xi_event->evtype == XI_ButtonPress) ? CLUTTER_PAD_BUTTON_PRESS
 | 
			
		||||
                                                   : CLUTTER_PAD_BUTTON_RELEASE;
 | 
			
		||||
            event->any.time = xev->time;
 | 
			
		||||
 | 
			
		||||
            /* The 4-7 button range is taken as non-existent on pad devices,
 | 
			
		||||
             * let the buttons above that take over this range.
 | 
			
		||||
             */
 | 
			
		||||
            if (xev->detail > 7)
 | 
			
		||||
              xev->detail -= 4;
 | 
			
		||||
 | 
			
		||||
            /* Pad buttons are 0-indexed */
 | 
			
		||||
            event->pad_button.button = xev->detail - 1;
 | 
			
		||||
            clutter_event_set_device (event, device);
 | 
			
		||||
            clutter_event_set_source_device (event, source_device);
 | 
			
		||||
 | 
			
		||||
            CLUTTER_NOTE (EVENT,
 | 
			
		||||
                          "%s: win:0x%x, device:%d '%s', time:%d "
 | 
			
		||||
                          "(button:%d)",
 | 
			
		||||
                          event->any.type == CLUTTER_BUTTON_PRESS
 | 
			
		||||
                            ? "pad button press  "
 | 
			
		||||
                            : "pad button release",
 | 
			
		||||
                          (unsigned int) stage_x11->xwin,
 | 
			
		||||
                          device->id,
 | 
			
		||||
                          device->device_name,
 | 
			
		||||
                          event->any.time,
 | 
			
		||||
                          event->pad_button.button);
 | 
			
		||||
 | 
			
		||||
            retval = CLUTTER_TRANSLATE_QUEUE;
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        switch (xev->detail)
 | 
			
		||||
          {
 | 
			
		||||
          case 4:
 | 
			
		||||
@@ -1472,8 +1157,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
 | 
			
		||||
 | 
			
		||||
            clutter_event_set_source_device (event, source_device);
 | 
			
		||||
            clutter_event_set_device (event, device);
 | 
			
		||||
            clutter_event_set_device_tool (event,
 | 
			
		||||
                                           clutter_input_device_xi2_get_current_tool (source_device));
 | 
			
		||||
 | 
			
		||||
            event->button.axes = translate_axes (event->button.device,
 | 
			
		||||
                                                 event->button.x,
 | 
			
		||||
@@ -1531,15 +1214,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
 | 
			
		||||
        device = g_hash_table_lookup (manager_xi2->devices_by_id,
 | 
			
		||||
                                      GINT_TO_POINTER (xev->deviceid));
 | 
			
		||||
 | 
			
		||||
        if (clutter_input_device_get_device_type (source_device) == CLUTTER_PAD_DEVICE)
 | 
			
		||||
          {
 | 
			
		||||
            event->any.stage = stage;
 | 
			
		||||
 | 
			
		||||
            if (translate_pad_event (event, xev, source_device))
 | 
			
		||||
              retval = CLUTTER_TRANSLATE_QUEUE;
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
        /* Set the stage for core events coming out of nowhere (see bug #684509) */
 | 
			
		||||
        if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER &&
 | 
			
		||||
            clutter_input_device_get_pointer_stage (device) == NULL &&
 | 
			
		||||
@@ -1591,8 +1265,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
 | 
			
		||||
 | 
			
		||||
        clutter_event_set_source_device (event, source_device);
 | 
			
		||||
        clutter_event_set_device (event, device);
 | 
			
		||||
        clutter_event_set_device_tool (event,
 | 
			
		||||
                                       clutter_input_device_xi2_get_current_tool (source_device));
 | 
			
		||||
 | 
			
		||||
        event->motion.axes = translate_axes (event->motion.device,
 | 
			
		||||
                                             event->motion.x,
 | 
			
		||||
@@ -1794,10 +1466,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
 | 
			
		||||
    case XI_FocusOut:
 | 
			
		||||
      retval = CLUTTER_TRANSLATE_CONTINUE;
 | 
			
		||||
      break;
 | 
			
		||||
    case XI_PropertyEvent:
 | 
			
		||||
      handle_property_event (manager_xi2, xi_event);
 | 
			
		||||
      retval = CLUTTER_TRANSLATE_CONTINUE;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return retval;
 | 
			
		||||
@@ -1975,7 +1643,6 @@ clutter_device_manager_xi2_constructed (GObject *gobject)
 | 
			
		||||
 | 
			
		||||
  XISetMask (mask, XI_HierarchyChanged);
 | 
			
		||||
  XISetMask (mask, XI_DeviceChanged);
 | 
			
		||||
  XISetMask (mask, XI_PropertyEvent);
 | 
			
		||||
 | 
			
		||||
  event_mask.deviceid = XIAllDevices;
 | 
			
		||||
  event_mask.mask_len = sizeof (mask);
 | 
			
		||||
@@ -2011,16 +1678,6 @@ clutter_device_manager_xi2_set_property (GObject      *gobject,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClutterVirtualInputDevice *
 | 
			
		||||
clutter_device_manager_xi2_create_virtual_device (ClutterDeviceManager   *manager,
 | 
			
		||||
                                                  ClutterInputDeviceType  device_type)
 | 
			
		||||
{
 | 
			
		||||
  return g_object_new (CLUTTER_TYPE_VIRTUAL_INPUT_DEVICE_X11,
 | 
			
		||||
                       "device-manager", manager,
 | 
			
		||||
                       "device-type", device_type,
 | 
			
		||||
                       NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
 | 
			
		||||
{
 | 
			
		||||
@@ -2048,7 +1705,6 @@ clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass)
 | 
			
		||||
  manager_class->get_core_device = clutter_device_manager_xi2_get_core_device;
 | 
			
		||||
  manager_class->get_device = clutter_device_manager_xi2_get_device;
 | 
			
		||||
  manager_class->select_stage_events = clutter_device_manager_xi2_select_stage_events;
 | 
			
		||||
  manager_class->create_virtual_device = clutter_device_manager_xi2_create_virtual_device;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -2057,6 +1713,4 @@ clutter_device_manager_xi2_init (ClutterDeviceManagerXI2 *self)
 | 
			
		||||
  self->devices_by_id = g_hash_table_new_full (NULL, NULL,
 | 
			
		||||
                                               NULL,
 | 
			
		||||
                                               (GDestroyNotify) g_object_unref);
 | 
			
		||||
  self->tools_by_serial = g_hash_table_new_full (NULL, NULL, NULL,
 | 
			
		||||
                                                 (GDestroyNotify) g_object_unref);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,6 @@ struct _ClutterDeviceManagerXI2
 | 
			
		||||
  ClutterDeviceManager parent_instance;
 | 
			
		||||
 | 
			
		||||
  GHashTable *devices_by_id;
 | 
			
		||||
  GHashTable *tools_by_serial;
 | 
			
		||||
 | 
			
		||||
  GSList *all_devices;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,51 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright © 2016 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_CONFIG_H
 | 
			
		||||
#include "clutter-build-config.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "clutter-input-device-tool-xi2.h"
 | 
			
		||||
 | 
			
		||||
G_DEFINE_TYPE (ClutterInputDeviceToolXI2, clutter_input_device_tool_xi2,
 | 
			
		||||
               CLUTTER_TYPE_INPUT_DEVICE_TOOL)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_tool_xi2_class_init (ClutterInputDeviceToolXI2Class *klass)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_tool_xi2_init (ClutterInputDeviceToolXI2 *tool)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterInputDeviceTool *
 | 
			
		||||
clutter_input_device_tool_xi2_new (guint                        serial,
 | 
			
		||||
                                   ClutterInputDeviceToolType   type)
 | 
			
		||||
{
 | 
			
		||||
  return g_object_new (CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2,
 | 
			
		||||
                       "type", type,
 | 
			
		||||
                       "serial", serial,
 | 
			
		||||
                       NULL);
 | 
			
		||||
}
 | 
			
		||||
@@ -1,74 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Clutter.
 | 
			
		||||
 *
 | 
			
		||||
 * An OpenGL based 'interactive canvas' library.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright © 2016 Red Hat
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Carlos Garnacho <carlosg@gnome.org>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __CLUTTER_INPUT_DEVICE_XI2_TOOL_H__
 | 
			
		||||
#define __CLUTTER_INPUT_DEVICE_XI2_TOOL_H__
 | 
			
		||||
 | 
			
		||||
#include <clutter/clutter-input-device-tool.h>
 | 
			
		||||
 | 
			
		||||
G_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2 (clutter_input_device_tool_xi2_get_type ())
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_INPUT_DEVICE_TOOL_XI2(o) \
 | 
			
		||||
  (G_TYPE_CHECK_INSTANCE_CAST ((o), \
 | 
			
		||||
  CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2, ClutterInputDeviceToolXI2))
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_IS_INPUT_DEVICE_TOOL_XI2(o) \
 | 
			
		||||
  (G_TYPE_CHECK_INSTANCE_TYPE ((o), \
 | 
			
		||||
  CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2))
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_INPUT_DEVICE_TOOL_XI2_CLASS(c) \
 | 
			
		||||
  (G_TYPE_CHECK_CLASS_CAST ((c), \
 | 
			
		||||
  CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2, ClutterInputDeviceToolXI2Class))
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_IS_INPUT_DEVICE_TOOL_XI2_CLASS(c) \
 | 
			
		||||
  (G_TYPE_CHECK_CLASS_TYPE ((c), \
 | 
			
		||||
  CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2))
 | 
			
		||||
 | 
			
		||||
#define CLUTTER_INPUT_DEVICE_TOOL_XI2_GET_CLASS(o) \
 | 
			
		||||
  (G_TYPE_INSTANCE_GET_CLASS ((o), \
 | 
			
		||||
  CLUTTER_TYPE_INPUT_DEVICE_TOOL_XI2, ClutterInputDeviceToolXI2Class))
 | 
			
		||||
 | 
			
		||||
typedef struct _ClutterInputDeviceToolXI2 ClutterInputDeviceToolXI2;
 | 
			
		||||
typedef struct _ClutterInputDeviceToolXI2Class ClutterInputDeviceToolXI2Class;
 | 
			
		||||
 | 
			
		||||
struct _ClutterInputDeviceToolXI2
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceTool parent_instance;
 | 
			
		||||
  struct libinput_tablet_tool *tool;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct _ClutterInputDeviceToolXI2Class
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceToolClass parent_class;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
GType                    clutter_input_device_tool_xi2_get_type  (void) G_GNUC_CONST;
 | 
			
		||||
 | 
			
		||||
ClutterInputDeviceTool * clutter_input_device_tool_xi2_new       (guint                        serial,
 | 
			
		||||
                                                                  ClutterInputDeviceToolType   type);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __CLUTTER_INPUT_DEVICE_XI2_TOOL_H__ */
 | 
			
		||||
@@ -44,7 +44,6 @@ struct _ClutterInputDeviceXI2
 | 
			
		||||
  ClutterInputDevice device;
 | 
			
		||||
 | 
			
		||||
  gint device_id;
 | 
			
		||||
  ClutterInputDeviceTool *current_tool;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define N_BUTTONS       5
 | 
			
		||||
@@ -80,13 +79,6 @@ clutter_input_device_xi2_keycode_to_evdev (ClutterInputDevice *device,
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
clutter_input_device_xi2_is_grouped (ClutterInputDevice *device,
 | 
			
		||||
                                     ClutterInputDevice *other_device)
 | 
			
		||||
{
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass)
 | 
			
		||||
{
 | 
			
		||||
@@ -96,7 +88,6 @@ clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass)
 | 
			
		||||
  gobject_class->constructed = clutter_input_device_xi2_constructed;
 | 
			
		||||
 | 
			
		||||
  device_class->keycode_to_evdev = clutter_input_device_xi2_keycode_to_evdev;
 | 
			
		||||
  device_class->is_grouped = clutter_input_device_xi2_is_grouped;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -181,18 +172,3 @@ _clutter_input_device_xi2_translate_state (ClutterEvent    *event,
 | 
			
		||||
 | 
			
		||||
  _clutter_event_set_state_full (event, button, base, latched, locked, effective);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
clutter_input_device_xi2_update_tool (ClutterInputDevice     *device,
 | 
			
		||||
                                      ClutterInputDeviceTool *tool)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
 | 
			
		||||
  g_set_object (&device_xi2->current_tool, tool);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterInputDeviceTool *
 | 
			
		||||
clutter_input_device_xi2_get_current_tool (ClutterInputDevice *device)
 | 
			
		||||
{
 | 
			
		||||
  ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device);
 | 
			
		||||
  return device_xi2->current_tool;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -41,9 +41,6 @@ void  _clutter_input_device_xi2_translate_state (ClutterEvent    *event,
 | 
			
		||||
						 XIModifierState *modifiers_state,
 | 
			
		||||
						 XIButtonState   *buttons_state,
 | 
			
		||||
						 XIGroupState    *group_state);
 | 
			
		||||
void  clutter_input_device_xi2_update_tool      (ClutterInputDevice     *device,
 | 
			
		||||
                                                 ClutterInputDeviceTool *tool);
 | 
			
		||||
ClutterInputDeviceTool * clutter_input_device_xi2_get_current_tool (ClutterInputDevice *device);
 | 
			
		||||
 | 
			
		||||
G_END_DECLS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,7 @@ static const struct {
 | 
			
		||||
  const char *xsetting_name;
 | 
			
		||||
  const char *settings_property;
 | 
			
		||||
} _clutter_settings_map[] = {
 | 
			
		||||
  { "Net/DoubleClickTime",     "double-click-time" },
 | 
			
		||||
  { "Net/DoubleClickDistance", "double-click-distance" },
 | 
			
		||||
  { "Net/DndDragThreshold",    "dnd-drag-threshold" },
 | 
			
		||||
  { "Gtk/FontName",            "font-name" },
 | 
			
		||||
 
 | 
			
		||||
@@ -27,9 +27,6 @@
 | 
			
		||||
 | 
			
		||||
#include <glib-object.h>
 | 
			
		||||
 | 
			
		||||
#include "clutter-x11.h"
 | 
			
		||||
#include "X11/extensions/XTest.h"
 | 
			
		||||
 | 
			
		||||
#include "clutter-virtual-input-device.h"
 | 
			
		||||
#include "x11/clutter-virtual-input-device-x11.h"
 | 
			
		||||
 | 
			
		||||
@@ -64,8 +61,6 @@ clutter_virtual_input_device_x11_notify_button (ClutterVirtualInputDevice *virtu
 | 
			
		||||
                                                uint32_t                   button,
 | 
			
		||||
                                                ClutterButtonState         button_state)
 | 
			
		||||
{
 | 
			
		||||
  XTestFakeButtonEvent (clutter_x11_get_default_display (),
 | 
			
		||||
                        button, button_state == CLUTTER_BUTTON_STATE_PRESSED, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -74,21 +69,6 @@ clutter_virtual_input_device_x11_notify_key (ClutterVirtualInputDevice *virtual_
 | 
			
		||||
                                             uint32_t                   key,
 | 
			
		||||
                                             ClutterKeyState            key_state)
 | 
			
		||||
{
 | 
			
		||||
  XTestFakeKeyEvent (clutter_x11_get_default_display (),
 | 
			
		||||
                     key, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
clutter_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtual_device,
 | 
			
		||||
						uint64_t                   time_us,
 | 
			
		||||
						uint32_t                   keyval,
 | 
			
		||||
						ClutterKeyState            key_state)
 | 
			
		||||
{
 | 
			
		||||
  KeyCode keycode;
 | 
			
		||||
 | 
			
		||||
  keycode = XKeysymToKeycode (clutter_x11_get_default_display (), keyval);
 | 
			
		||||
  XTestFakeKeyEvent (clutter_x11_get_default_display (),
 | 
			
		||||
                     keycode, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
@@ -106,5 +86,4 @@ clutter_virtual_input_device_x11_class_init (ClutterVirtualInputDeviceX11Class *
 | 
			
		||||
  virtual_input_device_class->notify_absolute_motion = clutter_virtual_input_device_x11_notify_absolute_motion;
 | 
			
		||||
  virtual_input_device_class->notify_button = clutter_virtual_input_device_x11_notify_button;
 | 
			
		||||
  virtual_input_device_class->notify_key = clutter_virtual_input_device_x11_notify_key;
 | 
			
		||||
  virtual_input_device_class->notify_keyval = clutter_virtual_input_device_x11_notify_keyval;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,9 @@ m4_define([clutter_release_status],
 | 
			
		||||
 | 
			
		||||
m4_define([clutter_version], [clutter_major_version.clutter_minor_version.clutter_micro_version])
 | 
			
		||||
 | 
			
		||||
# change this only when breaking the API
 | 
			
		||||
m4_define([clutter_api_version], [1.0])
 | 
			
		||||
 | 
			
		||||
AC_PREREQ([2.63])
 | 
			
		||||
 | 
			
		||||
AC_INIT([clutter],
 | 
			
		||||
@@ -58,18 +61,12 @@ AC_CONFIG_MACRO_DIR([build/autotools])
 | 
			
		||||
AM_INIT_AUTOMAKE([1.11 foreign -Wno-portability no-define no-dist-gzip dist-xz tar-ustar])
 | 
			
		||||
AM_SILENT_RULES([yes])
 | 
			
		||||
 | 
			
		||||
dnl = Check that we are configured by mutter ==============================
 | 
			
		||||
 | 
			
		||||
AC_ARG_VAR([MUTTER_VERSION])
 | 
			
		||||
AC_ARG_VAR([LIBMUTTER_API_VERSION])
 | 
			
		||||
 | 
			
		||||
AS_IF([test "x$MUTTER_VERSION" = "x"],
 | 
			
		||||
      [AC_MSG_ERROR([Clutter can only be configured by mutter])],)
 | 
			
		||||
 | 
			
		||||
AC_SUBST([CLUTTER_MAJOR_VERSION],  [clutter_major_version])
 | 
			
		||||
AC_SUBST([CLUTTER_MINOR_VERSION],  [clutter_minor_version])
 | 
			
		||||
AC_SUBST([CLUTTER_MICRO_VERSION],  [clutter_micro_version])
 | 
			
		||||
AC_SUBST([CLUTTER_VERSION],        [clutter_version])
 | 
			
		||||
AC_SUBST([CLUTTER_API_VERSION],    [clutter_api_version])
 | 
			
		||||
AC_SUBST([CLUTTER_API_VERSION_AM], [$CLUTTER_MAJOR_VERSION\_0])
 | 
			
		||||
AC_SUBST([CLUTTER_RELEASE_STATUS], [clutter_release_status])
 | 
			
		||||
 | 
			
		||||
m4_define([lt_current],  [m4_eval(100 * clutter_minor_version + clutter_micro_version - clutter_interface_age)])
 | 
			
		||||
@@ -119,7 +116,7 @@ m4_define([pango_req_version],          [1.30])
 | 
			
		||||
m4_define([gi_req_version],             [1.39.0])
 | 
			
		||||
m4_define([xcomposite_req_version],     [0.4])
 | 
			
		||||
m4_define([gdk_req_version],            [3.3.18])
 | 
			
		||||
m4_define([libinput_req_version],       [1.4.0])
 | 
			
		||||
m4_define([libinput_req_version],       [0.19.0])
 | 
			
		||||
m4_define([libudev_req_version],        [136])
 | 
			
		||||
 | 
			
		||||
AC_SUBST([GLIB_REQ_VERSION],       [glib_req_version])
 | 
			
		||||
@@ -385,22 +382,6 @@ AS_IF([test "x$SUPPORT_X11" = "x1"],
 | 
			
		||||
              [AC_MSG_ERROR([not found])]
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        # XTEST (required)
 | 
			
		||||
        AC_MSG_CHECKING([for XTest extension])
 | 
			
		||||
        PKG_CHECK_EXISTS([xtst], [have_xtest=yes], [have_xtest=no])
 | 
			
		||||
        AS_IF([test "x$have_xtest" = "xyes"],
 | 
			
		||||
              [
 | 
			
		||||
                AC_DEFINE(HAVE_XTEST, [1], [Define to 1 if we have the XTest X extension])
 | 
			
		||||
 | 
			
		||||
                X11_LIBS="$X11_LIBS -lXtst"
 | 
			
		||||
                X11_PC_FILES="$X11_PC_FILES xtst"
 | 
			
		||||
                X11_EXTS="$X11_EXTS xtst"
 | 
			
		||||
 | 
			
		||||
                AC_MSG_RESULT([found])
 | 
			
		||||
              ],
 | 
			
		||||
              [AC_MSG_ERROR([Not found])]
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        # X Generic Extensions (optional)
 | 
			
		||||
        clutter_save_CPPFLAGS="$CPPFLAGS"
 | 
			
		||||
        CPPFLAGS="$CPPFLAGS $X11_CFLAGS"
 | 
			
		||||
@@ -784,7 +765,7 @@ AC_CONFIG_FILES([
 | 
			
		||||
	clutter/Makefile
 | 
			
		||||
        clutter/clutter-config.h
 | 
			
		||||
	clutter/clutter-version.h
 | 
			
		||||
	clutter/mutter-clutter-$LIBMUTTER_API_VERSION.pc:clutter/mutter-clutter.pc.in
 | 
			
		||||
	clutter/mutter-clutter-$CLUTTER_API_VERSION.pc:clutter/mutter-clutter.pc.in
 | 
			
		||||
 | 
			
		||||
	tests/Makefile
 | 
			
		||||
	tests/accessibility/Makefile
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ all_examples += \
 | 
			
		||||
	image-content
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
LDADD = $(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la $(CLUTTER_LIBS) $(GDK_PIXBUF_LIBS) $(LIBM)
 | 
			
		||||
LDADD = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la $(CLUTTER_LIBS) $(GDK_PIXBUF_LIBS) $(LIBM)
 | 
			
		||||
AM_CFLAGS = $(CLUTTER_CFLAGS) $(GDK_PIXBUF_CFLAGS) $(MAINTAINER_CFLAGS)
 | 
			
		||||
AM_CPPFLAGS = \
 | 
			
		||||
	-DG_DISABLE_SINGLE_INCLUDES \
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
common_ldadd = \
 | 
			
		||||
	$(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
	$(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
 | 
			
		||||
 | 
			
		||||
common_sources = \
 | 
			
		||||
	cally-examples-util.c	\
 | 
			
		||||
@@ -11,7 +11,6 @@ AM_CPPFLAGS = \
 | 
			
		||||
	-DGLIB_DISABLE_DEPRECATION_WARNINGS \
 | 
			
		||||
	-I$(top_srcdir)/../cogl                 \
 | 
			
		||||
	-I$(top_builddir)/../cogl               \
 | 
			
		||||
	-I$(top_builddir)/../cogl/cogl          \
 | 
			
		||||
	-I$(top_srcdir)	\
 | 
			
		||||
	-I$(top_builddir) \
 | 
			
		||||
	-I$(top_srcdir)/clutter \
 | 
			
		||||
 
 | 
			
		||||
@@ -3,13 +3,12 @@ installed_testdir = $(libexecdir)/installed-tests/mutter-clutter
 | 
			
		||||
include $(top_srcdir)/build/autotools/glib-tap.mk
 | 
			
		||||
 | 
			
		||||
AM_CFLAGS = -g $(CLUTTER_CFLAGS) $(MAINTAINER_CFLAGS)
 | 
			
		||||
LDADD = $(top_builddir)/../cogl/cogl/libmutter-cogl-@LIBMUTTER_API_VERSION@.la $(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la $(CLUTTER_LIBS) $(LIBM)
 | 
			
		||||
LDADD = $(top_builddir)/../cogl/cogl/libmutter-cogl.la $(top_builddir)/clutter/libmutter-clutter-1.0.la $(CLUTTER_LIBS) $(LIBM)
 | 
			
		||||
AM_LDFLAGS = -export-dynamic
 | 
			
		||||
AM_CPPFLAGS = \
 | 
			
		||||
	-DG_LOG_DOMAIN=\"Clutter-Conform\"	\
 | 
			
		||||
	-I$(top_srcdir)/../cogl                 \
 | 
			
		||||
	-I$(top_builddir)/../cogl               \
 | 
			
		||||
	-I$(top_builddir)/../cogl/cogl          \
 | 
			
		||||
	-I$(top_srcdir) 			\
 | 
			
		||||
	-I$(top_builddir)			\
 | 
			
		||||
	-DCOGL_DISABLE_DEPRECATION_WARNINGS	\
 | 
			
		||||
@@ -79,7 +78,7 @@ script_tests = \
 | 
			
		||||
	test-script-timeline-markers.json \
 | 
			
		||||
	test-state-1.json
 | 
			
		||||
 | 
			
		||||
TESTS_ENVIRONMENT += G_ENABLE_DIAGNOSTIC=0 CLUTTER_ENABLE_DIAGNOSTIC=0 CLUTTER_SCALE=1
 | 
			
		||||
TESTS_ENVIRONMENT += G_ENABLE_DIAGNOSTIC=0 CLUTTER_ENABLE_DIAGNOSTIC=0
 | 
			
		||||
 | 
			
		||||
# simple rules for generating a Git ignore file for the conformance test suite
 | 
			
		||||
$(srcdir)/.gitignore: Makefile
 | 
			
		||||
 
 | 
			
		||||
@@ -350,8 +350,7 @@ actor_replace_child (void)
 | 
			
		||||
  g_assert_cmpstr (clutter_actor_get_name (iter), ==, "qux");
 | 
			
		||||
 | 
			
		||||
  clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
 | 
			
		||||
                                                "name", "foo",
 | 
			
		||||
                                                NULL));
 | 
			
		||||
                                                "name", "foo"));
 | 
			
		||||
 | 
			
		||||
  clutter_actor_replace_child (actor, iter,
 | 
			
		||||
                               g_object_new (CLUTTER_TYPE_ACTOR,
 | 
			
		||||
 
 | 
			
		||||
@@ -109,9 +109,7 @@ clean-wrappers:
 | 
			
		||||
 | 
			
		||||
.PHONY: wrappers clean-wrappers
 | 
			
		||||
 | 
			
		||||
common_ldadd = \
 | 
			
		||||
  $(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la \
 | 
			
		||||
  $(top_builddir)/../cogl/cogl/libmutter-cogl-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
 | 
			
		||||
 | 
			
		||||
check_PROGRAMS = test-interactive
 | 
			
		||||
check_SCRIPTS = wrappers
 | 
			
		||||
@@ -127,7 +125,6 @@ test_interactive_CPPFLAGS = \
 | 
			
		||||
	-DCLUTTER_DISABLE_DEPRECATION_WARNINGS \
 | 
			
		||||
	-I$(top_srcdir)/../cogl                 \
 | 
			
		||||
	-I$(top_builddir)/../cogl               \
 | 
			
		||||
	-I$(top_builddir)/../cogl/cogl          \
 | 
			
		||||
	-I$(top_srcdir)	\
 | 
			
		||||
	-I$(top_builddir) \
 | 
			
		||||
	-I$(top_srcdir)/clutter \
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,4 @@
 | 
			
		||||
common_ldadd = \
 | 
			
		||||
  $(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la \
 | 
			
		||||
  $(top_builddir)/../cogl/cogl/libmutter-cogl-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
 | 
			
		||||
common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
 | 
			
		||||
 | 
			
		||||
check_PROGRAMS = \
 | 
			
		||||
	test-text \
 | 
			
		||||
@@ -20,7 +17,6 @@ AM_CPPFLAGS = \
 | 
			
		||||
	-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
 | 
			
		||||
	-I$(top_srcdir)/../cogl                 \
 | 
			
		||||
	-I$(top_builddir)/../cogl               \
 | 
			
		||||
	-I$(top_builddir)/../cogl/cogl          \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
	-I$(top_builddir) \
 | 
			
		||||
	-I$(top_srcdir)/clutter \
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ check_PROGRAMS = \
 | 
			
		||||
	test-state-mini \
 | 
			
		||||
	test-state-pick
 | 
			
		||||
 | 
			
		||||
common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
 | 
			
		||||
 | 
			
		||||
LDADD = $(common_ldadd) $(CLUTTER_LIBS) $(LIBM)
 | 
			
		||||
 | 
			
		||||
@@ -21,7 +21,6 @@ AM_CPPFLAGS = \
 | 
			
		||||
	-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
 | 
			
		||||
	-I$(top_srcdir)/../cogl                 \
 | 
			
		||||
	-I$(top_builddir)/../cogl               \
 | 
			
		||||
	-I$(top_builddir)/../cogl/cogl          \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
	-I$(top_builddir) \
 | 
			
		||||
	-I$(top_srcdir)/clutter \
 | 
			
		||||
 
 | 
			
		||||
@@ -2,10 +2,8 @@
 | 
			
		||||
 | 
			
		||||
NULL =
 | 
			
		||||
 | 
			
		||||
DISTCLEANFILES =
 | 
			
		||||
 | 
			
		||||
mutterlibdir = $(libdir)/mutter
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-cogl-gles2-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-cogl-gles2.la
 | 
			
		||||
 | 
			
		||||
AM_CPPFLAGS = \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
@@ -13,8 +11,8 @@ AM_CPPFLAGS = \
 | 
			
		||||
 | 
			
		||||
AM_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
 | 
			
		||||
 | 
			
		||||
libmutter_cogl_gles2_@LIBMUTTER_API_VERSION@_la_SOURCES = cogl-gles2-api.c
 | 
			
		||||
libmutter_cogl_gles2_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
 | 
			
		||||
libmutter_cogl_gles2_la_SOURCES = cogl-gles2-api.c
 | 
			
		||||
libmutter_cogl_gles2_la_LDFLAGS = \
 | 
			
		||||
	-no-undefined \
 | 
			
		||||
	-rpath $(mutterlibdir) \
 | 
			
		||||
	-avoid-version \
 | 
			
		||||
@@ -27,9 +25,7 @@ coglgles2include_HEADERS = \
 | 
			
		||||
	GLES2/gl2ext.h \
 | 
			
		||||
	GLES2/gl2platform.h
 | 
			
		||||
 | 
			
		||||
pc_files = mutter-cogl-gles2-$(LIBMUTTER_API_VERSION).pc
 | 
			
		||||
pc_files = mutter-cogl-gles2-1.0.pc
 | 
			
		||||
 | 
			
		||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA = $(pc_files)
 | 
			
		||||
 | 
			
		||||
DISTCLEANFILES += $(pc_files)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,12 @@ prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@/mutter
 | 
			
		||||
includedir=@includedir@/mutter
 | 
			
		||||
apiversion=@LIBMUTTER_API_VERSION@
 | 
			
		||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@
 | 
			
		||||
apiversion=1.0
 | 
			
		||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-1.0
 | 
			
		||||
 | 
			
		||||
Name: Cogl
 | 
			
		||||
Description: An object oriented GL/GLES Abstraction/Utility Layer
 | 
			
		||||
Version: @MUTTER_VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-cogl-gles2-@LIBMUTTER_API_VERSION@
 | 
			
		||||
Version: @COGL_1_VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-cogl-gles2
 | 
			
		||||
Cflags: -I${includedir}/cogl
 | 
			
		||||
Requires: ${requires}
 | 
			
		||||
@@ -23,13 +23,13 @@ source_h_priv = \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
mutterlibdir = $(libdir)/mutter
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-cogl-pango-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-cogl-pango.la
 | 
			
		||||
 | 
			
		||||
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_SOURCES = $(source_c) $(source_h) $(source_h_priv)
 | 
			
		||||
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
 | 
			
		||||
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la
 | 
			
		||||
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_PANGO_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
 | 
			
		||||
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
 | 
			
		||||
libmutter_cogl_pango_la_SOURCES = $(source_c) $(source_h) $(source_h_priv)
 | 
			
		||||
libmutter_cogl_pango_la_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
 | 
			
		||||
libmutter_cogl_pango_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl.la
 | 
			
		||||
libmutter_cogl_pango_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_PANGO_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
 | 
			
		||||
libmutter_cogl_pango_la_LDFLAGS = \
 | 
			
		||||
	-export-dynamic \
 | 
			
		||||
	-rpath $(mutterlibdir) \
 | 
			
		||||
	-export-symbols-regex "^cogl_pango_.*" \
 | 
			
		||||
@@ -49,7 +49,7 @@ cogl_base_includedir = $(includedir)/mutter
 | 
			
		||||
cogl_pangoheadersdir = $(cogl_base_includedir)/cogl/cogl-pango
 | 
			
		||||
cogl_pangoheaders_HEADERS = $(source_h)
 | 
			
		||||
 | 
			
		||||
pc_files = mutter-cogl-pango-$(LIBMUTTER_API_VERSION).pc
 | 
			
		||||
pc_files = mutter-cogl-pango-1.0.pc
 | 
			
		||||
 | 
			
		||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA = $(pc_files)
 | 
			
		||||
@@ -65,23 +65,23 @@ INTROSPECTION_GIRS =
 | 
			
		||||
if HAVE_INTROSPECTION
 | 
			
		||||
INTROSPECTION_COMPILER_ARGS=--includedir=$(top_builddir)/cogl
 | 
			
		||||
 | 
			
		||||
CoglPango-@LIBMUTTER_API_VERSION@.gir: libmutter-cogl-pango-$(LIBMUTTER_API_VERSION).la Makefile
 | 
			
		||||
CoglPango-1.0.gir: libmutter-cogl-pango.la Makefile
 | 
			
		||||
 | 
			
		||||
CoglPango_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = CoglPango
 | 
			
		||||
CoglPango_@LIBMUTTER_API_VERSION@_gir_VERSION = @LIBMUTTER_API_VERSION@
 | 
			
		||||
CoglPango_@LIBMUTTER_API_VERSION@_gir_LIBS = $(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la libmutter-cogl-pango-$(LIBMUTTER_API_VERSION).la
 | 
			
		||||
CoglPango_@LIBMUTTER_API_VERSION@_gir_FILES = $(source_h) $(source_c)
 | 
			
		||||
CoglPango_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS)
 | 
			
		||||
CoglPango_@LIBMUTTER_API_VERSION@_gir_INCLUDES = Pango-1.0 PangoCairo-1.0
 | 
			
		||||
CoglPango_@LIBMUTTER_API_VERSION@_gir_EXPORT_PACKAGES = mutter-cogl-pango-@LIBMUTTER_API_VERSION@
 | 
			
		||||
CoglPango_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \
 | 
			
		||||
CoglPango_1_0_gir_NAMESPACE = CoglPango
 | 
			
		||||
CoglPango_1_0_gir_VERSION = 1.0
 | 
			
		||||
CoglPango_1_0_gir_LIBS = $(top_builddir)/cogl/libmutter-cogl.la libmutter-cogl-pango.la
 | 
			
		||||
CoglPango_1_0_gir_FILES = $(source_h) $(source_c)
 | 
			
		||||
CoglPango_1_0_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS)
 | 
			
		||||
CoglPango_1_0_gir_INCLUDES = Pango-1.0 PangoCairo-1.0
 | 
			
		||||
CoglPango_1_0_gir_EXPORT_PACKAGES = mutter-cogl-pango-1.0
 | 
			
		||||
CoglPango_1_0_gir_SCANNERFLAGS = \
 | 
			
		||||
	--warn-all \
 | 
			
		||||
	--identifier-prefix=CoglPango \
 | 
			
		||||
	--symbol-prefix=cogl_pango \
 | 
			
		||||
	--c-include='cogl-pango/cogl-pango.h' \
 | 
			
		||||
	--include-uninstalled=$(top_builddir)/cogl/Cogl-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
	--include-uninstalled=$(top_builddir)/cogl/Cogl-1.0.gir
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_GIRS += CoglPango-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
INTROSPECTION_GIRS += CoglPango-1.0.gir
 | 
			
		||||
 | 
			
		||||
girdir = $(mutterlibdir)
 | 
			
		||||
gir_DATA = $(INTROSPECTION_GIRS)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,12 @@ prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@/mutter
 | 
			
		||||
includedir=@includedir@/mutter
 | 
			
		||||
apiversion=@LIBMUTTER_API_VERSION@
 | 
			
		||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@
 | 
			
		||||
apiversion=1.0
 | 
			
		||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-1.0
 | 
			
		||||
 | 
			
		||||
Name: Cogl
 | 
			
		||||
Description: An object oriented GL/GLES Abstraction/Utility Layer
 | 
			
		||||
Version: @MUTTER_VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-cogl-pango-@LIBMUTTER_API_VERSION@
 | 
			
		||||
Version: @COGL_1_VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-cogl-pango
 | 
			
		||||
Cflags: -I${includedir}/cogl
 | 
			
		||||
Requires: ${requires}
 | 
			
		||||
@@ -65,14 +65,14 @@ glib_enum_headers = $(source_1_x_h)
 | 
			
		||||
include $(top_srcdir)/build/autotools/Makefile.am.enums
 | 
			
		||||
 | 
			
		||||
mutterlibdir = $(libdir)/mutter
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-cogl-path-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-cogl-path.la
 | 
			
		||||
 | 
			
		||||
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_SOURCES = $(source_c) $(source_h)
 | 
			
		||||
nodist_libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_SOURCES = $(BUILT_SOURCES)
 | 
			
		||||
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
 | 
			
		||||
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la
 | 
			
		||||
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
 | 
			
		||||
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
 | 
			
		||||
libmutter_cogl_path_la_SOURCES = $(source_c) $(source_h)
 | 
			
		||||
nodist_libmutter_cogl_path_la_SOURCES = $(BUILT_SOURCES)
 | 
			
		||||
libmutter_cogl_path_la_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS)
 | 
			
		||||
libmutter_cogl_path_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl.la
 | 
			
		||||
libmutter_cogl_path_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
 | 
			
		||||
libmutter_cogl_path_la_LDFLAGS = \
 | 
			
		||||
	-export-dynamic \
 | 
			
		||||
	-export-symbols-regex "^(cogl|cogl2)_(framebuffer|path|is|clip|[sg]et)_.*" \
 | 
			
		||||
	-no-undefined \
 | 
			
		||||
@@ -94,7 +94,7 @@ cogl_pathheadersdir = $(cogl_base_includedir)/cogl/cogl-path
 | 
			
		||||
cogl_pathheaders_HEADERS = $(source_h)
 | 
			
		||||
nodist_cogl_pathheaders_HEADERS = cogl-path-enum-types.h
 | 
			
		||||
 | 
			
		||||
pc_files = mutter-cogl-path-$(LIBMUTTER_API_VERSION).pc
 | 
			
		||||
pc_files = mutter-cogl-path-1.0.pc
 | 
			
		||||
 | 
			
		||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA = $(pc_files)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,12 @@ prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@/mutter
 | 
			
		||||
includedir=@includedir@/mutter
 | 
			
		||||
apiversion=@LIBMUTTER_API_VERSION@
 | 
			
		||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@
 | 
			
		||||
apiversion=1.0
 | 
			
		||||
requires=@COGL_PKG_REQUIRES@ mutter-cogl-1.0
 | 
			
		||||
 | 
			
		||||
Name: Cogl
 | 
			
		||||
Description: A 2D path drawing library for Cogl
 | 
			
		||||
Version: @MUTTER_VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-cogl-path-@LIBMUTTER_API_VERSION@
 | 
			
		||||
Version: @COGL_1_VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-cogl-path
 | 
			
		||||
Cflags: -I${includedir}/cogl
 | 
			
		||||
Requires: ${requires}
 | 
			
		||||
@@ -41,7 +41,7 @@ BUILT_SOURCES += cogl-defines.h cogl-egl-defines.h cogl-gl-header.h
 | 
			
		||||
DISTCLEANFILES += cogl-defines.h cogl-egl-defines.h cogl-gl-header.h
 | 
			
		||||
EXTRA_DIST += cogl-defines.h.in cogl-egl-defines.h.in cogl-gl-header.h.in
 | 
			
		||||
 | 
			
		||||
pc_files = mutter-cogl-$(LIBMUTTER_API_VERSION).pc
 | 
			
		||||
pc_files = mutter-cogl-1.0.pc
 | 
			
		||||
 | 
			
		||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA = $(pc_files)
 | 
			
		||||
@@ -439,23 +439,23 @@ cogl_sources_c += \
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
mutterlibdir = $(libdir)/mutter
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-cogl-@LIBMUTTER_API_VERSION@.la
 | 
			
		||||
mutterlib_LTLIBRARIES = libmutter-cogl.la
 | 
			
		||||
 | 
			
		||||
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_LIBADD = $(LIBM) $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
 | 
			
		||||
libmutter_cogl_la_LIBADD = $(LIBM) $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
 | 
			
		||||
if UNIT_TESTS
 | 
			
		||||
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_LIBADD += $(top_builddir)/test-fixtures/libtest-fixtures.la
 | 
			
		||||
libmutter_cogl_la_LIBADD += $(top_builddir)/test-fixtures/libtest-fixtures.la
 | 
			
		||||
endif
 | 
			
		||||
# XXX: The aim is to eventually get rid of all private API exports
 | 
			
		||||
# for cogl-pango.
 | 
			
		||||
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \
 | 
			
		||||
libmutter_cogl_la_LDFLAGS = \
 | 
			
		||||
	-no-undefined \
 | 
			
		||||
	-avoid-version \
 | 
			
		||||
	-export-dynamic \
 | 
			
		||||
	-rpath $(mutterlibdir) \
 | 
			
		||||
	-export-symbols-regex "^(cogl|_cogl_debug_flags|_cogl_atlas_new|_cogl_atlas_add_reorganize_callback|_cogl_atlas_reserve_space|_cogl_callback|_cogl_util_get_eye_planes_for_screen_poly|_cogl_atlas_texture_remove_reorganize_callback|_cogl_atlas_texture_add_reorganize_callback|_cogl_texture_get_format|_cogl_texture_foreach_sub_texture_in_region|_cogl_texture_set_region|_cogl_profile_trace_message|_cogl_context_get_default|_cogl_framebuffer_get_stencil_bits|_cogl_clip_stack_push_rectangle|_cogl_framebuffer_get_modelview_stack|_cogl_object_default_unref|_cogl_pipeline_foreach_layer_internal|_cogl_clip_stack_push_primitive|_cogl_buffer_unmap_for_fill_or_fallback|_cogl_framebuffer_draw_primitive|_cogl_debug_instances|_cogl_framebuffer_get_projection_stack|_cogl_pipeline_layer_get_texture|_cogl_buffer_map_for_fill_or_fallback|_cogl_texture_can_hardware_repeat|_cogl_pipeline_prune_to_n_layers|_cogl_primitive_draw|test_|unit_test_|_cogl_winsys_glx_get_vtable|_cogl_winsys_egl_xlib_get_vtable|_cogl_winsys_egl_get_vtable|_cogl_closure_disconnect|_cogl_onscreen_notify_complete|_cogl_onscreen_notify_frame_sync|_cogl_winsys_egl_renderer_connect_common|_cogl_winsys_error_quark|_cogl_set_error|_cogl_poll_renderer_add_fd|_cogl_poll_renderer_add_idle|_cogl_framebuffer_winsys_update_size|_cogl_winsys_egl_make_current|_cogl_pixel_format_get_bytes_per_pixel).*"
 | 
			
		||||
	-export-symbols-regex "^(cogl|_cogl_debug_flags|_cogl_atlas_new|_cogl_atlas_add_reorganize_callback|_cogl_atlas_reserve_space|_cogl_callback|_cogl_util_get_eye_planes_for_screen_poly|_cogl_atlas_texture_remove_reorganize_callback|_cogl_atlas_texture_add_reorganize_callback|_cogl_texture_get_format|_cogl_texture_foreach_sub_texture_in_region|_cogl_profile_trace_message|_cogl_context_get_default|_cogl_framebuffer_get_stencil_bits|_cogl_clip_stack_push_rectangle|_cogl_framebuffer_get_modelview_stack|_cogl_object_default_unref|_cogl_pipeline_foreach_layer_internal|_cogl_clip_stack_push_primitive|_cogl_buffer_unmap_for_fill_or_fallback|_cogl_framebuffer_draw_primitive|_cogl_debug_instances|_cogl_framebuffer_get_projection_stack|_cogl_pipeline_layer_get_texture|_cogl_buffer_map_for_fill_or_fallback|_cogl_texture_can_hardware_repeat|_cogl_pipeline_prune_to_n_layers|_cogl_primitive_draw|test_|unit_test_|_cogl_winsys_glx_get_vtable|_cogl_winsys_egl_xlib_get_vtable|_cogl_winsys_egl_get_vtable|_cogl_closure_disconnect|_cogl_onscreen_notify_complete|_cogl_onscreen_notify_frame_sync|_cogl_winsys_egl_renderer_connect_common|_cogl_winsys_error_quark|_cogl_set_error|_cogl_poll_renderer_add_fd|_cogl_poll_renderer_add_idle|_cogl_framebuffer_winsys_update_size|_cogl_winsys_egl_make_current).*"
 | 
			
		||||
 | 
			
		||||
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_SOURCES = $(cogl_sources_c)
 | 
			
		||||
nodist_libmutter_cogl_@LIBMUTTER_API_VERSION@_la_SOURCES = $(BUILT_SOURCES)
 | 
			
		||||
libmutter_cogl_la_SOURCES = $(cogl_sources_c)
 | 
			
		||||
nodist_libmutter_cogl_la_SOURCES = $(BUILT_SOURCES)
 | 
			
		||||
 | 
			
		||||
# Cogl installed headers
 | 
			
		||||
cogl_headers = \
 | 
			
		||||
@@ -483,22 +483,22 @@ EXTRA_DIST += \
 | 
			
		||||
INTROSPECTION_GIRS =
 | 
			
		||||
 | 
			
		||||
if HAVE_INTROSPECTION
 | 
			
		||||
Cogl-@LIBMUTTER_API_VERSION@.gir: libmutter-cogl-$(LIBMUTTER_API_VERSION).la Makefile
 | 
			
		||||
Cogl-1.0.gir: libmutter-cogl.la Makefile
 | 
			
		||||
 | 
			
		||||
Cogl_@LIBMUTTER_API_VERSION@_gir_NAMESPACE = Cogl
 | 
			
		||||
Cogl_@LIBMUTTER_API_VERSION@_gir_VERSION = $(LIBMUTTER_API_VERSION)
 | 
			
		||||
Cogl_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-cogl-$(LIBMUTTER_API_VERSION).la
 | 
			
		||||
Cogl_1_0_gir_NAMESPACE = Cogl
 | 
			
		||||
Cogl_1_0_gir_VERSION = 1.0
 | 
			
		||||
Cogl_1_0_gir_LIBS = libmutter-cogl.la
 | 
			
		||||
if UNIT_TESTS
 | 
			
		||||
Cogl_@LIBMUTTER_API_VERSION@_gir_LIBS += $(top_builddir)/test-fixtures/libtest-fixtures.la
 | 
			
		||||
Cogl_1_0_gir_LIBS += $(top_builddir)/test-fixtures/libtest-fixtures.la
 | 
			
		||||
endif
 | 
			
		||||
Cogl_@LIBMUTTER_API_VERSION@_gir_FILES = $(cogl_1_public_h)
 | 
			
		||||
Cogl_1_0_gir_FILES = $(cogl_1_public_h)
 | 
			
		||||
 | 
			
		||||
Cogl_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) -UCOGL_COMPILATION -D__COGL_H_INSIDE__ -D__COGL_XLIB_H_INSIDE__ -D__COGL_EGL_H_INSIDE__ -D__COGL_GLX_H_INSIDE__ -DCOGL_GIR_SCANNING
 | 
			
		||||
Cogl_@LIBMUTTER_API_VERSION@_gir_INCLUDES = GL-1.0 GObject-2.0
 | 
			
		||||
Cogl_@LIBMUTTER_API_VERSION@_gir_EXPORT_PACKAGES = mutter-cogl-@LIBMUTTER_API_VERSION@
 | 
			
		||||
Cogl_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = --warn-all --c-include='cogl/cogl.h'
 | 
			
		||||
Cogl_1_0_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) -UCOGL_COMPILATION -D__COGL_H_INSIDE__ -D__COGL_XLIB_H_INSIDE__ -D__COGL_EGL_H_INSIDE__ -D__COGL_GLX_H_INSIDE__ -DCOGL_GIR_SCANNING
 | 
			
		||||
Cogl_1_0_gir_INCLUDES = GL-1.0 GObject-2.0
 | 
			
		||||
Cogl_1_0_gir_EXPORT_PACKAGES = mutter-cogl-1.0
 | 
			
		||||
Cogl_1_0_gir_SCANNERFLAGS = --warn-all --c-include='cogl/cogl.h'
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_GIRS += Cogl-@LIBMUTTER_API_VERSION@.gir
 | 
			
		||||
INTROSPECTION_GIRS += Cogl-1.0.gir
 | 
			
		||||
 | 
			
		||||
girdir = $(mutterlibdir)
 | 
			
		||||
gir_DATA = $(INTROSPECTION_GIRS)
 | 
			
		||||
 
 | 
			
		||||
@@ -262,7 +262,6 @@ typedef enum _CoglFeatureID
 | 
			
		||||
  COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE,
 | 
			
		||||
  COGL_FEATURE_ID_TEXTURE_RG,
 | 
			
		||||
  COGL_FEATURE_ID_BUFFER_AGE,
 | 
			
		||||
  COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL,
 | 
			
		||||
 | 
			
		||||
  /*< private >*/
 | 
			
		||||
  _COGL_N_FEATURE_IDS   /*< skip >*/
 | 
			
		||||
 
 | 
			
		||||
@@ -55,13 +55,6 @@ struct _CoglDriverVtable
 | 
			
		||||
                          GLenum *out_glintformat,
 | 
			
		||||
                          GLenum *out_glformat,
 | 
			
		||||
                          GLenum *out_gltype);
 | 
			
		||||
  CoglPixelFormat
 | 
			
		||||
  (* pixel_format_to_gl_with_target) (CoglContext *context,
 | 
			
		||||
                                      CoglPixelFormat format,
 | 
			
		||||
                                      CoglPixelFormat target_format,
 | 
			
		||||
                                      GLenum *out_glintformat,
 | 
			
		||||
                                      GLenum *out_glformat,
 | 
			
		||||
                                      GLenum *out_gltype);
 | 
			
		||||
 | 
			
		||||
  CoglBool
 | 
			
		||||
  (* update_features) (CoglContext *context,
 | 
			
		||||
 
 | 
			
		||||
@@ -152,7 +152,6 @@ typedef long             GLsizeiptr;
 | 
			
		||||
#define GL_POLYGON_OFFSET_FILL            0x8037
 | 
			
		||||
#define GL_SAMPLE_ALPHA_TO_COVERAGE       0x809E
 | 
			
		||||
#define GL_SAMPLE_COVERAGE                0x80A0
 | 
			
		||||
#define GL_TEXTURE_EXTERNAL_OES           0x8D65
 | 
			
		||||
 | 
			
		||||
/* ErrorCode */
 | 
			
		||||
#define GL_NO_ERROR                       0
 | 
			
		||||
 
 | 
			
		||||
@@ -111,14 +111,6 @@ _cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
 | 
			
		||||
      lengths[count++] = sizeof (texture_3d_extension) - 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (cogl_has_feature (ctx, COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL))
 | 
			
		||||
    {
 | 
			
		||||
      static const char texture_3d_extension[] =
 | 
			
		||||
        "#extension GL_OES_EGL_image_external : require\n";
 | 
			
		||||
      strings[count] = texture_3d_extension;
 | 
			
		||||
      lengths[count++] = sizeof (texture_3d_extension) - 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (shader_gl_type == GL_VERTEX_SHADER)
 | 
			
		||||
    {
 | 
			
		||||
      strings[count] = vertex_boilerplate;
 | 
			
		||||
 
 | 
			
		||||
@@ -51,9 +51,6 @@ typedef struct _CoglGLXDisplay
 | 
			
		||||
 | 
			
		||||
  CoglBool found_fbconfig;
 | 
			
		||||
  CoglBool fbconfig_has_rgba_visual;
 | 
			
		||||
  CoglBool is_direct;
 | 
			
		||||
  CoglBool have_vblank_counter;
 | 
			
		||||
  CoglBool can_vblank_wait;
 | 
			
		||||
  GLXFBConfig fbconfig;
 | 
			
		||||
 | 
			
		||||
  /* Single context for all wins */
 | 
			
		||||
 
 | 
			
		||||
@@ -43,6 +43,8 @@ typedef struct _CoglGLXRenderer
 | 
			
		||||
  int glx_error_base;
 | 
			
		||||
  int glx_event_base;
 | 
			
		||||
 | 
			
		||||
  CoglBool is_direct;
 | 
			
		||||
 | 
			
		||||
  /* Vblank stuff */
 | 
			
		||||
  int dri_fd;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -169,8 +169,7 @@ check_qualcomm_vendor (const CoglGpuInfoStrings *strings)
 | 
			
		||||
static CoglBool
 | 
			
		||||
check_nvidia_vendor (const CoglGpuInfoStrings *strings)
 | 
			
		||||
{
 | 
			
		||||
  if (strcmp (strings->vendor_string, "NVIDIA") != 0 &&
 | 
			
		||||
      strcmp (strings->vendor_string, "NVIDIA Corporation") != 0)
 | 
			
		||||
  if (strcmp (strings->vendor_string, "NVIDIA") != 0)
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
 
 | 
			
		||||
@@ -42,7 +42,7 @@
 | 
			
		||||
#include <cogl/winsys/cogl-winsys-egl-private.h>
 | 
			
		||||
#include <cogl/winsys/cogl-winsys-private.h>
 | 
			
		||||
 | 
			
		||||
void cogl_renderer_set_custom_winsys (CoglRenderer                *renderer,
 | 
			
		||||
                                      CoglCustomWinsysVtableGetter winsys_vtable_getter);
 | 
			
		||||
void cogl_renderer_set_custom_winsys (CoglRenderer          *renderer,
 | 
			
		||||
                                      CoglWinsysVtableGetter winsys_vtable_getter);
 | 
			
		||||
 | 
			
		||||
#endif /* __COGL_MUTTER_H___ */
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ typedef struct _CoglObject      CoglObject;
 | 
			
		||||
/**
 | 
			
		||||
 * CoglObject: (ref-func cogl_object_ref) (unref-func cogl_object_unref)
 | 
			
		||||
 *     (set-value-func cogl_object_value_set_object)
 | 
			
		||||
 *     (get-value-func cogl_object_value_get_object)
 | 
			
		||||
 *     (get-value-func cogl_object_get_object)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ COGL_BEGIN_DECLS
 | 
			
		||||
/**
 | 
			
		||||
 * CoglPrimitive: (ref-func cogl_object_ref) (unref-func cogl_object_unref)
 | 
			
		||||
 *     (set-value-func cogl_object_value_set_object)
 | 
			
		||||
 *     (get-value-func cogl_object_value_get_object)
 | 
			
		||||
 *     (get-value-func cogl_object_get_object)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
@@ -77,9 +77,6 @@ typedef enum
 | 
			
		||||
  COGL_PRIVATE_FEATURE_GL_PROGRAMMABLE,
 | 
			
		||||
  COGL_PRIVATE_FEATURE_GL_EMBEDDED,
 | 
			
		||||
  COGL_PRIVATE_FEATURE_GL_WEB,
 | 
			
		||||
  /* This is currently only implemented for GLX, but isn't actually
 | 
			
		||||
   * that winsys dependent */
 | 
			
		||||
  COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT,
 | 
			
		||||
 | 
			
		||||
  COGL_N_PRIVATE_FEATURES
 | 
			
		||||
} CoglPrivateFeature;
 | 
			
		||||
 
 | 
			
		||||
@@ -39,13 +39,12 @@
 | 
			
		||||
#include "cogl-texture-driver.h"
 | 
			
		||||
#include "cogl-context.h"
 | 
			
		||||
#include "cogl-closure-list-private.h"
 | 
			
		||||
#include "cogl-mutter.h"
 | 
			
		||||
 | 
			
		||||
#ifdef COGL_HAS_XLIB_SUPPORT
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef const CoglWinsysVtable *(*CoglCustomWinsysVtableGetter) (CoglRenderer *renderer);
 | 
			
		||||
 | 
			
		||||
struct _CoglRenderer
 | 
			
		||||
{
 | 
			
		||||
  CoglObject _parent;
 | 
			
		||||
@@ -54,7 +53,7 @@ struct _CoglRenderer
 | 
			
		||||
  const CoglDriverVtable *driver_vtable;
 | 
			
		||||
  const CoglTextureDriver *texture_driver;
 | 
			
		||||
  const CoglWinsysVtable *winsys_vtable;
 | 
			
		||||
  CoglCustomWinsysVtableGetter custom_winsys_vtable_getter;
 | 
			
		||||
  CoglWinsysVtableGetter custom_winsys_vtable_getter;
 | 
			
		||||
  CoglWinsysID winsys_id_override;
 | 
			
		||||
  GList *constraints;
 | 
			
		||||
 | 
			
		||||
@@ -70,7 +69,6 @@ struct _CoglRenderer
 | 
			
		||||
  Display *foreign_xdpy;
 | 
			
		||||
  CoglBool xlib_enable_event_retrieval;
 | 
			
		||||
  CoglBool xlib_want_reset_on_video_memory_purge;
 | 
			
		||||
  CoglBool xlib_enable_threaded_swap_wait;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  CoglDriver driver;
 | 
			
		||||
 
 | 
			
		||||
@@ -285,17 +285,6 @@ cogl_xlib_renderer_request_reset_on_video_memory_purge (CoglRenderer *renderer,
 | 
			
		||||
 | 
			
		||||
  renderer->xlib_want_reset_on_video_memory_purge = enable;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cogl_xlib_renderer_set_threaded_swap_wait_enabled (CoglRenderer *renderer,
 | 
			
		||||
						   CoglBool enable)
 | 
			
		||||
{
 | 
			
		||||
  _COGL_RETURN_IF_FAIL (cogl_is_renderer (renderer));
 | 
			
		||||
  /* NB: Renderers are considered immutable once connected */
 | 
			
		||||
  _COGL_RETURN_IF_FAIL (!renderer->connected);
 | 
			
		||||
 | 
			
		||||
  renderer->xlib_enable_threaded_swap_wait = enable;
 | 
			
		||||
}
 | 
			
		||||
#endif /* COGL_HAS_XLIB_SUPPORT */
 | 
			
		||||
 | 
			
		||||
CoglBool
 | 
			
		||||
@@ -565,8 +554,8 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
 | 
			
		||||
/* Final connection API */
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cogl_renderer_set_custom_winsys (CoglRenderer                *renderer,
 | 
			
		||||
                                 CoglCustomWinsysVtableGetter winsys_vtable_getter)
 | 
			
		||||
cogl_renderer_set_custom_winsys (CoglRenderer          *renderer,
 | 
			
		||||
                                 CoglWinsysVtableGetter winsys_vtable_getter)
 | 
			
		||||
{
 | 
			
		||||
  renderer->custom_winsys_vtable_getter = winsys_vtable_getter;
 | 
			
		||||
}
 | 
			
		||||
@@ -575,11 +564,10 @@ static CoglBool
 | 
			
		||||
connect_custom_winsys (CoglRenderer *renderer,
 | 
			
		||||
                       CoglError   **error)
 | 
			
		||||
{
 | 
			
		||||
  const CoglWinsysVtable *winsys;
 | 
			
		||||
  const CoglWinsysVtable *winsys = renderer->custom_winsys_vtable_getter();
 | 
			
		||||
  CoglError *tmp_error = NULL;
 | 
			
		||||
  GString *error_message;
 | 
			
		||||
 | 
			
		||||
  winsys = renderer->custom_winsys_vtable_getter (renderer);
 | 
			
		||||
  renderer->winsys_vtable = winsys;
 | 
			
		||||
 | 
			
		||||
  error_message = g_string_new ("");
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,10 @@
 | 
			
		||||
#include "cogl-texture-private.h"
 | 
			
		||||
#include "cogl-texture-2d.h"
 | 
			
		||||
 | 
			
		||||
#ifdef COGL_HAS_EGL_SUPPORT
 | 
			
		||||
#include "cogl-egl-defines.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct _CoglTexture2D
 | 
			
		||||
{
 | 
			
		||||
  CoglTexture _parent;
 | 
			
		||||
@@ -55,23 +59,30 @@ struct _CoglTexture2D
 | 
			
		||||
  GLenum gl_internal_format;
 | 
			
		||||
  /* The texture object number */
 | 
			
		||||
  GLuint gl_texture;
 | 
			
		||||
  GLenum gl_target;
 | 
			
		||||
  GLenum gl_legacy_texobj_min_filter;
 | 
			
		||||
  GLenum gl_legacy_texobj_mag_filter;
 | 
			
		||||
  GLint gl_legacy_texobj_wrap_mode_s;
 | 
			
		||||
  GLint gl_legacy_texobj_wrap_mode_t;
 | 
			
		||||
  CoglTexturePixel first_pixel;
 | 
			
		||||
 | 
			
		||||
  struct {
 | 
			
		||||
    void *user_data;
 | 
			
		||||
    GDestroyNotify destroy;
 | 
			
		||||
  } egl_image_external;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
CoglTexture2D *
 | 
			
		||||
_cogl_texture_2d_new_from_bitmap (CoglBitmap *bmp,
 | 
			
		||||
                                  CoglBool can_convert_in_place);
 | 
			
		||||
 | 
			
		||||
#if defined (COGL_HAS_EGL_SUPPORT) && defined (EGL_KHR_image_base)
 | 
			
		||||
/* NB: The reason we require the width, height and format to be passed
 | 
			
		||||
 * even though they may seem redundant is because GLES 1/2 don't
 | 
			
		||||
 * provide a way to query these properties. */
 | 
			
		||||
CoglTexture2D *
 | 
			
		||||
_cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
 | 
			
		||||
                                     int width,
 | 
			
		||||
                                     int height,
 | 
			
		||||
                                     CoglPixelFormat format,
 | 
			
		||||
                                     EGLImageKHR image,
 | 
			
		||||
                                     CoglError **error);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
CoglTexture2D *
 | 
			
		||||
_cogl_texture_2d_create_base (CoglContext *ctx,
 | 
			
		||||
                              int width,
 | 
			
		||||
 
 | 
			
		||||
@@ -110,8 +110,6 @@ _cogl_texture_2d_create_base (CoglContext *ctx,
 | 
			
		||||
  tex_2d->mipmaps_dirty = TRUE;
 | 
			
		||||
  tex_2d->auto_mipmap = TRUE;
 | 
			
		||||
 | 
			
		||||
  tex_2d->gl_target = GL_TEXTURE_2D;
 | 
			
		||||
 | 
			
		||||
  tex_2d->is_foreign = FALSE;
 | 
			
		||||
 | 
			
		||||
  ctx->driver_vtable->texture_2d_init (tex_2d);
 | 
			
		||||
@@ -238,12 +236,12 @@ cogl_texture_2d_new_from_data (CoglContext *ctx,
 | 
			
		||||
 * even though they may seem redundant is because GLES 1/2 don't
 | 
			
		||||
 * provide a way to query these properties. */
 | 
			
		||||
CoglTexture2D *
 | 
			
		||||
cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
 | 
			
		||||
                                    int width,
 | 
			
		||||
                                    int height,
 | 
			
		||||
                                    CoglPixelFormat format,
 | 
			
		||||
                                    EGLImageKHR image,
 | 
			
		||||
                                    CoglError **error)
 | 
			
		||||
_cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
 | 
			
		||||
                                     int width,
 | 
			
		||||
                                     int height,
 | 
			
		||||
                                     CoglPixelFormat format,
 | 
			
		||||
                                     EGLImageKHR image,
 | 
			
		||||
                                     CoglError **error)
 | 
			
		||||
{
 | 
			
		||||
  CoglTextureLoader *loader;
 | 
			
		||||
  CoglTexture2D *tex;
 | 
			
		||||
@@ -432,11 +430,11 @@ cogl_wayland_texture_2d_new_from_buffer (CoglContext *ctx,
 | 
			
		||||
                                          EGL_WAYLAND_BUFFER_WL,
 | 
			
		||||
                                          buffer,
 | 
			
		||||
                                          NULL);
 | 
			
		||||
          tex = cogl_egl_texture_2d_new_from_image (ctx,
 | 
			
		||||
                                                    width, height,
 | 
			
		||||
                                                    internal_format,
 | 
			
		||||
                                                    image,
 | 
			
		||||
                                                    error);
 | 
			
		||||
          tex = _cogl_egl_texture_2d_new_from_image (ctx,
 | 
			
		||||
                                                     width, height,
 | 
			
		||||
                                                     internal_format,
 | 
			
		||||
                                                     image,
 | 
			
		||||
                                                     error);
 | 
			
		||||
          _cogl_egl_destroy_image (ctx, image);
 | 
			
		||||
          return tex;
 | 
			
		||||
        }
 | 
			
		||||
@@ -559,7 +557,7 @@ _cogl_texture_2d_get_gl_texture (CoglTexture *tex,
 | 
			
		||||
      GLuint handle;
 | 
			
		||||
 | 
			
		||||
      if (out_gl_target)
 | 
			
		||||
        *out_gl_target = tex_2d->gl_target;
 | 
			
		||||
        *out_gl_target = GL_TEXTURE_2D;
 | 
			
		||||
 | 
			
		||||
      handle = ctx->driver_vtable->texture_2d_get_gl_handle (tex_2d);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,10 +40,6 @@
 | 
			
		||||
#include "cogl-context.h"
 | 
			
		||||
#include "cogl-bitmap.h"
 | 
			
		||||
 | 
			
		||||
#ifdef COGL_HAS_EGL_SUPPORT
 | 
			
		||||
#include "cogl-egl-defines.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
COGL_BEGIN_DECLS
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -231,40 +227,6 @@ cogl_texture_2d_new_from_data (CoglContext *ctx,
 | 
			
		||||
CoglTexture2D *
 | 
			
		||||
cogl_texture_2d_new_from_bitmap (CoglBitmap *bitmap);
 | 
			
		||||
 | 
			
		||||
#if defined (COGL_HAS_EGL_SUPPORT) && defined (EGL_KHR_image_base)
 | 
			
		||||
/* NB: The reason we require the width, height and format to be passed
 | 
			
		||||
 * even though they may seem redundant is because GLES 1/2 don't
 | 
			
		||||
 * provide a way to query these properties. */
 | 
			
		||||
CoglTexture2D *
 | 
			
		||||
cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
 | 
			
		||||
                                    int width,
 | 
			
		||||
                                    int height,
 | 
			
		||||
                                    CoglPixelFormat format,
 | 
			
		||||
                                    EGLImageKHR image,
 | 
			
		||||
                                    CoglError **error);
 | 
			
		||||
 | 
			
		||||
typedef gboolean (*CoglTexture2DEGLImageExternalAlloc) (CoglTexture2D *tex_2d,
 | 
			
		||||
                                                        gpointer user_data,
 | 
			
		||||
                                                        GError **error);
 | 
			
		||||
 | 
			
		||||
CoglTexture2D *
 | 
			
		||||
cogl_texture_2d_new_from_egl_image_external (CoglContext *ctx,
 | 
			
		||||
                                             int width,
 | 
			
		||||
                                             int height,
 | 
			
		||||
                                             CoglTexture2DEGLImageExternalAlloc alloc,
 | 
			
		||||
                                             gpointer user_data,
 | 
			
		||||
                                             GDestroyNotify destroy,
 | 
			
		||||
                                             CoglError **error);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cogl_texture_2d_egl_image_external_bind (CoglTexture2D *tex_2d);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
cogl_texture_2d_egl_image_external_alloc_finish (CoglTexture2D *tex_2d,
 | 
			
		||||
						 void *user_data,
 | 
			
		||||
						 GDestroyNotify destroy);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
COGL_END_DECLS
 | 
			
		||||
 | 
			
		||||
#endif /* __COGL_TEXTURE_2D_H */
 | 
			
		||||
 
 | 
			
		||||
@@ -198,7 +198,6 @@ struct _CoglTextureDriver
 | 
			
		||||
  CoglPixelFormat
 | 
			
		||||
  (* find_best_gl_get_data_format) (CoglContext     *context,
 | 
			
		||||
                                    CoglPixelFormat format,
 | 
			
		||||
                                    CoglPixelFormat target_format,
 | 
			
		||||
                                    GLenum *closest_gl_format,
 | 
			
		||||
                                    GLenum *closest_gl_type);
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
@@ -37,7 +37,6 @@
 | 
			
		||||
#include "cogl-spans.h"
 | 
			
		||||
#include "cogl-meta-texture.h"
 | 
			
		||||
#include "cogl-framebuffer.h"
 | 
			
		||||
#include "cogl-texture-2d.h"
 | 
			
		||||
 | 
			
		||||
#ifdef COGL_HAS_EGL_SUPPORT
 | 
			
		||||
#include "cogl-egl-defines.h"
 | 
			
		||||
@@ -155,8 +154,7 @@ typedef enum _CoglTextureSoureType {
 | 
			
		||||
  COGL_TEXTURE_SOURCE_TYPE_SIZED = 1,
 | 
			
		||||
  COGL_TEXTURE_SOURCE_TYPE_BITMAP,
 | 
			
		||||
  COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE,
 | 
			
		||||
  COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN,
 | 
			
		||||
  COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL
 | 
			
		||||
  COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN
 | 
			
		||||
} CoglTextureSourceType;
 | 
			
		||||
 | 
			
		||||
typedef struct _CoglTextureLoader
 | 
			
		||||
@@ -181,14 +179,6 @@ typedef struct _CoglTextureLoader
 | 
			
		||||
      int height;
 | 
			
		||||
      CoglPixelFormat format;
 | 
			
		||||
    } egl_image;
 | 
			
		||||
#endif
 | 
			
		||||
#if defined (COGL_HAS_EGL_SUPPORT)
 | 
			
		||||
    struct {
 | 
			
		||||
      int width;
 | 
			
		||||
      int height;
 | 
			
		||||
      CoglTexture2DEGLImageExternalAlloc alloc;
 | 
			
		||||
      CoglPixelFormat format;
 | 
			
		||||
    } egl_image_external;
 | 
			
		||||
#endif
 | 
			
		||||
    struct {
 | 
			
		||||
      int width;
 | 
			
		||||
 
 | 
			
		||||
@@ -160,7 +160,6 @@ _cogl_texture_free_loader (CoglTexture *texture)
 | 
			
		||||
        case COGL_TEXTURE_SOURCE_TYPE_SIZED:
 | 
			
		||||
        case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE:
 | 
			
		||||
        case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
 | 
			
		||||
        case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL:
 | 
			
		||||
          break;
 | 
			
		||||
        case COGL_TEXTURE_SOURCE_TYPE_BITMAP:
 | 
			
		||||
          cogl_object_unref (loader->src.bitmap.bitmap);
 | 
			
		||||
@@ -1059,7 +1058,6 @@ cogl_texture_get_data (CoglTexture *texture,
 | 
			
		||||
 | 
			
		||||
  closest_format =
 | 
			
		||||
    ctx->texture_driver->find_best_gl_get_data_format (ctx,
 | 
			
		||||
                                                       texture_format,
 | 
			
		||||
                                                       format,
 | 
			
		||||
                                                       &closest_gl_format,
 | 
			
		||||
                                                       &closest_gl_type);
 | 
			
		||||
 
 | 
			
		||||
@@ -167,36 +167,6 @@ void
 | 
			
		||||
cogl_xlib_renderer_set_event_retrieval_enabled (CoglRenderer *renderer,
 | 
			
		||||
                                                CoglBool enable);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_xlib_renderer_set_threaded_swap_wait_enabled:
 | 
			
		||||
 * @renderer: a #CoglRenderer
 | 
			
		||||
 * @enable: The new value
 | 
			
		||||
 *
 | 
			
		||||
 * Sets whether Cogl is allowed to use a separate threaded to wait for the
 | 
			
		||||
 * completion of glXSwapBuffers() and call the frame callback for the
 | 
			
		||||
 * corresponding #CoglOnscreen. This is a way of emulating the
 | 
			
		||||
 * INTEL_swap_event extension, and will only ever be used if
 | 
			
		||||
 * INTEL_swap_event is not present; it will also only be used for
 | 
			
		||||
 * specific white-listed drivers that are known to work correctly with
 | 
			
		||||
 * multiple contexts sharing state between threads.
 | 
			
		||||
 *
 | 
			
		||||
 * The advantage of enabling this is that it will allow your main loop
 | 
			
		||||
 * to do other work while waiting for the system to be ready to draw
 | 
			
		||||
 * the next frame, instead of blocking in glXSwapBuffers(). A disadvantage
 | 
			
		||||
 * is that the driver will be prevented from buffering up multiple frames
 | 
			
		||||
 * even if it thinks that it would be advantageous. In general, this
 | 
			
		||||
 * will work best for something like a system compositor that is doing
 | 
			
		||||
 * simple drawing but handling lots of other complex tasks.
 | 
			
		||||
 * 
 | 
			
		||||
 * If you enable this, you must call XInitThreads() before any other
 | 
			
		||||
 * X11 calls in your program. (See the documentation for XInitThreads())
 | 
			
		||||
 *
 | 
			
		||||
 * Stability: unstable
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
cogl_xlib_renderer_set_threaded_swap_wait_enabled (CoglRenderer *renderer,
 | 
			
		||||
						   CoglBool enable);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_xlib_renderer_get_display: (skip)
 | 
			
		||||
 */
 | 
			
		||||
@@ -210,7 +180,7 @@ XVisualInfo *
 | 
			
		||||
cogl_xlib_renderer_get_visual_info (CoglRenderer *renderer);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_xlib_renderer_request_reset_on_video_memory_purge: (skip)
 | 
			
		||||
 * cogl_xlib_renderer_request_reset_on_video_memory_purge:
 | 
			
		||||
 * @renderer: a #CoglRenderer
 | 
			
		||||
 * @enable: The new value
 | 
			
		||||
 *
 | 
			
		||||
 
 | 
			
		||||
@@ -1307,7 +1307,7 @@ CoglMaterialWrapMode
 | 
			
		||||
cogl_material_layer_get_wrap_mode_p (CoglMaterialLayer *layer);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_material_set_depth_state: (skip)
 | 
			
		||||
 * cogl_material_set_depth_state:
 | 
			
		||||
 * @material: A #CoglMaterial object
 | 
			
		||||
 * @state: A #CoglDepthState struct
 | 
			
		||||
 * @error: A #CoglError to report failures to setup the given @state.
 | 
			
		||||
@@ -1334,7 +1334,7 @@ cogl_material_set_depth_state (CoglMaterial *material,
 | 
			
		||||
                               CoglError **error);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_material_get_depth_state: (skip)
 | 
			
		||||
 * cogl_material_get_depth_state:
 | 
			
		||||
 * @material: A #CoglMaterial object
 | 
			
		||||
 * @state_out: A destination #CoglDepthState struct
 | 
			
		||||
 *
 | 
			
		||||
@@ -1370,8 +1370,8 @@ typedef CoglBool (*CoglMaterialLayerCallback) (CoglMaterial *material,
 | 
			
		||||
/**
 | 
			
		||||
 * cogl_material_foreach_layer:
 | 
			
		||||
 * @material: A #CoglMaterial object
 | 
			
		||||
 * @callback: (scope call): A #CoglMaterialLayerCallback to be called for each
 | 
			
		||||
 *            layer index
 | 
			
		||||
 * @callback: A #CoglMaterialLayerCallback to be called for each layer
 | 
			
		||||
 *            index
 | 
			
		||||
 * @user_data: Private data that will be passed to the callback
 | 
			
		||||
 *
 | 
			
		||||
 * Iterates all the layer indices of the given @material.
 | 
			
		||||
 
 | 
			
		||||
@@ -1418,15 +1418,6 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
 | 
			
		||||
                                                            &gl_format,
 | 
			
		||||
                                                            &gl_type);
 | 
			
		||||
 | 
			
		||||
  /* As we are reading pixels, we want to consider the bitmap according to
 | 
			
		||||
   * its real pixel format, not the swizzled channels we pretend face to the
 | 
			
		||||
   * pipeline.
 | 
			
		||||
   */
 | 
			
		||||
  if ((format == COGL_PIXEL_FORMAT_BGRA_8888 ||
 | 
			
		||||
       format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) &&
 | 
			
		||||
      _cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
 | 
			
		||||
    gl_format = GL_BGRA;
 | 
			
		||||
 | 
			
		||||
  /* NB: All offscreen rendering is done upside down so there is no need
 | 
			
		||||
   * to flip in this case... */
 | 
			
		||||
  if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_MESA_PACK_INVERT) &&
 | 
			
		||||
 
 | 
			
		||||
@@ -46,31 +46,11 @@
 | 
			
		||||
#include "cogl-error-private.h"
 | 
			
		||||
#include "cogl-util-gl-private.h"
 | 
			
		||||
 | 
			
		||||
#if defined (COGL_HAS_EGL_SUPPORT)
 | 
			
		||||
 | 
			
		||||
/* We need this define from GLES2, but can't include the header
 | 
			
		||||
   as its type definitions may conflict with the GL ones
 | 
			
		||||
 */
 | 
			
		||||
#ifndef GL_OES_EGL_image_external
 | 
			
		||||
#define GL_OES_EGL_image_external 1
 | 
			
		||||
#define GL_TEXTURE_EXTERNAL_OES           0x8D65
 | 
			
		||||
#define GL_TEXTURE_BINDING_EXTERNAL_OES   0x8D67
 | 
			
		||||
#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68
 | 
			
		||||
#define GL_SAMPLER_EXTERNAL_OES           0x8D66
 | 
			
		||||
#endif /* GL_OES_EGL_image_external */
 | 
			
		||||
 | 
			
		||||
#endif /* defined (COGL_HAS_EGL_SUPPORT) */
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
_cogl_texture_2d_gl_free (CoglTexture2D *tex_2d)
 | 
			
		||||
{
 | 
			
		||||
  if (!tex_2d->is_foreign && tex_2d->gl_texture)
 | 
			
		||||
    _cogl_delete_gl_texture (tex_2d->gl_texture);
 | 
			
		||||
 | 
			
		||||
#if defined (COGL_HAS_EGL_SUPPORT)
 | 
			
		||||
  g_clear_pointer (&tex_2d->egl_image_external.user_data,
 | 
			
		||||
                   tex_2d->egl_image_external.destroy);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CoglBool
 | 
			
		||||
@@ -121,9 +101,6 @@ _cogl_texture_2d_gl_init (CoglTexture2D *tex_2d)
 | 
			
		||||
  /* Wrap mode not yet set */
 | 
			
		||||
  tex_2d->gl_legacy_texobj_wrap_mode_s = GL_FALSE;
 | 
			
		||||
  tex_2d->gl_legacy_texobj_wrap_mode_t = GL_FALSE;
 | 
			
		||||
 | 
			
		||||
  tex_2d->egl_image_external.user_data = NULL;
 | 
			
		||||
  tex_2d->egl_image_external.destroy = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
@@ -462,96 +439,6 @@ allocate_from_gl_foreign (CoglTexture2D *tex_2d,
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined (COGL_HAS_EGL_SUPPORT)
 | 
			
		||||
static CoglBool
 | 
			
		||||
allocate_custom_egl_image_external (CoglTexture2D *tex_2d,
 | 
			
		||||
                                    CoglTextureLoader *loader,
 | 
			
		||||
                                    CoglError **error)
 | 
			
		||||
{
 | 
			
		||||
  CoglTexture *tex = COGL_TEXTURE (tex_2d);
 | 
			
		||||
  CoglContext *ctx = tex->context;
 | 
			
		||||
  CoglPixelFormat internal_format = loader->src.egl_image_external.format;
 | 
			
		||||
 | 
			
		||||
  _cogl_gl_util_clear_gl_errors (ctx);
 | 
			
		||||
 | 
			
		||||
  GE (ctx, glActiveTexture (GL_TEXTURE0));
 | 
			
		||||
  GE (ctx, glGenTextures (1, &tex_2d->gl_texture));
 | 
			
		||||
 | 
			
		||||
  GE (ctx, glBindTexture (GL_TEXTURE_EXTERNAL_OES,
 | 
			
		||||
                          tex_2d->gl_texture));
 | 
			
		||||
 | 
			
		||||
  if (_cogl_gl_util_get_error (ctx) != GL_NO_ERROR)
 | 
			
		||||
    {
 | 
			
		||||
      _cogl_set_error (error,
 | 
			
		||||
                       COGL_TEXTURE_ERROR,
 | 
			
		||||
                       COGL_TEXTURE_ERROR_BAD_PARAMETER,
 | 
			
		||||
                       "Could not create a CoglTexture2D from a given "
 | 
			
		||||
                       "EGLImage");
 | 
			
		||||
      GE( ctx, glDeleteTextures (1, &tex_2d->gl_texture) );
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  GE (ctx, glTexParameteri(GL_TEXTURE_EXTERNAL_OES,
 | 
			
		||||
                           GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
 | 
			
		||||
  GE (ctx, glTexParameteri(GL_TEXTURE_EXTERNAL_OES,
 | 
			
		||||
                           GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));
 | 
			
		||||
 | 
			
		||||
  if (!loader->src.egl_image_external.alloc (tex_2d,
 | 
			
		||||
                                             tex_2d->egl_image_external.user_data,
 | 
			
		||||
                                             error))
 | 
			
		||||
    {
 | 
			
		||||
      GE (ctx, glBindTexture (GL_TEXTURE_EXTERNAL_OES, 0));
 | 
			
		||||
      GE (ctx, glDeleteTextures (1, &tex_2d->gl_texture));
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  GE (ctx, glBindTexture (GL_TEXTURE_EXTERNAL_OES, 0));
 | 
			
		||||
 | 
			
		||||
  tex_2d->internal_format = internal_format;
 | 
			
		||||
  tex_2d->gl_target = GL_TEXTURE_EXTERNAL_OES;
 | 
			
		||||
 | 
			
		||||
  return TRUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CoglTexture2D *
 | 
			
		||||
cogl_texture_2d_new_from_egl_image_external (CoglContext *ctx,
 | 
			
		||||
                                             int width,
 | 
			
		||||
                                             int height,
 | 
			
		||||
                                             CoglTexture2DEGLImageExternalAlloc alloc,
 | 
			
		||||
                                             gpointer user_data,
 | 
			
		||||
                                             GDestroyNotify destroy,
 | 
			
		||||
                                             CoglError **error)
 | 
			
		||||
{
 | 
			
		||||
  CoglTextureLoader *loader;
 | 
			
		||||
  CoglTexture2D *tex_2d;
 | 
			
		||||
  CoglPixelFormat internal_format = COGL_PIXEL_FORMAT_ANY;
 | 
			
		||||
 | 
			
		||||
  _COGL_RETURN_VAL_IF_FAIL (_cogl_context_get_winsys (ctx)->constraints &
 | 
			
		||||
                            COGL_RENDERER_CONSTRAINT_USES_EGL,
 | 
			
		||||
                            NULL);
 | 
			
		||||
 | 
			
		||||
  _COGL_RETURN_VAL_IF_FAIL (cogl_has_feature (ctx,
 | 
			
		||||
                                              COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL),
 | 
			
		||||
                            NULL);
 | 
			
		||||
 | 
			
		||||
  loader = _cogl_texture_create_loader ();
 | 
			
		||||
  loader->src_type = COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL;
 | 
			
		||||
  loader->src.egl_image_external.width = width;
 | 
			
		||||
  loader->src.egl_image_external.height = height;
 | 
			
		||||
  loader->src.egl_image_external.alloc = alloc;
 | 
			
		||||
  loader->src.egl_image_external.format = internal_format;
 | 
			
		||||
 | 
			
		||||
  tex_2d = _cogl_texture_2d_create_base (ctx, width, height,
 | 
			
		||||
                                         internal_format, loader);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  tex_2d->egl_image_external.user_data = user_data;
 | 
			
		||||
  tex_2d->egl_image_external.destroy = destroy;
 | 
			
		||||
 | 
			
		||||
  return tex_2d;
 | 
			
		||||
}
 | 
			
		||||
#endif /* defined (COGL_HAS_EGL_SUPPORT) */
 | 
			
		||||
 | 
			
		||||
CoglBool
 | 
			
		||||
_cogl_texture_2d_gl_allocate (CoglTexture *tex,
 | 
			
		||||
                              CoglError **error)
 | 
			
		||||
@@ -575,8 +462,6 @@ _cogl_texture_2d_gl_allocate (CoglTexture *tex,
 | 
			
		||||
#endif
 | 
			
		||||
    case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
 | 
			
		||||
      return allocate_from_gl_foreign (tex_2d, loader, error);
 | 
			
		||||
    case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL:
 | 
			
		||||
      return allocate_custom_egl_image_external (tex_2d, loader, error);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_reached (FALSE);
 | 
			
		||||
@@ -772,12 +657,11 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d,
 | 
			
		||||
 | 
			
		||||
  upload_format = cogl_bitmap_get_format (upload_bmp);
 | 
			
		||||
 | 
			
		||||
  ctx->driver_vtable->pixel_format_to_gl_with_target (ctx,
 | 
			
		||||
                                                      upload_format,
 | 
			
		||||
                                                      _cogl_texture_get_format (tex),
 | 
			
		||||
                                                      NULL, /* internal gl format */
 | 
			
		||||
                                                      &gl_format,
 | 
			
		||||
                                                      &gl_type);
 | 
			
		||||
  ctx->driver_vtable->pixel_format_to_gl (ctx,
 | 
			
		||||
                                          upload_format,
 | 
			
		||||
                                          NULL, /* internal format */
 | 
			
		||||
                                          &gl_format,
 | 
			
		||||
                                          &gl_type);
 | 
			
		||||
 | 
			
		||||
  /* If this touches the first pixel then we'll update our copy */
 | 
			
		||||
  if (dst_x == 0 && dst_y == 0 &&
 | 
			
		||||
 
 | 
			
		||||
@@ -96,12 +96,11 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglPixelFormat
 | 
			
		||||
_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
 | 
			
		||||
                                             CoglPixelFormat format,
 | 
			
		||||
                                             CoglPixelFormat target_format,
 | 
			
		||||
                                             GLenum *out_glintformat,
 | 
			
		||||
                                             GLenum *out_glformat,
 | 
			
		||||
                                             GLenum *out_gltype)
 | 
			
		||||
_cogl_driver_pixel_format_to_gl (CoglContext *context,
 | 
			
		||||
                                 CoglPixelFormat  format,
 | 
			
		||||
                                 GLenum *out_glintformat,
 | 
			
		||||
                                 GLenum *out_glformat,
 | 
			
		||||
                                 GLenum *out_gltype)
 | 
			
		||||
{
 | 
			
		||||
  CoglPixelFormat required_format;
 | 
			
		||||
  GLenum glintformat = 0;
 | 
			
		||||
@@ -175,16 +174,7 @@ _cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
 | 
			
		||||
    case COGL_PIXEL_FORMAT_BGRA_8888:
 | 
			
		||||
    case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
 | 
			
		||||
      glintformat = GL_RGBA;
 | 
			
		||||
      /* If the driver has texture_swizzle, pretend internal
 | 
			
		||||
       * and buffer format are the same here, the pixels
 | 
			
		||||
       * will be flipped through this extension.
 | 
			
		||||
       */
 | 
			
		||||
      if (target_format == format &&
 | 
			
		||||
          _cogl_has_private_feature
 | 
			
		||||
          (context, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
 | 
			
		||||
        glformat = GL_RGBA;
 | 
			
		||||
      else
 | 
			
		||||
        glformat = GL_BGRA;
 | 
			
		||||
      glformat = GL_BGRA;
 | 
			
		||||
      gltype = GL_UNSIGNED_BYTE;
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
@@ -299,20 +289,6 @@ _cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
 | 
			
		||||
  return required_format;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglPixelFormat
 | 
			
		||||
_cogl_driver_pixel_format_to_gl (CoglContext *context,
 | 
			
		||||
                                 CoglPixelFormat  format,
 | 
			
		||||
                                 GLenum *out_glintformat,
 | 
			
		||||
                                 GLenum *out_glformat,
 | 
			
		||||
                                 GLenum *out_gltype)
 | 
			
		||||
{
 | 
			
		||||
  return _cogl_driver_pixel_format_to_gl_with_target (context,
 | 
			
		||||
                                                      format, format,
 | 
			
		||||
                                                      out_glintformat,
 | 
			
		||||
                                                      out_glformat,
 | 
			
		||||
                                                      out_gltype);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
_cogl_get_gl_version (CoglContext *ctx,
 | 
			
		||||
                      int *major_out,
 | 
			
		||||
@@ -693,7 +669,6 @@ _cogl_driver_gl =
 | 
			
		||||
  {
 | 
			
		||||
    _cogl_driver_pixel_format_from_gl_internal,
 | 
			
		||||
    _cogl_driver_pixel_format_to_gl,
 | 
			
		||||
    _cogl_driver_pixel_format_to_gl_with_target,
 | 
			
		||||
    _cogl_driver_update_features,
 | 
			
		||||
    _cogl_offscreen_gl_allocate,
 | 
			
		||||
    _cogl_offscreen_gl_free,
 | 
			
		||||
 
 | 
			
		||||
@@ -114,18 +114,6 @@ _cogl_texture_driver_gen (CoglContext *ctx,
 | 
			
		||||
                                 red_swizzle) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* If swizzle extension is available, prefer it to flip bgra buffers to rgba */
 | 
			
		||||
  if ((internal_format == COGL_PIXEL_FORMAT_BGRA_8888 ||
 | 
			
		||||
       internal_format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) &&
 | 
			
		||||
      _cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
 | 
			
		||||
    {
 | 
			
		||||
      static const GLint bgra_swizzle[] = { GL_BLUE, GL_GREEN, GL_RED, GL_ALPHA };
 | 
			
		||||
 | 
			
		||||
      GE( ctx, glTexParameteriv (gl_target,
 | 
			
		||||
                                 GL_TEXTURE_SWIZZLE_RGBA,
 | 
			
		||||
                                 bgra_swizzle) );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return tex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -533,16 +521,14 @@ static CoglPixelFormat
 | 
			
		||||
_cogl_texture_driver_find_best_gl_get_data_format
 | 
			
		||||
                                            (CoglContext *context,
 | 
			
		||||
                                             CoglPixelFormat format,
 | 
			
		||||
                                             CoglPixelFormat target_format,
 | 
			
		||||
                                             GLenum *closest_gl_format,
 | 
			
		||||
                                             GLenum *closest_gl_type)
 | 
			
		||||
{
 | 
			
		||||
  return context->driver_vtable->pixel_format_to_gl_with_target (context,
 | 
			
		||||
                                                                 format,
 | 
			
		||||
                                                                 target_format,
 | 
			
		||||
                                                                 NULL, /* don't need */
 | 
			
		||||
                                                                 closest_gl_format,
 | 
			
		||||
                                                                 closest_gl_type);
 | 
			
		||||
  return context->driver_vtable->pixel_format_to_gl (context,
 | 
			
		||||
                                                     format,
 | 
			
		||||
                                                     NULL, /* don't need */
 | 
			
		||||
                                                     closest_gl_format,
 | 
			
		||||
                                                     closest_gl_type);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const CoglTextureDriver
 | 
			
		||||
 
 | 
			
		||||
@@ -67,12 +67,11 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglPixelFormat
 | 
			
		||||
_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
 | 
			
		||||
                                             CoglPixelFormat format,
 | 
			
		||||
                                             CoglPixelFormat target_format,
 | 
			
		||||
                                             GLenum *out_glintformat,
 | 
			
		||||
                                             GLenum *out_glformat,
 | 
			
		||||
                                             GLenum *out_gltype)
 | 
			
		||||
_cogl_driver_pixel_format_to_gl (CoglContext *context,
 | 
			
		||||
                                 CoglPixelFormat  format,
 | 
			
		||||
                                 GLenum *out_glintformat,
 | 
			
		||||
                                 GLenum *out_glformat,
 | 
			
		||||
                                 GLenum *out_gltype)
 | 
			
		||||
{
 | 
			
		||||
  CoglPixelFormat required_format;
 | 
			
		||||
  GLenum glintformat;
 | 
			
		||||
@@ -220,20 +219,6 @@ _cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
 | 
			
		||||
  return required_format;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglPixelFormat
 | 
			
		||||
_cogl_driver_pixel_format_to_gl (CoglContext *context,
 | 
			
		||||
                                 CoglPixelFormat  format,
 | 
			
		||||
                                 GLenum *out_glintformat,
 | 
			
		||||
                                 GLenum *out_glformat,
 | 
			
		||||
                                 GLenum *out_gltype)
 | 
			
		||||
{
 | 
			
		||||
  return _cogl_driver_pixel_format_to_gl_with_target (context,
 | 
			
		||||
                                                      format, format,
 | 
			
		||||
                                                      out_glintformat,
 | 
			
		||||
                                                      out_glformat,
 | 
			
		||||
                                                      out_gltype);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
_cogl_get_gl_version (CoglContext *ctx,
 | 
			
		||||
                      int *major_out,
 | 
			
		||||
@@ -472,7 +457,6 @@ _cogl_driver_gles =
 | 
			
		||||
  {
 | 
			
		||||
    _cogl_driver_pixel_format_from_gl_internal,
 | 
			
		||||
    _cogl_driver_pixel_format_to_gl,
 | 
			
		||||
    _cogl_driver_pixel_format_to_gl_with_target,
 | 
			
		||||
    _cogl_driver_update_features,
 | 
			
		||||
    _cogl_offscreen_gl_allocate,
 | 
			
		||||
    _cogl_offscreen_gl_free,
 | 
			
		||||
 
 | 
			
		||||
@@ -615,7 +615,6 @@ static CoglPixelFormat
 | 
			
		||||
_cogl_texture_driver_find_best_gl_get_data_format
 | 
			
		||||
                                            (CoglContext *context,
 | 
			
		||||
                                             CoglPixelFormat format,
 | 
			
		||||
                                             CoglPixelFormat target_format,
 | 
			
		||||
                                             GLenum *closest_gl_format,
 | 
			
		||||
                                             GLenum *closest_gl_type)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,6 @@ _cogl_driver_nop =
 | 
			
		||||
  {
 | 
			
		||||
    NULL, /* pixel_format_from_gl_internal */
 | 
			
		||||
    NULL, /* pixel_format_to_gl */
 | 
			
		||||
    NULL, /* pixel_format_to_gl_with_target */
 | 
			
		||||
    _cogl_driver_update_features,
 | 
			
		||||
    _cogl_offscreen_nop_allocate,
 | 
			
		||||
    _cogl_offscreen_nop_free,
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,12 @@ prefix=@prefix@
 | 
			
		||||
exec_prefix=@exec_prefix@
 | 
			
		||||
libdir=@libdir@/mutter
 | 
			
		||||
includedir=@includedir@/mutter
 | 
			
		||||
apiversion=@LIBMUTTER_API_VERSION@
 | 
			
		||||
apiversion=1.0
 | 
			
		||||
requires=@COGL_PKG_REQUIRES@
 | 
			
		||||
 | 
			
		||||
Name: Cogl
 | 
			
		||||
Description: An object oriented GL/GLES Abstraction/Utility Layer
 | 
			
		||||
Version: @MUTTER_VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-cogl-@LIBMUTTER_API_VERSION@
 | 
			
		||||
Version: @COGL_1_VERSION@
 | 
			
		||||
Libs: -L${libdir} -lmutter-cogl
 | 
			
		||||
Cflags: -I${includedir}/cogl
 | 
			
		||||
Requires: ${requires}
 | 
			
		||||
@@ -48,7 +48,6 @@
 | 
			
		||||
 | 
			
		||||
#include "cogl-texture-pixmap-x11-private.h"
 | 
			
		||||
#include "cogl-texture-2d-private.h"
 | 
			
		||||
#include "cogl-texture-2d.h"
 | 
			
		||||
#include "cogl-error-private.h"
 | 
			
		||||
#include "cogl-poll-private.h"
 | 
			
		||||
 | 
			
		||||
@@ -262,39 +261,6 @@ _cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
 | 
			
		||||
  g_slice_free (CoglRendererEGL, egl_renderer);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static EGLDisplay
 | 
			
		||||
_cogl_winsys_egl_get_display (void *native)
 | 
			
		||||
{
 | 
			
		||||
  EGLDisplay dpy = NULL;
 | 
			
		||||
  const char *client_exts = eglQueryString (NULL, EGL_EXTENSIONS);
 | 
			
		||||
 | 
			
		||||
  if (g_strstr_len (client_exts, -1, "EGL_KHR_platform_base"))
 | 
			
		||||
    {
 | 
			
		||||
      PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
 | 
			
		||||
	(void *) eglGetProcAddress ("eglGetPlatformDisplay");
 | 
			
		||||
 | 
			
		||||
      if (get_platform_display)
 | 
			
		||||
	dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL);
 | 
			
		||||
 | 
			
		||||
      if (dpy)
 | 
			
		||||
	return dpy;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (g_strstr_len (client_exts, -1, "EGL_EXT_platform_base"))
 | 
			
		||||
    {
 | 
			
		||||
      PFNEGLGETPLATFORMDISPLAYEXTPROC get_platform_display =
 | 
			
		||||
	(void *) eglGetProcAddress ("eglGetPlatformDisplayEXT");
 | 
			
		||||
 | 
			
		||||
      if (get_platform_display)
 | 
			
		||||
	dpy = get_platform_display (EGL_PLATFORM_X11_KHR, native, NULL);
 | 
			
		||||
 | 
			
		||||
      if (dpy)
 | 
			
		||||
	return dpy;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return eglGetDisplay ((EGLNativeDisplayType) native);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
_cogl_winsys_renderer_connect (CoglRenderer *renderer,
 | 
			
		||||
                               CoglError **error)
 | 
			
		||||
@@ -311,7 +277,8 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
 | 
			
		||||
  if (!_cogl_xlib_renderer_connect (renderer, error))
 | 
			
		||||
    goto error;
 | 
			
		||||
 | 
			
		||||
  egl_renderer->edpy = _cogl_winsys_egl_get_display (xlib_renderer->xdpy);
 | 
			
		||||
  egl_renderer->edpy =
 | 
			
		||||
    eglGetDisplay ((EGLNativeDisplayType) xlib_renderer->xdpy);
 | 
			
		||||
 | 
			
		||||
  if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
 | 
			
		||||
    goto error;
 | 
			
		||||
@@ -323,19 +290,6 @@ error:
 | 
			
		||||
  return FALSE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
_cogl_winsys_egl_add_config_attributes (CoglDisplay *display,
 | 
			
		||||
                                        CoglFramebufferConfig *config,
 | 
			
		||||
                                        EGLint *attributes)
 | 
			
		||||
{
 | 
			
		||||
  int i = 0;
 | 
			
		||||
 | 
			
		||||
  attributes[i++] = EGL_SURFACE_TYPE;
 | 
			
		||||
  attributes[i++] = EGL_WINDOW_BIT;
 | 
			
		||||
 | 
			
		||||
  return i;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static CoglBool
 | 
			
		||||
_cogl_winsys_egl_display_setup (CoglDisplay *display,
 | 
			
		||||
                                CoglError **error)
 | 
			
		||||
@@ -774,12 +728,12 @@ _cogl_winsys_texture_pixmap_x11_create (CoglTexturePixmapX11 *tex_pixmap)
 | 
			
		||||
                    COGL_PIXEL_FORMAT_RGB_888);
 | 
			
		||||
 | 
			
		||||
  egl_tex_pixmap->texture = COGL_TEXTURE (
 | 
			
		||||
    cogl_egl_texture_2d_new_from_image (ctx,
 | 
			
		||||
                                        tex->width,
 | 
			
		||||
                                        tex->height,
 | 
			
		||||
                                        texture_format,
 | 
			
		||||
                                        egl_tex_pixmap->image,
 | 
			
		||||
                                        NULL));
 | 
			
		||||
    _cogl_egl_texture_2d_new_from_image (ctx,
 | 
			
		||||
                                         tex->width,
 | 
			
		||||
                                         tex->height,
 | 
			
		||||
                                         texture_format,
 | 
			
		||||
                                         egl_tex_pixmap->image,
 | 
			
		||||
                                         NULL));
 | 
			
		||||
 | 
			
		||||
  tex_pixmap->winsys = egl_tex_pixmap;
 | 
			
		||||
 | 
			
		||||
@@ -840,7 +794,6 @@ _cogl_winsys_texture_pixmap_x11_get_texture (CoglTexturePixmapX11 *tex_pixmap,
 | 
			
		||||
static const CoglWinsysEGLVtable
 | 
			
		||||
_cogl_winsys_egl_vtable =
 | 
			
		||||
  {
 | 
			
		||||
    .add_config_attributes = _cogl_winsys_egl_add_config_attributes,
 | 
			
		||||
    .display_setup = _cogl_winsys_egl_display_setup,
 | 
			
		||||
    .display_destroy = _cogl_winsys_egl_display_destroy,
 | 
			
		||||
    .context_created = _cogl_winsys_egl_context_created,
 | 
			
		||||
 
 | 
			
		||||
@@ -233,11 +233,11 @@ egl_attributes_from_framebuffer_config (CoglDisplay *display,
 | 
			
		||||
  CoglRendererEGL *egl_renderer = renderer->winsys;
 | 
			
		||||
  int i = 0;
 | 
			
		||||
 | 
			
		||||
  /* Let the platform add attributes first, including setting the
 | 
			
		||||
   * EGL_SURFACE_TYPE */
 | 
			
		||||
  i = egl_renderer->platform_vtable->add_config_attributes (display,
 | 
			
		||||
                                                            config,
 | 
			
		||||
                                                            attributes);
 | 
			
		||||
  /* Let the platform add attributes first */
 | 
			
		||||
  if (egl_renderer->platform_vtable->add_config_attributes)
 | 
			
		||||
    i = egl_renderer->platform_vtable->add_config_attributes (display,
 | 
			
		||||
                                                              config,
 | 
			
		||||
                                                              attributes);
 | 
			
		||||
 | 
			
		||||
  if (config->need_stencil)
 | 
			
		||||
    {
 | 
			
		||||
@@ -269,6 +269,9 @@ egl_attributes_from_framebuffer_config (CoglDisplay *display,
 | 
			
		||||
                     EGL_OPENGL_ES_BIT :
 | 
			
		||||
                     EGL_OPENGL_ES2_BIT);
 | 
			
		||||
 | 
			
		||||
  attributes[i++] = EGL_SURFACE_TYPE;
 | 
			
		||||
  attributes[i++] = EGL_WINDOW_BIT;
 | 
			
		||||
 | 
			
		||||
  if (config->samples_per_pixel)
 | 
			
		||||
    {
 | 
			
		||||
       attributes[i++] = EGL_SAMPLE_BUFFERS;
 | 
			
		||||
@@ -1025,13 +1028,6 @@ _cogl_egl_create_image (CoglContext *ctx,
 | 
			
		||||
  if (target == EGL_NATIVE_PIXMAP_KHR)
 | 
			
		||||
    egl_ctx = EGL_NO_CONTEXT;
 | 
			
		||||
  else
 | 
			
		||||
#endif
 | 
			
		||||
#ifdef COGL_HAS_WAYLAND_EGL_SERVER_SUPPORT
 | 
			
		||||
  /* The WL_bind_wayland_display spec states that EGL_NO_CONTEXT is to be used
 | 
			
		||||
   * in conjunction with the EGL_WAYLAND_BUFFER_WL target */
 | 
			
		||||
  if (target == EGL_WAYLAND_BUFFER_WL)
 | 
			
		||||
    egl_ctx = EGL_NO_CONTEXT;
 | 
			
		||||
  else
 | 
			
		||||
#endif
 | 
			
		||||
    egl_ctx = egl_display->egl_context;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -65,16 +65,12 @@
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/time.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <fcntl.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#include <GL/glx.h>
 | 
			
		||||
#include <X11/Xlib.h>
 | 
			
		||||
 | 
			
		||||
#include <glib.h>
 | 
			
		||||
 | 
			
		||||
/* This is a relatively new extension */
 | 
			
		||||
#ifndef GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV
 | 
			
		||||
#define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7
 | 
			
		||||
@@ -104,14 +100,6 @@ typedef struct _CoglOnscreenGLX
 | 
			
		||||
  CoglBool pending_sync_notify;
 | 
			
		||||
  CoglBool pending_complete_notify;
 | 
			
		||||
  CoglBool pending_resize_notify;
 | 
			
		||||
 | 
			
		||||
  GThread *swap_wait_thread;
 | 
			
		||||
  GQueue *swap_wait_queue;
 | 
			
		||||
  GCond swap_wait_cond;
 | 
			
		||||
  GMutex swap_wait_mutex;
 | 
			
		||||
  int swap_wait_pipe[2];
 | 
			
		||||
  GLXContext swap_wait_context;
 | 
			
		||||
  CoglBool closing_down;
 | 
			
		||||
} CoglOnscreenGLX;
 | 
			
		||||
 | 
			
		||||
typedef struct _CoglPixmapTextureEyeGLX
 | 
			
		||||
@@ -204,15 +192,6 @@ find_onscreen_for_xid (CoglContext *context, uint32_t xid)
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int64_t
 | 
			
		||||
get_monotonic_time_ns (void)
 | 
			
		||||
{
 | 
			
		||||
  struct timespec ts;
 | 
			
		||||
 | 
			
		||||
  clock_gettime (CLOCK_MONOTONIC, &ts);
 | 
			
		||||
  return ts.tv_sec * G_GINT64_CONSTANT (1000000000) + ts.tv_nsec;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
ensure_ust_type (CoglRenderer *renderer,
 | 
			
		||||
                 GLXDrawable drawable)
 | 
			
		||||
@@ -223,6 +202,7 @@ ensure_ust_type (CoglRenderer *renderer,
 | 
			
		||||
  int64_t msc;
 | 
			
		||||
  int64_t sbc;
 | 
			
		||||
  struct timeval tv;
 | 
			
		||||
  struct timespec ts;
 | 
			
		||||
  int64_t current_system_time;
 | 
			
		||||
  int64_t current_monotonic_time;
 | 
			
		||||
 | 
			
		||||
@@ -252,7 +232,9 @@ ensure_ust_type (CoglRenderer *renderer,
 | 
			
		||||
 | 
			
		||||
  /* This is the time source that the newer (fixed) linux drm
 | 
			
		||||
   * drivers use (Linux >= 3.8) */
 | 
			
		||||
  current_monotonic_time = get_monotonic_time_ns () / 1000;
 | 
			
		||||
  clock_gettime (CLOCK_MONOTONIC, &ts);
 | 
			
		||||
  current_monotonic_time = (ts.tv_sec * G_GINT64_CONSTANT (1000000)) +
 | 
			
		||||
    (ts.tv_nsec / G_GINT64_CONSTANT (1000));
 | 
			
		||||
 | 
			
		||||
  if (current_monotonic_time > ust - 1000000 &&
 | 
			
		||||
      current_monotonic_time < ust + 1000000)
 | 
			
		||||
@@ -308,9 +290,6 @@ _cogl_winsys_get_clock_time (CoglContext *context)
 | 
			
		||||
{
 | 
			
		||||
  CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
 | 
			
		||||
 | 
			
		||||
  if (!glx_renderer->glXWaitForMsc)
 | 
			
		||||
    return get_monotonic_time_ns ();
 | 
			
		||||
 | 
			
		||||
  /* We don't call ensure_ust_type() because we don't have a drawable
 | 
			
		||||
   * to work with. cogl_get_clock_time() is documented to only work
 | 
			
		||||
   * once a valid, non-zero, timestamp has been retrieved from Cogl.
 | 
			
		||||
@@ -331,7 +310,10 @@ _cogl_winsys_get_clock_time (CoglContext *context)
 | 
			
		||||
      }
 | 
			
		||||
    case COGL_GLX_UST_IS_MONOTONIC_TIME:
 | 
			
		||||
      {
 | 
			
		||||
        return get_monotonic_time_ns ();
 | 
			
		||||
        struct timespec ts;
 | 
			
		||||
 | 
			
		||||
        clock_gettime (CLOCK_MONOTONIC, &ts);
 | 
			
		||||
        return ts.tv_sec * G_GINT64_CONSTANT (1000000000) + ts.tv_nsec;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -730,25 +712,23 @@ update_base_winsys_features (CoglRenderer *renderer)
 | 
			
		||||
 | 
			
		||||
  g_strfreev (split_extensions);
 | 
			
		||||
 | 
			
		||||
  /* The GLX_SGI_video_sync spec explicitly states this extension
 | 
			
		||||
   * only works for direct contexts; we don't know per-renderer
 | 
			
		||||
   * if the context is direct or not, so we turn off the feature
 | 
			
		||||
   * flag; we still use the extension within this file looking
 | 
			
		||||
   * instead at glx_display->have_vblank_counter.
 | 
			
		||||
   */
 | 
			
		||||
  COGL_FLAGS_SET (glx_renderer->base_winsys_features,
 | 
			
		||||
                  COGL_WINSYS_FEATURE_VBLANK_COUNTER,
 | 
			
		||||
                  FALSE);
 | 
			
		||||
 | 
			
		||||
  /* Note: the GLX_SGI_video_sync spec explicitly states this extension
 | 
			
		||||
   * only works for direct contexts. */
 | 
			
		||||
  if (!glx_renderer->is_direct)
 | 
			
		||||
    {
 | 
			
		||||
      glx_renderer->glXGetVideoSync = NULL;
 | 
			
		||||
      glx_renderer->glXWaitVideoSync = NULL;
 | 
			
		||||
      COGL_FLAGS_SET (glx_renderer->base_winsys_features,
 | 
			
		||||
                      COGL_WINSYS_FEATURE_VBLANK_COUNTER,
 | 
			
		||||
                      FALSE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  COGL_FLAGS_SET (glx_renderer->base_winsys_features,
 | 
			
		||||
                  COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN,
 | 
			
		||||
                  TRUE);
 | 
			
		||||
 | 
			
		||||
  /* Because of the direct-context dependency, the VBLANK_WAIT feature
 | 
			
		||||
   * doesn't reflect the presence of GLX_SGI_video_sync.
 | 
			
		||||
   */
 | 
			
		||||
  if (glx_renderer->glXWaitForMsc)
 | 
			
		||||
  if (glx_renderer->glXWaitVideoSync ||
 | 
			
		||||
      glx_renderer->glXWaitForMsc)
 | 
			
		||||
    COGL_FLAGS_SET (glx_renderer->base_winsys_features,
 | 
			
		||||
                    COGL_WINSYS_FEATURE_VBLANK_WAIT,
 | 
			
		||||
                    TRUE);
 | 
			
		||||
@@ -881,7 +861,7 @@ update_winsys_features (CoglContext *context, CoglError **error)
 | 
			
		||||
   * by the SwapInterval so we have to throttle swap_region requests
 | 
			
		||||
   * manually... */
 | 
			
		||||
  if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SWAP_REGION) &&
 | 
			
		||||
      (glx_display->have_vblank_counter || glx_display->can_vblank_wait))
 | 
			
		||||
      _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT))
 | 
			
		||||
    COGL_FLAGS_SET (context->winsys_features,
 | 
			
		||||
                    COGL_WINSYS_FEATURE_SWAP_REGION_THROTTLE, TRUE);
 | 
			
		||||
 | 
			
		||||
@@ -897,29 +877,6 @@ update_winsys_features (CoglContext *context, CoglError **error)
 | 
			
		||||
                      COGL_FEATURE_ID_PRESENTATION_TIME,
 | 
			
		||||
                      TRUE);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      CoglGpuInfo *info = &context->gpu;
 | 
			
		||||
      if (glx_display->have_vblank_counter &&
 | 
			
		||||
	  context->display->renderer->xlib_enable_threaded_swap_wait &&
 | 
			
		||||
	  info->vendor == COGL_GPU_INFO_VENDOR_NVIDIA)
 | 
			
		||||
        {
 | 
			
		||||
          COGL_FLAGS_SET (context->winsys_features,
 | 
			
		||||
                          COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT, TRUE);
 | 
			
		||||
          COGL_FLAGS_SET (context->winsys_features,
 | 
			
		||||
                          COGL_WINSYS_FEATURE_SWAP_BUFFERS_EVENT, TRUE);
 | 
			
		||||
          /* TODO: remove this deprecated feature */
 | 
			
		||||
          COGL_FLAGS_SET (context->features,
 | 
			
		||||
                          COGL_FEATURE_ID_SWAP_BUFFERS_EVENT,
 | 
			
		||||
                          TRUE);
 | 
			
		||||
          COGL_FLAGS_SET (context->features,
 | 
			
		||||
                          COGL_FEATURE_ID_PRESENTATION_TIME,
 | 
			
		||||
                          TRUE);
 | 
			
		||||
          COGL_FLAGS_SET (context->private_features,
 | 
			
		||||
                          COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT,
 | 
			
		||||
                          TRUE);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  /* We'll manually handle queueing dirty events in response to
 | 
			
		||||
   * Expose events from X */
 | 
			
		||||
@@ -1182,13 +1139,11 @@ create_context (CoglDisplay *display, CoglError **error)
 | 
			
		||||
      return FALSE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  glx_display->is_direct =
 | 
			
		||||
  glx_renderer->is_direct =
 | 
			
		||||
    glx_renderer->glXIsDirect (xlib_renderer->xdpy, glx_display->glx_context);
 | 
			
		||||
  glx_display->have_vblank_counter = glx_display->is_direct && glx_renderer->glXWaitVideoSync;
 | 
			
		||||
  glx_display->can_vblank_wait = glx_renderer->glXWaitForMsc || glx_display->have_vblank_counter;
 | 
			
		||||
 | 
			
		||||
  COGL_NOTE (WINSYS, "Setting %s context",
 | 
			
		||||
             glx_display->is_direct ? "direct" : "indirect");
 | 
			
		||||
             glx_renderer->is_direct ? "direct" : "indirect");
 | 
			
		||||
 | 
			
		||||
  /* XXX: GLX doesn't let us make a context current without a window
 | 
			
		||||
   * so we create a dummy window that we can use while no CoglOnscreen
 | 
			
		||||
@@ -1516,8 +1471,7 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#ifdef GLX_INTEL_swap_event
 | 
			
		||||
  if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT) &&
 | 
			
		||||
      !_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT))
 | 
			
		||||
  if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT))
 | 
			
		||||
    {
 | 
			
		||||
      GLXDrawable drawable =
 | 
			
		||||
        glx_onscreen->glxwin ? glx_onscreen->glxwin : xlib_onscreen->xwin;
 | 
			
		||||
@@ -1560,31 +1514,6 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen)
 | 
			
		||||
      xlib_onscreen->output = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (glx_onscreen->swap_wait_thread)
 | 
			
		||||
    {
 | 
			
		||||
      g_mutex_lock (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
      glx_onscreen->closing_down = TRUE;
 | 
			
		||||
      g_cond_signal (&glx_onscreen->swap_wait_cond);
 | 
			
		||||
      g_mutex_unlock (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
      g_thread_join (glx_onscreen->swap_wait_thread);
 | 
			
		||||
      glx_onscreen->swap_wait_thread = NULL;
 | 
			
		||||
 | 
			
		||||
      g_cond_clear (&glx_onscreen->swap_wait_cond);
 | 
			
		||||
      g_mutex_clear (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
 | 
			
		||||
      g_queue_free (glx_onscreen->swap_wait_queue);
 | 
			
		||||
      glx_onscreen->swap_wait_queue = NULL;
 | 
			
		||||
 | 
			
		||||
      _cogl_poll_renderer_remove_fd (context->display->renderer,
 | 
			
		||||
                                     glx_onscreen->swap_wait_pipe[0]);
 | 
			
		||||
      
 | 
			
		||||
      close (glx_onscreen->swap_wait_pipe[0]);
 | 
			
		||||
      close (glx_onscreen->swap_wait_pipe[1]);
 | 
			
		||||
 | 
			
		||||
      glx_renderer->glXDestroyContext (xlib_renderer->xdpy,
 | 
			
		||||
                                       glx_onscreen->swap_wait_context);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  _cogl_xlib_renderer_trap_errors (context->display->renderer, &old_state);
 | 
			
		||||
 | 
			
		||||
  drawable =
 | 
			
		||||
@@ -1726,13 +1655,12 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen)
 | 
			
		||||
  CoglContext *ctx = framebuffer->context;
 | 
			
		||||
  CoglGLXRenderer *glx_renderer;
 | 
			
		||||
  CoglXlibRenderer *xlib_renderer;
 | 
			
		||||
  CoglGLXDisplay *glx_display;
 | 
			
		||||
 | 
			
		||||
  glx_renderer = ctx->display->renderer->winsys;
 | 
			
		||||
  xlib_renderer = _cogl_xlib_renderer_get_data (ctx->display->renderer);
 | 
			
		||||
  glx_display = ctx->display->winsys;
 | 
			
		||||
 | 
			
		||||
  if (glx_display->can_vblank_wait)
 | 
			
		||||
  if (glx_renderer->glXWaitForMsc ||
 | 
			
		||||
      glx_renderer->glXGetVideoSync)
 | 
			
		||||
    {
 | 
			
		||||
      CoglFrameInfo *info = g_queue_peek_tail (&onscreen->pending_frame_infos);
 | 
			
		||||
 | 
			
		||||
@@ -1754,13 +1682,16 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen)
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          uint32_t current_count;
 | 
			
		||||
          struct timespec ts;
 | 
			
		||||
 | 
			
		||||
          glx_renderer->glXGetVideoSync (¤t_count);
 | 
			
		||||
          glx_renderer->glXWaitVideoSync (2,
 | 
			
		||||
                                          (current_count + 1) % 2,
 | 
			
		||||
                                          ¤t_count);
 | 
			
		||||
 | 
			
		||||
          info->presentation_time = get_monotonic_time_ns ();
 | 
			
		||||
          clock_gettime (CLOCK_MONOTONIC, &ts);
 | 
			
		||||
          info->presentation_time =
 | 
			
		||||
            ts.tv_sec * G_GINT64_CONSTANT (1000000000) + ts.tv_nsec;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1818,199 +1749,6 @@ set_frame_info_output (CoglOnscreen *onscreen,
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gpointer
 | 
			
		||||
threaded_swap_wait (gpointer data)
 | 
			
		||||
{
 | 
			
		||||
  CoglOnscreen *onscreen = data;
 | 
			
		||||
 | 
			
		||||
  CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
 | 
			
		||||
 | 
			
		||||
  CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
 | 
			
		||||
  CoglContext *context = framebuffer->context;
 | 
			
		||||
  CoglDisplay *display = context->display;
 | 
			
		||||
  CoglXlibRenderer *xlib_renderer = _cogl_xlib_renderer_get_data (display->renderer);
 | 
			
		||||
  CoglGLXDisplay *glx_display = display->winsys;
 | 
			
		||||
  CoglGLXRenderer *glx_renderer = display->renderer->winsys;
 | 
			
		||||
  GLXDrawable dummy_drawable;
 | 
			
		||||
 | 
			
		||||
  if (glx_display->dummy_glxwin)
 | 
			
		||||
    dummy_drawable = glx_display->dummy_glxwin;
 | 
			
		||||
  else
 | 
			
		||||
    dummy_drawable = glx_display->dummy_xwin;
 | 
			
		||||
 | 
			
		||||
  glx_renderer->glXMakeContextCurrent (xlib_renderer->xdpy,
 | 
			
		||||
                                       dummy_drawable,
 | 
			
		||||
                                       dummy_drawable,
 | 
			
		||||
                                       glx_onscreen->swap_wait_context);
 | 
			
		||||
 | 
			
		||||
  g_mutex_lock (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
 | 
			
		||||
  while (TRUE)
 | 
			
		||||
    {
 | 
			
		||||
      gpointer queue_element;
 | 
			
		||||
      uint32_t vblank_counter;
 | 
			
		||||
 | 
			
		||||
      while (!glx_onscreen->closing_down && glx_onscreen->swap_wait_queue->length == 0)
 | 
			
		||||
         g_cond_wait (&glx_onscreen->swap_wait_cond, &glx_onscreen->swap_wait_mutex);
 | 
			
		||||
 | 
			
		||||
      if (glx_onscreen->closing_down)
 | 
			
		||||
         break;
 | 
			
		||||
 | 
			
		||||
      queue_element = g_queue_pop_tail (glx_onscreen->swap_wait_queue);
 | 
			
		||||
      vblank_counter = GPOINTER_TO_UINT(queue_element);
 | 
			
		||||
 | 
			
		||||
      g_mutex_unlock (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
      glx_renderer->glXWaitVideoSync (2,
 | 
			
		||||
                                      (vblank_counter + 1) % 2,
 | 
			
		||||
                                      &vblank_counter);
 | 
			
		||||
      g_mutex_lock (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
 | 
			
		||||
      if (!glx_onscreen->closing_down)
 | 
			
		||||
         {
 | 
			
		||||
           int bytes_written = 0;
 | 
			
		||||
 | 
			
		||||
           union {
 | 
			
		||||
             char bytes[8];
 | 
			
		||||
             int64_t presentation_time;
 | 
			
		||||
           } u;
 | 
			
		||||
 | 
			
		||||
           u.presentation_time = get_monotonic_time_ns ();
 | 
			
		||||
 | 
			
		||||
           while (bytes_written < 8)
 | 
			
		||||
             {
 | 
			
		||||
               int res = write (glx_onscreen->swap_wait_pipe[1], u.bytes + bytes_written, 8 - bytes_written);
 | 
			
		||||
               if (res == -1)
 | 
			
		||||
                 {
 | 
			
		||||
                   if (errno != EINTR)
 | 
			
		||||
                     g_error ("Error writing to swap notification pipe: %s\n",
 | 
			
		||||
                              g_strerror (errno));
 | 
			
		||||
                 }
 | 
			
		||||
               else
 | 
			
		||||
                 {
 | 
			
		||||
                   bytes_written += res;
 | 
			
		||||
                 }
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_mutex_unlock (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
 | 
			
		||||
  glx_renderer->glXMakeContextCurrent (xlib_renderer->xdpy,
 | 
			
		||||
                                       None,
 | 
			
		||||
                                       None,
 | 
			
		||||
                                       NULL);
 | 
			
		||||
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int64_t
 | 
			
		||||
threaded_swap_wait_pipe_prepare (void *user_data)
 | 
			
		||||
{
 | 
			
		||||
  return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
threaded_swap_wait_pipe_dispatch (void *user_data, int revents)
 | 
			
		||||
{
 | 
			
		||||
  CoglOnscreen *onscreen = user_data;
 | 
			
		||||
  CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
 | 
			
		||||
 | 
			
		||||
  CoglFrameInfo *info;
 | 
			
		||||
 | 
			
		||||
  if ((revents & COGL_POLL_FD_EVENT_IN))
 | 
			
		||||
    {
 | 
			
		||||
      int bytes_read = 0;
 | 
			
		||||
 | 
			
		||||
      union {
 | 
			
		||||
         char bytes[8];
 | 
			
		||||
         int64_t presentation_time;
 | 
			
		||||
      } u;
 | 
			
		||||
 | 
			
		||||
      while (bytes_read < 8)
 | 
			
		||||
         {
 | 
			
		||||
           int res = read (glx_onscreen->swap_wait_pipe[0], u.bytes + bytes_read, 8 - bytes_read);
 | 
			
		||||
           if (res == -1)
 | 
			
		||||
             {
 | 
			
		||||
               if (errno != EINTR)
 | 
			
		||||
                 g_error ("Error reading from swap notification pipe: %s\n",
 | 
			
		||||
                          g_strerror (errno));
 | 
			
		||||
             }
 | 
			
		||||
           else
 | 
			
		||||
             {
 | 
			
		||||
               bytes_read += res;
 | 
			
		||||
             }
 | 
			
		||||
         }
 | 
			
		||||
 | 
			
		||||
      set_sync_pending (onscreen);
 | 
			
		||||
      set_complete_pending (onscreen);
 | 
			
		||||
 | 
			
		||||
      info = g_queue_peek_head (&onscreen->pending_frame_infos);
 | 
			
		||||
      info->presentation_time = u.presentation_time;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
start_threaded_swap_wait (CoglOnscreen *onscreen,
 | 
			
		||||
                           uint32_t      vblank_counter)
 | 
			
		||||
{
 | 
			
		||||
  CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
 | 
			
		||||
  CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
 | 
			
		||||
  CoglContext *context = framebuffer->context;
 | 
			
		||||
 | 
			
		||||
  if (glx_onscreen->swap_wait_thread == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      CoglDisplay *display = context->display;
 | 
			
		||||
      CoglGLXRenderer *glx_renderer = display->renderer->winsys;
 | 
			
		||||
      CoglGLXDisplay *glx_display = display->winsys;
 | 
			
		||||
      CoglOnscreenXlib *xlib_onscreen = onscreen->winsys;
 | 
			
		||||
      CoglXlibRenderer *xlib_renderer =
 | 
			
		||||
        _cogl_xlib_renderer_get_data (display->renderer);
 | 
			
		||||
 | 
			
		||||
      GLXDrawable drawable =
 | 
			
		||||
        glx_onscreen->glxwin ? glx_onscreen->glxwin : xlib_onscreen->xwin;
 | 
			
		||||
      int i;
 | 
			
		||||
 | 
			
		||||
      ensure_ust_type (display->renderer, drawable);
 | 
			
		||||
      
 | 
			
		||||
      if ((pipe (glx_onscreen->swap_wait_pipe) == -1))
 | 
			
		||||
        g_error ("Couldn't create pipe for swap notification: %s\n",
 | 
			
		||||
                 g_strerror (errno));
 | 
			
		||||
 | 
			
		||||
      for (i = 0; i < 2; i++)
 | 
			
		||||
	{
 | 
			
		||||
	  if (fcntl(glx_onscreen->swap_wait_pipe[i], F_SETFD,
 | 
			
		||||
		    fcntl(glx_onscreen->swap_wait_pipe[i], F_GETFD, 0) | FD_CLOEXEC) == -1)
 | 
			
		||||
	    g_error ("Couldn't set swap notification pipe CLOEXEC: %s\n",
 | 
			
		||||
		     g_strerror (errno));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
      _cogl_poll_renderer_add_fd (display->renderer,
 | 
			
		||||
                                  glx_onscreen->swap_wait_pipe[0],
 | 
			
		||||
                                  COGL_POLL_FD_EVENT_IN,
 | 
			
		||||
                                  threaded_swap_wait_pipe_prepare,
 | 
			
		||||
                                  threaded_swap_wait_pipe_dispatch,
 | 
			
		||||
                                  onscreen);
 | 
			
		||||
 | 
			
		||||
      glx_onscreen->swap_wait_queue = g_queue_new ();
 | 
			
		||||
      g_mutex_init (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
      g_cond_init (&glx_onscreen->swap_wait_cond);
 | 
			
		||||
      glx_onscreen->swap_wait_context =
 | 
			
		||||
         glx_renderer->glXCreateNewContext (xlib_renderer->xdpy,
 | 
			
		||||
                                            glx_display->fbconfig,
 | 
			
		||||
                                            GLX_RGBA_TYPE,
 | 
			
		||||
                                            glx_display->glx_context,
 | 
			
		||||
                                            True);
 | 
			
		||||
      glx_onscreen->swap_wait_thread = g_thread_new ("cogl_glx_swap_wait",
 | 
			
		||||
                                                     threaded_swap_wait,
 | 
			
		||||
                                                     onscreen);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_mutex_lock (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
  g_queue_push_head (glx_onscreen->swap_wait_queue, GUINT_TO_POINTER(vblank_counter));
 | 
			
		||||
  g_cond_signal (&glx_onscreen->swap_wait_cond);
 | 
			
		||||
  g_mutex_unlock (&glx_onscreen->swap_wait_mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
_cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
 | 
			
		||||
                                   const int *user_rectangles,
 | 
			
		||||
@@ -2021,7 +1759,6 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
 | 
			
		||||
  CoglXlibRenderer *xlib_renderer =
 | 
			
		||||
    _cogl_xlib_renderer_get_data (context->display->renderer);
 | 
			
		||||
  CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
 | 
			
		||||
  CoglGLXDisplay *glx_display = context->display->winsys;
 | 
			
		||||
  CoglOnscreenXlib *xlib_onscreen = onscreen->winsys;
 | 
			
		||||
  CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
 | 
			
		||||
  GLXDrawable drawable =
 | 
			
		||||
@@ -2078,8 +1815,9 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
 | 
			
		||||
 | 
			
		||||
  if (framebuffer->config.swap_throttled)
 | 
			
		||||
    {
 | 
			
		||||
      have_counter = glx_display->have_vblank_counter;
 | 
			
		||||
      can_wait = glx_display->can_vblank_wait;
 | 
			
		||||
      have_counter =
 | 
			
		||||
        _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_COUNTER);
 | 
			
		||||
      can_wait = _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT);
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
@@ -2236,7 +1974,6 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
 | 
			
		||||
  CoglXlibRenderer *xlib_renderer =
 | 
			
		||||
    _cogl_xlib_renderer_get_data (context->display->renderer);
 | 
			
		||||
  CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
 | 
			
		||||
  CoglGLXDisplay *glx_display = context->display->winsys;
 | 
			
		||||
  CoglOnscreenXlib *xlib_onscreen = onscreen->winsys;
 | 
			
		||||
  CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
 | 
			
		||||
  CoglBool have_counter;
 | 
			
		||||
@@ -2254,38 +1991,21 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
 | 
			
		||||
 | 
			
		||||
  if (framebuffer->config.swap_throttled)
 | 
			
		||||
    {
 | 
			
		||||
      have_counter = glx_display->have_vblank_counter;
 | 
			
		||||
      uint32_t end_frame_vsync_counter = 0;
 | 
			
		||||
 | 
			
		||||
      if (glx_renderer->glXSwapInterval)
 | 
			
		||||
      have_counter =
 | 
			
		||||
        _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_COUNTER);
 | 
			
		||||
 | 
			
		||||
      /* If the swap_region API is also being used then we need to track
 | 
			
		||||
       * the vsync counter for each swap request so we can manually
 | 
			
		||||
       * throttle swap_region requests. */
 | 
			
		||||
      if (have_counter)
 | 
			
		||||
        end_frame_vsync_counter = _cogl_winsys_get_vsync_counter (context);
 | 
			
		||||
 | 
			
		||||
      if (!glx_renderer->glXSwapInterval)
 | 
			
		||||
        {
 | 
			
		||||
          if (_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT))
 | 
			
		||||
            {
 | 
			
		||||
	      /* If we didn't wait for the GPU here, then it's easy to get the case
 | 
			
		||||
	       * where there is a VBlank between the point where we get the vsync counter
 | 
			
		||||
	       * and the point where the GPU is ready to actually perform the glXSwapBuffers(),
 | 
			
		||||
	       * and the swap wait terminates at the first VBlank rather than the one
 | 
			
		||||
	       * where the swap buffers happens. Calling glFinish() here makes this a
 | 
			
		||||
	       * rare race since the GPU is already ready to swap when we call glXSwapBuffers().
 | 
			
		||||
	       * The glFinish() also prevents any serious damage if the rare race happens,
 | 
			
		||||
	       * since it will wait for the preceding glXSwapBuffers() and prevent us from
 | 
			
		||||
	       * getting premanently ahead. (For NVIDIA drivers, glFinish() after glXSwapBuffers()
 | 
			
		||||
	       * waits for the buffer swap to happen.)
 | 
			
		||||
	       */
 | 
			
		||||
              _cogl_winsys_wait_for_gpu (onscreen);
 | 
			
		||||
              start_threaded_swap_wait (onscreen, _cogl_winsys_get_vsync_counter (context));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
      else
 | 
			
		||||
        {
 | 
			
		||||
          CoglBool can_wait = have_counter || glx_display->can_vblank_wait;
 | 
			
		||||
 | 
			
		||||
          uint32_t end_frame_vsync_counter = 0;
 | 
			
		||||
 | 
			
		||||
          /* If the swap_region API is also being used then we need to track
 | 
			
		||||
           * the vsync counter for each swap request so we can manually
 | 
			
		||||
           * throttle swap_region requests. */
 | 
			
		||||
          if (have_counter)
 | 
			
		||||
            end_frame_vsync_counter = _cogl_winsys_get_vsync_counter (context);
 | 
			
		||||
          CoglBool can_wait =
 | 
			
		||||
            _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT);
 | 
			
		||||
 | 
			
		||||
          /* If we are going to wait for VBLANK manually, we not only
 | 
			
		||||
           * need to flush out pending drawing to the GPU before we
 | 
			
		||||
 
 | 
			
		||||
@@ -83,16 +83,6 @@ AC_CONFIG_HEADERS(cogl-config.h)
 | 
			
		||||
AC_CONFIG_HEADERS(cogl-mutter-config.h)
 | 
			
		||||
AC_GNU_SOURCE
 | 
			
		||||
 | 
			
		||||
dnl ================================================================
 | 
			
		||||
dnl Check that we are configured by mutter
 | 
			
		||||
dnl ================================================================
 | 
			
		||||
 | 
			
		||||
AC_ARG_VAR([MUTTER_VERSION])
 | 
			
		||||
AC_ARG_VAR([LIBMUTTER_API_VERSION])
 | 
			
		||||
 | 
			
		||||
AS_IF([test "x$MUTTER_VERSION" = "x"],
 | 
			
		||||
      [AC_MSG_ERROR([Clutter can only be configured by mutter])],)
 | 
			
		||||
 | 
			
		||||
dnl ================================================================
 | 
			
		||||
dnl Required versions for dependencies
 | 
			
		||||
dnl ================================================================
 | 
			
		||||
@@ -955,16 +945,16 @@ AC_OUTPUT(
 | 
			
		||||
Makefile
 | 
			
		||||
test-fixtures/Makefile
 | 
			
		||||
cogl/Makefile
 | 
			
		||||
cogl/mutter-cogl-$LIBMUTTER_API_VERSION.pc:cogl/mutter-cogl.pc.in
 | 
			
		||||
cogl/mutter-cogl-1.0.pc
 | 
			
		||||
cogl/cogl-defines.h
 | 
			
		||||
cogl/cogl-gl-header.h
 | 
			
		||||
cogl/cogl-egl-defines.h
 | 
			
		||||
cogl-pango/Makefile
 | 
			
		||||
cogl-pango/mutter-cogl-pango-$LIBMUTTER_API_VERSION.pc:cogl-pango/mutter-cogl-pango.pc.in
 | 
			
		||||
cogl-pango/mutter-cogl-pango-1.0.pc
 | 
			
		||||
cogl-path/Makefile
 | 
			
		||||
cogl-path/mutter-cogl-path-$LIBMUTTER_API_VERSION.pc:cogl-path/mutter-cogl-path.pc.in
 | 
			
		||||
cogl-path/mutter-cogl-path-1.0.pc
 | 
			
		||||
cogl-gles2/Makefile
 | 
			
		||||
cogl-gles2/mutter-cogl-gles2-$LIBMUTTER_API_VERSION.pc:cogl-gles2/mutter-cogl-gles2.pc.in
 | 
			
		||||
cogl-gles2/mutter-cogl-gles2-1.0.pc
 | 
			
		||||
tests/Makefile
 | 
			
		||||
tests/config.env
 | 
			
		||||
tests/conform/Makefile
 | 
			
		||||
 
 | 
			
		||||
@@ -131,10 +131,10 @@ AM_CPPFLAGS += \
 | 
			
		||||
test_conformance_CFLAGS = -g3 -O0 $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) -Wno-error=maybe-uninitialized -Wno-error=nested-externs -Wno-error=missing-prototypes
 | 
			
		||||
test_conformance_LDADD = \
 | 
			
		||||
	$(COGL_DEP_LIBS) \
 | 
			
		||||
	$(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la \
 | 
			
		||||
	$(top_builddir)/cogl/libmutter-cogl.la \
 | 
			
		||||
	$(LIBM)
 | 
			
		||||
if BUILD_COGL_PATH
 | 
			
		||||
test_conformance_LDADD += $(top_builddir)/cogl-path/libmutter-cogl-path-$(LIBMUTTER_API_VERSION).la
 | 
			
		||||
test_conformance_LDADD += $(top_builddir)/cogl-path/libmutter-cogl-path.la
 | 
			
		||||
endif
 | 
			
		||||
test_conformance_LDFLAGS = -export-dynamic
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ NULL =
 | 
			
		||||
 | 
			
		||||
AM_CPPFLAGS = \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
	-I$(top_builddir)/cogl \
 | 
			
		||||
	-DCOGL_DISABLE_DEPRECATED
 | 
			
		||||
 | 
			
		||||
test_conformance_CPPFLAGS = \
 | 
			
		||||
@@ -17,7 +16,7 @@ AM_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS)
 | 
			
		||||
 | 
			
		||||
common_ldadd = \
 | 
			
		||||
	$(COGL_DEP_LIBS) \
 | 
			
		||||
	$(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la \
 | 
			
		||||
	$(top_builddir)/cogl/libmutter-cogl.la \
 | 
			
		||||
	$(LIBM)
 | 
			
		||||
 | 
			
		||||
test_journal_SOURCES = test-journal.c
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ wrappers: stamp-test-unit
 | 
			
		||||
	@true
 | 
			
		||||
stamp-test-unit: Makefile test-unit$(EXEEXT)
 | 
			
		||||
	@mkdir -p wrappers
 | 
			
		||||
	. $(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la ; \
 | 
			
		||||
	. $(top_builddir)/cogl/libmutter-cogl.la ; \
 | 
			
		||||
	  $(NM) $(top_builddir)/cogl/.libs/"$$dlname"| \
 | 
			
		||||
	  grep '[DR] _\?unit_test_'|sed 's/.\+ [DR] _\?//' > unit-tests
 | 
			
		||||
	@chmod +x $(top_srcdir)/tests/test-launcher.sh
 | 
			
		||||
@@ -62,7 +62,7 @@ AM_CPPFLAGS += \
 | 
			
		||||
test_unit_CFLAGS = -g3 -O0 $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS)
 | 
			
		||||
test_unit_LDADD = \
 | 
			
		||||
	$(COGL_DEP_LIBS) \
 | 
			
		||||
	$(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la \
 | 
			
		||||
	$(top_builddir)/cogl/libmutter-cogl.la \
 | 
			
		||||
	$(LIBM)
 | 
			
		||||
test_unit_LDFLAGS = -export-dynamic
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										77
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										77
									
								
								configure.ac
									
									
									
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
AC_PREREQ(2.62)
 | 
			
		||||
 | 
			
		||||
m4_define([mutter_major_version], [3])
 | 
			
		||||
m4_define([mutter_minor_version], [24])
 | 
			
		||||
m4_define([mutter_minor_version], [21])
 | 
			
		||||
m4_define([mutter_micro_version], [4])
 | 
			
		||||
 | 
			
		||||
m4_define([mutter_version],
 | 
			
		||||
@@ -9,8 +9,6 @@ m4_define([mutter_version],
 | 
			
		||||
 | 
			
		||||
m4_define([mutter_plugin_api_version], [3])
 | 
			
		||||
 | 
			
		||||
m4_define([libmutter_api_version], [0])
 | 
			
		||||
 | 
			
		||||
AC_INIT([mutter], [mutter_version],
 | 
			
		||||
        [http://bugzilla.gnome.org/enter_bug.cgi?product=mutter])
 | 
			
		||||
 | 
			
		||||
@@ -29,18 +27,11 @@ AC_GNU_SOURCE
 | 
			
		||||
MUTTER_MAJOR_VERSION=mutter_major_version
 | 
			
		||||
MUTTER_MINOR_VERSION=mutter_minor_version
 | 
			
		||||
MUTTER_MICRO_VERSION=mutter_micro_version
 | 
			
		||||
MUTTER_VERSION=mutter_version
 | 
			
		||||
MUTTER_PLUGIN_API_VERSION=mutter_plugin_api_version
 | 
			
		||||
LIBMUTTER_API_VERSION=libmutter_api_version
 | 
			
		||||
AC_SUBST(MUTTER_MAJOR_VERSION)
 | 
			
		||||
AC_SUBST(MUTTER_MINOR_VERSION)
 | 
			
		||||
AC_SUBST(MUTTER_MICRO_VERSION)
 | 
			
		||||
AC_SUBST(MUTTER_PLUGIN_API_VERSION)
 | 
			
		||||
AC_SUBST(MUTTER_VERSION)
 | 
			
		||||
AC_SUBST(LIBMUTTER_API_VERSION)
 | 
			
		||||
 | 
			
		||||
# Make the mutter versions visible to the cogl and clutter subdirs
 | 
			
		||||
export LIBMUTTER_API_VERSION MUTTER_VERSION
 | 
			
		||||
 | 
			
		||||
MUTTER_PLUGIN_DIR="$libdir/$PACKAGE/plugins"
 | 
			
		||||
AC_SUBST(MUTTER_PLUGIN_DIR)
 | 
			
		||||
@@ -52,11 +43,9 @@ GETTEXT_PACKAGE=mutter
 | 
			
		||||
AC_SUBST(GETTEXT_PACKAGE)
 | 
			
		||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain])
 | 
			
		||||
 | 
			
		||||
AM_GNU_GETTEXT_VERSION([0.19.6])
 | 
			
		||||
AM_GNU_GETTEXT([external])
 | 
			
		||||
 | 
			
		||||
LT_PREREQ([2.2.6])
 | 
			
		||||
LT_INIT([disable-static])
 | 
			
		||||
IT_PROG_INTLTOOL([0.41])
 | 
			
		||||
AC_PROG_CC
 | 
			
		||||
AC_PROG_CC_C_O
 | 
			
		||||
AC_PROG_INSTALL
 | 
			
		||||
@@ -73,7 +62,6 @@ CANBERRA_GTK_VERSION=0.26
 | 
			
		||||
LIBWACOM_VERSION=0.13
 | 
			
		||||
 | 
			
		||||
MUTTER_PC_MODULES="
 | 
			
		||||
   egl
 | 
			
		||||
   gtk+-3.0 >= 3.19.8
 | 
			
		||||
   gio-unix-2.0 >= 2.35.1
 | 
			
		||||
   pango >= 1.2.0
 | 
			
		||||
@@ -95,7 +83,6 @@ MUTTER_PC_MODULES="
 | 
			
		||||
   xrender
 | 
			
		||||
   x11-xcb
 | 
			
		||||
   xcb-randr
 | 
			
		||||
   xcb-res
 | 
			
		||||
"
 | 
			
		||||
 | 
			
		||||
GLIB_GSETTINGS
 | 
			
		||||
@@ -129,11 +116,6 @@ AC_ARG_WITH(libwacom,
 | 
			
		||||
                 [disable the use of libwacom for advanced tablet management]),,
 | 
			
		||||
  with_libwacom=auto)
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH(gudev,
 | 
			
		||||
  AC_HELP_STRING([--without-gudev],
 | 
			
		||||
                 [disable the use of gudev for device type detection]),,
 | 
			
		||||
  with_gudev=auto)
 | 
			
		||||
 | 
			
		||||
AC_ARG_WITH([xwayland-path],
 | 
			
		||||
            [AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])],
 | 
			
		||||
            [XWAYLAND_PATH="$withval"],
 | 
			
		||||
@@ -213,43 +195,31 @@ else
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
have_gudev=no
 | 
			
		||||
AC_MSG_CHECKING([gudev])
 | 
			
		||||
if test x$with_gudev = xno ; then
 | 
			
		||||
  AC_MSG_RESULT([disabled])
 | 
			
		||||
else
 | 
			
		||||
  if $PKG_CONFIG --exists gudev-1.0; then
 | 
			
		||||
    have_gudev=yes
 | 
			
		||||
    AC_MSG_RESULT(yes)
 | 
			
		||||
    MUTTER_PC_MODULES="$MUTTER_PC_MODULES gudev-1.0"
 | 
			
		||||
    AC_DEFINE([HAVE_LIBGUDEV], 1, [Building with gudev for device type detection])
 | 
			
		||||
  else
 | 
			
		||||
    AC_MSG_RESULT(no)
 | 
			
		||||
    if test x$with_gudev = xyes ; then
 | 
			
		||||
      AC_MSG_ERROR([gudev forced but not found])
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
INTROSPECTION_VERSION=0.9.5
 | 
			
		||||
GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
 | 
			
		||||
 | 
			
		||||
if test x$found_introspection != xno; then
 | 
			
		||||
  AC_DEFINE(HAVE_INTROSPECTION, 1, [Define if GObject introspection is available])
 | 
			
		||||
  MUTTER_PC_MODULES="$MUTTER_PC_MODULES gobject-introspection-1.0"
 | 
			
		||||
  # Since we don't make any guarantees about stability and we don't support
 | 
			
		||||
  # parallel install, there's no real reason to change directories, filenames,
 | 
			
		||||
  # etc. as we change the Mutter tarball version. Note that this must match
 | 
			
		||||
  # api_version in src/Makefile.am
 | 
			
		||||
  META_GIR=Meta_3_0_gir
 | 
			
		||||
  # META_GIR=[Meta_]mutter_major_version[_]mutter_minor_version[_gir]
 | 
			
		||||
  AC_SUBST(META_GIR)
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
AC_SUBST(XWAYLAND_PATH)
 | 
			
		||||
 | 
			
		||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
 | 
			
		||||
 | 
			
		||||
MUTTER_NATIVE_BACKEND_MODULES="libdrm libsystemd libinput >= 1.4 gudev-1.0 gbm >= 10.3"
 | 
			
		||||
MUTTER_NATIVE_BACKEND_MODULES="libdrm libsystemd libinput gudev-1.0 gbm >= 10.3"
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(native-backend,
 | 
			
		||||
  AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),,
 | 
			
		||||
  enable_native_backend=auto
 | 
			
		||||
)
 | 
			
		||||
have_native_backend="no"
 | 
			
		||||
AS_IF([test "$enable_native_backend" = "yes"], [have_native_backend=yes],
 | 
			
		||||
      [test "$enable_native_backend" = "auto"], PKG_CHECK_EXISTS([$MUTTER_NATIVE_BACKEND_MODULES], [have_native_backend=yes]))
 | 
			
		||||
 | 
			
		||||
@@ -259,15 +229,6 @@ AS_IF([test "$have_native_backend" = "yes"], [
 | 
			
		||||
])
 | 
			
		||||
AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test "$have_native_backend" = "yes"])
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(egl-device,
 | 
			
		||||
  AS_HELP_STRING([--enable-egl-device], [enable support for EGLDevice on top of KMS]),
 | 
			
		||||
  enable_egl_device=yes,
 | 
			
		||||
  enable_egl_device=no
 | 
			
		||||
)
 | 
			
		||||
AS_IF([test "$enable_egl_device" = "yes"], [
 | 
			
		||||
  AC_DEFINE([HAVE_EGL_DEVICE],[1], [Defined if EGLDevice support is enabled])
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
MUTTER_WAYLAND_MODULES="wayland-server >= 1.6.90"
 | 
			
		||||
 | 
			
		||||
AC_ARG_ENABLE(wayland,
 | 
			
		||||
@@ -285,7 +246,7 @@ AS_IF([test "$have_wayland" = "yes"], [
 | 
			
		||||
  AC_SUBST([WAYLAND_SCANNER])
 | 
			
		||||
  AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support])
 | 
			
		||||
 | 
			
		||||
  PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.7],
 | 
			
		||||
  PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.5],
 | 
			
		||||
		    [ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`])
 | 
			
		||||
  AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir)
 | 
			
		||||
])
 | 
			
		||||
@@ -389,8 +350,6 @@ AC_CHECK_DECL([GL_EXT_x11_sync_object],
 | 
			
		||||
              [AC_MSG_ERROR([GL_EXT_x11_sync_object definition not found, please update your GL headers])],
 | 
			
		||||
              [#include <GL/glx.h>])
 | 
			
		||||
 | 
			
		||||
AC_PATH_PROG([CVT],[cvt],[])
 | 
			
		||||
 | 
			
		||||
#### Warnings (last since -Werror can disturb other tests)
 | 
			
		||||
 | 
			
		||||
# Stay command-line compatible with the gnome-common configure option. Here
 | 
			
		||||
@@ -463,7 +422,7 @@ data/Makefile
 | 
			
		||||
doc/Makefile
 | 
			
		||||
doc/man/Makefile
 | 
			
		||||
src/Makefile
 | 
			
		||||
src/libmutter-$LIBMUTTER_API_VERSION.pc:src/libmutter.pc.in
 | 
			
		||||
src/libmutter.pc
 | 
			
		||||
src/compositor/plugins/Makefile
 | 
			
		||||
src/meta/meta-version.h
 | 
			
		||||
po/Makefile.in
 | 
			
		||||
@@ -471,16 +430,6 @@ po/Makefile.in
 | 
			
		||||
 | 
			
		||||
AC_OUTPUT
 | 
			
		||||
 | 
			
		||||
# Check that cogl and clutter have their .pc files regenerated with the correct version
 | 
			
		||||
 | 
			
		||||
COGL_PC_VERSION=$(grep Version: cogl/cogl/mutter-cogl-$LIBMUTTER_API_VERSION.pc|awk '{ print $2; }')
 | 
			
		||||
AS_IF([test "x$COGL_PC_VERSION" != "x$MUTTER_VERSION"],
 | 
			
		||||
      [AC_MSG_ERROR([mutter-cogl pkg-config file not updated, rerun ./configure])])
 | 
			
		||||
 | 
			
		||||
CLUTTER_PC_VERSION=$(grep Version: clutter/clutter/mutter-clutter-$LIBMUTTER_API_VERSION.pc|awk '{ print $2; }')
 | 
			
		||||
AS_IF([test "x$CLUTTER_PC_VERSION" != "x$MUTTER_VERSION"],
 | 
			
		||||
      [AC_MSG_ERROR([mutter-clutter pkg-config file not updated, rerun ./configure])])
 | 
			
		||||
 | 
			
		||||
if test x$enable_verbose_mode = xno; then
 | 
			
		||||
        echo "*** WARNING WARNING WARNING WARNING WARNING"
 | 
			
		||||
        echo "*** Building without verbose mode"
 | 
			
		||||
@@ -500,12 +449,10 @@ mutter-$VERSION
 | 
			
		||||
	Startup notification:     ${have_startup_notification}
 | 
			
		||||
	libcanberra:              ${have_libcanberra}
 | 
			
		||||
	libwacom:                 ${have_libwacom}
 | 
			
		||||
	gudev                     ${have_gudev}
 | 
			
		||||
	Introspection:            ${found_introspection}
 | 
			
		||||
	Session management:       ${found_sm}
 | 
			
		||||
	Wayland:                  ${have_wayland}
 | 
			
		||||
	Native (KMS) backend:     ${have_native_backend}
 | 
			
		||||
	EGLDevice:                ${enable_egl_device}
 | 
			
		||||
"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,140 +1,140 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" ?>
 | 
			
		||||
<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
 | 
			
		||||
                group="system"
 | 
			
		||||
                name="Navigation"
 | 
			
		||||
                _name="Navigation"
 | 
			
		||||
                wm_name="Mutter"
 | 
			
		||||
                package="mutter">
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-1"
 | 
			
		||||
	              description="Move window to workspace 1" />
 | 
			
		||||
	              _description="Move window to workspace 1" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-2"
 | 
			
		||||
	              description="Move window to workspace 2" />
 | 
			
		||||
	              _description="Move window to workspace 2" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-3"
 | 
			
		||||
	              description="Move window to workspace 3" />
 | 
			
		||||
	              _description="Move window to workspace 3" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-4"
 | 
			
		||||
	              description="Move window to workspace 4" />
 | 
			
		||||
	              _description="Move window to workspace 4" />
 | 
			
		||||
 | 
			
		||||
        <KeyListEntry name="move-to-workspace-last"
 | 
			
		||||
                      description="Move window to last workspace" />
 | 
			
		||||
                      _description="Move window to last workspace" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-left"
 | 
			
		||||
	              description="Move window one workspace to the left" />
 | 
			
		||||
	              _description="Move window one workspace to the left" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-right"
 | 
			
		||||
	              description="Move window one workspace to the right" />
 | 
			
		||||
	              _description="Move window one workspace to the right" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-up"
 | 
			
		||||
	              description="Move window one workspace up" />
 | 
			
		||||
	              _description="Move window one workspace up" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-workspace-down"
 | 
			
		||||
	              description="Move window one workspace down" />
 | 
			
		||||
	              _description="Move window one workspace down" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-monitor-left"
 | 
			
		||||
	              description="Move window one monitor to the left" />
 | 
			
		||||
	              _description="Move window one monitor to the left" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-monitor-right"
 | 
			
		||||
	              description="Move window one monitor to the right" />
 | 
			
		||||
	              _description="Move window one monitor to the right" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-monitor-up"
 | 
			
		||||
	              description="Move window one monitor up" />
 | 
			
		||||
	              _description="Move window one monitor up" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="move-to-monitor-down"
 | 
			
		||||
	              description="Move window one monitor down" />
 | 
			
		||||
	              _description="Move window one monitor down" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-applications"
 | 
			
		||||
	              reverse-entry="switch-applications-backward"
 | 
			
		||||
	              description="Switch applications"/>
 | 
			
		||||
	              _description="Switch applications"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-applications-backward"
 | 
			
		||||
	              reverse-entry="switch-applications"
 | 
			
		||||
	              hidden="true"
 | 
			
		||||
	              description="Switch to previous application"/>
 | 
			
		||||
	              _description="Switch to previous application"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-windows"
 | 
			
		||||
	              reverse-entry="switch-windows-backward"
 | 
			
		||||
	              description="Switch windows"/>
 | 
			
		||||
	              _description="Switch windows"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-windows-backward"
 | 
			
		||||
	              reverse-entry="switch-windows"
 | 
			
		||||
	              hidden="true"
 | 
			
		||||
	              description="Switch to previous window"/>
 | 
			
		||||
	              _description="Switch to previous window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-group"
 | 
			
		||||
	              reverse-entry="switch-group-backward"
 | 
			
		||||
	              description="Switch windows of an application"/>
 | 
			
		||||
	              _description="Switch windows of an application"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-group-backward"
 | 
			
		||||
	              reverse-entry="switch-group"
 | 
			
		||||
	              hidden="true"
 | 
			
		||||
	              description="Switch to previous window of an application"/>
 | 
			
		||||
	              _description="Switch to previous window of an application"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-panels"
 | 
			
		||||
	              reverse-entry="switch-panels-backward"
 | 
			
		||||
	              description="Switch system controls"/>
 | 
			
		||||
	              _description="Switch system controls"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-panels-backward"
 | 
			
		||||
	              reverse-entry="switch-panels"
 | 
			
		||||
	              hidden="true"
 | 
			
		||||
	              description="Switch to previous system control"/>
 | 
			
		||||
	              _description="Switch to previous system control"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="cycle-windows"
 | 
			
		||||
	              reverse-entry="cycle-windows-backward"
 | 
			
		||||
	              description="Switch windows directly"/>
 | 
			
		||||
	              _description="Switch windows directly"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="cycle-windows-backward"
 | 
			
		||||
	              reverse-entry="cycle-windows"
 | 
			
		||||
	              hidden="true"
 | 
			
		||||
	              description="Switch directly to previous window"/>
 | 
			
		||||
	              _description="Switch directly to previous window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="cycle-group"
 | 
			
		||||
	              reverse-entry="cycle-group-backward"
 | 
			
		||||
	              description="Switch windows of an app directly"/>
 | 
			
		||||
	              _description="Switch windows of an app directly"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="cycle-group-backward"
 | 
			
		||||
	              reverse-entry="cycle-group"
 | 
			
		||||
	              hidden="true"
 | 
			
		||||
	              description="Switch directly to previous window of an app"/>
 | 
			
		||||
	              _description="Switch directly to previous window of an app"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="cycle-panels"
 | 
			
		||||
	              reverse-entry="cycle-panels-backward"
 | 
			
		||||
	              description="Switch system controls directly"/>
 | 
			
		||||
	              _description="Switch system controls directly"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="cycle-panels-backward"
 | 
			
		||||
	              reverse-entry="cycle-panels"
 | 
			
		||||
	              hidden="true"
 | 
			
		||||
	              description="Switch directly to previous system control"/>
 | 
			
		||||
	              _description="Switch directly to previous system control"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="show-desktop"
 | 
			
		||||
	              description="Hide all normal windows"/>
 | 
			
		||||
	              _description="Hide all normal windows"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-1"
 | 
			
		||||
	              description="Switch to workspace 1" />
 | 
			
		||||
	              _description="Switch to workspace 1" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-2"
 | 
			
		||||
	              description="Switch to workspace 2" />
 | 
			
		||||
	              _description="Switch to workspace 2" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-3"
 | 
			
		||||
	              description="Switch to workspace 3" />
 | 
			
		||||
	              _description="Switch to workspace 3" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-4"
 | 
			
		||||
	              description="Switch to workspace 4" />
 | 
			
		||||
	              _description="Switch to workspace 4" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-last"
 | 
			
		||||
	              description="Switch to last workspace" />
 | 
			
		||||
	              _description="Switch to last workspace" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-left"
 | 
			
		||||
	              description="Move to workspace left" />
 | 
			
		||||
	              _description="Move to workspace left" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-right"
 | 
			
		||||
	              description="Move to workspace right" />
 | 
			
		||||
	              _description="Move to workspace right" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-up"
 | 
			
		||||
	              description="Move to workspace above" />
 | 
			
		||||
	              _description="Move to workspace above" />
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="switch-to-workspace-down"
 | 
			
		||||
	              description="Move to workspace below" />
 | 
			
		||||
	              _description="Move to workspace below" />
 | 
			
		||||
 | 
			
		||||
</KeyListEntries>
 | 
			
		||||
@@ -1,13 +1,13 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" ?>
 | 
			
		||||
<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
 | 
			
		||||
                group="system"
 | 
			
		||||
                name="System"
 | 
			
		||||
                _name="System"
 | 
			
		||||
                wm_name="Mutter"
 | 
			
		||||
                package="mutter">
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="panel-run-dialog" description="Show the run command prompt"/>
 | 
			
		||||
	<KeyListEntry name="panel-run-dialog" _description="Show the run command prompt"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="panel-main-menu" description="Show the activities overview"/>
 | 
			
		||||
	<KeyListEntry name="panel-main-menu" _description="Show the activities overview"/>
 | 
			
		||||
 | 
			
		||||
</KeyListEntries>
 | 
			
		||||
 | 
			
		||||
@@ -1,50 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" ?>
 | 
			
		||||
<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
 | 
			
		||||
                group="system"
 | 
			
		||||
                name="Windows"
 | 
			
		||||
                wm_name="Mutter"
 | 
			
		||||
                package="mutter">
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="activate-window-menu" description="Activate the window menu"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-fullscreen" description="Toggle fullscreen mode"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-maximized" description="Toggle maximization state"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="maximize" description="Maximize window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="unmaximize" description="Restore window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-shaded" description="Toggle shaded state"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="close" description="Close window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="minimize" description="Hide window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="begin-move" description="Move window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="begin-resize" description="Resize window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-on-all-workspaces"
 | 
			
		||||
	              description="Toggle window on all workspaces or one"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="raise-or-lower" description="Raise window if covered, otherwise lower it"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="raise" description="Raise window above other windows"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="lower" description="Lower window below other windows"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="maximize-vertically" description="Maximize window vertically"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="maximize-horizontally" description="Maximize window horizontally"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-tiled-left"
 | 
			
		||||
                      schema="org.gnome.mutter.keybindings"
 | 
			
		||||
                      description="View split on left"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-tiled-right"
 | 
			
		||||
                      schema="org.gnome.mutter.keybindings"
 | 
			
		||||
                      description="View split on right"/>
 | 
			
		||||
 | 
			
		||||
</KeyListEntries>
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										50
									
								
								data/50-mutter-windows.xml.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								data/50-mutter-windows.xml.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8" ?>
 | 
			
		||||
<KeyListEntries schema="org.gnome.desktop.wm.keybindings"
 | 
			
		||||
                group="system"
 | 
			
		||||
                _name="Windows"
 | 
			
		||||
                wm_name="Mutter"
 | 
			
		||||
                package="mutter">
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="activate-window-menu" _description="Activate the window menu"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-fullscreen" _description="Toggle fullscreen mode"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-maximized" _description="Toggle maximization state"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="maximize" _description="Maximize window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="unmaximize" _description="Restore window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-shaded" _description="Toggle shaded state"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="close" _description="Close window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="minimize" _description="Hide window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="begin-move" _description="Move window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="begin-resize" _description="Resize window"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-on-all-workspaces"
 | 
			
		||||
	              _description="Toggle window on all workspaces or one"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="raise-or-lower" _description="Raise window if covered, otherwise lower it"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="raise" _description="Raise window above other windows"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="lower" _description="Lower window below other windows"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="maximize-vertically" _description="Maximize window vertically"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="maximize-horizontally" _description="Maximize window horizontally"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-tiled-left"
 | 
			
		||||
                      schema="org.gnome.mutter.keybindings"
 | 
			
		||||
                      _description="View split on left"/>
 | 
			
		||||
 | 
			
		||||
	<KeyListEntry name="toggle-tiled-right"
 | 
			
		||||
                      schema="org.gnome.mutter.keybindings"
 | 
			
		||||
                      _description="View split on right"/>
 | 
			
		||||
 | 
			
		||||
</KeyListEntries>
 | 
			
		||||
 | 
			
		||||
@@ -3,24 +3,21 @@ desktopfiles_in_files = \
 | 
			
		||||
desktopfilesdir = $(datadir)/applications
 | 
			
		||||
desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop)
 | 
			
		||||
 | 
			
		||||
%.desktop:%.desktop.in
 | 
			
		||||
	$(AM_V_GET) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@
 | 
			
		||||
@INTLTOOL_DESKTOP_RULE@
 | 
			
		||||
 | 
			
		||||
xml_in_files = \
 | 
			
		||||
        50-mutter-navigation.xml.in \
 | 
			
		||||
        50-mutter-system.xml.in \
 | 
			
		||||
        50-mutter-windows.xml.in
 | 
			
		||||
xmldir = $(GNOME_KEYBINDINGS_KEYSDIR)
 | 
			
		||||
xml_DATA = \
 | 
			
		||||
        50-mutter-navigation.xml \
 | 
			
		||||
        50-mutter-system.xml \
 | 
			
		||||
        50-mutter-windows.xml
 | 
			
		||||
xml_DATA = $(xml_in_files:.xml.in=.xml)
 | 
			
		||||
 | 
			
		||||
gschema_in_files = \
 | 
			
		||||
	org.gnome.mutter.gschema.xml.in	\
 | 
			
		||||
	org.gnome.mutter.wayland.gschema.xml.in
 | 
			
		||||
gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml)
 | 
			
		||||
 | 
			
		||||
%.gschema.xml: %.gschema.xml.in Makefile
 | 
			
		||||
	$(AM_V_GEN) sed -e 's|@GETTEXT_DOMAIN[@]|$(GETTEXT_DOMAIN)|g' \
 | 
			
		||||
	$< > $@ || rm $@
 | 
			
		||||
 | 
			
		||||
@INTLTOOL_XML_NOMERGE_RULE@
 | 
			
		||||
@GSETTINGS_RULES@
 | 
			
		||||
 | 
			
		||||
convertdir = $(datadir)/GConf/gsettings
 | 
			
		||||
@@ -28,10 +25,11 @@ convert_DATA = mutter-schemas.convert
 | 
			
		||||
 | 
			
		||||
CLEANFILES = \
 | 
			
		||||
	$(desktopfiles_DATA) \
 | 
			
		||||
	$(gsettings_SCHEMAS)
 | 
			
		||||
	$(gsettings_SCHEMAS) \
 | 
			
		||||
	$(xml_DATA)
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST = \
 | 
			
		||||
	$(convert_DATA) \
 | 
			
		||||
	$(desktopfiles_in_files) \
 | 
			
		||||
	$(gschema_in_files) \
 | 
			
		||||
	$(xml_DATA)
 | 
			
		||||
	$(xml_in_files)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
[Desktop Entry]
 | 
			
		||||
Type=Application
 | 
			
		||||
Name=Mutter
 | 
			
		||||
_Name=Mutter
 | 
			
		||||
Exec=mutter
 | 
			
		||||
NoDisplay=true
 | 
			
		||||
# name of loadable control center module
 | 
			
		||||
 
 | 
			
		||||
@@ -4,102 +4,102 @@
 | 
			
		||||
 | 
			
		||||
    <key name="overlay-key" type="s">
 | 
			
		||||
      <default>'Super_L'</default>
 | 
			
		||||
      <summary>Modifier to use for extended window management operations</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        This key will initiate the “overlay”, which is a combination window
 | 
			
		||||
      <_summary>Modifier to use for extended window management operations</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
        This key will initiate the "overlay", which is a combination window
 | 
			
		||||
        overview and application launching system.  The default is intended
 | 
			
		||||
        to be the “Windows key” on PC hardware.
 | 
			
		||||
        to be the "Windows key" on PC hardware.
 | 
			
		||||
 | 
			
		||||
        It’s expected that this binding either the default or set to
 | 
			
		||||
        It's expected that this binding either the default or set to
 | 
			
		||||
        the empty string.
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="attach-modal-dialogs" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <summary>Attach modal dialogs</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
      <_summary>Attach modal dialogs</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
        When true, instead of having independent titlebars, modal dialogs
 | 
			
		||||
        appear attached to the titlebar of the parent window and are moved
 | 
			
		||||
        together with the parent window.
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="edge-tiling" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <summary>Enable edge tiling when dropping windows on screen edges</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
      <_summary>Enable edge tiling when dropping windows on screen edges</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
        If enabled, dropping windows on vertical screen edges maximizes them
 | 
			
		||||
        vertically and resizes them horizontally to cover half of the available
 | 
			
		||||
        area. Dropping windows on the top screen edge maximizes them completely.
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="dynamic-workspaces" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <summary>Workspaces are managed dynamically</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
      <_summary>Workspaces are managed dynamically</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
        Determines whether workspaces are managed dynamically or
 | 
			
		||||
        whether there’s a static number of workspaces (determined
 | 
			
		||||
        whether there's a static number of workspaces (determined
 | 
			
		||||
        by the num-workspaces key in org.gnome.desktop.wm.preferences).
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="workspaces-only-on-primary" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <summary>Workspaces only on primary</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
      <_summary>Workspaces only on primary</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
        Determines whether workspace switching should happen for windows
 | 
			
		||||
        on all monitors or only for windows on the primary monitor.
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="no-tab-popup" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <summary>No tab popup</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
      <_summary>No tab popup</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
        Determines whether the use of popup and highlight frame should
 | 
			
		||||
        be disabled for window cycling.
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="focus-change-on-pointer-rest" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <summary>Delay focus changes until the pointer stops moving</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        If set to true, and the focus mode is either “sloppy” or “mouse”
 | 
			
		||||
      <_summary>Delay focus changes until the pointer stops moving</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
        If set to true, and the focus mode is either "sloppy" or "mouse"
 | 
			
		||||
        then the focus will not be changed immediately when entering a
 | 
			
		||||
        window, but only after the pointer stops moving.
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="draggable-border-width" type="i">
 | 
			
		||||
      <default>10</default>
 | 
			
		||||
      <range min="0" max="64"/>
 | 
			
		||||
      <summary>Draggable border width</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
          The amount of total draggable borders. If the theme’s visible
 | 
			
		||||
      <_summary>Draggable border width</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
          The amount of total draggable borders. If the theme's visible
 | 
			
		||||
          borders are not enough, invisible borders will be added to meet
 | 
			
		||||
          this value.
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="auto-maximize" type="b">
 | 
			
		||||
      <default>true</default>
 | 
			
		||||
      <summary>Auto maximize nearly monitor sized windows</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
      <_summary>Auto maximize nearly monitor sized windows</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
        If enabled, new windows that are initially the size of the monitor
 | 
			
		||||
        automatically get maximized.
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="center-new-windows" type="b">
 | 
			
		||||
      <default>false</default>
 | 
			
		||||
      <summary>Place new windows in the center</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
      <_summary>Place new windows in the center</_summary>
 | 
			
		||||
      <_description>
 | 
			
		||||
        When true, the new windows will always be put in the center of the
 | 
			
		||||
        active screen of the monitor.
 | 
			
		||||
      </description>
 | 
			
		||||
      </_description>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <child name="keybindings" schema="org.gnome.mutter.keybindings"/>
 | 
			
		||||
@@ -117,12 +117,12 @@
 | 
			
		||||
 | 
			
		||||
    <key name="tab-popup-select" type="as">
 | 
			
		||||
      <default>[]</default>
 | 
			
		||||
      <summary>Select window from tab popup</summary>
 | 
			
		||||
      <_summary>Select window from tab popup</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
    <key name="tab-popup-cancel" type="as">
 | 
			
		||||
      <default>[]</default>
 | 
			
		||||
      <summary>Cancel tab popup</summary>
 | 
			
		||||
      <_summary>Cancel tab popup</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
 | 
			
		||||
  </schema>
 | 
			
		||||
 
 | 
			
		||||
@@ -3,51 +3,51 @@
 | 
			
		||||
	  gettext-domain="@GETTEXT_DOMAIN@">
 | 
			
		||||
    <key name="switch-to-session-1" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F1']]]></default>
 | 
			
		||||
      <summary>Switch to VT 1</summary>
 | 
			
		||||
      <_summary>Switch to VT 1</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-2" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F2']]]></default>
 | 
			
		||||
      <summary>Switch to VT 2</summary>
 | 
			
		||||
      <_summary>Switch to VT 2</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-3" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F3']]]></default>
 | 
			
		||||
      <summary>Switch to VT 3</summary>
 | 
			
		||||
      <_summary>Switch to VT 3</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-4" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F4']]]></default>
 | 
			
		||||
      <summary>Switch to VT 4</summary>
 | 
			
		||||
      <_summary>Switch to VT 4</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-5" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F5']]]></default>
 | 
			
		||||
      <summary>Switch to VT 5</summary>
 | 
			
		||||
      <_summary>Switch to VT 5</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-6" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F6']]]></default>
 | 
			
		||||
      <summary>Switch to VT 6</summary>
 | 
			
		||||
      <_summary>Switch to VT 6</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-7" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F7']]]></default>
 | 
			
		||||
      <summary>Switch to VT 7</summary>
 | 
			
		||||
      <_summary>Switch to VT 7</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-8" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F8']]]></default>
 | 
			
		||||
      <summary>Switch to VT 8</summary>
 | 
			
		||||
      <_summary>Switch to VT 8</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-9" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F9']]]></default>
 | 
			
		||||
      <summary>Switch to VT 9</summary>
 | 
			
		||||
      <_summary>Switch to VT 9</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-10" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F10']]]></default>
 | 
			
		||||
      <summary>Switch to VT 10</summary>
 | 
			
		||||
      <_summary>Switch to VT 10</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-11" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F11']]]></default>
 | 
			
		||||
      <summary>Switch to VT 11</summary>
 | 
			
		||||
      <_summary>Switch to VT 11</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="switch-to-session-12" type="as">
 | 
			
		||||
      <default><![CDATA[['<Primary><Alt>F12']]]></default>
 | 
			
		||||
      <summary>Switch to VT 12</summary>
 | 
			
		||||
      <_summary>Switch to VT 12</_summary>
 | 
			
		||||
    </key>
 | 
			
		||||
  </schema>
 | 
			
		||||
</schemalist>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										68
									
								
								po/Makevars
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								po/Makevars
									
									
									
									
									
								
							@@ -1,68 +0,0 @@
 | 
			
		||||
# Makefile variables for PO directory in any package using GNU gettext.
 | 
			
		||||
 | 
			
		||||
# Usually the message domain is the same as the package name.
 | 
			
		||||
DOMAIN = $(PACKAGE)
 | 
			
		||||
 | 
			
		||||
# These two variables depend on the location of this directory.
 | 
			
		||||
subdir = po
 | 
			
		||||
top_builddir = ..
 | 
			
		||||
 | 
			
		||||
# These options get passed to xgettext.
 | 
			
		||||
XGETTEXT_OPTIONS = --from-code=UTF-8 --keyword=_ --keyword=N_ \
 | 
			
		||||
        --keyword=C_:1c,2 --keyword=NC_:1c,2 \
 | 
			
		||||
        --keyword=g_dngettext:2,3 --add-comments \
 | 
			
		||||
        --flag=g_dngettext:2:pass-c-format \
 | 
			
		||||
        --flag=g_strdup_printf:1:c-format \
 | 
			
		||||
        --flag=g_string_printf:2:c-format \
 | 
			
		||||
        --flag=g_string_append_printf:2:c-format \
 | 
			
		||||
        --flag=g_error_new:3:c-format \
 | 
			
		||||
        --flag=g_set_error:4:c-format \
 | 
			
		||||
        --flag=g_markup_printf_escaped:1:c-format \
 | 
			
		||||
        --flag=g_log:3:c-format \
 | 
			
		||||
        --flag=g_print:1:c-format \
 | 
			
		||||
        --flag=g_printerr:1:c-format \
 | 
			
		||||
        --flag=g_printf:1:c-format \
 | 
			
		||||
        --flag=g_fprintf:2:c-format \
 | 
			
		||||
        --flag=g_sprintf:2:c-format \
 | 
			
		||||
        --flag=g_snprintf:3:c-format
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# This is the copyright holder that gets inserted into the header of the
 | 
			
		||||
# $(DOMAIN).pot file.  Set this to the copyright holder of the surrounding
 | 
			
		||||
# package.  (Note that the msgstr strings, extracted from the package's
 | 
			
		||||
# sources, belong to the copyright holder of the package.)  Translators are
 | 
			
		||||
# expected to transfer the copyright for their translations to this person
 | 
			
		||||
# or entity, or to disclaim their copyright.  The empty string stands for
 | 
			
		||||
# the public domain; in this case the translators are expected to disclaim
 | 
			
		||||
# their copyright.
 | 
			
		||||
COPYRIGHT_HOLDER = Translation copyright holder
 | 
			
		||||
# This is the email address or URL to which the translators shall report
 | 
			
		||||
# bugs in the untranslated strings:
 | 
			
		||||
# - Strings which are not entire sentences, see the maintainer guidelines
 | 
			
		||||
#   in the GNU gettext documentation, section 'Preparing Strings'.
 | 
			
		||||
# - Strings which use unclear terms or require additional context to be
 | 
			
		||||
#   understood.
 | 
			
		||||
# - Strings which make invalid assumptions about notation of date, time or
 | 
			
		||||
#   money.
 | 
			
		||||
# - Pluralisation problems.
 | 
			
		||||
# - Incorrect English spelling.
 | 
			
		||||
# - Incorrect formatting.
 | 
			
		||||
# It can be your email address, or a mailing list address where translators
 | 
			
		||||
# can write to without being subscribed, or the URL of a web page through
 | 
			
		||||
# which the translators can contact you.
 | 
			
		||||
MSGID_BUGS_ADDRESS = http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&keywords=I18N+L10N&component=general
 | 
			
		||||
 | 
			
		||||
# This is the list of locale categories, beyond LC_MESSAGES, for which the
 | 
			
		||||
# message catalogs shall be used.  It is usually empty.
 | 
			
		||||
EXTRA_LOCALE_CATEGORIES =
 | 
			
		||||
 | 
			
		||||
# Ignore the timestamp of the .pot file, as git clones do not have
 | 
			
		||||
# deterministic timestamps, and .po files are updated by translators
 | 
			
		||||
# (only) in GNOME projects.
 | 
			
		||||
PO_DEPENDS_ON_POT = no
 | 
			
		||||
 | 
			
		||||
# This tells whether or not to forcibly update $(DOMAIN).pot and
 | 
			
		||||
# regenerate PO files on "make dist".  Possible values are "yes" and
 | 
			
		||||
# "no".  Set this to no if the POT file and PO files are maintained
 | 
			
		||||
# externally.
 | 
			
		||||
DIST_DEPENDS_ON_UPDATE_PO = no
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user