Compare commits

..

15 Commits

Author SHA1 Message Date
Carlos Garnacho
7e3f96d972 backends: Prepare for virtual devices
Those have no backing libinput_device, and configuration does not
apply to those.

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:26 +02:00
Carlos Garnacho
5f91d34f88 clutter/evdev: Implement ClutterVirtualInputDevice::notify_keyval
This is somewhat gross at the moment, because we're after all mimicking
real keyboard events, we can only lookup keycodes that are available
in the current map, and the control of levels is rather limited.

Eventually, we want to implement the text_input protocol, handle these
events separately to MetaWaylandKeyboard, so event->key.keyval is
is guaranteed to be the final result. Until then, this is the farthest
we can get.

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:26 +02:00
Carlos Garnacho
d0a708b42c clutter: Add ClutterVirtualInputDevice vmethod to notify keysyms
Evcodes don't cut it when we have something already specifying the
character to be printed, despite the current group/level. This API
allows some more control on the intended output.

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:26 +02:00
Carlos Garnacho
d940d5e581 clutter: Make ClutterVirtualInputDevice public
This includes adding documentation and introspection annotations,
and marking the functions as extern.

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:26 +02:00
Carlos Garnacho
70f69e5de4 clutter/evdev: Allow specifying the ClutterInputMode of virtual devices
The seat core keyboard/pointer will be "master", the ones created through
ClutterVirtualInputDevice will be "slaves".

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
c2ce0e6795 ClutterVirtualInputDeviceEvdev: Forward button and key presses
https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
adbd566f83 ClutterSeatEvdev: Keep track of button count
libinput does it for us, but only for physical devices. When we add
virtual devices to the same seat, we need to track button press count
ourself.

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
f511f65a14 ClutterVirtualInputDeviceEvdev: Forward motion events
https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
0942d68f1a ClutterVirtualInputDeviceEvdev: Create associated ClutterInputDevice
https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
73d5d837db ClutterVirtualInputDeviceEvdev: Construct with a specific seat
We are still single seated, so until we are properly multi seated its
always the main seat.

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
ea5b691ac6 ClutterVirtualInputDevice: Store the device type
https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
53d1b11386 clutter/evdev: Move keyboard and pointer notification into seat
We notify per seat; so lets move the logic there. Touch and tablets to
follow later.

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
85e8feca67 ClutterVirtualInputDevice: Keep track of the device manager
https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
fb47374629 ClutterDeviceManagerEvdev: Split out seat into a separate file
Split out ClutterSeatEvdev functionality into a separate file.

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
Jonas Ådahl
9a92d5fe89 clutter: Add virtual input device API
Virtual input devices aim to enable injecting input events as if they
came from hardware events. This is useful for things such as remote
controlling, for example via a remote desktop session.

The API so far only consists of stumps.

https://bugzilla.gnome.org/show_bug.cgi?id=765009
2016-07-26 18:45:25 +02:00
307 changed files with 19261 additions and 37346 deletions

9
.gitignore vendored
View File

@@ -41,14 +41,8 @@ stamp-h1
*~ *~
stamp-it stamp-it
.intltool-merge-cache .intltool-merge-cache
ABOUT-NLS
POTFILES POTFILES
Makevars.template
po/*.header
po/*.pot po/*.pot
po/*.sed
po/*.sin
Rules-quot
libmutter.pc libmutter.pc
mutter mutter
mutter-restart-helper mutter-restart-helper
@@ -83,10 +77,7 @@ src/relative-pointer-unstable-v*-protocol.c
src/relative-pointer-unstable-v*-server-protocol.h src/relative-pointer-unstable-v*-server-protocol.h
src/pointer-constraints-unstable-v*-protocol.c src/pointer-constraints-unstable-v*-protocol.c
src/pointer-constraints-unstable-v*-server-protocol.h 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/meta/meta-version.h
src/libmutter-*.pc
doc/reference/*.args doc/reference/*.args
doc/reference/*.bak doc/reference/*.bak
doc/reference/*.hierarchy doc/reference/*.hierarchy

285
NEWS
View File

@@ -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 3.21.4
====== ======
* Fix missing frame border around GTK+ dialogs [Florian; #745060] * Fix missing frame border around GTK+ dialogs [Florian; #745060]

View File

@@ -6,23 +6,16 @@ test -z "$srcdir" && srcdir=.
REQUIRED_AUTOMAKE_VERSION=1.11 REQUIRED_AUTOMAKE_VERSION=1.11
olddir="$(pwd)" (test -f $srcdir/configure.ac \
&& test -d $srcdir/src) || {
cd "${srcdir}"
(test -f configure.ac \
&& test -d src) || {
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
echo " top-level mutter directory" echo " top-level metacity directory"
exit 1 exit 1
} }
aclocal --install || exit 1 which gnome-autogen.sh || {
intltoolize --force --copy --automake || exit 1 echo "You need to install gnome-common from GNOME Subversion (or from"
autoreconf --verbose --force --install || exit 1 echo "your distribution's package manager)."
exit 1
cd "${olddir}" }
. gnome-autogen.sh
if [ "$NOCONFIGURE" = "" ]; then
"${srcdir}/configure" "$@" || exit 1
fi

View File

@@ -25,7 +25,6 @@ AM_CPPFLAGS = \
-I$(top_builddir)/clutter \ -I$(top_builddir)/clutter \
-I$(top_srcdir)/../cogl \ -I$(top_srcdir)/../cogl \
-I$(top_builddir)/../cogl \ -I$(top_builddir)/../cogl \
-I$(top_builddir)/../cogl/cogl \
$(CLUTTER_DEPRECATED_CFLAGS) \ $(CLUTTER_DEPRECATED_CFLAGS) \
$(CLUTTER_DEBUG_CFLAGS) \ $(CLUTTER_DEBUG_CFLAGS) \
$(CLUTTER_HIDDEN_VISIBILITY_CFLAGS) \ $(CLUTTER_HIDDEN_VISIBILITY_CFLAGS) \
@@ -37,7 +36,7 @@ AM_CFLAGS = $(CLUTTER_CFLAGS) $(MAINTAINER_CFLAGS)
INTROSPECTION_GIRS = INTROSPECTION_GIRS =
# the base include path for headers # 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_includedir = $(clutter_base_includedir)/clutter
clutter_deprecateddir = $(clutter_base_includedir)/clutter/deprecated clutter_deprecateddir = $(clutter_base_includedir)/clutter/deprecated
@@ -113,6 +112,7 @@ source_h = \
clutter-snap-constraint.h \ clutter-snap-constraint.h \
clutter-stage.h \ clutter-stage.h \
clutter-stage-manager.h \ clutter-stage-manager.h \
clutter-stage-view.h \
clutter-tap-action.h \ clutter-tap-action.h \
clutter-test-utils.h \ clutter-test-utils.h \
clutter-texture.h \ clutter-texture.h \
@@ -198,6 +198,7 @@ source_c = \
clutter-snap-constraint.c \ clutter-snap-constraint.c \
clutter-stage.c \ clutter-stage.c \
clutter-stage-manager.c \ clutter-stage-manager.c \
clutter-stage-view.c \
clutter-stage-window.c \ clutter-stage-window.c \
clutter-tap-action.c \ clutter-tap-action.c \
clutter-test-utils.c \ clutter-test-utils.c \
@@ -239,7 +240,6 @@ source_h_priv = \
clutter-settings-private.h \ clutter-settings-private.h \
clutter-stage-manager-private.h \ clutter-stage-manager-private.h \
clutter-stage-private.h \ clutter-stage-private.h \
clutter-stage-view.h \
clutter-stage-window.h \ clutter-stage-window.h \
$(NULL) $(NULL)
@@ -248,7 +248,6 @@ source_c_priv = \
clutter-easing.c \ clutter-easing.c \
clutter-event-translator.c \ clutter-event-translator.c \
clutter-id-pool.c \ clutter-id-pool.c \
clutter-stage-view.c \
$(NULL) $(NULL)
# deprecated installed headers # deprecated installed headers
@@ -356,7 +355,7 @@ EXTRA_DIST += clutter-version.h.in clutter-version.h
# key symbol update script # key symbol update script
EXTRA_DIST += clutter-keysyms-update.pl 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 # 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 # shared library whose name was determined by the single backend it
@@ -414,13 +413,11 @@ x11_source_c_priv = \
x11_source_c += \ x11_source_c += \
x11/clutter-device-manager-xi2.c \ x11/clutter-device-manager-xi2.c \
x11/clutter-input-device-xi2.c \ x11/clutter-input-device-xi2.c \
x11/clutter-input-device-tool-xi2.c \
$(NULL) $(NULL)
x11_source_h_priv += \ x11_source_h_priv += \
x11/clutter-device-manager-xi2.h \ x11/clutter-device-manager-xi2.h \
x11/clutter-input-device-xi2.h \ x11/clutter-input-device-xi2.h \
x11/clutter-input-device-tool-xi2.h \
$(NULL) $(NULL)
x11_source_c += \ x11_source_c += \
@@ -442,10 +439,10 @@ x11_introspection = $(x11_source_c) $(x11_source_h)
clutterx11_includedir = $(clutter_includedir)/x11 clutterx11_includedir = $(clutter_includedir)/x11
clutterx11_include_HEADERS = $(x11_source_h) 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) $(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 # Shared cogl backend files
cogl_source_h = cogl_source_h =
@@ -583,17 +580,17 @@ nodist_clutter_include_HEADERS = clutter-config.h $(built_source_h)
clutter_deprecated_HEADERS = $(deprecated_h) clutter_deprecated_HEADERS = $(deprecated_h)
mutterlibdir = $(libdir)/mutter 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) \ $(LIBM) \
$(CLUTTER_LIBS) \ $(CLUTTER_LIBS) \
$(top_builddir)/../cogl/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la \ $(top_builddir)/../cogl/cogl/libmutter-cogl.la \
$(top_builddir)/../cogl/cogl-pango/libmutter-cogl-pango-$(LIBMUTTER_API_VERSION).la \ $(top_builddir)/../cogl/cogl-pango/libmutter-cogl-pango.la \
$(top_builddir)/../cogl/cogl-path/libmutter-cogl-path-$(LIBMUTTER_API_VERSION).la \ $(top_builddir)/../cogl/cogl-path/libmutter-cogl-path.la \
$(NULL) $(NULL)
libmutter_clutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \ libmutter_clutter_@CLUTTER_API_VERSION@_la_SOURCES = \
$(backend_source_c) \ $(backend_source_c) \
$(backend_source_h) \ $(backend_source_h) \
$(backend_source_c_priv) \ $(backend_source_c_priv) \
@@ -611,12 +608,12 @@ libmutter_clutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \
$(cally_sources_private) \ $(cally_sources_private) \
$(NULL) $(NULL)
nodist_libmutter_clutter_@LIBMUTTER_API_VERSION@_la_SOURCES = \ nodist_libmutter_clutter_@CLUTTER_API_VERSION@_la_SOURCES = \
$(backend_source_built) \ $(backend_source_built) \
$(built_source_c) \ $(built_source_c) \
$(built_source_h) $(built_source_h)
libmutter_clutter_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \ libmutter_clutter_@CLUTTER_API_VERSION@_la_LDFLAGS = \
$(CLUTTER_LINK_FLAGS) \ $(CLUTTER_LINK_FLAGS) \
$(CLUTTER_LT_LDFLAGS) \ $(CLUTTER_LT_LDFLAGS) \
-export-dynamic \ -export-dynamic \
@@ -630,13 +627,13 @@ install-exec-local:
rm -f $$lib.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION); \ rm -f $$lib.0.$(CLUTTER_LT_CURRENT).$(CLUTTER_LT_REVISION); \
) ; \ ) ; \
(cd $(DESTDIR)$(mutterlibdir) && \ (cd $(DESTDIR)$(mutterlibdir) && \
{ ln -s -f 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-$(LIBMUTTER_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) && \ (cd $(DESTDIR)$(mutterlibdir) && \
{ ln -s -f 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-$(LIBMUTTER_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 done
@@ -644,65 +641,59 @@ install-exec-local:
# gobject-introspection rules # gobject-introspection rules
-include $(INTROSPECTION_MAKEFILE) -include $(INTROSPECTION_MAKEFILE)
INTROSPECTION_SCANNER_ARGS = \ INTROSPECTION_SCANNER_ARGS = --add-include-path=$(top_builddir)/../cogl/cogl --add-include-path=$(top_builddir)/../cogl/cogl-pango
--add-include-path=$(top_builddir)/../cogl/cogl \ INTROSPECTION_COMPILER_ARGS = --includedir=$(top_builddir)/../cogl/cogl --includedir=$(top_builddir)/../cogl/cogl-pango
--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}
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_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = Clutter
Clutter_@LIBMUTTER_API_VERSION@_gir_VERSION = @LIBMUTTER_API_VERSION@ Clutter_@CLUTTER_API_VERSION_AM@_gir_VERSION = @CLUTTER_API_VERSION@
Clutter_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-clutter-@LIBMUTTER_API_VERSION@.la Clutter_@CLUTTER_API_VERSION_AM@_gir_LIBS = libmutter-clutter-@CLUTTER_API_VERSION@.la
Clutter_@LIBMUTTER_API_VERSION@_gir_FILES = \ Clutter_@CLUTTER_API_VERSION_AM@_gir_FILES = \
$(clutter_include_HEADERS) \ $(clutter_include_HEADERS) \
$(clutter_deprecated_HEADERS) \ $(clutter_deprecated_HEADERS) \
$(nodist_clutter_include_HEADERS) \ $(nodist_clutter_include_HEADERS) \
$(source_c) \ $(source_c) \
$(deprecated_c) \ $(deprecated_c) \
$(built_source_c) $(built_source_c)
Clutter_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS) Clutter_@CLUTTER_API_VERSION_AM@_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_@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_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \ Clutter_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
--warn-all \ --warn-all \
--c-include='clutter/clutter.h' \ --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_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = Cally
Cally_@LIBMUTTER_API_VERSION@_gir_VERSION = @LIBMUTTER_API_VERSION@ Cally_@CLUTTER_API_VERSION_AM@_gir_VERSION = @CLUTTER_API_VERSION@
Cally_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-clutter-@LIBMUTTER_API_VERSION@.la Cally_@CLUTTER_API_VERSION_AM@_gir_LIBS = libmutter-clutter-@CLUTTER_API_VERSION@.la
Cally_@LIBMUTTER_API_VERSION@_gir_FILES = $(cally_sources_h) $(cally_sources_c) Cally_@CLUTTER_API_VERSION_AM@_gir_FILES = $(cally_sources_h) $(cally_sources_c)
Cally_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS) Cally_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
Cally_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \ Cally_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
--warn-all \ --warn-all \
--c-include='cally/cally.h' \ --c-include='cally/cally.h' \
--pkg-export=mutter-cally-@LIBMUTTER_API_VERSION@ \ --pkg-export=mutter-cally-@CLUTTER_API_VERSION@ \
--include-uninstalled=$(top_builddir)/clutter/Clutter-@LIBMUTTER_API_VERSION@.gir --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_@CLUTTER_API_VERSION_AM@_gir_NAMESPACE = ClutterX11
ClutterX11_@LIBMUTTER_API_VERSION@_gir_INCLUDES = xlib-2.0 ClutterX11_@CLUTTER_API_VERSION_AM@_gir_INCLUDES = xlib-2.0
ClutterX11_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-clutter-@LIBMUTTER_API_VERSION@.la ClutterX11_@CLUTTER_API_VERSION_AM@_gir_LIBS = libmutter-clutter-@CLUTTER_API_VERSION@.la
ClutterX11_@LIBMUTTER_API_VERSION@_gir_FILES = $(x11_introspection) ClutterX11_@CLUTTER_API_VERSION_AM@_gir_FILES = $(x11_introspection)
ClutterX11_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS) ClutterX11_@CLUTTER_API_VERSION_AM@_gir_CFLAGS = $(AM_CPPFLAGS) $(CLUTTER_CFLAGS)
ClutterX11_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \ ClutterX11_@CLUTTER_API_VERSION_AM@_gir_SCANNERFLAGS = \
--warn-all \ --warn-all \
--c-include='clutter/x11/clutter-x11.h' \ --c-include='clutter/x11/clutter-x11.h' \
--pkg-export=mutter-clutter-x11-@LIBMUTTER_API_VERSION@ \ --pkg-export=mutter-clutter-x11-@CLUTTER_API_VERSION@ \
--include-uninstalled=$(top_builddir)/clutter/Clutter-@LIBMUTTER_API_VERSION@.gir --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 # INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
# install anything - we need to install inside our prefix. # install anything - we need to install inside our prefix.

View File

@@ -781,7 +781,7 @@ _cally_actor_get_top_level_origin (ClutterActor *actor,
"position of the stage"); "position of the stage");
} }
else else
#endif #else
{ {
static gboolean yet_warned = FALSE; 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."); "atk_component_get_extents() with ATK_XY_SCREEN.");
} }
} }
#endif
if (xp) if (xp)
*xp = x; *xp = x;

View File

@@ -401,7 +401,7 @@ clutter_canvas_emit_draw (ClutterCanvas *self)
gboolean res; gboolean res;
cairo_t *cr; cairo_t *cr;
g_assert (priv->height > 0 && priv->width > 0); g_assert (priv->width > 0 && priv->width > 0);
priv->dirty = TRUE; priv->dirty = TRUE;

View File

@@ -54,7 +54,6 @@
struct _ClutterClonePrivate struct _ClutterClonePrivate
{ {
ClutterActor *clone_source; ClutterActor *clone_source;
gulong source_destroy_id;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (ClutterClone, clutter_clone, CLUTTER_TYPE_ACTOR) 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); 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 static void
clutter_clone_set_source_internal (ClutterClone *self, clutter_clone_set_source_internal (ClutterClone *self,
ClutterActor *source) ClutterActor *source)
@@ -395,8 +387,6 @@ clutter_clone_set_source_internal (ClutterClone *self,
if (priv->clone_source != NULL) 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)); _clutter_actor_detach_clone (priv->clone_source, CLUTTER_ACTOR (self));
g_object_unref (priv->clone_source); g_object_unref (priv->clone_source);
priv->clone_source = NULL; priv->clone_source = NULL;
@@ -406,8 +396,6 @@ clutter_clone_set_source_internal (ClutterClone *self,
{ {
priv->clone_source = g_object_ref (source); priv->clone_source = g_object_ref (source);
_clutter_actor_attach_clone (priv->clone_source, CLUTTER_ACTOR (self)); _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]); g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_SOURCE]);

View File

@@ -48,7 +48,7 @@
#include "clutter-debug.h" #include "clutter-debug.h"
/* XXX - keep in sync with the ClutterStaticColor enumeration order */ /* XXX - keep in sync with the ClutterStaticColor enumeration order */
static const ClutterColor static_colors[] = { static const ClutterColor const static_colors[] = {
/* CGA/EGA color palette */ /* CGA/EGA color palette */
{ 0xff, 0xff, 0xff, 0xff }, /* white */ { 0xff, 0xff, 0xff, 0xff }, /* white */
{ 0x00, 0x00, 0x00, 0xff }, /* black */ { 0x00, 0x00, 0x00, 0xff }, /* black */

View File

@@ -154,15 +154,6 @@ struct _ClutterInputDeviceClass
guint *evdev_keycode); guint *evdev_keycode);
void (* update_from_tool) (ClutterInputDevice *device, void (* update_from_tool) (ClutterInputDevice *device,
ClutterInputDeviceTool *tool); 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 */ /* Platform-dependent interface */
@@ -197,10 +188,6 @@ void _clutter_device_manager_select_stage_events (ClutterDeviceMa
ClutterStage *stage); ClutterStage *stage);
ClutterBackend *_clutter_device_manager_get_backend (ClutterDeviceManager *device_manager); 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 */ /* input device */
gboolean _clutter_input_device_has_sequence (ClutterInputDevice *device, gboolean _clutter_input_device_has_sequence (ClutterInputDevice *device,
ClutterEventSequence *sequence); ClutterEventSequence *sequence);

View File

@@ -48,7 +48,6 @@
#include "clutter-private.h" #include "clutter-private.h"
#include "clutter-stage-private.h" #include "clutter-stage-private.h"
#include "clutter-virtual-input-device.h" #include "clutter-virtual-input-device.h"
#include "clutter-input-device-tool.h"
struct _ClutterDeviceManagerPrivate struct _ClutterDeviceManagerPrivate
{ {
@@ -71,7 +70,6 @@ enum
{ {
DEVICE_ADDED, DEVICE_ADDED,
DEVICE_REMOVED, DEVICE_REMOVED,
TOOL_CHANGED,
LAST_SIGNAL LAST_SIGNAL
}; };
@@ -186,16 +184,6 @@ clutter_device_manager_class_init (ClutterDeviceManagerClass *klass)
_clutter_marshal_VOID__OBJECT, _clutter_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_INPUT_DEVICE); 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 static void
@@ -470,20 +458,3 @@ clutter_device_manager_create_virtual_device (ClutterDeviceManager *device_man
return manager_class->create_virtual_device (device_manager, return manager_class->create_virtual_device (device_manager,
device_type); 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);
}

View File

@@ -83,14 +83,11 @@ struct _ClutterDeviceManagerClass
ClutterInputDevice *device); ClutterInputDevice *device);
void (* select_stage_events) (ClutterDeviceManager *manager, void (* select_stage_events) (ClutterDeviceManager *manager,
ClutterStage *stage); ClutterStage *stage);
ClutterVirtualInputDevice *(* create_virtual_device) (ClutterDeviceManager *device_manager, ClutterVirtualInputDevice *(* create_virtual_device) (ClutterDeviceManager *manager,
ClutterInputDeviceType device_type); ClutterInputDeviceType device_type);
void (* compress_motion) (ClutterDeviceManager *device_manger,
ClutterEvent *event,
const ClutterEvent *to_discard);
/* padding */ /* padding */
gpointer _padding[6]; gpointer _padding[7];
}; };
CLUTTER_AVAILABLE_IN_1_2 CLUTTER_AVAILABLE_IN_1_2

View File

@@ -1990,28 +1990,22 @@ clutter_event_remove_filter (guint id)
} }
/** /**
* clutter_event_get_touchpad_gesture_finger_count: * clutter_event_get_gesture_swipe_finger_count:
* @event: a touchpad swipe/pinch event * @event: a touchpad swipe event
* *
* Returns the number of fingers that is triggering the touchpad gesture. * 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 * Since: 1.24
**/ **/
guint 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 != NULL, 0);
g_return_val_if_fail (event->type == CLUTTER_TOUCHPAD_SWIPE || g_return_val_if_fail (event->type == CLUTTER_TOUCHPAD_SWIPE, 0);
event->type == CLUTTER_TOUCHPAD_PINCH, 0);
if (event->type == CLUTTER_TOUCHPAD_SWIPE)
return event->touchpad_swipe.n_fingers; return event->touchpad_swipe.n_fingers;
else if (event->type == CLUTTER_TOUCHPAD_PINCH)
return event->touchpad_pinch.n_fingers;
return 0;
} }
/** /**
@@ -2179,61 +2173,3 @@ clutter_event_get_mode_group (const ClutterEvent *event)
return 0; 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;
}

View File

@@ -459,7 +459,6 @@ struct _ClutterTouchpadPinchEvent
gfloat dy; gfloat dy;
gfloat angle_delta; gfloat angle_delta;
gfloat scale; gfloat scale;
guint n_fingers;
}; };
/** /**
@@ -508,7 +507,6 @@ struct _ClutterPadButtonEvent
guint32 button; guint32 button;
guint32 group; guint32 group;
ClutterInputDevice *device; ClutterInputDevice *device;
guint32 mode;
}; };
struct _ClutterPadStripEvent struct _ClutterPadStripEvent
@@ -524,7 +522,6 @@ struct _ClutterPadStripEvent
guint32 strip_number; guint32 strip_number;
guint32 group; guint32 group;
gdouble value; gdouble value;
guint32 mode;
}; };
struct _ClutterPadRingEvent struct _ClutterPadRingEvent
@@ -540,7 +537,6 @@ struct _ClutterPadRingEvent
guint32 ring_number; guint32 ring_number;
guint32 group; guint32 group;
gdouble angle; gdouble angle;
guint32 mode;
}; };
/** /**
@@ -756,7 +752,7 @@ CLUTTER_AVAILABLE_IN_1_2
const ClutterEvent * clutter_get_current_event (void); const ClutterEvent * clutter_get_current_event (void);
CLUTTER_AVAILABLE_IN_1_24 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 CLUTTER_AVAILABLE_IN_1_24
gdouble clutter_event_get_gesture_pinch_angle_delta (const ClutterEvent *event); 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 CLUTTER_AVAILABLE_IN_ALL
guint clutter_event_get_mode_group (const ClutterEvent *event); 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 G_END_DECLS

View File

@@ -2175,63 +2175,6 @@ clutter_input_device_get_n_mode_groups (ClutterInputDevice *device)
return device->n_mode_groups; 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 * const gchar *
clutter_input_device_get_device_node (ClutterInputDevice *device) clutter_input_device_get_device_node (ClutterInputDevice *device)
{ {
@@ -2243,15 +2186,10 @@ clutter_input_device_get_device_node (ClutterInputDevice *device)
ClutterInputDeviceMapping ClutterInputDeviceMapping
clutter_input_device_get_mapping_mode (ClutterInputDevice *device) clutter_input_device_get_mapping_mode (ClutterInputDevice *device)
{ {
ClutterInputDeviceType device_type;
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device),
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE); CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
g_return_val_if_fail (clutter_input_device_get_device_type (device) ==
device_type = clutter_input_device_get_device_type (device); CLUTTER_TABLET_DEVICE,
g_return_val_if_fail (device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE ||
device_type == CLUTTER_ERASER_DEVICE,
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE); CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE);
return device->mapping_mode; return device->mapping_mode;
@@ -2261,14 +2199,9 @@ void
clutter_input_device_set_mapping_mode (ClutterInputDevice *device, clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
ClutterInputDeviceMapping mapping) ClutterInputDeviceMapping mapping)
{ {
ClutterInputDeviceType device_type;
g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device)); g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
g_return_if_fail (clutter_input_device_get_device_type (device) ==
device_type = clutter_input_device_get_device_type (device); CLUTTER_TABLET_DEVICE);
g_return_if_fail (device_type == CLUTTER_TABLET_DEVICE ||
device_type == CLUTTER_PEN_DEVICE ||
device_type == CLUTTER_ERASER_DEVICE);
if (device->mapping_mode == mapping) if (device->mapping_mode == mapping)
return; return;
@@ -2276,13 +2209,3 @@ clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
device->mapping_mode = mapping; device->mapping_mode = mapping;
g_object_notify (G_OBJECT (device), "mapping-mode"); 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);
}

View File

@@ -147,18 +147,6 @@ gint clutter_input_device_get_n_strips (ClutterInputDev
CLUTTER_AVAILABLE_IN_ALL CLUTTER_AVAILABLE_IN_ALL
gint clutter_input_device_get_n_mode_groups (ClutterInputDevice *device); 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 CLUTTER_AVAILABLE_IN_ALL
const gchar * clutter_input_device_get_device_node (ClutterInputDevice *device); 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 CLUTTER_AVAILABLE_IN_ALL
void clutter_input_device_set_mapping_mode (ClutterInputDevice *device, void clutter_input_device_set_mapping_mode (ClutterInputDevice *device,
ClutterInputDeviceMapping mapping); ClutterInputDeviceMapping mapping);
CLUTTER_AVAILABLE_IN_ALL
gboolean clutter_input_device_is_grouped (ClutterInputDevice *device,
ClutterInputDevice *other_device);
G_END_DECLS G_END_DECLS

View File

@@ -719,8 +719,14 @@ clutter_get_text_direction (void)
} }
else else
{ {
/* Re-use GTK+'s LTR/RTL handling */ /* Translators: Leave this UNTRANSLATED if your language is
const char *e = g_dgettext ("gtk30", "default:LTR"); * 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) if (strcmp (e, "default:RTL") == 0)
dir = CLUTTER_TEXT_DIRECTION_RTL; dir = CLUTTER_TEXT_DIRECTION_RTL;

View File

@@ -23,7 +23,6 @@ VOID:OBJECT
VOID:OBJECT,FLAGS VOID:OBJECT,FLAGS
VOID:OBJECT,FLOAT,FLOAT VOID:OBJECT,FLOAT,FLOAT
VOID:OBJECT,FLOAT,FLOAT,FLAGS VOID:OBJECT,FLOAT,FLOAT,FLAGS
VOID:OBJECT,OBJECT
VOID:OBJECT,PARAM VOID:OBJECT,PARAM
VOID:OBJECT,POINTER VOID:OBJECT,POINTER
VOID:OBJECT,UINT VOID:OBJECT,UINT

View File

@@ -27,7 +27,6 @@ enum
PROP_LAYOUT, PROP_LAYOUT,
PROP_FRAMEBUFFER, PROP_FRAMEBUFFER,
PROP_OFFSCREEN,
PROP_LAST PROP_LAST
}; };
@@ -38,10 +37,6 @@ typedef struct _ClutterStageViewPrivate
{ {
cairo_rectangle_int_t layout; cairo_rectangle_int_t layout;
CoglFramebuffer *framebuffer; CoglFramebuffer *framebuffer;
CoglOffscreen *offscreen;
CoglPipeline *pipeline;
guint dirty_viewport : 1; guint dirty_viewport : 1;
guint dirty_projection : 1; guint dirty_projection : 1;
} ClutterStageViewPrivate; } ClutterStageViewPrivate;
@@ -64,83 +59,9 @@ clutter_stage_view_get_framebuffer (ClutterStageView *view)
ClutterStageViewPrivate *priv = ClutterStageViewPrivate *priv =
clutter_stage_view_get_instance_private (view); clutter_stage_view_get_instance_private (view);
if (priv->offscreen)
return priv->offscreen;
else
return priv->framebuffer; return priv->framebuffer;
} }
CoglFramebuffer *
clutter_stage_view_get_onscreen (ClutterStageView *view)
{
ClutterStageViewPrivate *priv =
clutter_stage_view_get_instance_private (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 gboolean
clutter_stage_view_is_dirty_viewport (ClutterStageView *view) clutter_stage_view_is_dirty_viewport (ClutterStageView *view)
{ {
@@ -179,35 +100,6 @@ clutter_stage_view_set_dirty_projection (ClutterStageView *view,
priv->dirty_projection = dirty; 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 static void
clutter_stage_view_get_property (GObject *object, clutter_stage_view_get_property (GObject *object,
guint prop_id, guint prop_id,
@@ -226,11 +118,6 @@ clutter_stage_view_get_property (GObject *object,
case PROP_FRAMEBUFFER: case PROP_FRAMEBUFFER:
g_value_set_boxed (value, priv->framebuffer); g_value_set_boxed (value, priv->framebuffer);
break; 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: case PROP_FRAMEBUFFER:
priv->framebuffer = g_value_dup_boxed (value); priv->framebuffer = g_value_dup_boxed (value);
break; 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); clutter_stage_view_get_instance_private (view);
g_clear_pointer (&priv->framebuffer, cogl_object_unref); 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 static void
clutter_stage_view_init (ClutterStageView *view) 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 static void
@@ -291,9 +164,6 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (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->get_property = clutter_stage_view_get_property;
object_class->set_property = clutter_stage_view_set_property; object_class->set_property = clutter_stage_view_set_property;
object_class->dispose = clutter_stage_view_dispose; object_class->dispose = clutter_stage_view_dispose;
@@ -309,19 +179,10 @@ clutter_stage_view_class_init (ClutterStageViewClass *klass)
obj_props[PROP_FRAMEBUFFER] = obj_props[PROP_FRAMEBUFFER] =
g_param_spec_boxed ("framebuffer", g_param_spec_boxed ("framebuffer",
"View framebuffer", "View framebuffer",
"The front buffer of the view", "The framebuffer of the view",
COGL_TYPE_HANDLE, COGL_TYPE_HANDLE,
G_PARAM_READWRITE | G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS); 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); g_object_class_install_properties (object_class, PROP_LAST, obj_props);
} }

View File

@@ -33,12 +33,6 @@ G_DECLARE_DERIVABLE_TYPE (ClutterStageView, clutter_stage_view,
struct _ClutterStageViewClass struct _ClutterStageViewClass
{ {
GObjectClass parent_class; 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 CLUTTER_AVAILABLE_IN_MUTTER
@@ -47,18 +41,6 @@ void clutter_stage_view_get_layout (ClutterStageView *view,
CLUTTER_AVAILABLE_IN_MUTTER CLUTTER_AVAILABLE_IN_MUTTER
CoglFramebuffer *clutter_stage_view_get_framebuffer (ClutterStageView *view); 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); 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, void clutter_stage_view_set_dirty_projection (ClutterStageView *view,
gboolean dirty); gboolean dirty);
CLUTTER_AVAILABLE_IN_MUTTER
void clutter_stage_view_get_offscreen_transformation_matrix (ClutterStageView *view,
CoglMatrix *matrix);
#endif /* __CLUTTER_STAGE_VIEW_H__ */ #endif /* __CLUTTER_STAGE_VIEW_H__ */

View File

@@ -971,7 +971,6 @@ _clutter_stage_process_queued_events (ClutterStage *stage)
ClutterEvent *next_event; ClutterEvent *next_event;
ClutterInputDevice *device; ClutterInputDevice *device;
ClutterInputDevice *next_device; ClutterInputDevice *next_device;
ClutterInputDeviceType device_type;
gboolean check_device = FALSE; gboolean check_device = FALSE;
event = l->data; event = l->data;
@@ -987,16 +986,8 @@ _clutter_stage_process_queued_events (ClutterStage *stage)
if (device != NULL && next_device != NULL) if (device != NULL && next_device != NULL)
check_device = TRUE; check_device = TRUE;
device_type = clutter_input_device_get_device_type (device); /* Skip consecutive motion events coming from the same device */
if (priv->throttle_motion_events && next_event != NULL)
/* 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)
{ {
if (event->type == CLUTTER_MOTION && if (event->type == CLUTTER_MOTION &&
(next_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", "Omitting motion event at %d, %d",
(int) event->motion.x, (int) event->motion.x,
(int) event->motion.y); (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; goto next_event;
} }
else if (event->type == CLUTTER_TOUCH_UPDATE && else if (event->type == CLUTTER_TOUCH_UPDATE &&
@@ -1413,6 +1394,8 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
view_layout.height); view_layout.height);
_clutter_stage_window_get_dirty_pixel (priv->impl, view, &dirty_x, &dirty_y); _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))) if (G_LIKELY (!(clutter_pick_debug_flags & CLUTTER_DEBUG_DUMP_PICK_BUFFERS)))
{ {
@@ -1463,8 +1446,8 @@ _clutter_stage_do_pick_on_view (ClutterStage *stage,
used. The format is requested as pre-multiplied because Cogl used. The format is requested as pre-multiplied because Cogl
assumes that all pixels in the framebuffer are premultiplied so assumes that all pixels in the framebuffer are premultiplied so
it avoids a conversion. */ it avoids a conversion. */
cogl_framebuffer_read_pixels (fb, cogl_read_pixels (read_x, read_y, 1, 1,
read_x, read_y, 1, 1, COGL_READ_PIXELS_COLOR_BUFFER,
COGL_PIXEL_FORMAT_RGBA_8888_PRE, COGL_PIXEL_FORMAT_RGBA_8888_PRE,
pixel); pixel);
@@ -4693,7 +4676,6 @@ capture_view (ClutterStage *stage,
uint8_t *data; uint8_t *data;
int stride; int stride;
CoglBitmap *bitmap; CoglBitmap *bitmap;
cairo_rectangle_int_t view_layout;
framebuffer = clutter_stage_view_get_framebuffer (view); framebuffer = clutter_stage_view_get_framebuffer (view);
@@ -4718,11 +4700,8 @@ capture_view (ClutterStage *stage,
stride, stride,
data); data);
clutter_stage_view_get_layout (view, &view_layout);
cogl_framebuffer_read_pixels_into_bitmap (framebuffer, cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
rect->x - view_layout.x, rect->x, rect->y,
rect->y - view_layout.y,
COGL_READ_PIXELS_COLOR_BUFFER, COGL_READ_PIXELS_COLOR_BUFFER,
bitmap); bitmap);

View File

@@ -37,7 +37,6 @@
#include "clutter-stage-cogl.h" #include "clutter-stage-cogl.h"
#include <stdlib.h> #include <stdlib.h>
#include <math.h>
#include "clutter-actor-private.h" #include "clutter-actor-private.h"
#include "clutter-backend-private.h" #include "clutter-backend-private.h"
@@ -358,7 +357,7 @@ swap_framebuffer (ClutterStageWindow *stage_window,
cairo_rectangle_int_t *swap_region, cairo_rectangle_int_t *swap_region,
gboolean swap_with_damage) gboolean swap_with_damage)
{ {
CoglFramebuffer *framebuffer = clutter_stage_view_get_onscreen (view); CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
int damage[4], ndamage; int damage[4], ndamage;
damage[0] = swap_region->x; damage[0] = swap_region->x;
@@ -420,12 +419,6 @@ paint_stage (ClutterStageCogl *stage_cogl,
_clutter_stage_maybe_setup_viewport (stage, view); _clutter_stage_maybe_setup_viewport (stage, view);
_clutter_stage_paint_view (stage, view, clip); _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 static void
@@ -445,42 +438,6 @@ fill_current_damage_history_and_step (ClutterStageView *view)
view_priv->damage_index++; 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 static gboolean
clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window, clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
ClutterStageView *view) ClutterStageView *view)
@@ -751,12 +708,6 @@ clutter_stage_cogl_redraw_view (ClutterStageWindow *stage_window,
if (do_swap_buffer) 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, return swap_framebuffer (stage_window,
view, view,
&swap_region, &swap_region,
@@ -806,9 +757,7 @@ clutter_stage_cogl_get_dirty_pixel (ClutterStageWindow *stage_window,
int *x, int *x,
int *y) int *y)
{ {
CoglFramebuffer *framebuffer = clutter_stage_view_get_framebuffer (view);
gboolean has_buffer_age = gboolean has_buffer_age =
cogl_is_onscreen (framebuffer) &&
cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE); cogl_clutter_winsys_has_feature (COGL_WINSYS_FEATURE_BUFFER_AGE);
cairo_rectangle_int_t *rect; 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); ClutterStageViewCogl *view_cogl = CLUTTER_STAGE_VIEW_COGL (view);
ClutterStageViewCoglPrivate *view_priv = ClutterStageViewCoglPrivate *view_priv =
clutter_stage_view_cogl_get_instance_private (view_cogl); 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)]; rect = &view_priv->damage_history[DAMAGE_HISTORY (view_priv->damage_index - 1)];
*x = rect->x - view_layout.x; *x = rect->x;
*y = rect->y - view_layout.y; *y = rect->y;
} }
} }

View File

@@ -102,9 +102,6 @@ struct _ClutterDeviceManagerEvdevPrivate
gpointer constrain_data; gpointer constrain_data;
GDestroyNotify constrain_data_notify; GDestroyNotify constrain_data_notify;
ClutterRelativeMotionFilter relative_motion_filter;
gpointer relative_motion_filter_user_data;
ClutterStageManager *stage_manager; ClutterStageManager *stage_manager;
guint stage_added_handler; guint stage_added_handler;
guint stage_removed_handler; guint stage_removed_handler;
@@ -127,7 +124,6 @@ G_DEFINE_TYPE_WITH_CODE (ClutterDeviceManagerEvdev,
static ClutterOpenDeviceCallback device_open_callback; static ClutterOpenDeviceCallback device_open_callback;
static ClutterCloseDeviceCallback device_close_callback; static ClutterCloseDeviceCallback device_close_callback;
static gpointer device_callback_data; static gpointer device_callback_data;
static gchar * evdev_seat_id;
#ifdef CLUTTER_ENABLE_DEBUG #ifdef CLUTTER_ENABLE_DEBUG
static const char *device_type_str[] = { 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 * static ClutterEvent *
new_absolute_motion_event (ClutterInputDevice *input_device, 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); _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
event->motion.x = x; event->motion.x = x;
event->motion.y = y; event->motion.y = y;
clutter_input_device_evdev_translate_coordinates (input_device, stage,
&event->motion.x,
&event->motion.y);
event->motion.axes = axes; event->motion.axes = axes;
clutter_event_set_source_device (event, input_device); clutter_event_set_source_device (event, input_device);
@@ -377,23 +354,11 @@ notify_relative_tool_motion (ClutterInputDevice *input_device,
gfloat dy, gfloat dy,
gdouble *axes) gdouble *axes)
{ {
ClutterInputDeviceEvdev *device_evdev;
ClutterEvent *event; ClutterEvent *event;
ClutterSeatEvdev *seat;
gfloat x, y; 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; x = input_device->current_x + dx;
y = input_device->current_y + dy; 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); event = new_absolute_motion_event (input_device, time_us, x, y, axes);
_clutter_evdev_event_set_relative_motion (event, dx, dy, 0, 0); _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.device = seat->core_pointer;
event->touch.x = x; event->touch.x = x;
event->touch.y = y; 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 */ /* "NULL" sequences are special cased in clutter */
event->touch.sequence = GINT_TO_POINTER (slot + 1); event->touch.sequence = GINT_TO_POINTER (slot + 1);
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state); _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
@@ -569,8 +530,7 @@ notify_pinch_gesture_event (ClutterInputDevice *input_device,
gdouble dx, gdouble dx,
gdouble dy, gdouble dy,
gdouble angle_delta, gdouble angle_delta,
gdouble scale, gdouble scale)
guint n_fingers)
{ {
ClutterInputDeviceEvdev *device_evdev; ClutterInputDeviceEvdev *device_evdev;
ClutterSeatEvdev *seat; ClutterSeatEvdev *seat;
@@ -601,7 +561,6 @@ notify_pinch_gesture_event (ClutterInputDevice *input_device,
event->touchpad_pinch.dy = dy; event->touchpad_pinch.dy = dy;
event->touchpad_pinch.angle_delta = angle_delta; event->touchpad_pinch.angle_delta = angle_delta;
event->touchpad_pinch.scale = scale; event->touchpad_pinch.scale = scale;
event->touchpad_pinch.n_fingers = n_fingers;
_clutter_xkb_translate_state (event, seat->xkb, seat->button_state); _clutter_xkb_translate_state (event, seat->xkb, seat->button_state);
@@ -699,7 +658,6 @@ notify_pad_button (ClutterInputDevice *input_device,
guint64 time_us, guint64 time_us,
guint32 button, guint32 button,
guint32 mode_group, guint32 mode_group,
guint32 mode,
guint32 pressed) guint32 pressed)
{ {
ClutterInputDeviceEvdev *device_evdev; ClutterInputDeviceEvdev *device_evdev;
@@ -725,7 +683,6 @@ notify_pad_button (ClutterInputDevice *input_device,
event->pad_button.stage = stage; event->pad_button.stage = stage;
event->pad_button.button = button; event->pad_button.button = button;
event->pad_button.group = mode_group; event->pad_button.group = mode_group;
event->pad_button.mode = mode;
clutter_event_set_device (event, input_device); clutter_event_set_device (event, input_device);
clutter_event_set_source_device (event, input_device); clutter_event_set_source_device (event, input_device);
clutter_event_set_time (event, us2ms (time_us)); clutter_event_set_time (event, us2ms (time_us));
@@ -741,7 +698,6 @@ notify_pad_strip (ClutterInputDevice *input_device,
guint32 strip_number, guint32 strip_number,
guint32 strip_source, guint32 strip_source,
guint32 mode_group, guint32 mode_group,
guint32 mode,
gdouble value) gdouble value)
{ {
ClutterInputDeviceEvdev *device_evdev; ClutterInputDeviceEvdev *device_evdev;
@@ -771,7 +727,6 @@ notify_pad_strip (ClutterInputDevice *input_device,
event->pad_strip.strip_number = strip_number; event->pad_strip.strip_number = strip_number;
event->pad_strip.value = value; event->pad_strip.value = value;
event->pad_strip.group = mode_group; event->pad_strip.group = mode_group;
event->pad_strip.mode = mode;
clutter_event_set_device (event, input_device); clutter_event_set_device (event, input_device);
clutter_event_set_source_device (event, input_device); clutter_event_set_source_device (event, input_device);
clutter_event_set_time (event, us2ms (time_us)); clutter_event_set_time (event, us2ms (time_us));
@@ -787,7 +742,6 @@ notify_pad_ring (ClutterInputDevice *input_device,
guint32 ring_number, guint32 ring_number,
guint32 ring_source, guint32 ring_source,
guint32 mode_group, guint32 mode_group,
guint32 mode,
gdouble angle) gdouble angle)
{ {
ClutterInputDeviceEvdev *device_evdev; ClutterInputDeviceEvdev *device_evdev;
@@ -817,7 +771,6 @@ notify_pad_ring (ClutterInputDevice *input_device,
event->pad_ring.ring_number = ring_number; event->pad_ring.ring_number = ring_number;
event->pad_ring.angle = angle; event->pad_ring.angle = angle;
event->pad_ring.group = mode_group; event->pad_ring.group = mode_group;
event->pad_ring.mode = mode;
clutter_event_set_device (event, input_device); clutter_event_set_device (event, input_device);
clutter_event_set_source_device (event, input_device); clutter_event_set_source_device (event, input_device);
clutter_event_set_time (event, us2ms (time_us)); 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 * which are located on the main seat. Make whatever seat comes first the
* main seat. */ * main seat. */
if (priv->main_seat->libinput_seat == NULL) if (priv->main_seat->libinput_seat == NULL)
{
seat = priv->main_seat; seat = priv->main_seat;
}
else else
{
seat = clutter_seat_evdev_new (manager_evdev); seat = clutter_seat_evdev_new (manager_evdev);
}
clutter_seat_evdev_set_libinput_seat (seat, libinput_seat); clutter_seat_evdev_set_libinput_seat (seat, libinput_seat);
priv->seats = g_slist_append (priv->seats, 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; evdev_device->last_tool = tool;
g_signal_emit_by_name (clutter_device_manager_get_default (),
"tool-changed", input_device, tool);
}
} }
static gdouble * static gdouble *
translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event, translate_tablet_axes (struct libinput_event_tablet_tool *tablet_event)
ClutterInputDeviceTool *tool)
{ {
GArray *axes = g_array_new (FALSE, FALSE, sizeof (gdouble)); GArray *axes = g_array_new (FALSE, FALSE, sizeof (gdouble));
struct libinput_tablet_tool *libinput_tool; 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)) if (libinput_tablet_tool_has_pressure (libinput_tool))
{ {
value = libinput_event_tablet_tool_get_pressure (tablet_event); 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); g_array_append_val (axes, value);
} }
@@ -1671,7 +1621,6 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
struct libinput_event_gesture *gesture_event = struct libinput_event_gesture *gesture_event =
libinput_event_get_gesture_event (event); libinput_event_get_gesture_event (event);
ClutterTouchpadGesturePhase phase; ClutterTouchpadGesturePhase phase;
guint n_fingers;
guint64 time_us; guint64 time_us;
if (libinput_event_get_type (event) == LIBINPUT_EVENT_GESTURE_PINCH_BEGIN) 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) ? phase = libinput_event_gesture_get_cancelled (gesture_event) ?
CLUTTER_TOUCHPAD_GESTURE_PHASE_CANCEL : CLUTTER_TOUCHPAD_GESTURE_PHASE_END; 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); device = libinput_device_get_user_data (libinput_device);
time_us = libinput_event_gesture_get_time_usec (gesture_event); 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; break;
} }
case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE: case LIBINPUT_EVENT_GESTURE_PINCH_UPDATE:
@@ -1691,10 +1639,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
struct libinput_event_gesture *gesture_event = struct libinput_event_gesture *gesture_event =
libinput_event_get_gesture_event (event); libinput_event_get_gesture_event (event);
gdouble angle_delta, scale, dx, dy; gdouble angle_delta, scale, dx, dy;
guint n_fingers;
guint64 time_us; guint64 time_us;
n_fingers = libinput_event_gesture_get_finger_count (gesture_event);
device = libinput_device_get_user_data (libinput_device); device = libinput_device_get_user_data (libinput_device);
time_us = libinput_event_gesture_get_time_usec (gesture_event); time_us = libinput_event_gesture_get_time_usec (gesture_event);
angle_delta = libinput_event_gesture_get_angle_delta (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, notify_pinch_gesture_event (device,
CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE, CLUTTER_TOUCHPAD_GESTURE_PHASE_UPDATE,
time_us, dx, dy, angle_delta, scale, n_fingers); time_us, dx, dy, angle_delta, scale);
break; break;
} }
case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN: case LIBINPUT_EVENT_GESTURE_SWIPE_BEGIN:
@@ -1765,8 +1711,7 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
if (!stage) if (!stage)
break; break;
axes = translate_tablet_axes (tablet_event, axes = translate_tablet_axes (tablet_event);
evdev_device->last_tool);
if (!axes) if (!axes)
break; break;
@@ -1806,11 +1751,8 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
libinput_tool = libinput_event_tablet_tool_get_tool (tablet_event); 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); 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; break;
} }
case LIBINPUT_EVENT_TABLET_TOOL_BUTTON: case LIBINPUT_EVENT_TABLET_TOOL_BUTTON:
@@ -1852,7 +1794,7 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
case LIBINPUT_EVENT_TABLET_PAD_BUTTON: case LIBINPUT_EVENT_TABLET_PAD_BUTTON:
{ {
guint64 time; guint64 time;
guint32 button_state, button, group, mode; guint32 button_state, button, group;
struct libinput_tablet_pad_mode_group *mode_group; struct libinput_tablet_pad_mode_group *mode_group;
struct libinput_event_tablet_pad *pad_event = struct libinput_event_tablet_pad *pad_event =
libinput_event_get_tablet_pad_event (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); mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
group = libinput_tablet_pad_mode_group_get_index (mode_group); 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 = libinput_event_tablet_pad_get_button_number (pad_event);
button_state = libinput_event_tablet_pad_get_button_state (pad_event) == button_state = libinput_event_tablet_pad_get_button_state (pad_event) ==
LIBINPUT_BUTTON_STATE_PRESSED; LIBINPUT_BUTTON_STATE_PRESSED;
notify_pad_button (device, time, button, group, mode, button_state); notify_pad_button (device, time, button, group, button_state);
break; break;
} }
case LIBINPUT_EVENT_TABLET_PAD_STRIP: case LIBINPUT_EVENT_TABLET_PAD_STRIP:
{ {
guint64 time; guint64 time;
guint32 number, source, group, mode; guint32 number, source, group;
struct libinput_tablet_pad_mode_group *mode_group; struct libinput_tablet_pad_mode_group *mode_group;
struct libinput_event_tablet_pad *pad_event = struct libinput_event_tablet_pad *pad_event =
libinput_event_get_tablet_pad_event (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); mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
group = libinput_tablet_pad_mode_group_get_index (mode_group); 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; break;
} }
case LIBINPUT_EVENT_TABLET_PAD_RING: case LIBINPUT_EVENT_TABLET_PAD_RING:
{ {
guint64 time; guint64 time;
guint32 number, source, group, mode; guint32 number, source, group;
struct libinput_tablet_pad_mode_group *mode_group; struct libinput_tablet_pad_mode_group *mode_group;
struct libinput_event_tablet_pad *pad_event = struct libinput_event_tablet_pad *pad_event =
libinput_event_get_tablet_pad_event (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); mode_group = libinput_event_tablet_pad_get_mode_group (pad_event);
group = libinput_tablet_pad_mode_group_get_index (mode_group); 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; break;
} }
default: default:
@@ -2035,31 +1974,6 @@ clutter_device_manager_evdev_create_virtual_device (ClutterDeviceManager *manag
NULL); 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 * GObject implementation
*/ */
@@ -2093,8 +2007,7 @@ clutter_device_manager_evdev_constructed (GObject *gobject)
return; return;
} }
if (libinput_udev_assign_seat (priv->libinput, if (libinput_udev_assign_seat (priv->libinput, "seat0") == -1)
evdev_seat_id ? evdev_seat_id : "seat0") == -1)
{ {
g_critical ("Failed to assign a seat to the libinput object."); g_critical ("Failed to assign a seat to the libinput object.");
libinput_unref (priv->libinput); 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_core_device = clutter_device_manager_evdev_get_core_device;
manager_class->get_device = clutter_device_manager_evdev_get_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->create_virtual_device = clutter_device_manager_evdev_create_virtual_device;
manager_class->compress_motion = clutter_device_manager_evdev_compress_motion;
} }
static void static void
@@ -2327,12 +2239,6 @@ _clutter_device_manager_evdev_acquire_device_id (ClutterDeviceManagerEvdev *mana
return next_id; return next_id;
} }
void
_clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev)
{
dispatch_libinput (manager_evdev);
}
static int static int
compare_ids (gconstpointer a, compare_ids (gconstpointer a,
gconstpointer b) 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); 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: * clutter_evdev_set_pointer_constrain_callback:
* @evdev: the #ClutterDeviceManager created by the evdev backend * @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; 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: * clutter_evdev_set_keyboard_repeat:
* @evdev: the #ClutterDeviceManager created by the evdev backend * @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); 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);
}

View File

@@ -76,15 +76,6 @@ void _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev
float *new_x, float *new_x,
float *new_y); 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 static inline guint64
us (guint64 us) us (guint64 us)
{ {

View File

@@ -57,9 +57,6 @@ void clutter_evdev_set_device_callbacks (ClutterOpenDeviceCallback open_callba
ClutterCloseDeviceCallback close_callback, ClutterCloseDeviceCallback close_callback,
gpointer user_data); gpointer user_data);
CLUTTER_AVAILABLE_IN_ALL
void clutter_evdev_set_seat_id (const gchar *seat_id);
CLUTTER_AVAILABLE_IN_1_10 CLUTTER_AVAILABLE_IN_1_10
void clutter_evdev_release_devices (void); void clutter_evdev_release_devices (void);
CLUTTER_AVAILABLE_IN_1_10 CLUTTER_AVAILABLE_IN_1_10
@@ -97,18 +94,6 @@ void clutter_evdev_set_pointer_constrain_callback (ClutterDeviceManager
gpointer user_data, gpointer user_data,
GDestroyNotify user_data_notify); 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 CLUTTER_AVAILABLE_IN_1_16
void clutter_evdev_set_keyboard_map (ClutterDeviceManager *evdev, void clutter_evdev_set_keyboard_map (ClutterDeviceManager *evdev,
struct xkb_keymap *keymap); struct xkb_keymap *keymap);
@@ -120,10 +105,6 @@ CLUTTER_AVAILABLE_IN_1_20
void clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev, void clutter_evdev_set_keyboard_layout_index (ClutterDeviceManager *evdev,
xkb_layout_index_t idx); 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 CLUTTER_AVAILABLE_IN_1_18
void clutter_evdev_set_keyboard_repeat (ClutterDeviceManager *evdev, void clutter_evdev_set_keyboard_repeat (ClutterDeviceManager *evdev,
gboolean repeat, gboolean repeat,
@@ -165,14 +146,6 @@ gboolean clutter_evdev_event_get_relative_motion (const ClutterEvent *event,
double *dx_unaccel, double *dx_unaccel,
double *dy_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 G_END_DECLS
#endif /* __CLUTTER_EVDEV_H__ */ #endif /* __CLUTTER_EVDEV_H__ */

View File

@@ -35,8 +35,6 @@
#include "clutter-input-device-evdev.h" #include "clutter-input-device-evdev.h"
#include "clutter-device-manager-evdev.h" #include "clutter-device-manager-evdev.h"
#include "cairo-gobject.h"
typedef struct _ClutterInputDeviceClass ClutterInputDeviceEvdevClass; typedef struct _ClutterInputDeviceClass ClutterInputDeviceEvdevClass;
#define clutter_input_device_evdev_get_type _clutter_input_device_evdev_get_type #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_input_device_evdev,
CLUTTER_TYPE_INPUT_DEVICE) 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 static void
clutter_input_device_evdev_finalize (GObject *object) 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); 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 static gboolean
clutter_input_device_evdev_keycode_to_evdev (ClutterInputDevice *device, clutter_input_device_evdev_keycode_to_evdev (ClutterInputDevice *device,
guint hardware_keycode, 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)) if (libinput_tablet_tool_has_slider (evdev_tool->tool))
_clutter_input_device_add_axis (device, CLUTTER_INPUT_AXIS_SLIDER, -1, 1, 0); _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)); 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 static void
clutter_input_device_evdev_class_init (ClutterInputDeviceEvdevClass *klass) clutter_input_device_evdev_class_init (ClutterInputDeviceEvdevClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = clutter_input_device_evdev_finalize; 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->keycode_to_evdev = clutter_input_device_evdev_keycode_to_evdev;
klass->update_from_tool = clutter_input_device_evdev_update_from_tool; 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 static void
clutter_input_device_evdev_init (ClutterInputDeviceEvdev *self) 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; gchar *vendor, *product;
gint device_id, n_rings = 0, n_strips = 0, n_groups = 1; gint device_id, n_rings = 0, n_strips = 0, n_groups = 1;
gchar *node_path; gchar *node_path;
gdouble width, height;
type = _clutter_input_device_evdev_determine_type (libinput_device); type = _clutter_input_device_evdev_determine_type (libinput_device);
vendor = g_strdup_printf ("%.4x", libinput_device_get_id_vendor (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 (vendor);
g_free (product); g_free (product);
if (libinput_device_get_size (libinput_device, &width, &height) == 0)
device->device_aspect_ratio = width / height;
return CLUTTER_INPUT_DEVICE (device); return CLUTTER_INPUT_DEVICE (device);
} }
@@ -442,39 +313,3 @@ clutter_evdev_event_sequence_get_slot (const ClutterEventSequence *sequence)
return GPOINTER_TO_INT (sequence) - 1; 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;
}

View File

@@ -66,10 +66,6 @@ struct _ClutterInputDeviceEvdev
struct libinput_device *libinput_device; struct libinput_device *libinput_device;
ClutterSeatEvdev *seat; ClutterSeatEvdev *seat;
ClutterInputDeviceTool *last_tool; 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; 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 dx_unaccel,
double dy_unaccel); double dy_unaccel);
void clutter_input_device_evdev_translate_coordinates (ClutterInputDevice *device,
ClutterStage *stage,
gfloat *x,
gfloat *y);
G_END_DECLS G_END_DECLS
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_H__ */ #endif /* __CLUTTER_INPUT_DEVICE_EVDEV_H__ */

View File

@@ -26,7 +26,6 @@
#endif #endif
#include "clutter-input-device-tool-evdev.h" #include "clutter-input-device-tool-evdev.h"
#include "clutter-evdev.h"
G_DEFINE_TYPE (ClutterInputDeviceToolEvdev, clutter_input_device_tool_evdev, G_DEFINE_TYPE (ClutterInputDeviceToolEvdev, clutter_input_device_tool_evdev,
CLUTTER_TYPE_INPUT_DEVICE_TOOL) 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); ClutterInputDeviceToolEvdev *tool = CLUTTER_INPUT_DEVICE_TOOL_EVDEV (object);
g_hash_table_unref (tool->button_map);
libinput_tablet_tool_unref (tool->tool); libinput_tablet_tool_unref (tool->tool);
G_OBJECT_CLASS (clutter_input_device_tool_evdev_parent_class)->finalize (object); 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 static void
clutter_input_device_tool_evdev_init (ClutterInputDeviceToolEvdev *tool) clutter_input_device_tool_evdev_init (ClutterInputDeviceToolEvdev *tool)
{ {
tool->button_map = g_hash_table_new (NULL, NULL);
} }
ClutterInputDeviceTool * ClutterInputDeviceTool *
@@ -73,96 +70,3 @@ clutter_input_device_tool_evdev_new (struct libinput_tablet_tool *tool,
return CLUTTER_INPUT_DEVICE_TOOL (evdev_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)));
}

View File

@@ -59,8 +59,6 @@ struct _ClutterInputDeviceToolEvdev
{ {
ClutterInputDeviceTool parent_instance; ClutterInputDeviceTool parent_instance;
struct libinput_tablet_tool *tool; struct libinput_tablet_tool *tool;
GHashTable *button_map;
gdouble pressure_curve[4];
}; };
struct _ClutterInputDeviceToolEvdevClass struct _ClutterInputDeviceToolEvdevClass
@@ -74,11 +72,6 @@ ClutterInputDeviceTool * clutter_input_device_tool_evdev_new (struct libinp
guint64 serial, guint64 serial,
ClutterInputDeviceToolType type); 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 G_END_DECLS
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_TOOL_H__ */ #endif /* __CLUTTER_INPUT_DEVICE_EVDEV_TOOL_H__ */

View File

@@ -32,7 +32,6 @@
#include "clutter-event-private.h" #include "clutter-event-private.h"
#include "clutter-input-device-evdev.h" #include "clutter-input-device-evdev.h"
#include "clutter-input-device-tool-evdev.h"
#include "clutter-main.h" #include "clutter-main.h"
/* Try to keep the pointer inside the stage. Hopefully no one is using /* Try to keep the pointer inside the stage. Hopefully no one is using
@@ -186,19 +185,15 @@ keyboard_repeat (gpointer data)
{ {
ClutterSeatEvdev *seat = data; ClutterSeatEvdev *seat = data;
GSource *source; GSource *source;
guint32 time_ms;
/* 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;
g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE); g_return_val_if_fail (seat->repeat_device != NULL, G_SOURCE_REMOVE);
source = g_main_context_find_source_by_id (NULL, seat->repeat_timer); 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, clutter_seat_evdev_notify_key (seat,
seat->repeat_device, seat->repeat_device,
g_source_get_time (source), ms2us (time_ms),
seat->repeat_key, seat->repeat_key,
AUTOREPEAT_VALUE, AUTOREPEAT_VALUE,
FALSE); FALSE);
@@ -405,13 +400,6 @@ clutter_seat_evdev_notify_relative_motion (ClutterSeatEvdev *seat,
if (!_clutter_input_device_get_stage (input_device)) if (!_clutter_input_device_get_stage (input_device))
return; 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_x = seat->pointer_x + dx;
new_y = seat->pointer_y + dy; new_y = seat->pointer_y + dy;
event = new_absolute_motion_event (seat, input_device, event = new_absolute_motion_event (seat, input_device,
@@ -433,7 +421,7 @@ void clutter_seat_evdev_notify_absolute_motion (ClutterSeatEvdev *seat,
{ {
ClutterEvent *event; 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); queue_event (event);
} }
@@ -445,7 +433,6 @@ clutter_seat_evdev_notify_button (ClutterSeatEvdev *seat,
uint32_t button, uint32_t button,
uint32_t state) uint32_t state)
{ {
ClutterInputDeviceEvdev *device_evdev = (ClutterInputDeviceEvdev *) input_device;
ClutterStage *stage; ClutterStage *stage;
ClutterEvent *event = NULL; ClutterEvent *event = NULL;
gint button_nr; 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_device (event, seat->core_pointer);
clutter_event_set_source_device (event, input_device); 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); _clutter_evdev_event_set_event_code (event, button);
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE) 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_tool (event, device_evdev->last_tool);
clutter_event_set_device (event, input_device); clutter_event_set_device (event, input_device);
} }

View File

@@ -71,10 +71,18 @@ update_button_count (ClutterVirtualInputDeviceEvdev *virtual_evdev,
uint32_t state) uint32_t state)
{ {
if (state) if (state)
{
return ++virtual_evdev->button_count[button]; return ++virtual_evdev->button_count[button];
}
else else
{
/* 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]; return --virtual_evdev->button_count[button];
} }
}
static EvdevButtonType static EvdevButtonType
get_button_type (uint16_t code) get_button_type (uint16_t code)
@@ -124,9 +132,6 @@ release_pressed_buttons (ClutterVirtualInputDevice *virtual_device)
for (code = 0; code < G_N_ELEMENTS (virtual_evdev->button_count); code++) 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)) switch (get_button_type (code))
{ {
case EVDEV_BUTTON_TYPE_KEY: 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); 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, g_warning ("Received multiple virtual 0x%x button presses (ignoring)",
button_state == CLUTTER_BUTTON_STATE_PRESSED ? "presses" : "releases"); button);
update_button_count (virtual_evdev, button, 1 - button_state);
return; return;
} }
@@ -229,11 +233,10 @@ clutter_virtual_input_device_evdev_notify_key (ClutterVirtualInputDevice *virtua
} }
key_count = update_button_count (virtual_evdev, key, key_state); 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, g_warning ("Received multiple virtual 0x%x key presses (ignoring)",
key_state == CLUTTER_KEY_STATE_PRESSED ? "presses" : "releases"); key);
update_button_count (virtual_evdev, key, 1 - key_state);
return; return;
} }
@@ -360,11 +363,10 @@ clutter_virtual_input_device_evdev_notify_keyval (ClutterVirtualInputDevice *vir
} }
key_count = update_button_count (virtual_evdev, evcode, key_state); 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, g_warning ("Received multiple virtual 0x%x key presses (ignoring)",
key_state == CLUTTER_KEY_STATE_PRESSED ? "presses" : "releases"); keycode);
update_button_count (virtual_evdev, evcode, 1 - key_state);
return; return;
} }

View File

@@ -3,8 +3,8 @@ exec_prefix=@exec_prefix@
libdir=@libdir@/mutter libdir=@libdir@/mutter
includedir=@includedir@/mutter includedir=@includedir@/mutter
apiversion=@LIBMUTTER_API_VERSION@ apiversion=@CLUTTER_API_VERSION@
requires=@CLUTTER_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@ requires=@CLUTTER_REQUIRES@ mutter-cogl-1.0
requires_private=@CLUTTER_REQUIRES_PRIVATE@ requires_private=@CLUTTER_REQUIRES_PRIVATE@
backends=@CLUTTER_BACKENDS@ backends=@CLUTTER_BACKENDS@
@@ -17,7 +17,7 @@ cogl_driver=deprecated
Name: Mutter Clutter Name: Mutter Clutter
Description: Mutter's Clutter Private Library Description: Mutter's Clutter Private Library
Version: @MUTTER_VERSION@ Version: @VERSION@
Libs: -L${libdir} -lmutter-clutter-${apiversion} Libs: -L${libdir} -lmutter-clutter-${apiversion}
Cflags: -I${includedir}/clutter-${apiversion} Cflags: -I${includedir}/clutter-${apiversion}
Requires: ${requires} Requires: ${requires}

View File

@@ -29,8 +29,6 @@
#include "clutter-backend-x11.h" #include "clutter-backend-x11.h"
#include "clutter-input-device-xi2.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-stage-x11.h"
#include "clutter-backend.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) #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 Atom clutter_input_axis_atoms[N_AXIS_ATOMS] = { 0, };
static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface); static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
@@ -367,36 +357,6 @@ get_device_node_path (ClutterBackendX11 *backend_x11,
return node_path; 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 * static ClutterInputDevice *
create_device (ClutterDeviceManagerXI2 *manager_xi2, create_device (ClutterDeviceManagerXI2 *manager_xi2,
ClutterBackendX11 *backend_x11, ClutterBackendX11 *backend_x11,
@@ -406,7 +366,7 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
ClutterInputDevice *retval; ClutterInputDevice *retval;
ClutterInputMode mode; ClutterInputMode mode;
gboolean is_enabled; 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; gchar *vendor_id = NULL, *product_id = NULL, *node_path = NULL;
if (info->use == XIMasterKeyboard || info->use == XISlaveKeyboard) if (info->use == XIMasterKeyboard || info->use == XISlaveKeyboard)
@@ -434,8 +394,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
source = CLUTTER_ERASER_DEVICE; source = CLUTTER_ERASER_DEVICE;
else if (strstr (name, "cursor") != NULL) else if (strstr (name, "cursor") != NULL)
source = CLUTTER_CURSOR_DEVICE; source = CLUTTER_CURSOR_DEVICE;
else if (strstr (name, " pad") != NULL)
source = CLUTTER_PAD_DEVICE;
else if (strstr (name, "wacom") != NULL || strstr (name, "pen") != NULL) else if (strstr (name, "wacom") != NULL || strstr (name, "pen") != NULL)
source = CLUTTER_PEN_DEVICE; source = CLUTTER_PEN_DEVICE;
else if (strstr (name, "touchpad") != NULL) else if (strstr (name, "touchpad") != NULL)
@@ -474,12 +432,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
node_path = get_device_node_path (backend_x11, info); 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, retval = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_XI2,
"name", info->name, "name", info->name,
"id", info->deviceid, "id", info->deviceid,
@@ -492,8 +444,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
"vendor-id", vendor_id, "vendor-id", vendor_id,
"product-id", product_id, "product-id", product_id,
"device-node", node_path, "device-node", node_path,
"n-rings", num_rings,
"n-strips", num_strips,
NULL); NULL);
translate_device_classes (backend_x11->xdpy, retval, translate_device_classes (backend_x11->xdpy, retval,
@@ -510,46 +460,6 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
return retval; 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 * static ClutterInputDevice *
add_device (ClutterDeviceManagerXI2 *manager_xi2, add_device (ClutterDeviceManagerXI2 *manager_xi2,
ClutterBackendX11 *backend_x11, ClutterBackendX11 *backend_x11,
@@ -584,9 +494,6 @@ add_device (ClutterDeviceManagerXI2 *manager_xi2,
g_warning ("Unhandled device: %s", g_warning ("Unhandled device: %s",
clutter_input_device_get_device_name (device)); 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 /* relationships between devices and signal emissions are not
* necessary while we're constructing the device manager instance * necessary while we're constructing the device manager instance
*/ */
@@ -893,54 +800,6 @@ translate_axes (ClutterInputDevice *device,
return retval; 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 static void
translate_coords (ClutterStageX11 *stage_x11, translate_coords (ClutterStageX11 *stage_x11,
gdouble event_x, gdouble event_x,
@@ -1047,126 +906,6 @@ clutter_device_manager_xi2_select_stage_events (ClutterDeviceManager *manager,
g_free (mask); 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 static ClutterTranslateReturn
clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator, clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
gpointer native, gpointer native,
@@ -1198,8 +937,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
return CLUTTER_TRANSLATE_REMOVE; return CLUTTER_TRANSLATE_REMOVE;
if (!(xi_event->evtype == XI_HierarchyChanged || if (!(xi_event->evtype == XI_HierarchyChanged ||
xi_event->evtype == XI_DeviceChanged || xi_event->evtype == XI_DeviceChanged))
xi_event->evtype == XI_PropertyEvent))
{ {
stage = get_event_stage (translator, xi_event); stage = get_event_stage (translator, xi_event);
if (stage == NULL || CLUTTER_ACTOR_IN_DESTRUCTION (stage)) if (stage == NULL || CLUTTER_ACTOR_IN_DESTRUCTION (stage))
@@ -1340,59 +1078,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
stage != NULL) stage != NULL)
_clutter_input_device_set_stage (device, stage); _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) switch (xev->detail)
{ {
case 4: 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_source_device (event, source_device);
clutter_event_set_device (event, 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.axes = translate_axes (event->button.device,
event->button.x, 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, device = g_hash_table_lookup (manager_xi2->devices_by_id,
GINT_TO_POINTER (xev->deviceid)); 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) */ /* 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 && if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER &&
clutter_input_device_get_pointer_stage (device) == NULL && 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_source_device (event, source_device);
clutter_event_set_device (event, 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.axes = translate_axes (event->motion.device,
event->motion.x, event->motion.x,
@@ -1794,10 +1466,6 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
case XI_FocusOut: case XI_FocusOut:
retval = CLUTTER_TRANSLATE_CONTINUE; retval = CLUTTER_TRANSLATE_CONTINUE;
break; break;
case XI_PropertyEvent:
handle_property_event (manager_xi2, xi_event);
retval = CLUTTER_TRANSLATE_CONTINUE;
break;
} }
return retval; return retval;
@@ -1975,7 +1643,6 @@ clutter_device_manager_xi2_constructed (GObject *gobject)
XISetMask (mask, XI_HierarchyChanged); XISetMask (mask, XI_HierarchyChanged);
XISetMask (mask, XI_DeviceChanged); XISetMask (mask, XI_DeviceChanged);
XISetMask (mask, XI_PropertyEvent);
event_mask.deviceid = XIAllDevices; event_mask.deviceid = XIAllDevices;
event_mask.mask_len = sizeof (mask); 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 static void
clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass) 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_core_device = clutter_device_manager_xi2_get_core_device;
manager_class->get_device = clutter_device_manager_xi2_get_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->select_stage_events = clutter_device_manager_xi2_select_stage_events;
manager_class->create_virtual_device = clutter_device_manager_xi2_create_virtual_device;
} }
static void static void
@@ -2057,6 +1713,4 @@ clutter_device_manager_xi2_init (ClutterDeviceManagerXI2 *self)
self->devices_by_id = g_hash_table_new_full (NULL, NULL, self->devices_by_id = g_hash_table_new_full (NULL, NULL,
NULL, NULL,
(GDestroyNotify) g_object_unref); (GDestroyNotify) g_object_unref);
self->tools_by_serial = g_hash_table_new_full (NULL, NULL, NULL,
(GDestroyNotify) g_object_unref);
} }

View File

@@ -43,7 +43,6 @@ struct _ClutterDeviceManagerXI2
ClutterDeviceManager parent_instance; ClutterDeviceManager parent_instance;
GHashTable *devices_by_id; GHashTable *devices_by_id;
GHashTable *tools_by_serial;
GSList *all_devices; GSList *all_devices;

View File

@@ -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);
}

View File

@@ -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__ */

View File

@@ -44,7 +44,6 @@ struct _ClutterInputDeviceXI2
ClutterInputDevice device; ClutterInputDevice device;
gint device_id; gint device_id;
ClutterInputDeviceTool *current_tool;
}; };
#define N_BUTTONS 5 #define N_BUTTONS 5
@@ -80,13 +79,6 @@ clutter_input_device_xi2_keycode_to_evdev (ClutterInputDevice *device,
return TRUE; return TRUE;
} }
static gboolean
clutter_input_device_xi2_is_grouped (ClutterInputDevice *device,
ClutterInputDevice *other_device)
{
return FALSE;
}
static void static void
clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass) 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; gobject_class->constructed = clutter_input_device_xi2_constructed;
device_class->keycode_to_evdev = clutter_input_device_xi2_keycode_to_evdev; device_class->keycode_to_evdev = clutter_input_device_xi2_keycode_to_evdev;
device_class->is_grouped = clutter_input_device_xi2_is_grouped;
} }
static void 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); _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;
}

View File

@@ -41,9 +41,6 @@ void _clutter_input_device_xi2_translate_state (ClutterEvent *event,
XIModifierState *modifiers_state, XIModifierState *modifiers_state,
XIButtonState *buttons_state, XIButtonState *buttons_state,
XIGroupState *group_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 G_END_DECLS

View File

@@ -6,6 +6,7 @@ static const struct {
const char *xsetting_name; const char *xsetting_name;
const char *settings_property; const char *settings_property;
} _clutter_settings_map[] = { } _clutter_settings_map[] = {
{ "Net/DoubleClickTime", "double-click-time" },
{ "Net/DoubleClickDistance", "double-click-distance" }, { "Net/DoubleClickDistance", "double-click-distance" },
{ "Net/DndDragThreshold", "dnd-drag-threshold" }, { "Net/DndDragThreshold", "dnd-drag-threshold" },
{ "Gtk/FontName", "font-name" }, { "Gtk/FontName", "font-name" },

View File

@@ -27,9 +27,6 @@
#include <glib-object.h> #include <glib-object.h>
#include "clutter-x11.h"
#include "X11/extensions/XTest.h"
#include "clutter-virtual-input-device.h" #include "clutter-virtual-input-device.h"
#include "x11/clutter-virtual-input-device-x11.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, uint32_t button,
ClutterButtonState button_state) ClutterButtonState button_state)
{ {
XTestFakeButtonEvent (clutter_x11_get_default_display (),
button, button_state == CLUTTER_BUTTON_STATE_PRESSED, 0);
} }
static void static void
@@ -74,21 +69,6 @@ clutter_virtual_input_device_x11_notify_key (ClutterVirtualInputDevice *virtual_
uint32_t key, uint32_t key,
ClutterKeyState key_state) 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 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_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_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_key = clutter_virtual_input_device_x11_notify_key;
virtual_input_device_class->notify_keyval = clutter_virtual_input_device_x11_notify_keyval;
} }

View File

@@ -42,6 +42,9 @@ m4_define([clutter_release_status],
m4_define([clutter_version], [clutter_major_version.clutter_minor_version.clutter_micro_version]) 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_PREREQ([2.63])
AC_INIT([clutter], 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_INIT_AUTOMAKE([1.11 foreign -Wno-portability no-define no-dist-gzip dist-xz tar-ustar])
AM_SILENT_RULES([yes]) 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_MAJOR_VERSION], [clutter_major_version])
AC_SUBST([CLUTTER_MINOR_VERSION], [clutter_minor_version]) AC_SUBST([CLUTTER_MINOR_VERSION], [clutter_minor_version])
AC_SUBST([CLUTTER_MICRO_VERSION], [clutter_micro_version]) AC_SUBST([CLUTTER_MICRO_VERSION], [clutter_micro_version])
AC_SUBST([CLUTTER_VERSION], [clutter_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]) AC_SUBST([CLUTTER_RELEASE_STATUS], [clutter_release_status])
m4_define([lt_current], [m4_eval(100 * clutter_minor_version + clutter_micro_version - clutter_interface_age)]) 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([gi_req_version], [1.39.0])
m4_define([xcomposite_req_version], [0.4]) m4_define([xcomposite_req_version], [0.4])
m4_define([gdk_req_version], [3.3.18]) 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]) m4_define([libudev_req_version], [136])
AC_SUBST([GLIB_REQ_VERSION], [glib_req_version]) AC_SUBST([GLIB_REQ_VERSION], [glib_req_version])
@@ -385,22 +382,6 @@ AS_IF([test "x$SUPPORT_X11" = "x1"],
[AC_MSG_ERROR([not found])] [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) # X Generic Extensions (optional)
clutter_save_CPPFLAGS="$CPPFLAGS" clutter_save_CPPFLAGS="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $X11_CFLAGS" CPPFLAGS="$CPPFLAGS $X11_CFLAGS"
@@ -784,7 +765,7 @@ AC_CONFIG_FILES([
clutter/Makefile clutter/Makefile
clutter/clutter-config.h clutter/clutter-config.h
clutter/clutter-version.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/Makefile
tests/accessibility/Makefile tests/accessibility/Makefile

View File

@@ -21,7 +21,7 @@ all_examples += \
image-content image-content
endif 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_CFLAGS = $(CLUTTER_CFLAGS) $(GDK_PIXBUF_CFLAGS) $(MAINTAINER_CFLAGS)
AM_CPPFLAGS = \ AM_CPPFLAGS = \
-DG_DISABLE_SINGLE_INCLUDES \ -DG_DISABLE_SINGLE_INCLUDES \

View File

@@ -1,5 +1,5 @@
common_ldadd = \ common_ldadd = \
$(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
common_sources = \ common_sources = \
cally-examples-util.c \ cally-examples-util.c \
@@ -11,7 +11,6 @@ AM_CPPFLAGS = \
-DGLIB_DISABLE_DEPRECATION_WARNINGS \ -DGLIB_DISABLE_DEPRECATION_WARNINGS \
-I$(top_srcdir)/../cogl \ -I$(top_srcdir)/../cogl \
-I$(top_builddir)/../cogl \ -I$(top_builddir)/../cogl \
-I$(top_builddir)/../cogl/cogl \
-I$(top_srcdir) \ -I$(top_srcdir) \
-I$(top_builddir) \ -I$(top_builddir) \
-I$(top_srcdir)/clutter \ -I$(top_srcdir)/clutter \

View File

@@ -3,13 +3,12 @@ installed_testdir = $(libexecdir)/installed-tests/mutter-clutter
include $(top_srcdir)/build/autotools/glib-tap.mk include $(top_srcdir)/build/autotools/glib-tap.mk
AM_CFLAGS = -g $(CLUTTER_CFLAGS) $(MAINTAINER_CFLAGS) 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_LDFLAGS = -export-dynamic
AM_CPPFLAGS = \ AM_CPPFLAGS = \
-DG_LOG_DOMAIN=\"Clutter-Conform\" \ -DG_LOG_DOMAIN=\"Clutter-Conform\" \
-I$(top_srcdir)/../cogl \ -I$(top_srcdir)/../cogl \
-I$(top_builddir)/../cogl \ -I$(top_builddir)/../cogl \
-I$(top_builddir)/../cogl/cogl \
-I$(top_srcdir) \ -I$(top_srcdir) \
-I$(top_builddir) \ -I$(top_builddir) \
-DCOGL_DISABLE_DEPRECATION_WARNINGS \ -DCOGL_DISABLE_DEPRECATION_WARNINGS \
@@ -79,7 +78,7 @@ script_tests = \
test-script-timeline-markers.json \ test-script-timeline-markers.json \
test-state-1.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 # simple rules for generating a Git ignore file for the conformance test suite
$(srcdir)/.gitignore: Makefile $(srcdir)/.gitignore: Makefile

View File

@@ -350,8 +350,7 @@ actor_replace_child (void)
g_assert_cmpstr (clutter_actor_get_name (iter), ==, "qux"); g_assert_cmpstr (clutter_actor_get_name (iter), ==, "qux");
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR, clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
"name", "foo", "name", "foo"));
NULL));
clutter_actor_replace_child (actor, iter, clutter_actor_replace_child (actor, iter,
g_object_new (CLUTTER_TYPE_ACTOR, g_object_new (CLUTTER_TYPE_ACTOR,

View File

@@ -109,9 +109,7 @@ clean-wrappers:
.PHONY: wrappers clean-wrappers .PHONY: wrappers clean-wrappers
common_ldadd = \ common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
$(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la \
$(top_builddir)/../cogl/cogl/libmutter-cogl-@LIBMUTTER_API_VERSION@.la
check_PROGRAMS = test-interactive check_PROGRAMS = test-interactive
check_SCRIPTS = wrappers check_SCRIPTS = wrappers
@@ -127,7 +125,6 @@ test_interactive_CPPFLAGS = \
-DCLUTTER_DISABLE_DEPRECATION_WARNINGS \ -DCLUTTER_DISABLE_DEPRECATION_WARNINGS \
-I$(top_srcdir)/../cogl \ -I$(top_srcdir)/../cogl \
-I$(top_builddir)/../cogl \ -I$(top_builddir)/../cogl \
-I$(top_builddir)/../cogl/cogl \
-I$(top_srcdir) \ -I$(top_srcdir) \
-I$(top_builddir) \ -I$(top_builddir) \
-I$(top_srcdir)/clutter \ -I$(top_srcdir)/clutter \

View File

@@ -1,7 +1,4 @@
common_ldadd = \ common_ldadd = $(top_builddir)/clutter/libmutter-clutter-@CLUTTER_API_VERSION@.la
$(top_builddir)/clutter/libmutter-clutter-@LIBMUTTER_API_VERSION@.la \
$(top_builddir)/../cogl/cogl/libmutter-cogl-@LIBMUTTER_API_VERSION@.la
check_PROGRAMS = \ check_PROGRAMS = \
test-text \ test-text \
@@ -20,7 +17,6 @@ AM_CPPFLAGS = \
-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \ -DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
-I$(top_srcdir)/../cogl \ -I$(top_srcdir)/../cogl \
-I$(top_builddir)/../cogl \ -I$(top_builddir)/../cogl \
-I$(top_builddir)/../cogl/cogl \
-I$(top_srcdir) \ -I$(top_srcdir) \
-I$(top_builddir) \ -I$(top_builddir) \
-I$(top_srcdir)/clutter \ -I$(top_srcdir)/clutter \

View File

@@ -7,7 +7,7 @@ check_PROGRAMS = \
test-state-mini \ test-state-mini \
test-state-pick 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) LDADD = $(common_ldadd) $(CLUTTER_LIBS) $(LIBM)
@@ -21,7 +21,6 @@ AM_CPPFLAGS = \
-DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \ -DTESTS_DATA_DIR=\""$(top_srcdir)/tests/data/"\" \
-I$(top_srcdir)/../cogl \ -I$(top_srcdir)/../cogl \
-I$(top_builddir)/../cogl \ -I$(top_builddir)/../cogl \
-I$(top_builddir)/../cogl/cogl \
-I$(top_srcdir) \ -I$(top_srcdir) \
-I$(top_builddir) \ -I$(top_builddir) \
-I$(top_srcdir)/clutter \ -I$(top_srcdir)/clutter \

View File

@@ -2,10 +2,8 @@
NULL = NULL =
DISTCLEANFILES =
mutterlibdir = $(libdir)/mutter mutterlibdir = $(libdir)/mutter
mutterlib_LTLIBRARIES = libmutter-cogl-gles2-@LIBMUTTER_API_VERSION@.la mutterlib_LTLIBRARIES = libmutter-cogl-gles2.la
AM_CPPFLAGS = \ AM_CPPFLAGS = \
-I$(top_srcdir) \ -I$(top_srcdir) \
@@ -13,8 +11,8 @@ AM_CPPFLAGS = \
AM_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS) 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_la_SOURCES = cogl-gles2-api.c
libmutter_cogl_gles2_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \ libmutter_cogl_gles2_la_LDFLAGS = \
-no-undefined \ -no-undefined \
-rpath $(mutterlibdir) \ -rpath $(mutterlibdir) \
-avoid-version \ -avoid-version \
@@ -27,9 +25,7 @@ coglgles2include_HEADERS = \
GLES2/gl2ext.h \ GLES2/gl2ext.h \
GLES2/gl2platform.h GLES2/gl2platform.h
pc_files = mutter-cogl-gles2-$(LIBMUTTER_API_VERSION).pc pc_files = mutter-cogl-gles2-1.0.pc
pkgconfigdir = $(libdir)/pkgconfig pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = $(pc_files) pkgconfig_DATA = $(pc_files)
DISTCLEANFILES += $(pc_files)

View File

@@ -2,12 +2,12 @@ prefix=@prefix@
exec_prefix=@exec_prefix@ exec_prefix=@exec_prefix@
libdir=@libdir@/mutter libdir=@libdir@/mutter
includedir=@includedir@/mutter includedir=@includedir@/mutter
apiversion=@LIBMUTTER_API_VERSION@ apiversion=1.0
requires=@COGL_PKG_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@ requires=@COGL_PKG_REQUIRES@ mutter-cogl-1.0
Name: Cogl Name: Cogl
Description: An object oriented GL/GLES Abstraction/Utility Layer Description: An object oriented GL/GLES Abstraction/Utility Layer
Version: @MUTTER_VERSION@ Version: @COGL_1_VERSION@
Libs: -L${libdir} -lmutter-cogl-gles2-@LIBMUTTER_API_VERSION@ Libs: -L${libdir} -lmutter-cogl-gles2
Cflags: -I${includedir}/cogl Cflags: -I${includedir}/cogl
Requires: ${requires} Requires: ${requires}

View File

@@ -23,13 +23,13 @@ source_h_priv = \
$(NULL) $(NULL)
mutterlibdir = $(libdir)/mutter 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_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_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_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl.la
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_PANGO_DEP_LIBS) $(COGL_EXTRA_LDFLAGS) libmutter_cogl_pango_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_PANGO_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
libmutter_cogl_pango_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \ libmutter_cogl_pango_la_LDFLAGS = \
-export-dynamic \ -export-dynamic \
-rpath $(mutterlibdir) \ -rpath $(mutterlibdir) \
-export-symbols-regex "^cogl_pango_.*" \ -export-symbols-regex "^cogl_pango_.*" \
@@ -49,7 +49,7 @@ cogl_base_includedir = $(includedir)/mutter
cogl_pangoheadersdir = $(cogl_base_includedir)/cogl/cogl-pango cogl_pangoheadersdir = $(cogl_base_includedir)/cogl/cogl-pango
cogl_pangoheaders_HEADERS = $(source_h) 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 pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = $(pc_files) pkgconfig_DATA = $(pc_files)
@@ -65,23 +65,23 @@ INTROSPECTION_GIRS =
if HAVE_INTROSPECTION if HAVE_INTROSPECTION
INTROSPECTION_COMPILER_ARGS=--includedir=$(top_builddir)/cogl 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_1_0_gir_NAMESPACE = CoglPango
CoglPango_@LIBMUTTER_API_VERSION@_gir_VERSION = @LIBMUTTER_API_VERSION@ CoglPango_1_0_gir_VERSION = 1.0
CoglPango_@LIBMUTTER_API_VERSION@_gir_LIBS = $(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la libmutter-cogl-pango-$(LIBMUTTER_API_VERSION).la CoglPango_1_0_gir_LIBS = $(top_builddir)/cogl/libmutter-cogl.la libmutter-cogl-pango.la
CoglPango_@LIBMUTTER_API_VERSION@_gir_FILES = $(source_h) $(source_c) CoglPango_1_0_gir_FILES = $(source_h) $(source_c)
CoglPango_@LIBMUTTER_API_VERSION@_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS) CoglPango_1_0_gir_CFLAGS = $(AM_CPPFLAGS) $(COGL_DEP_CFLAGS) $(COGL_PANGO_DEP_CFLAGS)
CoglPango_@LIBMUTTER_API_VERSION@_gir_INCLUDES = Pango-1.0 PangoCairo-1.0 CoglPango_1_0_gir_INCLUDES = Pango-1.0 PangoCairo-1.0
CoglPango_@LIBMUTTER_API_VERSION@_gir_EXPORT_PACKAGES = mutter-cogl-pango-@LIBMUTTER_API_VERSION@ CoglPango_1_0_gir_EXPORT_PACKAGES = mutter-cogl-pango-1.0
CoglPango_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = \ CoglPango_1_0_gir_SCANNERFLAGS = \
--warn-all \ --warn-all \
--identifier-prefix=CoglPango \ --identifier-prefix=CoglPango \
--symbol-prefix=cogl_pango \ --symbol-prefix=cogl_pango \
--c-include='cogl-pango/cogl-pango.h' \ --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) girdir = $(mutterlibdir)
gir_DATA = $(INTROSPECTION_GIRS) gir_DATA = $(INTROSPECTION_GIRS)

View File

@@ -2,12 +2,12 @@ prefix=@prefix@
exec_prefix=@exec_prefix@ exec_prefix=@exec_prefix@
libdir=@libdir@/mutter libdir=@libdir@/mutter
includedir=@includedir@/mutter includedir=@includedir@/mutter
apiversion=@LIBMUTTER_API_VERSION@ apiversion=1.0
requires=@COGL_PKG_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@ requires=@COGL_PKG_REQUIRES@ mutter-cogl-1.0
Name: Cogl Name: Cogl
Description: An object oriented GL/GLES Abstraction/Utility Layer Description: An object oriented GL/GLES Abstraction/Utility Layer
Version: @MUTTER_VERSION@ Version: @COGL_1_VERSION@
Libs: -L${libdir} -lmutter-cogl-pango-@LIBMUTTER_API_VERSION@ Libs: -L${libdir} -lmutter-cogl-pango
Cflags: -I${includedir}/cogl Cflags: -I${includedir}/cogl
Requires: ${requires} Requires: ${requires}

View File

@@ -65,14 +65,14 @@ glib_enum_headers = $(source_1_x_h)
include $(top_srcdir)/build/autotools/Makefile.am.enums include $(top_srcdir)/build/autotools/Makefile.am.enums
mutterlibdir = $(libdir)/mutter 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) libmutter_cogl_path_la_SOURCES = $(source_c) $(source_h)
nodist_libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_SOURCES = $(BUILT_SOURCES) nodist_libmutter_cogl_path_la_SOURCES = $(BUILT_SOURCES)
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) $(MAINTAINER_CFLAGS) libmutter_cogl_path_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_la_LIBADD = $(top_builddir)/cogl/libmutter-cogl.la
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS) libmutter_cogl_path_la_LIBADD += $(COGL_DEP_LIBS) $(COGL_EXTRA_LDFLAGS)
libmutter_cogl_path_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \ libmutter_cogl_path_la_LDFLAGS = \
-export-dynamic \ -export-dynamic \
-export-symbols-regex "^(cogl|cogl2)_(framebuffer|path|is|clip|[sg]et)_.*" \ -export-symbols-regex "^(cogl|cogl2)_(framebuffer|path|is|clip|[sg]et)_.*" \
-no-undefined \ -no-undefined \
@@ -94,7 +94,7 @@ cogl_pathheadersdir = $(cogl_base_includedir)/cogl/cogl-path
cogl_pathheaders_HEADERS = $(source_h) cogl_pathheaders_HEADERS = $(source_h)
nodist_cogl_pathheaders_HEADERS = cogl-path-enum-types.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 pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = $(pc_files) pkgconfig_DATA = $(pc_files)

View File

@@ -2,12 +2,12 @@ prefix=@prefix@
exec_prefix=@exec_prefix@ exec_prefix=@exec_prefix@
libdir=@libdir@/mutter libdir=@libdir@/mutter
includedir=@includedir@/mutter includedir=@includedir@/mutter
apiversion=@LIBMUTTER_API_VERSION@ apiversion=1.0
requires=@COGL_PKG_REQUIRES@ mutter-cogl-@LIBMUTTER_API_VERSION@ requires=@COGL_PKG_REQUIRES@ mutter-cogl-1.0
Name: Cogl Name: Cogl
Description: A 2D path drawing library for Cogl Description: A 2D path drawing library for Cogl
Version: @MUTTER_VERSION@ Version: @COGL_1_VERSION@
Libs: -L${libdir} -lmutter-cogl-path-@LIBMUTTER_API_VERSION@ Libs: -L${libdir} -lmutter-cogl-path
Cflags: -I${includedir}/cogl Cflags: -I${includedir}/cogl
Requires: ${requires} Requires: ${requires}

View File

@@ -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 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 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 pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = $(pc_files) pkgconfig_DATA = $(pc_files)
@@ -439,23 +439,23 @@ cogl_sources_c += \
endif endif
mutterlibdir = $(libdir)/mutter 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 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 endif
# XXX: The aim is to eventually get rid of all private API exports # XXX: The aim is to eventually get rid of all private API exports
# for cogl-pango. # for cogl-pango.
libmutter_cogl_@LIBMUTTER_API_VERSION@_la_LDFLAGS = \ libmutter_cogl_la_LDFLAGS = \
-no-undefined \ -no-undefined \
-avoid-version \ -avoid-version \
-export-dynamic \ -export-dynamic \
-rpath $(mutterlibdir) \ -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) libmutter_cogl_la_SOURCES = $(cogl_sources_c)
nodist_libmutter_cogl_@LIBMUTTER_API_VERSION@_la_SOURCES = $(BUILT_SOURCES) nodist_libmutter_cogl_la_SOURCES = $(BUILT_SOURCES)
# Cogl installed headers # Cogl installed headers
cogl_headers = \ cogl_headers = \
@@ -483,22 +483,22 @@ EXTRA_DIST += \
INTROSPECTION_GIRS = INTROSPECTION_GIRS =
if HAVE_INTROSPECTION 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_1_0_gir_NAMESPACE = Cogl
Cogl_@LIBMUTTER_API_VERSION@_gir_VERSION = $(LIBMUTTER_API_VERSION) Cogl_1_0_gir_VERSION = 1.0
Cogl_@LIBMUTTER_API_VERSION@_gir_LIBS = libmutter-cogl-$(LIBMUTTER_API_VERSION).la Cogl_1_0_gir_LIBS = libmutter-cogl.la
if UNIT_TESTS 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 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_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_@LIBMUTTER_API_VERSION@_gir_INCLUDES = GL-1.0 GObject-2.0 Cogl_1_0_gir_INCLUDES = GL-1.0 GObject-2.0
Cogl_@LIBMUTTER_API_VERSION@_gir_EXPORT_PACKAGES = mutter-cogl-@LIBMUTTER_API_VERSION@ Cogl_1_0_gir_EXPORT_PACKAGES = mutter-cogl-1.0
Cogl_@LIBMUTTER_API_VERSION@_gir_SCANNERFLAGS = --warn-all --c-include='cogl/cogl.h' 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) girdir = $(mutterlibdir)
gir_DATA = $(INTROSPECTION_GIRS) gir_DATA = $(INTROSPECTION_GIRS)

View File

@@ -262,7 +262,6 @@ typedef enum _CoglFeatureID
COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE, COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE,
COGL_FEATURE_ID_TEXTURE_RG, COGL_FEATURE_ID_TEXTURE_RG,
COGL_FEATURE_ID_BUFFER_AGE, COGL_FEATURE_ID_BUFFER_AGE,
COGL_FEATURE_ID_TEXTURE_EGL_IMAGE_EXTERNAL,
/*< private >*/ /*< private >*/
_COGL_N_FEATURE_IDS /*< skip >*/ _COGL_N_FEATURE_IDS /*< skip >*/

View File

@@ -55,13 +55,6 @@ struct _CoglDriverVtable
GLenum *out_glintformat, GLenum *out_glintformat,
GLenum *out_glformat, GLenum *out_glformat,
GLenum *out_gltype); 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 CoglBool
(* update_features) (CoglContext *context, (* update_features) (CoglContext *context,

View File

@@ -152,7 +152,6 @@ typedef long GLsizeiptr;
#define GL_POLYGON_OFFSET_FILL 0x8037 #define GL_POLYGON_OFFSET_FILL 0x8037
#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E #define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E
#define GL_SAMPLE_COVERAGE 0x80A0 #define GL_SAMPLE_COVERAGE 0x80A0
#define GL_TEXTURE_EXTERNAL_OES 0x8D65
/* ErrorCode */ /* ErrorCode */
#define GL_NO_ERROR 0 #define GL_NO_ERROR 0

View File

@@ -111,14 +111,6 @@ _cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
lengths[count++] = sizeof (texture_3d_extension) - 1; 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) if (shader_gl_type == GL_VERTEX_SHADER)
{ {
strings[count] = vertex_boilerplate; strings[count] = vertex_boilerplate;

View File

@@ -51,9 +51,6 @@ typedef struct _CoglGLXDisplay
CoglBool found_fbconfig; CoglBool found_fbconfig;
CoglBool fbconfig_has_rgba_visual; CoglBool fbconfig_has_rgba_visual;
CoglBool is_direct;
CoglBool have_vblank_counter;
CoglBool can_vblank_wait;
GLXFBConfig fbconfig; GLXFBConfig fbconfig;
/* Single context for all wins */ /* Single context for all wins */

View File

@@ -43,6 +43,8 @@ typedef struct _CoglGLXRenderer
int glx_error_base; int glx_error_base;
int glx_event_base; int glx_event_base;
CoglBool is_direct;
/* Vblank stuff */ /* Vblank stuff */
int dri_fd; int dri_fd;

View File

@@ -169,8 +169,7 @@ check_qualcomm_vendor (const CoglGpuInfoStrings *strings)
static CoglBool static CoglBool
check_nvidia_vendor (const CoglGpuInfoStrings *strings) check_nvidia_vendor (const CoglGpuInfoStrings *strings)
{ {
if (strcmp (strings->vendor_string, "NVIDIA") != 0 && if (strcmp (strings->vendor_string, "NVIDIA") != 0)
strcmp (strings->vendor_string, "NVIDIA Corporation") != 0)
return FALSE; return FALSE;
return TRUE; return TRUE;

View File

@@ -43,6 +43,6 @@
#include <cogl/winsys/cogl-winsys-private.h> #include <cogl/winsys/cogl-winsys-private.h>
void cogl_renderer_set_custom_winsys (CoglRenderer *renderer, void cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
CoglCustomWinsysVtableGetter winsys_vtable_getter); CoglWinsysVtableGetter winsys_vtable_getter);
#endif /* __COGL_MUTTER_H___ */ #endif /* __COGL_MUTTER_H___ */

View File

@@ -44,7 +44,7 @@ typedef struct _CoglObject CoglObject;
/** /**
* CoglObject: (ref-func cogl_object_ref) (unref-func cogl_object_unref) * CoglObject: (ref-func cogl_object_ref) (unref-func cogl_object_unref)
* (set-value-func cogl_object_value_set_object) * (set-value-func cogl_object_value_set_object)
* (get-value-func cogl_object_value_get_object) * (get-value-func cogl_object_get_object)
*/ */
/** /**

View File

@@ -62,7 +62,7 @@ COGL_BEGIN_DECLS
/** /**
* CoglPrimitive: (ref-func cogl_object_ref) (unref-func cogl_object_unref) * CoglPrimitive: (ref-func cogl_object_ref) (unref-func cogl_object_unref)
* (set-value-func cogl_object_value_set_object) * (set-value-func cogl_object_value_set_object)
* (get-value-func cogl_object_value_get_object) * (get-value-func cogl_object_get_object)
*/ */
/** /**

View File

@@ -77,9 +77,6 @@ typedef enum
COGL_PRIVATE_FEATURE_GL_PROGRAMMABLE, COGL_PRIVATE_FEATURE_GL_PROGRAMMABLE,
COGL_PRIVATE_FEATURE_GL_EMBEDDED, COGL_PRIVATE_FEATURE_GL_EMBEDDED,
COGL_PRIVATE_FEATURE_GL_WEB, 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 COGL_N_PRIVATE_FEATURES
} CoglPrivateFeature; } CoglPrivateFeature;

View File

@@ -39,13 +39,12 @@
#include "cogl-texture-driver.h" #include "cogl-texture-driver.h"
#include "cogl-context.h" #include "cogl-context.h"
#include "cogl-closure-list-private.h" #include "cogl-closure-list-private.h"
#include "cogl-mutter.h"
#ifdef COGL_HAS_XLIB_SUPPORT #ifdef COGL_HAS_XLIB_SUPPORT
#include <X11/Xlib.h> #include <X11/Xlib.h>
#endif #endif
typedef const CoglWinsysVtable *(*CoglCustomWinsysVtableGetter) (CoglRenderer *renderer);
struct _CoglRenderer struct _CoglRenderer
{ {
CoglObject _parent; CoglObject _parent;
@@ -54,7 +53,7 @@ struct _CoglRenderer
const CoglDriverVtable *driver_vtable; const CoglDriverVtable *driver_vtable;
const CoglTextureDriver *texture_driver; const CoglTextureDriver *texture_driver;
const CoglWinsysVtable *winsys_vtable; const CoglWinsysVtable *winsys_vtable;
CoglCustomWinsysVtableGetter custom_winsys_vtable_getter; CoglWinsysVtableGetter custom_winsys_vtable_getter;
CoglWinsysID winsys_id_override; CoglWinsysID winsys_id_override;
GList *constraints; GList *constraints;
@@ -70,7 +69,6 @@ struct _CoglRenderer
Display *foreign_xdpy; Display *foreign_xdpy;
CoglBool xlib_enable_event_retrieval; CoglBool xlib_enable_event_retrieval;
CoglBool xlib_want_reset_on_video_memory_purge; CoglBool xlib_want_reset_on_video_memory_purge;
CoglBool xlib_enable_threaded_swap_wait;
#endif #endif
CoglDriver driver; CoglDriver driver;

View File

@@ -285,17 +285,6 @@ cogl_xlib_renderer_request_reset_on_video_memory_purge (CoglRenderer *renderer,
renderer->xlib_want_reset_on_video_memory_purge = enable; 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 */ #endif /* COGL_HAS_XLIB_SUPPORT */
CoglBool CoglBool
@@ -566,7 +555,7 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
void void
cogl_renderer_set_custom_winsys (CoglRenderer *renderer, cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
CoglCustomWinsysVtableGetter winsys_vtable_getter) CoglWinsysVtableGetter winsys_vtable_getter)
{ {
renderer->custom_winsys_vtable_getter = winsys_vtable_getter; renderer->custom_winsys_vtable_getter = winsys_vtable_getter;
} }
@@ -575,11 +564,10 @@ static CoglBool
connect_custom_winsys (CoglRenderer *renderer, connect_custom_winsys (CoglRenderer *renderer,
CoglError **error) CoglError **error)
{ {
const CoglWinsysVtable *winsys; const CoglWinsysVtable *winsys = renderer->custom_winsys_vtable_getter();
CoglError *tmp_error = NULL; CoglError *tmp_error = NULL;
GString *error_message; GString *error_message;
winsys = renderer->custom_winsys_vtable_getter (renderer);
renderer->winsys_vtable = winsys; renderer->winsys_vtable = winsys;
error_message = g_string_new (""); error_message = g_string_new ("");

View File

@@ -36,6 +36,10 @@
#include "cogl-texture-private.h" #include "cogl-texture-private.h"
#include "cogl-texture-2d.h" #include "cogl-texture-2d.h"
#ifdef COGL_HAS_EGL_SUPPORT
#include "cogl-egl-defines.h"
#endif
struct _CoglTexture2D struct _CoglTexture2D
{ {
CoglTexture _parent; CoglTexture _parent;
@@ -55,23 +59,30 @@ struct _CoglTexture2D
GLenum gl_internal_format; GLenum gl_internal_format;
/* The texture object number */ /* The texture object number */
GLuint gl_texture; GLuint gl_texture;
GLenum gl_target;
GLenum gl_legacy_texobj_min_filter; GLenum gl_legacy_texobj_min_filter;
GLenum gl_legacy_texobj_mag_filter; GLenum gl_legacy_texobj_mag_filter;
GLint gl_legacy_texobj_wrap_mode_s; GLint gl_legacy_texobj_wrap_mode_s;
GLint gl_legacy_texobj_wrap_mode_t; GLint gl_legacy_texobj_wrap_mode_t;
CoglTexturePixel first_pixel; CoglTexturePixel first_pixel;
struct {
void *user_data;
GDestroyNotify destroy;
} egl_image_external;
}; };
CoglTexture2D * CoglTexture2D *
_cogl_texture_2d_new_from_bitmap (CoglBitmap *bmp, _cogl_texture_2d_new_from_bitmap (CoglBitmap *bmp,
CoglBool can_convert_in_place); 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 * CoglTexture2D *
_cogl_texture_2d_create_base (CoglContext *ctx, _cogl_texture_2d_create_base (CoglContext *ctx,
int width, int width,

View File

@@ -110,8 +110,6 @@ _cogl_texture_2d_create_base (CoglContext *ctx,
tex_2d->mipmaps_dirty = TRUE; tex_2d->mipmaps_dirty = TRUE;
tex_2d->auto_mipmap = TRUE; tex_2d->auto_mipmap = TRUE;
tex_2d->gl_target = GL_TEXTURE_2D;
tex_2d->is_foreign = FALSE; tex_2d->is_foreign = FALSE;
ctx->driver_vtable->texture_2d_init (tex_2d); ctx->driver_vtable->texture_2d_init (tex_2d);
@@ -238,7 +236,7 @@ cogl_texture_2d_new_from_data (CoglContext *ctx,
* even though they may seem redundant is because GLES 1/2 don't * even though they may seem redundant is because GLES 1/2 don't
* provide a way to query these properties. */ * provide a way to query these properties. */
CoglTexture2D * CoglTexture2D *
cogl_egl_texture_2d_new_from_image (CoglContext *ctx, _cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
int width, int width,
int height, int height,
CoglPixelFormat format, CoglPixelFormat format,
@@ -432,7 +430,7 @@ cogl_wayland_texture_2d_new_from_buffer (CoglContext *ctx,
EGL_WAYLAND_BUFFER_WL, EGL_WAYLAND_BUFFER_WL,
buffer, buffer,
NULL); NULL);
tex = cogl_egl_texture_2d_new_from_image (ctx, tex = _cogl_egl_texture_2d_new_from_image (ctx,
width, height, width, height,
internal_format, internal_format,
image, image,
@@ -559,7 +557,7 @@ _cogl_texture_2d_get_gl_texture (CoglTexture *tex,
GLuint handle; GLuint handle;
if (out_gl_target) 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); handle = ctx->driver_vtable->texture_2d_get_gl_handle (tex_2d);

View File

@@ -40,10 +40,6 @@
#include "cogl-context.h" #include "cogl-context.h"
#include "cogl-bitmap.h" #include "cogl-bitmap.h"
#ifdef COGL_HAS_EGL_SUPPORT
#include "cogl-egl-defines.h"
#endif
COGL_BEGIN_DECLS COGL_BEGIN_DECLS
/** /**
@@ -231,40 +227,6 @@ cogl_texture_2d_new_from_data (CoglContext *ctx,
CoglTexture2D * CoglTexture2D *
cogl_texture_2d_new_from_bitmap (CoglBitmap *bitmap); 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 COGL_END_DECLS
#endif /* __COGL_TEXTURE_2D_H */ #endif /* __COGL_TEXTURE_2D_H */

View File

@@ -198,7 +198,6 @@ struct _CoglTextureDriver
CoglPixelFormat CoglPixelFormat
(* find_best_gl_get_data_format) (CoglContext *context, (* find_best_gl_get_data_format) (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format,
GLenum *closest_gl_format, GLenum *closest_gl_format,
GLenum *closest_gl_type); GLenum *closest_gl_type);
}; };

View File

@@ -37,7 +37,6 @@
#include "cogl-spans.h" #include "cogl-spans.h"
#include "cogl-meta-texture.h" #include "cogl-meta-texture.h"
#include "cogl-framebuffer.h" #include "cogl-framebuffer.h"
#include "cogl-texture-2d.h"
#ifdef COGL_HAS_EGL_SUPPORT #ifdef COGL_HAS_EGL_SUPPORT
#include "cogl-egl-defines.h" #include "cogl-egl-defines.h"
@@ -155,8 +154,7 @@ typedef enum _CoglTextureSoureType {
COGL_TEXTURE_SOURCE_TYPE_SIZED = 1, COGL_TEXTURE_SOURCE_TYPE_SIZED = 1,
COGL_TEXTURE_SOURCE_TYPE_BITMAP, COGL_TEXTURE_SOURCE_TYPE_BITMAP,
COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE, COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE,
COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN, COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN
COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL
} CoglTextureSourceType; } CoglTextureSourceType;
typedef struct _CoglTextureLoader typedef struct _CoglTextureLoader
@@ -181,14 +179,6 @@ typedef struct _CoglTextureLoader
int height; int height;
CoglPixelFormat format; CoglPixelFormat format;
} egl_image; } egl_image;
#endif
#if defined (COGL_HAS_EGL_SUPPORT)
struct {
int width;
int height;
CoglTexture2DEGLImageExternalAlloc alloc;
CoglPixelFormat format;
} egl_image_external;
#endif #endif
struct { struct {
int width; int width;

View File

@@ -160,7 +160,6 @@ _cogl_texture_free_loader (CoglTexture *texture)
case COGL_TEXTURE_SOURCE_TYPE_SIZED: case COGL_TEXTURE_SOURCE_TYPE_SIZED:
case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE: case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE:
case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN: case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
case COGL_TEXTURE_SOURCE_TYPE_EGL_IMAGE_EXTERNAL:
break; break;
case COGL_TEXTURE_SOURCE_TYPE_BITMAP: case COGL_TEXTURE_SOURCE_TYPE_BITMAP:
cogl_object_unref (loader->src.bitmap.bitmap); cogl_object_unref (loader->src.bitmap.bitmap);
@@ -1059,7 +1058,6 @@ cogl_texture_get_data (CoglTexture *texture,
closest_format = closest_format =
ctx->texture_driver->find_best_gl_get_data_format (ctx, ctx->texture_driver->find_best_gl_get_data_format (ctx,
texture_format,
format, format,
&closest_gl_format, &closest_gl_format,
&closest_gl_type); &closest_gl_type);

View File

@@ -167,36 +167,6 @@ void
cogl_xlib_renderer_set_event_retrieval_enabled (CoglRenderer *renderer, cogl_xlib_renderer_set_event_retrieval_enabled (CoglRenderer *renderer,
CoglBool enable); 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) * cogl_xlib_renderer_get_display: (skip)
*/ */
@@ -210,7 +180,7 @@ XVisualInfo *
cogl_xlib_renderer_get_visual_info (CoglRenderer *renderer); 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 * @renderer: a #CoglRenderer
* @enable: The new value * @enable: The new value
* *

View File

@@ -1307,7 +1307,7 @@ CoglMaterialWrapMode
cogl_material_layer_get_wrap_mode_p (CoglMaterialLayer *layer); cogl_material_layer_get_wrap_mode_p (CoglMaterialLayer *layer);
/** /**
* cogl_material_set_depth_state: (skip) * cogl_material_set_depth_state:
* @material: A #CoglMaterial object * @material: A #CoglMaterial object
* @state: A #CoglDepthState struct * @state: A #CoglDepthState struct
* @error: A #CoglError to report failures to setup the given @state. * @error: A #CoglError to report failures to setup the given @state.
@@ -1334,7 +1334,7 @@ cogl_material_set_depth_state (CoglMaterial *material,
CoglError **error); CoglError **error);
/** /**
* cogl_material_get_depth_state: (skip) * cogl_material_get_depth_state:
* @material: A #CoglMaterial object * @material: A #CoglMaterial object
* @state_out: A destination #CoglDepthState struct * @state_out: A destination #CoglDepthState struct
* *
@@ -1370,8 +1370,8 @@ typedef CoglBool (*CoglMaterialLayerCallback) (CoglMaterial *material,
/** /**
* cogl_material_foreach_layer: * cogl_material_foreach_layer:
* @material: A #CoglMaterial object * @material: A #CoglMaterial object
* @callback: (scope call): A #CoglMaterialLayerCallback to be called for each * @callback: A #CoglMaterialLayerCallback to be called for each layer
* layer index * index
* @user_data: Private data that will be passed to the callback * @user_data: Private data that will be passed to the callback
* *
* Iterates all the layer indices of the given @material. * Iterates all the layer indices of the given @material.

View File

@@ -1418,15 +1418,6 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
&gl_format, &gl_format,
&gl_type); &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 /* NB: All offscreen rendering is done upside down so there is no need
* to flip in this case... */ * to flip in this case... */
if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_MESA_PACK_INVERT) && if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_MESA_PACK_INVERT) &&

View File

@@ -46,31 +46,11 @@
#include "cogl-error-private.h" #include "cogl-error-private.h"
#include "cogl-util-gl-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 void
_cogl_texture_2d_gl_free (CoglTexture2D *tex_2d) _cogl_texture_2d_gl_free (CoglTexture2D *tex_2d)
{ {
if (!tex_2d->is_foreign && tex_2d->gl_texture) if (!tex_2d->is_foreign && tex_2d->gl_texture)
_cogl_delete_gl_texture (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 CoglBool
@@ -121,9 +101,6 @@ _cogl_texture_2d_gl_init (CoglTexture2D *tex_2d)
/* Wrap mode not yet set */ /* Wrap mode not yet set */
tex_2d->gl_legacy_texobj_wrap_mode_s = GL_FALSE; tex_2d->gl_legacy_texobj_wrap_mode_s = GL_FALSE;
tex_2d->gl_legacy_texobj_wrap_mode_t = 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 static CoglBool
@@ -462,96 +439,6 @@ allocate_from_gl_foreign (CoglTexture2D *tex_2d,
return TRUE; 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 CoglBool
_cogl_texture_2d_gl_allocate (CoglTexture *tex, _cogl_texture_2d_gl_allocate (CoglTexture *tex,
CoglError **error) CoglError **error)
@@ -575,8 +462,6 @@ _cogl_texture_2d_gl_allocate (CoglTexture *tex,
#endif #endif
case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN: case COGL_TEXTURE_SOURCE_TYPE_GL_FOREIGN:
return allocate_from_gl_foreign (tex_2d, loader, error); 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); g_return_val_if_reached (FALSE);
@@ -772,10 +657,9 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d,
upload_format = cogl_bitmap_get_format (upload_bmp); upload_format = cogl_bitmap_get_format (upload_bmp);
ctx->driver_vtable->pixel_format_to_gl_with_target (ctx, ctx->driver_vtable->pixel_format_to_gl (ctx,
upload_format, upload_format,
_cogl_texture_get_format (tex), NULL, /* internal format */
NULL, /* internal gl format */
&gl_format, &gl_format,
&gl_type); &gl_type);

View File

@@ -96,9 +96,8 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
} }
static CoglPixelFormat static CoglPixelFormat
_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context, _cogl_driver_pixel_format_to_gl (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format,
GLenum *out_glintformat, GLenum *out_glintformat,
GLenum *out_glformat, GLenum *out_glformat,
GLenum *out_gltype) GLenum *out_gltype)
@@ -175,15 +174,6 @@ _cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
case COGL_PIXEL_FORMAT_BGRA_8888: case COGL_PIXEL_FORMAT_BGRA_8888:
case COGL_PIXEL_FORMAT_BGRA_8888_PRE: case COGL_PIXEL_FORMAT_BGRA_8888_PRE:
glintformat = GL_RGBA; 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; gltype = GL_UNSIGNED_BYTE;
break; break;
@@ -299,20 +289,6 @@ _cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
return required_format; 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 static CoglBool
_cogl_get_gl_version (CoglContext *ctx, _cogl_get_gl_version (CoglContext *ctx,
int *major_out, int *major_out,
@@ -693,7 +669,6 @@ _cogl_driver_gl =
{ {
_cogl_driver_pixel_format_from_gl_internal, _cogl_driver_pixel_format_from_gl_internal,
_cogl_driver_pixel_format_to_gl, _cogl_driver_pixel_format_to_gl,
_cogl_driver_pixel_format_to_gl_with_target,
_cogl_driver_update_features, _cogl_driver_update_features,
_cogl_offscreen_gl_allocate, _cogl_offscreen_gl_allocate,
_cogl_offscreen_gl_free, _cogl_offscreen_gl_free,

View File

@@ -114,18 +114,6 @@ _cogl_texture_driver_gen (CoglContext *ctx,
red_swizzle) ); 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; return tex;
} }
@@ -533,13 +521,11 @@ static CoglPixelFormat
_cogl_texture_driver_find_best_gl_get_data_format _cogl_texture_driver_find_best_gl_get_data_format
(CoglContext *context, (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format,
GLenum *closest_gl_format, GLenum *closest_gl_format,
GLenum *closest_gl_type) GLenum *closest_gl_type)
{ {
return context->driver_vtable->pixel_format_to_gl_with_target (context, return context->driver_vtable->pixel_format_to_gl (context,
format, format,
target_format,
NULL, /* don't need */ NULL, /* don't need */
closest_gl_format, closest_gl_format,
closest_gl_type); closest_gl_type);

View File

@@ -67,9 +67,8 @@ _cogl_driver_pixel_format_from_gl_internal (CoglContext *context,
} }
static CoglPixelFormat static CoglPixelFormat
_cogl_driver_pixel_format_to_gl_with_target (CoglContext *context, _cogl_driver_pixel_format_to_gl (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format,
GLenum *out_glintformat, GLenum *out_glintformat,
GLenum *out_glformat, GLenum *out_glformat,
GLenum *out_gltype) GLenum *out_gltype)
@@ -220,20 +219,6 @@ _cogl_driver_pixel_format_to_gl_with_target (CoglContext *context,
return required_format; 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 static CoglBool
_cogl_get_gl_version (CoglContext *ctx, _cogl_get_gl_version (CoglContext *ctx,
int *major_out, int *major_out,
@@ -472,7 +457,6 @@ _cogl_driver_gles =
{ {
_cogl_driver_pixel_format_from_gl_internal, _cogl_driver_pixel_format_from_gl_internal,
_cogl_driver_pixel_format_to_gl, _cogl_driver_pixel_format_to_gl,
_cogl_driver_pixel_format_to_gl_with_target,
_cogl_driver_update_features, _cogl_driver_update_features,
_cogl_offscreen_gl_allocate, _cogl_offscreen_gl_allocate,
_cogl_offscreen_gl_free, _cogl_offscreen_gl_free,

View File

@@ -615,7 +615,6 @@ static CoglPixelFormat
_cogl_texture_driver_find_best_gl_get_data_format _cogl_texture_driver_find_best_gl_get_data_format
(CoglContext *context, (CoglContext *context,
CoglPixelFormat format, CoglPixelFormat format,
CoglPixelFormat target_format,
GLenum *closest_gl_format, GLenum *closest_gl_format,
GLenum *closest_gl_type) GLenum *closest_gl_type)
{ {

View File

@@ -61,7 +61,6 @@ _cogl_driver_nop =
{ {
NULL, /* pixel_format_from_gl_internal */ NULL, /* pixel_format_from_gl_internal */
NULL, /* pixel_format_to_gl */ NULL, /* pixel_format_to_gl */
NULL, /* pixel_format_to_gl_with_target */
_cogl_driver_update_features, _cogl_driver_update_features,
_cogl_offscreen_nop_allocate, _cogl_offscreen_nop_allocate,
_cogl_offscreen_nop_free, _cogl_offscreen_nop_free,

View File

@@ -2,12 +2,12 @@ prefix=@prefix@
exec_prefix=@exec_prefix@ exec_prefix=@exec_prefix@
libdir=@libdir@/mutter libdir=@libdir@/mutter
includedir=@includedir@/mutter includedir=@includedir@/mutter
apiversion=@LIBMUTTER_API_VERSION@ apiversion=1.0
requires=@COGL_PKG_REQUIRES@ requires=@COGL_PKG_REQUIRES@
Name: Cogl Name: Cogl
Description: An object oriented GL/GLES Abstraction/Utility Layer Description: An object oriented GL/GLES Abstraction/Utility Layer
Version: @MUTTER_VERSION@ Version: @COGL_1_VERSION@
Libs: -L${libdir} -lmutter-cogl-@LIBMUTTER_API_VERSION@ Libs: -L${libdir} -lmutter-cogl
Cflags: -I${includedir}/cogl Cflags: -I${includedir}/cogl
Requires: ${requires} Requires: ${requires}

View File

@@ -48,7 +48,6 @@
#include "cogl-texture-pixmap-x11-private.h" #include "cogl-texture-pixmap-x11-private.h"
#include "cogl-texture-2d-private.h" #include "cogl-texture-2d-private.h"
#include "cogl-texture-2d.h"
#include "cogl-error-private.h" #include "cogl-error-private.h"
#include "cogl-poll-private.h" #include "cogl-poll-private.h"
@@ -262,39 +261,6 @@ _cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
g_slice_free (CoglRendererEGL, egl_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 static CoglBool
_cogl_winsys_renderer_connect (CoglRenderer *renderer, _cogl_winsys_renderer_connect (CoglRenderer *renderer,
CoglError **error) CoglError **error)
@@ -311,7 +277,8 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
if (!_cogl_xlib_renderer_connect (renderer, error)) if (!_cogl_xlib_renderer_connect (renderer, error))
goto 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)) if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
goto error; goto error;
@@ -323,19 +290,6 @@ error:
return FALSE; 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 static CoglBool
_cogl_winsys_egl_display_setup (CoglDisplay *display, _cogl_winsys_egl_display_setup (CoglDisplay *display,
CoglError **error) CoglError **error)
@@ -774,7 +728,7 @@ _cogl_winsys_texture_pixmap_x11_create (CoglTexturePixmapX11 *tex_pixmap)
COGL_PIXEL_FORMAT_RGB_888); COGL_PIXEL_FORMAT_RGB_888);
egl_tex_pixmap->texture = COGL_TEXTURE ( egl_tex_pixmap->texture = COGL_TEXTURE (
cogl_egl_texture_2d_new_from_image (ctx, _cogl_egl_texture_2d_new_from_image (ctx,
tex->width, tex->width,
tex->height, tex->height,
texture_format, texture_format,
@@ -840,7 +794,6 @@ _cogl_winsys_texture_pixmap_x11_get_texture (CoglTexturePixmapX11 *tex_pixmap,
static const CoglWinsysEGLVtable static const CoglWinsysEGLVtable
_cogl_winsys_egl_vtable = _cogl_winsys_egl_vtable =
{ {
.add_config_attributes = _cogl_winsys_egl_add_config_attributes,
.display_setup = _cogl_winsys_egl_display_setup, .display_setup = _cogl_winsys_egl_display_setup,
.display_destroy = _cogl_winsys_egl_display_destroy, .display_destroy = _cogl_winsys_egl_display_destroy,
.context_created = _cogl_winsys_egl_context_created, .context_created = _cogl_winsys_egl_context_created,

View File

@@ -233,8 +233,8 @@ egl_attributes_from_framebuffer_config (CoglDisplay *display,
CoglRendererEGL *egl_renderer = renderer->winsys; CoglRendererEGL *egl_renderer = renderer->winsys;
int i = 0; int i = 0;
/* Let the platform add attributes first, including setting the /* Let the platform add attributes first */
* EGL_SURFACE_TYPE */ if (egl_renderer->platform_vtable->add_config_attributes)
i = egl_renderer->platform_vtable->add_config_attributes (display, i = egl_renderer->platform_vtable->add_config_attributes (display,
config, config,
attributes); attributes);
@@ -269,6 +269,9 @@ egl_attributes_from_framebuffer_config (CoglDisplay *display,
EGL_OPENGL_ES_BIT : EGL_OPENGL_ES_BIT :
EGL_OPENGL_ES2_BIT); EGL_OPENGL_ES2_BIT);
attributes[i++] = EGL_SURFACE_TYPE;
attributes[i++] = EGL_WINDOW_BIT;
if (config->samples_per_pixel) if (config->samples_per_pixel)
{ {
attributes[i++] = EGL_SAMPLE_BUFFERS; attributes[i++] = EGL_SAMPLE_BUFFERS;
@@ -1025,13 +1028,6 @@ _cogl_egl_create_image (CoglContext *ctx,
if (target == EGL_NATIVE_PIXMAP_KHR) if (target == EGL_NATIVE_PIXMAP_KHR)
egl_ctx = EGL_NO_CONTEXT; egl_ctx = EGL_NO_CONTEXT;
else 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 #endif
egl_ctx = egl_display->egl_context; egl_ctx = egl_display->egl_context;

View File

@@ -65,16 +65,12 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/time.h> #include <sys/time.h>
#include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <time.h> #include <time.h>
#include <unistd.h>
#include <GL/glx.h> #include <GL/glx.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <glib.h>
/* This is a relatively new extension */ /* This is a relatively new extension */
#ifndef GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV #ifndef GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV
#define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7 #define GLX_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x20F7
@@ -104,14 +100,6 @@ typedef struct _CoglOnscreenGLX
CoglBool pending_sync_notify; CoglBool pending_sync_notify;
CoglBool pending_complete_notify; CoglBool pending_complete_notify;
CoglBool pending_resize_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; } CoglOnscreenGLX;
typedef struct _CoglPixmapTextureEyeGLX typedef struct _CoglPixmapTextureEyeGLX
@@ -204,15 +192,6 @@ find_onscreen_for_xid (CoglContext *context, uint32_t xid)
return NULL; 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 static void
ensure_ust_type (CoglRenderer *renderer, ensure_ust_type (CoglRenderer *renderer,
GLXDrawable drawable) GLXDrawable drawable)
@@ -223,6 +202,7 @@ ensure_ust_type (CoglRenderer *renderer,
int64_t msc; int64_t msc;
int64_t sbc; int64_t sbc;
struct timeval tv; struct timeval tv;
struct timespec ts;
int64_t current_system_time; int64_t current_system_time;
int64_t current_monotonic_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 /* This is the time source that the newer (fixed) linux drm
* drivers use (Linux >= 3.8) */ * 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 && if (current_monotonic_time > ust - 1000000 &&
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; 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 /* 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 * to work with. cogl_get_clock_time() is documented to only work
* once a valid, non-zero, timestamp has been retrieved from Cogl. * 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: 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); g_strfreev (split_extensions);
/* The GLX_SGI_video_sync spec explicitly states this extension /* Note: the GLX_SGI_video_sync spec explicitly states this extension
* only works for direct contexts; we don't know per-renderer * only works for direct contexts. */
* if the context is direct or not, so we turn off the feature if (!glx_renderer->is_direct)
* flag; we still use the extension within this file looking {
* instead at glx_display->have_vblank_counter. glx_renderer->glXGetVideoSync = NULL;
*/ glx_renderer->glXWaitVideoSync = NULL;
COGL_FLAGS_SET (glx_renderer->base_winsys_features, COGL_FLAGS_SET (glx_renderer->base_winsys_features,
COGL_WINSYS_FEATURE_VBLANK_COUNTER, COGL_WINSYS_FEATURE_VBLANK_COUNTER,
FALSE); FALSE);
}
COGL_FLAGS_SET (glx_renderer->base_winsys_features, COGL_FLAGS_SET (glx_renderer->base_winsys_features,
COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN, COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN,
TRUE); TRUE);
/* Because of the direct-context dependency, the VBLANK_WAIT feature if (glx_renderer->glXWaitVideoSync ||
* doesn't reflect the presence of GLX_SGI_video_sync. glx_renderer->glXWaitForMsc)
*/
if (glx_renderer->glXWaitForMsc)
COGL_FLAGS_SET (glx_renderer->base_winsys_features, COGL_FLAGS_SET (glx_renderer->base_winsys_features,
COGL_WINSYS_FEATURE_VBLANK_WAIT, COGL_WINSYS_FEATURE_VBLANK_WAIT,
TRUE); TRUE);
@@ -881,7 +861,7 @@ update_winsys_features (CoglContext *context, CoglError **error)
* by the SwapInterval so we have to throttle swap_region requests * by the SwapInterval so we have to throttle swap_region requests
* manually... */ * manually... */
if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SWAP_REGION) && 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_FLAGS_SET (context->winsys_features,
COGL_WINSYS_FEATURE_SWAP_REGION_THROTTLE, TRUE); COGL_WINSYS_FEATURE_SWAP_REGION_THROTTLE, TRUE);
@@ -897,29 +877,6 @@ update_winsys_features (CoglContext *context, CoglError **error)
COGL_FEATURE_ID_PRESENTATION_TIME, COGL_FEATURE_ID_PRESENTATION_TIME,
TRUE); 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 /* We'll manually handle queueing dirty events in response to
* Expose events from X */ * Expose events from X */
@@ -1182,13 +1139,11 @@ create_context (CoglDisplay *display, CoglError **error)
return FALSE; return FALSE;
} }
glx_display->is_direct = glx_renderer->is_direct =
glx_renderer->glXIsDirect (xlib_renderer->xdpy, glx_display->glx_context); 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", 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 /* 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 * 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 #ifdef GLX_INTEL_swap_event
if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT) && if (_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_SYNC_AND_COMPLETE_EVENT))
!_cogl_has_private_feature (context, COGL_PRIVATE_FEATURE_THREADED_SWAP_WAIT))
{ {
GLXDrawable drawable = GLXDrawable drawable =
glx_onscreen->glxwin ? glx_onscreen->glxwin : xlib_onscreen->xwin; glx_onscreen->glxwin ? glx_onscreen->glxwin : xlib_onscreen->xwin;
@@ -1560,31 +1514,6 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen)
xlib_onscreen->output = NULL; 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); _cogl_xlib_renderer_trap_errors (context->display->renderer, &old_state);
drawable = drawable =
@@ -1726,13 +1655,12 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen)
CoglContext *ctx = framebuffer->context; CoglContext *ctx = framebuffer->context;
CoglGLXRenderer *glx_renderer; CoglGLXRenderer *glx_renderer;
CoglXlibRenderer *xlib_renderer; CoglXlibRenderer *xlib_renderer;
CoglGLXDisplay *glx_display;
glx_renderer = ctx->display->renderer->winsys; glx_renderer = ctx->display->renderer->winsys;
xlib_renderer = _cogl_xlib_renderer_get_data (ctx->display->renderer); 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); CoglFrameInfo *info = g_queue_peek_tail (&onscreen->pending_frame_infos);
@@ -1754,13 +1682,16 @@ _cogl_winsys_wait_for_vblank (CoglOnscreen *onscreen)
else else
{ {
uint32_t current_count; uint32_t current_count;
struct timespec ts;
glx_renderer->glXGetVideoSync (&current_count); glx_renderer->glXGetVideoSync (&current_count);
glx_renderer->glXWaitVideoSync (2, glx_renderer->glXWaitVideoSync (2,
(current_count + 1) % 2, (current_count + 1) % 2,
&current_count); &current_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 static void
_cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen, _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
const int *user_rectangles, const int *user_rectangles,
@@ -2021,7 +1759,6 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (context->display->renderer); _cogl_xlib_renderer_get_data (context->display->renderer);
CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
CoglGLXDisplay *glx_display = context->display->winsys;
CoglOnscreenXlib *xlib_onscreen = onscreen->winsys; CoglOnscreenXlib *xlib_onscreen = onscreen->winsys;
CoglOnscreenGLX *glx_onscreen = onscreen->winsys; CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
GLXDrawable drawable = GLXDrawable drawable =
@@ -2078,8 +1815,9 @@ _cogl_winsys_onscreen_swap_region (CoglOnscreen *onscreen,
if (framebuffer->config.swap_throttled) if (framebuffer->config.swap_throttled)
{ {
have_counter = glx_display->have_vblank_counter; have_counter =
can_wait = glx_display->can_vblank_wait; _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_COUNTER);
can_wait = _cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT);
} }
else else
{ {
@@ -2236,7 +1974,6 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
CoglXlibRenderer *xlib_renderer = CoglXlibRenderer *xlib_renderer =
_cogl_xlib_renderer_get_data (context->display->renderer); _cogl_xlib_renderer_get_data (context->display->renderer);
CoglGLXRenderer *glx_renderer = context->display->renderer->winsys; CoglGLXRenderer *glx_renderer = context->display->renderer->winsys;
CoglGLXDisplay *glx_display = context->display->winsys;
CoglOnscreenXlib *xlib_onscreen = onscreen->winsys; CoglOnscreenXlib *xlib_onscreen = onscreen->winsys;
CoglOnscreenGLX *glx_onscreen = onscreen->winsys; CoglOnscreenGLX *glx_onscreen = onscreen->winsys;
CoglBool have_counter; CoglBool have_counter;
@@ -2254,39 +1991,22 @@ _cogl_winsys_onscreen_swap_buffers_with_damage (CoglOnscreen *onscreen,
if (framebuffer->config.swap_throttled) if (framebuffer->config.swap_throttled)
{ {
have_counter = glx_display->have_vblank_counter;
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; uint32_t end_frame_vsync_counter = 0;
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 /* 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 * the vsync counter for each swap request so we can manually
* throttle swap_region requests. */ * throttle swap_region requests. */
if (have_counter) if (have_counter)
end_frame_vsync_counter = _cogl_winsys_get_vsync_counter (context); end_frame_vsync_counter = _cogl_winsys_get_vsync_counter (context);
if (!glx_renderer->glXSwapInterval)
{
CoglBool can_wait =
_cogl_winsys_has_feature (COGL_WINSYS_FEATURE_VBLANK_WAIT);
/* If we are going to wait for VBLANK manually, we not only /* If we are going to wait for VBLANK manually, we not only
* need to flush out pending drawing to the GPU before we * need to flush out pending drawing to the GPU before we
* sleep, we need to wait for it to finish. Otherwise, we * sleep, we need to wait for it to finish. Otherwise, we

View File

@@ -83,16 +83,6 @@ AC_CONFIG_HEADERS(cogl-config.h)
AC_CONFIG_HEADERS(cogl-mutter-config.h) AC_CONFIG_HEADERS(cogl-mutter-config.h)
AC_GNU_SOURCE 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 ================================================================
dnl Required versions for dependencies dnl Required versions for dependencies
dnl ================================================================ dnl ================================================================
@@ -955,16 +945,16 @@ AC_OUTPUT(
Makefile Makefile
test-fixtures/Makefile test-fixtures/Makefile
cogl/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-defines.h
cogl/cogl-gl-header.h cogl/cogl-gl-header.h
cogl/cogl-egl-defines.h cogl/cogl-egl-defines.h
cogl-pango/Makefile 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/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/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/Makefile
tests/config.env tests/config.env
tests/conform/Makefile tests/conform/Makefile

View File

@@ -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_CFLAGS = -g3 -O0 $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS) -Wno-error=maybe-uninitialized -Wno-error=nested-externs -Wno-error=missing-prototypes
test_conformance_LDADD = \ test_conformance_LDADD = \
$(COGL_DEP_LIBS) \ $(COGL_DEP_LIBS) \
$(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la \ $(top_builddir)/cogl/libmutter-cogl.la \
$(LIBM) $(LIBM)
if BUILD_COGL_PATH 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 endif
test_conformance_LDFLAGS = -export-dynamic test_conformance_LDFLAGS = -export-dynamic

View File

@@ -2,7 +2,6 @@ NULL =
AM_CPPFLAGS = \ AM_CPPFLAGS = \
-I$(top_srcdir) \ -I$(top_srcdir) \
-I$(top_builddir)/cogl \
-DCOGL_DISABLE_DEPRECATED -DCOGL_DISABLE_DEPRECATED
test_conformance_CPPFLAGS = \ test_conformance_CPPFLAGS = \
@@ -17,7 +16,7 @@ AM_CFLAGS = $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS)
common_ldadd = \ common_ldadd = \
$(COGL_DEP_LIBS) \ $(COGL_DEP_LIBS) \
$(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la \ $(top_builddir)/cogl/libmutter-cogl.la \
$(LIBM) $(LIBM)
test_journal_SOURCES = test-journal.c test_journal_SOURCES = test-journal.c

View File

@@ -13,7 +13,7 @@ wrappers: stamp-test-unit
@true @true
stamp-test-unit: Makefile test-unit$(EXEEXT) stamp-test-unit: Makefile test-unit$(EXEEXT)
@mkdir -p wrappers @mkdir -p wrappers
. $(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la ; \ . $(top_builddir)/cogl/libmutter-cogl.la ; \
$(NM) $(top_builddir)/cogl/.libs/"$$dlname"| \ $(NM) $(top_builddir)/cogl/.libs/"$$dlname"| \
grep '[DR] _\?unit_test_'|sed 's/.\+ [DR] _\?//' > unit-tests grep '[DR] _\?unit_test_'|sed 's/.\+ [DR] _\?//' > unit-tests
@chmod +x $(top_srcdir)/tests/test-launcher.sh @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_CFLAGS = -g3 -O0 $(COGL_DEP_CFLAGS) $(COGL_EXTRA_CFLAGS)
test_unit_LDADD = \ test_unit_LDADD = \
$(COGL_DEP_LIBS) \ $(COGL_DEP_LIBS) \
$(top_builddir)/cogl/libmutter-cogl-$(LIBMUTTER_API_VERSION).la \ $(top_builddir)/cogl/libmutter-cogl.la \
$(LIBM) $(LIBM)
test_unit_LDFLAGS = -export-dynamic test_unit_LDFLAGS = -export-dynamic

View File

@@ -1,7 +1,7 @@
AC_PREREQ(2.62) AC_PREREQ(2.62)
m4_define([mutter_major_version], [3]) 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_micro_version], [4])
m4_define([mutter_version], m4_define([mutter_version],
@@ -9,8 +9,6 @@ m4_define([mutter_version],
m4_define([mutter_plugin_api_version], [3]) m4_define([mutter_plugin_api_version], [3])
m4_define([libmutter_api_version], [0])
AC_INIT([mutter], [mutter_version], AC_INIT([mutter], [mutter_version],
[http://bugzilla.gnome.org/enter_bug.cgi?product=mutter]) [http://bugzilla.gnome.org/enter_bug.cgi?product=mutter])
@@ -29,18 +27,11 @@ AC_GNU_SOURCE
MUTTER_MAJOR_VERSION=mutter_major_version MUTTER_MAJOR_VERSION=mutter_major_version
MUTTER_MINOR_VERSION=mutter_minor_version MUTTER_MINOR_VERSION=mutter_minor_version
MUTTER_MICRO_VERSION=mutter_micro_version MUTTER_MICRO_VERSION=mutter_micro_version
MUTTER_VERSION=mutter_version
MUTTER_PLUGIN_API_VERSION=mutter_plugin_api_version MUTTER_PLUGIN_API_VERSION=mutter_plugin_api_version
LIBMUTTER_API_VERSION=libmutter_api_version
AC_SUBST(MUTTER_MAJOR_VERSION) AC_SUBST(MUTTER_MAJOR_VERSION)
AC_SUBST(MUTTER_MINOR_VERSION) AC_SUBST(MUTTER_MINOR_VERSION)
AC_SUBST(MUTTER_MICRO_VERSION) AC_SUBST(MUTTER_MICRO_VERSION)
AC_SUBST(MUTTER_PLUGIN_API_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" MUTTER_PLUGIN_DIR="$libdir/$PACKAGE/plugins"
AC_SUBST(MUTTER_PLUGIN_DIR) AC_SUBST(MUTTER_PLUGIN_DIR)
@@ -52,11 +43,9 @@ GETTEXT_PACKAGE=mutter
AC_SUBST(GETTEXT_PACKAGE) AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain]) 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_PREREQ([2.2.6])
LT_INIT([disable-static]) LT_INIT([disable-static])
IT_PROG_INTLTOOL([0.41])
AC_PROG_CC AC_PROG_CC
AC_PROG_CC_C_O AC_PROG_CC_C_O
AC_PROG_INSTALL AC_PROG_INSTALL
@@ -73,7 +62,6 @@ CANBERRA_GTK_VERSION=0.26
LIBWACOM_VERSION=0.13 LIBWACOM_VERSION=0.13
MUTTER_PC_MODULES=" MUTTER_PC_MODULES="
egl
gtk+-3.0 >= 3.19.8 gtk+-3.0 >= 3.19.8
gio-unix-2.0 >= 2.35.1 gio-unix-2.0 >= 2.35.1
pango >= 1.2.0 pango >= 1.2.0
@@ -95,7 +83,6 @@ MUTTER_PC_MODULES="
xrender xrender
x11-xcb x11-xcb
xcb-randr xcb-randr
xcb-res
" "
GLIB_GSETTINGS GLIB_GSETTINGS
@@ -129,11 +116,6 @@ AC_ARG_WITH(libwacom,
[disable the use of libwacom for advanced tablet management]),, [disable the use of libwacom for advanced tablet management]),,
with_libwacom=auto) 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], AC_ARG_WITH([xwayland-path],
[AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])], [AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])],
[XWAYLAND_PATH="$withval"], [XWAYLAND_PATH="$withval"],
@@ -213,43 +195,31 @@ else
fi fi
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 INTROSPECTION_VERSION=0.9.5
GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION]) GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
if test x$found_introspection != xno; then if test x$found_introspection != xno; then
AC_DEFINE(HAVE_INTROSPECTION, 1, [Define if GObject introspection is available]) AC_DEFINE(HAVE_INTROSPECTION, 1, [Define if GObject introspection is available])
MUTTER_PC_MODULES="$MUTTER_PC_MODULES gobject-introspection-1.0" 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 fi
AC_SUBST(XWAYLAND_PATH) AC_SUBST(XWAYLAND_PATH)
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES) 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, AC_ARG_ENABLE(native-backend,
AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),, AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),,
enable_native_backend=auto enable_native_backend=auto
) )
have_native_backend="no"
AS_IF([test "$enable_native_backend" = "yes"], [have_native_backend=yes], 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])) [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"]) 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" MUTTER_WAYLAND_MODULES="wayland-server >= 1.6.90"
AC_ARG_ENABLE(wayland, AC_ARG_ENABLE(wayland,
@@ -285,7 +246,7 @@ AS_IF([test "$have_wayland" = "yes"], [
AC_SUBST([WAYLAND_SCANNER]) AC_SUBST([WAYLAND_SCANNER])
AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support]) 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_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`])
AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir) 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])], [AC_MSG_ERROR([GL_EXT_x11_sync_object definition not found, please update your GL headers])],
[#include <GL/glx.h>]) [#include <GL/glx.h>])
AC_PATH_PROG([CVT],[cvt],[])
#### Warnings (last since -Werror can disturb other tests) #### Warnings (last since -Werror can disturb other tests)
# Stay command-line compatible with the gnome-common configure option. Here # Stay command-line compatible with the gnome-common configure option. Here
@@ -463,7 +422,7 @@ data/Makefile
doc/Makefile doc/Makefile
doc/man/Makefile doc/man/Makefile
src/Makefile src/Makefile
src/libmutter-$LIBMUTTER_API_VERSION.pc:src/libmutter.pc.in src/libmutter.pc
src/compositor/plugins/Makefile src/compositor/plugins/Makefile
src/meta/meta-version.h src/meta/meta-version.h
po/Makefile.in po/Makefile.in
@@ -471,16 +430,6 @@ po/Makefile.in
AC_OUTPUT 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 if test x$enable_verbose_mode = xno; then
echo "*** WARNING WARNING WARNING WARNING WARNING" echo "*** WARNING WARNING WARNING WARNING WARNING"
echo "*** Building without verbose mode" echo "*** Building without verbose mode"
@@ -500,12 +449,10 @@ mutter-$VERSION
Startup notification: ${have_startup_notification} Startup notification: ${have_startup_notification}
libcanberra: ${have_libcanberra} libcanberra: ${have_libcanberra}
libwacom: ${have_libwacom} libwacom: ${have_libwacom}
gudev ${have_gudev}
Introspection: ${found_introspection} Introspection: ${found_introspection}
Session management: ${found_sm} Session management: ${found_sm}
Wayland: ${have_wayland} Wayland: ${have_wayland}
Native (KMS) backend: ${have_native_backend} Native (KMS) backend: ${have_native_backend}
EGLDevice: ${enable_egl_device}
" "

View File

@@ -1,140 +1,140 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<KeyListEntries schema="org.gnome.desktop.wm.keybindings" <KeyListEntries schema="org.gnome.desktop.wm.keybindings"
group="system" group="system"
name="Navigation" _name="Navigation"
wm_name="Mutter" wm_name="Mutter"
package="mutter"> package="mutter">
<KeyListEntry name="move-to-workspace-1" <KeyListEntry name="move-to-workspace-1"
description="Move window to workspace 1" /> _description="Move window to workspace 1" />
<KeyListEntry name="move-to-workspace-2" <KeyListEntry name="move-to-workspace-2"
description="Move window to workspace 2" /> _description="Move window to workspace 2" />
<KeyListEntry name="move-to-workspace-3" <KeyListEntry name="move-to-workspace-3"
description="Move window to workspace 3" /> _description="Move window to workspace 3" />
<KeyListEntry name="move-to-workspace-4" <KeyListEntry name="move-to-workspace-4"
description="Move window to workspace 4" /> _description="Move window to workspace 4" />
<KeyListEntry name="move-to-workspace-last" <KeyListEntry name="move-to-workspace-last"
description="Move window to last workspace" /> _description="Move window to last workspace" />
<KeyListEntry name="move-to-workspace-left" <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" <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" <KeyListEntry name="move-to-workspace-up"
description="Move window one workspace up" /> _description="Move window one workspace up" />
<KeyListEntry name="move-to-workspace-down" <KeyListEntry name="move-to-workspace-down"
description="Move window one workspace down" /> _description="Move window one workspace down" />
<KeyListEntry name="move-to-monitor-left" <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" <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" <KeyListEntry name="move-to-monitor-up"
description="Move window one monitor up" /> _description="Move window one monitor up" />
<KeyListEntry name="move-to-monitor-down" <KeyListEntry name="move-to-monitor-down"
description="Move window one monitor down" /> _description="Move window one monitor down" />
<KeyListEntry name="switch-applications" <KeyListEntry name="switch-applications"
reverse-entry="switch-applications-backward" reverse-entry="switch-applications-backward"
description="Switch applications"/> _description="Switch applications"/>
<KeyListEntry name="switch-applications-backward" <KeyListEntry name="switch-applications-backward"
reverse-entry="switch-applications" reverse-entry="switch-applications"
hidden="true" hidden="true"
description="Switch to previous application"/> _description="Switch to previous application"/>
<KeyListEntry name="switch-windows" <KeyListEntry name="switch-windows"
reverse-entry="switch-windows-backward" reverse-entry="switch-windows-backward"
description="Switch windows"/> _description="Switch windows"/>
<KeyListEntry name="switch-windows-backward" <KeyListEntry name="switch-windows-backward"
reverse-entry="switch-windows" reverse-entry="switch-windows"
hidden="true" hidden="true"
description="Switch to previous window"/> _description="Switch to previous window"/>
<KeyListEntry name="switch-group" <KeyListEntry name="switch-group"
reverse-entry="switch-group-backward" reverse-entry="switch-group-backward"
description="Switch windows of an application"/> _description="Switch windows of an application"/>
<KeyListEntry name="switch-group-backward" <KeyListEntry name="switch-group-backward"
reverse-entry="switch-group" reverse-entry="switch-group"
hidden="true" hidden="true"
description="Switch to previous window of an application"/> _description="Switch to previous window of an application"/>
<KeyListEntry name="switch-panels" <KeyListEntry name="switch-panels"
reverse-entry="switch-panels-backward" reverse-entry="switch-panels-backward"
description="Switch system controls"/> _description="Switch system controls"/>
<KeyListEntry name="switch-panels-backward" <KeyListEntry name="switch-panels-backward"
reverse-entry="switch-panels" reverse-entry="switch-panels"
hidden="true" hidden="true"
description="Switch to previous system control"/> _description="Switch to previous system control"/>
<KeyListEntry name="cycle-windows" <KeyListEntry name="cycle-windows"
reverse-entry="cycle-windows-backward" reverse-entry="cycle-windows-backward"
description="Switch windows directly"/> _description="Switch windows directly"/>
<KeyListEntry name="cycle-windows-backward" <KeyListEntry name="cycle-windows-backward"
reverse-entry="cycle-windows" reverse-entry="cycle-windows"
hidden="true" hidden="true"
description="Switch directly to previous window"/> _description="Switch directly to previous window"/>
<KeyListEntry name="cycle-group" <KeyListEntry name="cycle-group"
reverse-entry="cycle-group-backward" reverse-entry="cycle-group-backward"
description="Switch windows of an app directly"/> _description="Switch windows of an app directly"/>
<KeyListEntry name="cycle-group-backward" <KeyListEntry name="cycle-group-backward"
reverse-entry="cycle-group" reverse-entry="cycle-group"
hidden="true" hidden="true"
description="Switch directly to previous window of an app"/> _description="Switch directly to previous window of an app"/>
<KeyListEntry name="cycle-panels" <KeyListEntry name="cycle-panels"
reverse-entry="cycle-panels-backward" reverse-entry="cycle-panels-backward"
description="Switch system controls directly"/> _description="Switch system controls directly"/>
<KeyListEntry name="cycle-panels-backward" <KeyListEntry name="cycle-panels-backward"
reverse-entry="cycle-panels" reverse-entry="cycle-panels"
hidden="true" hidden="true"
description="Switch directly to previous system control"/> _description="Switch directly to previous system control"/>
<KeyListEntry name="show-desktop" <KeyListEntry name="show-desktop"
description="Hide all normal windows"/> _description="Hide all normal windows"/>
<KeyListEntry name="switch-to-workspace-1" <KeyListEntry name="switch-to-workspace-1"
description="Switch to workspace 1" /> _description="Switch to workspace 1" />
<KeyListEntry name="switch-to-workspace-2" <KeyListEntry name="switch-to-workspace-2"
description="Switch to workspace 2" /> _description="Switch to workspace 2" />
<KeyListEntry name="switch-to-workspace-3" <KeyListEntry name="switch-to-workspace-3"
description="Switch to workspace 3" /> _description="Switch to workspace 3" />
<KeyListEntry name="switch-to-workspace-4" <KeyListEntry name="switch-to-workspace-4"
description="Switch to workspace 4" /> _description="Switch to workspace 4" />
<KeyListEntry name="switch-to-workspace-last" <KeyListEntry name="switch-to-workspace-last"
description="Switch to last workspace" /> _description="Switch to last workspace" />
<KeyListEntry name="switch-to-workspace-left" <KeyListEntry name="switch-to-workspace-left"
description="Move to workspace left" /> _description="Move to workspace left" />
<KeyListEntry name="switch-to-workspace-right" <KeyListEntry name="switch-to-workspace-right"
description="Move to workspace right" /> _description="Move to workspace right" />
<KeyListEntry name="switch-to-workspace-up" <KeyListEntry name="switch-to-workspace-up"
description="Move to workspace above" /> _description="Move to workspace above" />
<KeyListEntry name="switch-to-workspace-down" <KeyListEntry name="switch-to-workspace-down"
description="Move to workspace below" /> _description="Move to workspace below" />
</KeyListEntries> </KeyListEntries>

View File

@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<KeyListEntries schema="org.gnome.desktop.wm.keybindings" <KeyListEntries schema="org.gnome.desktop.wm.keybindings"
group="system" group="system"
name="System" _name="System"
wm_name="Mutter" wm_name="Mutter"
package="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> </KeyListEntries>

View File

@@ -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>

View 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>

View File

@@ -3,24 +3,21 @@ desktopfiles_in_files = \
desktopfilesdir = $(datadir)/applications desktopfilesdir = $(datadir)/applications
desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop) desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop)
%.desktop:%.desktop.in @INTLTOOL_DESKTOP_RULE@
$(AM_V_GET) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@
xml_in_files = \
50-mutter-navigation.xml.in \
50-mutter-system.xml.in \
50-mutter-windows.xml.in
xmldir = $(GNOME_KEYBINDINGS_KEYSDIR) xmldir = $(GNOME_KEYBINDINGS_KEYSDIR)
xml_DATA = \ xml_DATA = $(xml_in_files:.xml.in=.xml)
50-mutter-navigation.xml \
50-mutter-system.xml \
50-mutter-windows.xml
gschema_in_files = \ gschema_in_files = \
org.gnome.mutter.gschema.xml.in \ org.gnome.mutter.gschema.xml.in \
org.gnome.mutter.wayland.gschema.xml.in org.gnome.mutter.wayland.gschema.xml.in
gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml) gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml)
%.gschema.xml: %.gschema.xml.in Makefile @INTLTOOL_XML_NOMERGE_RULE@
$(AM_V_GEN) sed -e 's|@GETTEXT_DOMAIN[@]|$(GETTEXT_DOMAIN)|g' \
$< > $@ || rm $@
@GSETTINGS_RULES@ @GSETTINGS_RULES@
convertdir = $(datadir)/GConf/gsettings convertdir = $(datadir)/GConf/gsettings
@@ -28,10 +25,11 @@ convert_DATA = mutter-schemas.convert
CLEANFILES = \ CLEANFILES = \
$(desktopfiles_DATA) \ $(desktopfiles_DATA) \
$(gsettings_SCHEMAS) $(gsettings_SCHEMAS) \
$(xml_DATA)
EXTRA_DIST = \ EXTRA_DIST = \
$(convert_DATA) \ $(convert_DATA) \
$(desktopfiles_in_files) \ $(desktopfiles_in_files) \
$(gschema_in_files) \ $(gschema_in_files) \
$(xml_DATA) $(xml_in_files)

View File

@@ -1,6 +1,6 @@
[Desktop Entry] [Desktop Entry]
Type=Application Type=Application
Name=Mutter _Name=Mutter
Exec=mutter Exec=mutter
NoDisplay=true NoDisplay=true
# name of loadable control center module # name of loadable control center module

View File

@@ -4,102 +4,102 @@
<key name="overlay-key" type="s"> <key name="overlay-key" type="s">
<default>'Super_L'</default> <default>'Super_L'</default>
<summary>Modifier to use for extended window management operations</summary> <_summary>Modifier to use for extended window management operations</_summary>
<description> <_description>
This key will initiate the overlay, which is a combination window This key will initiate the "overlay", which is a combination window
overview and application launching system. The default is intended 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.
Its 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. the empty string.
</description> </_description>
</key> </key>
<key name="attach-modal-dialogs" type="b"> <key name="attach-modal-dialogs" type="b">
<default>false</default> <default>false</default>
<summary>Attach modal dialogs</summary> <_summary>Attach modal dialogs</_summary>
<description> <_description>
When true, instead of having independent titlebars, modal dialogs When true, instead of having independent titlebars, modal dialogs
appear attached to the titlebar of the parent window and are moved appear attached to the titlebar of the parent window and are moved
together with the parent window. together with the parent window.
</description> </_description>
</key> </key>
<key name="edge-tiling" type="b"> <key name="edge-tiling" type="b">
<default>false</default> <default>false</default>
<summary>Enable edge tiling when dropping windows on screen edges</summary> <_summary>Enable edge tiling when dropping windows on screen edges</_summary>
<description> <_description>
If enabled, dropping windows on vertical screen edges maximizes them If enabled, dropping windows on vertical screen edges maximizes them
vertically and resizes them horizontally to cover half of the available vertically and resizes them horizontally to cover half of the available
area. Dropping windows on the top screen edge maximizes them completely. area. Dropping windows on the top screen edge maximizes them completely.
</description> </_description>
</key> </key>
<key name="dynamic-workspaces" type="b"> <key name="dynamic-workspaces" type="b">
<default>false</default> <default>false</default>
<summary>Workspaces are managed dynamically</summary> <_summary>Workspaces are managed dynamically</_summary>
<description> <_description>
Determines whether workspaces are managed dynamically or Determines whether workspaces are managed dynamically or
whether theres 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). by the num-workspaces key in org.gnome.desktop.wm.preferences).
</description> </_description>
</key> </key>
<key name="workspaces-only-on-primary" type="b"> <key name="workspaces-only-on-primary" type="b">
<default>false</default> <default>false</default>
<summary>Workspaces only on primary</summary> <_summary>Workspaces only on primary</_summary>
<description> <_description>
Determines whether workspace switching should happen for windows Determines whether workspace switching should happen for windows
on all monitors or only for windows on the primary monitor. on all monitors or only for windows on the primary monitor.
</description> </_description>
</key> </key>
<key name="no-tab-popup" type="b"> <key name="no-tab-popup" type="b">
<default>false</default> <default>false</default>
<summary>No tab popup</summary> <_summary>No tab popup</_summary>
<description> <_description>
Determines whether the use of popup and highlight frame should Determines whether the use of popup and highlight frame should
be disabled for window cycling. be disabled for window cycling.
</description> </_description>
</key> </key>
<key name="focus-change-on-pointer-rest" type="b"> <key name="focus-change-on-pointer-rest" type="b">
<default>false</default> <default>false</default>
<summary>Delay focus changes until the pointer stops moving</summary> <_summary>Delay focus changes until the pointer stops moving</_summary>
<description> <_description>
If set to true, and the focus mode is either sloppy or mouse If set to true, and the focus mode is either "sloppy" or "mouse"
then the focus will not be changed immediately when entering a then the focus will not be changed immediately when entering a
window, but only after the pointer stops moving. window, but only after the pointer stops moving.
</description> </_description>
</key> </key>
<key name="draggable-border-width" type="i"> <key name="draggable-border-width" type="i">
<default>10</default> <default>10</default>
<range min="0" max="64"/> <range min="0" max="64"/>
<summary>Draggable border width</summary> <_summary>Draggable border width</_summary>
<description> <_description>
The amount of total draggable borders. If the themes visible The amount of total draggable borders. If the theme's visible
borders are not enough, invisible borders will be added to meet borders are not enough, invisible borders will be added to meet
this value. this value.
</description> </_description>
</key> </key>
<key name="auto-maximize" type="b"> <key name="auto-maximize" type="b">
<default>true</default> <default>true</default>
<summary>Auto maximize nearly monitor sized windows</summary> <_summary>Auto maximize nearly monitor sized windows</_summary>
<description> <_description>
If enabled, new windows that are initially the size of the monitor If enabled, new windows that are initially the size of the monitor
automatically get maximized. automatically get maximized.
</description> </_description>
</key> </key>
<key name="center-new-windows" type="b"> <key name="center-new-windows" type="b">
<default>false</default> <default>false</default>
<summary>Place new windows in the center</summary> <_summary>Place new windows in the center</_summary>
<description> <_description>
When true, the new windows will always be put in the center of the When true, the new windows will always be put in the center of the
active screen of the monitor. active screen of the monitor.
</description> </_description>
</key> </key>
<child name="keybindings" schema="org.gnome.mutter.keybindings"/> <child name="keybindings" schema="org.gnome.mutter.keybindings"/>
@@ -117,12 +117,12 @@
<key name="tab-popup-select" type="as"> <key name="tab-popup-select" type="as">
<default>[]</default> <default>[]</default>
<summary>Select window from tab popup</summary> <_summary>Select window from tab popup</_summary>
</key> </key>
<key name="tab-popup-cancel" type="as"> <key name="tab-popup-cancel" type="as">
<default>[]</default> <default>[]</default>
<summary>Cancel tab popup</summary> <_summary>Cancel tab popup</_summary>
</key> </key>
</schema> </schema>

View File

@@ -3,51 +3,51 @@
gettext-domain="@GETTEXT_DOMAIN@"> gettext-domain="@GETTEXT_DOMAIN@">
<key name="switch-to-session-1" type="as"> <key name="switch-to-session-1" type="as">
<default><![CDATA[['<Primary><Alt>F1']]]></default> <default><![CDATA[['<Primary><Alt>F1']]]></default>
<summary>Switch to VT 1</summary> <_summary>Switch to VT 1</_summary>
</key> </key>
<key name="switch-to-session-2" type="as"> <key name="switch-to-session-2" type="as">
<default><![CDATA[['<Primary><Alt>F2']]]></default> <default><![CDATA[['<Primary><Alt>F2']]]></default>
<summary>Switch to VT 2</summary> <_summary>Switch to VT 2</_summary>
</key> </key>
<key name="switch-to-session-3" type="as"> <key name="switch-to-session-3" type="as">
<default><![CDATA[['<Primary><Alt>F3']]]></default> <default><![CDATA[['<Primary><Alt>F3']]]></default>
<summary>Switch to VT 3</summary> <_summary>Switch to VT 3</_summary>
</key> </key>
<key name="switch-to-session-4" type="as"> <key name="switch-to-session-4" type="as">
<default><![CDATA[['<Primary><Alt>F4']]]></default> <default><![CDATA[['<Primary><Alt>F4']]]></default>
<summary>Switch to VT 4</summary> <_summary>Switch to VT 4</_summary>
</key> </key>
<key name="switch-to-session-5" type="as"> <key name="switch-to-session-5" type="as">
<default><![CDATA[['<Primary><Alt>F5']]]></default> <default><![CDATA[['<Primary><Alt>F5']]]></default>
<summary>Switch to VT 5</summary> <_summary>Switch to VT 5</_summary>
</key> </key>
<key name="switch-to-session-6" type="as"> <key name="switch-to-session-6" type="as">
<default><![CDATA[['<Primary><Alt>F6']]]></default> <default><![CDATA[['<Primary><Alt>F6']]]></default>
<summary>Switch to VT 6</summary> <_summary>Switch to VT 6</_summary>
</key> </key>
<key name="switch-to-session-7" type="as"> <key name="switch-to-session-7" type="as">
<default><![CDATA[['<Primary><Alt>F7']]]></default> <default><![CDATA[['<Primary><Alt>F7']]]></default>
<summary>Switch to VT 7</summary> <_summary>Switch to VT 7</_summary>
</key> </key>
<key name="switch-to-session-8" type="as"> <key name="switch-to-session-8" type="as">
<default><![CDATA[['<Primary><Alt>F8']]]></default> <default><![CDATA[['<Primary><Alt>F8']]]></default>
<summary>Switch to VT 8</summary> <_summary>Switch to VT 8</_summary>
</key> </key>
<key name="switch-to-session-9" type="as"> <key name="switch-to-session-9" type="as">
<default><![CDATA[['<Primary><Alt>F9']]]></default> <default><![CDATA[['<Primary><Alt>F9']]]></default>
<summary>Switch to VT 9</summary> <_summary>Switch to VT 9</_summary>
</key> </key>
<key name="switch-to-session-10" type="as"> <key name="switch-to-session-10" type="as">
<default><![CDATA[['<Primary><Alt>F10']]]></default> <default><![CDATA[['<Primary><Alt>F10']]]></default>
<summary>Switch to VT 10</summary> <_summary>Switch to VT 10</_summary>
</key> </key>
<key name="switch-to-session-11" type="as"> <key name="switch-to-session-11" type="as">
<default><![CDATA[['<Primary><Alt>F11']]]></default> <default><![CDATA[['<Primary><Alt>F11']]]></default>
<summary>Switch to VT 11</summary> <_summary>Switch to VT 11</_summary>
</key> </key>
<key name="switch-to-session-12" type="as"> <key name="switch-to-session-12" type="as">
<default><![CDATA[['<Primary><Alt>F12']]]></default> <default><![CDATA[['<Primary><Alt>F12']]]></default>
<summary>Switch to VT 12</summary> <_summary>Switch to VT 12</_summary>
</key> </key>
</schema> </schema>
</schemalist> </schemalist>

View File

@@ -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