Compare commits
4 Commits
wip/garnac
...
wip/dnd-su
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7947bcb0b0 | ||
|
|
308cccc72c | ||
|
|
074946ac0b | ||
|
|
9688a0d7bc |
11
.gitignore
vendored
11
.gitignore
vendored
@@ -44,9 +44,6 @@ po/*.pot
|
|||||||
libmutter.pc
|
libmutter.pc
|
||||||
mutter
|
mutter
|
||||||
mutter-restart-helper
|
mutter-restart-helper
|
||||||
mutter-test-client
|
|
||||||
mutter-test-runner
|
|
||||||
mutter-all.test
|
|
||||||
org.gnome.mutter.gschema.valid
|
org.gnome.mutter.gschema.valid
|
||||||
org.gnome.mutter.gschema.xml
|
org.gnome.mutter.gschema.xml
|
||||||
org.gnome.mutter.wayland.gschema.valid
|
org.gnome.mutter.wayland.gschema.valid
|
||||||
@@ -57,8 +54,10 @@ testgradient
|
|||||||
m4/*
|
m4/*
|
||||||
INSTALL
|
INSTALL
|
||||||
mkinstalldirs
|
mkinstalldirs
|
||||||
meta-enum-types.[ch]
|
src/mutter-enum-types.[ch]
|
||||||
src/stamp-meta-enum-types.h
|
src/stamp-mutter-enum-types.h
|
||||||
|
src/mutter-marshal.[ch]
|
||||||
|
src/stamp-mutter-marshal.h
|
||||||
src/meta-dbus-display-config.[ch]
|
src/meta-dbus-display-config.[ch]
|
||||||
src/meta-dbus-idle-monitor.[ch]
|
src/meta-dbus-idle-monitor.[ch]
|
||||||
src/meta-dbus-login1.[ch]
|
src/meta-dbus-login1.[ch]
|
||||||
@@ -66,8 +65,6 @@ src/gtk-shell-protocol.c
|
|||||||
src/gtk-shell-server-protocol.h
|
src/gtk-shell-server-protocol.h
|
||||||
src/xdg-shell-protocol.c
|
src/xdg-shell-protocol.c
|
||||||
src/xdg-shell-server-protocol.h
|
src/xdg-shell-server-protocol.h
|
||||||
src/pointer-gestures-protocol.c
|
|
||||||
src/pointer-gestures-server-protocol.h
|
|
||||||
src/xserver-protocol.c
|
src/xserver-protocol.c
|
||||||
src/xserver-server-protocol.h
|
src/xserver-server-protocol.h
|
||||||
src/meta/meta-version.h
|
src/meta/meta-version.h
|
||||||
|
|||||||
@@ -9,3 +9,5 @@ DISTCLEANFILES = \
|
|||||||
intltool-update \
|
intltool-update \
|
||||||
po/stamp-it \
|
po/stamp-it \
|
||||||
po/.intltool-merge-cache
|
po/.intltool-merge-cache
|
||||||
|
|
||||||
|
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
||||||
|
|||||||
268
NEWS
268
NEWS
@@ -1,271 +1,3 @@
|
|||||||
3.17.4
|
|
||||||
======
|
|
||||||
* nested: Allow basic configuration of dummy outputs [Jonas; #747089]
|
|
||||||
* Send wl_surface.enter and wl_surface.leave on output changes [Jonas; #744453]
|
|
||||||
* Improve HiDPI handling on wayland [Jonas; #745655, #744934]
|
|
||||||
* Implement compositor-side animated cursors [Carlos; #752342]
|
|
||||||
* Misc. bug fixes [Peter, Marek, Carlos, Matthias, Rui; #750816, #751884,
|
|
||||||
#752248, #752551, #752552, #752673, #752674]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Marek Chalupa, Matthias Clasen, Carlos Garnacho, Peter Hutterer,
|
|
||||||
Rui Matos, Florian Müllner, Jasper St. Pierre
|
|
||||||
|
|
||||||
3.17.3
|
|
||||||
======
|
|
||||||
* Add X11/wayland clipboard interaction [Carlos; #738312]
|
|
||||||
* Support VM monitor layout hints on wayland [Thomas; #750363]
|
|
||||||
* Misc. bug fixes [Rui, Jonas, Olivier, Carlos, Ting-Wei, Peter, Florian;
|
|
||||||
#749994, #750256, #749716, #748705, #750552, #751036, #750007, #751136,
|
|
||||||
#750552, #751471, #751715, #750680]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Dave Airlie, Cosimo Cecchi, Olivier Fourdan, Carlos Garnacho,
|
|
||||||
Thomas Hellstrom, Peter Hutterer, Ting-Wei Lan, Jasper Lievisse Adriaanse,
|
|
||||||
Rui Matos, Florian Müllner, Jasper St. Pierre
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Marek Černocký [cs], Christian Kirbach [de], Pedro Albuquerque [pt]
|
|
||||||
|
|
||||||
3.17.2
|
|
||||||
======
|
|
||||||
* Honor default value for click method setting [Rui; #746290]
|
|
||||||
* Add X11/wayland clipboard interoperation [Carlos; #738312]
|
|
||||||
* Misc. bug fixes [Rui; #749076, #749711]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Carlos Garnacho, Rui Matos, Jasper St. Pierre
|
|
||||||
|
|
||||||
3.17.1
|
|
||||||
======
|
|
||||||
* Add public method to get neighboring monitor [Florian; #633994]
|
|
||||||
* Apply the right settings to the right input devices [Carlos; #747886]
|
|
||||||
* Fix scroll button setting [Ondrej; #747967]
|
|
||||||
* Add support for modal hint on wayland [Jonas; #745720]
|
|
||||||
* Don't reset idle time for non-hardware events [Rui; #748541]
|
|
||||||
* Misc. bug fixes [Ray, Rui; #748380, #748478]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Carlos Garnacho, Ondrej Holy, Rui Matos, Florian Müllner,
|
|
||||||
Jasper St. Pierre, Ray Strode, Tomeu Vizoso
|
|
||||||
|
|
||||||
3.16.1
|
|
||||||
======
|
|
||||||
* Add function to refresh all background instances [Rui; #739178]
|
|
||||||
* Fix swapped scroll methods on wayland [Ondrej; #746870]
|
|
||||||
* Manually activate stage to fix accessibility on wayland [Ray, Rui; #746670]
|
|
||||||
* Center pointer on primary monitor on startup [Carlos; #746896]
|
|
||||||
* wayland: Reword synchronized state application semantics [Jonas; #743617]
|
|
||||||
* Ensure input settings are applied on startup [Rui; #747434]
|
|
||||||
* Misc. bug fixes [Jonas, Giovanni, Calvin, Ray, Rui; #744932, #746509, #746692,
|
|
||||||
#746510, #746545, #747263]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Giovanni Campagna, Carlos Garnacho, Ondrej Holy, Rui Matos,
|
|
||||||
Jasper St. Pierre, Ray Strode, Calvin Walton
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Khaled Hosny [ar], Marek Černocký [cs]
|
|
||||||
|
|
||||||
3.16.0
|
|
||||||
======
|
|
||||||
* wayland: Don't skip notifying about initial maximized state [Jonas; #745303]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Kjartan Maraas [nb], Jiri Grönroos [fi], Andika Triwidada [id],
|
|
||||||
Inaki Larranaga Murgoitio [eu], Ask H. Larsen [da], Muhammet Kara [tr]
|
|
||||||
|
|
||||||
3.15.92
|
|
||||||
=======
|
|
||||||
* Ensure pointer visibility on monitor changes [Rui, Marek; #745121, #745752]
|
|
||||||
* Fix geometry of shaded windows [Florian; #746145]
|
|
||||||
* Take over cursor visibility handling from gsd [Carlos; #712775]
|
|
||||||
* Fix touch interaction on window decorations [Carlos; #745335]
|
|
||||||
* Add options for libinput_config_click_method [Carlos; #746290]
|
|
||||||
* Scale window decorations on HiDPI displays [Florian; #744354]
|
|
||||||
* Misc. bug fixes [Carlos, Ray, Rui; #745163, #746295, #746098, #745734]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Marek Chalupa, Carlos Garnacho, Rui Matos, Florian Müllner,
|
|
||||||
Jasper St. Pierre, Ray Strode
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Piotr Drąg [pl], Milo Casagrande [it], Changwoo Ryu [ko],
|
|
||||||
Daniel Korostil [uk], Baurzhan Muftakhidinov [kk], Trần Ngọc Quân [vi],
|
|
||||||
Alexander Shopov [bg], Jordi Mas [ca], Samir Ribic [bs], A S Alam [pa],
|
|
||||||
Matej Urbančič [sl]
|
|
||||||
|
|
||||||
3.15.91
|
|
||||||
=======
|
|
||||||
* wayland: Fix nested compositor mode [Jonas; #745401]
|
|
||||||
* wayland: Fix pointer constraining [Marek; #727337]
|
|
||||||
* wayland: Fix input region on HiDPI [Jonas; #744933]
|
|
||||||
* Allow themes to style buttons differently based on function [Horst; #745108]
|
|
||||||
* Misc. bug fixes and cleanups [Ray, Rui, Alban; #745141, #745118, #745476,
|
|
||||||
#745442]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Alban Browaeys, Marek Chalupa, Horst, Rui Matos,
|
|
||||||
Jasper St. Pierre, Ray Strode
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Chao-Hsiung Liao [zh_TW], Efstathios Iosifidis [el], Dušan Kazik [sk],
|
|
||||||
Balázs Úr [hu], Daniel Mustieles [es], Claude Paroz [fr], Stas Solovey [ru],
|
|
||||||
Yosef Or Boczko [he], Rafael Ferreira [pt_BR], Aurimas Černius [lt],
|
|
||||||
Fran Dieguez [gl], Anders Jonsson [sv], Мирослав Николић [sr, sr@latin]
|
|
||||||
|
|
||||||
3.15.90
|
|
||||||
=======
|
|
||||||
* Initialize MetaOutput even when we can't get the EDID [Rui; #743412]
|
|
||||||
* Expose MetaMonitorManager to introspection [Rui; #743745]
|
|
||||||
* Fix flash on unredirection [Chris; #743858]
|
|
||||||
* Update xdg-shell implementation to v5 [Jonas; #744452]
|
|
||||||
* Do not try to use seat devices that aren't (yet) present [Ray; #744640]
|
|
||||||
* Add keybindings for switching to VT8-VT12 [Ray; #744800]
|
|
||||||
* Misc bug fixes [Jonas, Cosimo; #743678, #744500]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Cosimo Cecchi, Carlos Garnacho, Rui Matos, Jasper St. Pierre,
|
|
||||||
Ray Strode, Chris Wilson
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Yosef Or Boczko [he], Yuri Myasoedov [ru], Kristjan SCHMIDT [eo],
|
|
||||||
Matej Urbančič [sl], Dušan Kazik [sk]
|
|
||||||
|
|
||||||
3.15.4
|
|
||||||
======
|
|
||||||
* Use GTK+ theme for window decorations instead of metacity [Florian; #741917]
|
|
||||||
* Export the same EDID information on X11 and wayland [Carlos; #742882]
|
|
||||||
* Apply input device configuration on wayland [Carlos; #739397]
|
|
||||||
* Implement pointer barriers on wayland [Jonas; #706655]
|
|
||||||
* Misc. bug fixes (Ting-Wei, Rui, Ikey, Florian, Marek, Jonas; #741829,
|
|
||||||
#738630, #737463, #698995, #727893, #742825, #742824, #742841, #743173,
|
|
||||||
#743189, #743217, #743254]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jonas Ådahl, Giovanni Campagna, Marek Chalupa, Ikey Doherty, Adel Gadllah,
|
|
||||||
Carlos Garnacho, Ting-Wei Lan, Rui Matos, Florian Müllner, Jasper St. Pierre,
|
|
||||||
Rico Tzschichholz
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Matej Urbančič [sl], Balázs Úr [hu], Marek Černocký [cs],
|
|
||||||
Inaki Larranaga Murgoitio [eu], Rafael Ferreira [pt_BR],
|
|
||||||
Daniel Mustieles [es], Fran Dieguez [gl]
|
|
||||||
|
|
||||||
3.15.3
|
|
||||||
======
|
|
||||||
* Don't leave left-over frames queued [Owen; #738686]
|
|
||||||
* Set CRTC configuration even if it might be redundant [Rui; #740838]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Rui Matos, Jasper St. Pierre, Rico Tzschichholz, Owen W. Taylor
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Trần Ngọc Quân [vi], Muhammet Kara [tr]
|
|
||||||
|
|
||||||
3.15.2
|
|
||||||
======
|
|
||||||
* Don't enable hiDPI on monitors with broken EDID [Bastien; #734839]
|
|
||||||
* Prevent crash applying monitor config for a closed lid [Rui; #739450]
|
|
||||||
* Fix "flicker" during startup transition [Ray; #740377]
|
|
||||||
* Misc. bug fixes [Lan, Florian, Carlos; #731521, #740133, #738890]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Emmanuele Bassi, Carlos Garnacho, Jonathon Jongsma, Ting-Wei Lan, Rui Matos,
|
|
||||||
Florian Müllner, Bastien Nocera, Jasper St. Pierre, Ray Strode
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Kjartan Maraas [nb]
|
|
||||||
|
|
||||||
3.15.1
|
|
||||||
======
|
|
||||||
* Use GResources for theme loading [Cosimo; #736936]
|
|
||||||
* Fix headerbar drag getting stuck on xwayland [Carlos; #738411]
|
|
||||||
* Fix wayland hiDPI regressions [Adel; #739161]
|
|
||||||
* Misc bug fixes and cleanups [Jasper, Rui, Carlos; #662962, #738630, #738888,
|
|
||||||
#738890]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Cosimo Cecchi, Adel Gadllah, Carlos Garnacho, Rui Matos, Florian Müllner,
|
|
||||||
Jasper St. Pierre
|
|
||||||
|
|
||||||
3.14.1
|
|
||||||
======
|
|
||||||
* Fix move-titlebar-onscreen function [Florian; #736915]
|
|
||||||
* Fix stacking of the guard window [Owen; #737233]
|
|
||||||
* Fix keycode lookup for non-default layouts [Rui; #737134]
|
|
||||||
* Fix workspaces-only-on-primary handling [Florian; #737178]
|
|
||||||
* Don't unstick sticky windows on workspace removal [Florian; #737625]
|
|
||||||
* Do not auto-minimize fullscreen windows [Jasper; #705177]
|
|
||||||
* Upload keymap to newly added keyboard devices [Rui; #737673]
|
|
||||||
* Apply keyboard repeat settings [Rui; #728055]
|
|
||||||
* Don't send pressed keys on enter [Rui; #727178]
|
|
||||||
* Fix build without wayland/native [Rico; #738225]
|
|
||||||
* Send modifiers after the key event [Rui; #738238]
|
|
||||||
* Fix unredirect heuristic [Adel; #738271]
|
|
||||||
* Do not show system chrome over fullscreen windows [Florian; #693991]
|
|
||||||
* Misc. bug fixes [Florian, Adel, Tom; #737135, #737581, #738146, #738384]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Tom Beckmann, Adel Gadllah, Carlos Garnacho, Rui Matos, Florian Müllner,
|
|
||||||
Jasper St. Pierre, Rico Tzschichholz, Owen W. Taylor
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Krishnababu Krothapalli [te], Мирослав Николић [sr, sr@latin],
|
|
||||||
Alexander Shopov [bg], Saibal Ray [bn_IN], Milo Casagrande [it],
|
|
||||||
Rūdolfs Mazurs [lv]
|
|
||||||
|
|
||||||
3.14.0
|
|
||||||
======
|
|
||||||
* Fix placement of popup windows on wayland [Jasper; #736812]
|
|
||||||
* Only increment serial once per event [Jasper; #736840]
|
|
||||||
* Fix window positioning regression with non-GTK+ toolkits [Owen; #736719]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Jasper St. Pierre, Owen W. Taylor
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Saibal Ray [bn_IN], Dušan Kazik [sk], Manoj Kumar Giri [or],
|
|
||||||
Christian Kirbach [de], Ask H. Larsen [da], YunQiang Su [zh_CN],
|
|
||||||
Bernd Homuth [de], Shankar Prasad [kn], Petr Kovar [cs], Rajesh Ranjan [hi]
|
|
||||||
|
|
||||||
3.13.92
|
|
||||||
=======
|
|
||||||
* Rewrite background code [Owen; #735637, #736568]
|
|
||||||
* Fix size in nested mode [Owen; #736279]
|
|
||||||
* Fix destroy animation of background windows [Florian; #735927]
|
|
||||||
* Wire keymap changes up to the wayland frontend [Rui; #736433]
|
|
||||||
* Add a test framework and stacking tests [Owen; #736505]
|
|
||||||
* Simplify handling of the merged X and wayland stack [Owen; #736559]
|
|
||||||
* Fix cursor size on HiDPI [Adel; #729337]
|
|
||||||
* Misc. bug fixes [Owen; #735632, #736589, #736694]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Adel Gadllah, Rui Matos, Florian Müllner, Jasper St. Pierre, Owen W. Taylor
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Andika Triwidada [id], Piotr Drąg [pl], Changwoo Ryu [ko],
|
|
||||||
Kjartan Maraas [nb], Ville-Pekka Vainio [fi], Yuri Myasoedov [ru],
|
|
||||||
Aurimas Černius [lt], Balázs Úr [hu], Sweta Kothari [gu], A S Alam [pa],
|
|
||||||
Sandeep Sheshrao Shedmake [mr], Shantha kumar [ta], Gil Forcada [ca],
|
|
||||||
Carles Ferrando [ca@valencia], Mattias Eriksson [sv]
|
|
||||||
|
|
||||||
3.13.91
|
|
||||||
=======
|
|
||||||
* Misc. bug fixes [Carlos; #735452]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Adel Gadllah, Carlos Garnacho, Rui Matos, Jasper St. Pierre,
|
|
||||||
Rico Tzschichholz
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Chao-Hsiung Liao po/zh_HK, zh_TW.po, Enrico Nicoletto [pt_BR],
|
|
||||||
Kjartan Maraas [nb], Fran Diéguez [gl], Yosef Or Boczko [he],
|
|
||||||
Maria Mavridou [el], Claude Paroz [fr]
|
|
||||||
|
|
||||||
3.13.90
|
3.13.90
|
||||||
=======
|
=======
|
||||||
* Only call XSync() once per frame [Rui; #728464]
|
* Only call XSync() once per frame [Rui; #728464]
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
srcdir=`dirname $0`
|
srcdir=`dirname $0`
|
||||||
test -z "$srcdir" && srcdir=.
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
|
PKG_NAME="mutter"
|
||||||
REQUIRED_AUTOMAKE_VERSION=1.11
|
REQUIRED_AUTOMAKE_VERSION=1.11
|
||||||
|
|
||||||
(test -f $srcdir/configure.ac \
|
(test -f $srcdir/configure.ac \
|
||||||
@@ -18,4 +19,4 @@ which gnome-autogen.sh || {
|
|||||||
echo "your distribution's package manager)."
|
echo "your distribution's package manager)."
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
. gnome-autogen.sh
|
USE_GNOME2_MACROS=1 USE_COMMON_DOC_BUILD=yes . gnome-autogen.sh
|
||||||
|
|||||||
82
configure.ac
82
configure.ac
@@ -1,8 +1,8 @@
|
|||||||
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], [17])
|
m4_define([mutter_minor_version], [13])
|
||||||
m4_define([mutter_micro_version], [4])
|
m4_define([mutter_micro_version], [90])
|
||||||
|
|
||||||
m4_define([mutter_version],
|
m4_define([mutter_version],
|
||||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||||
@@ -52,6 +52,19 @@ PKG_PROG_PKG_CONFIG([0.21])
|
|||||||
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS
|
||||||
AM_PATH_GLIB_2_0()
|
AM_PATH_GLIB_2_0()
|
||||||
|
|
||||||
|
#### Integer sizes
|
||||||
|
|
||||||
|
AC_CHECK_SIZEOF(char)
|
||||||
|
AC_CHECK_SIZEOF(short)
|
||||||
|
AC_CHECK_SIZEOF(long)
|
||||||
|
AC_CHECK_SIZEOF(int)
|
||||||
|
AC_CHECK_SIZEOF(void *)
|
||||||
|
AC_CHECK_SIZEOF(long long)
|
||||||
|
AC_CHECK_SIZEOF(__int64)
|
||||||
|
|
||||||
|
## byte order
|
||||||
|
AC_C_BIGENDIAN
|
||||||
|
|
||||||
CANBERRA_GTK=libcanberra-gtk3
|
CANBERRA_GTK=libcanberra-gtk3
|
||||||
CANBERRA_GTK_VERSION=0.26
|
CANBERRA_GTK_VERSION=0.26
|
||||||
|
|
||||||
@@ -59,12 +72,14 @@ CLUTTER_PACKAGE=clutter-1.0
|
|||||||
|
|
||||||
MUTTER_PC_MODULES="
|
MUTTER_PC_MODULES="
|
||||||
gtk+-3.0 >= 3.9.11
|
gtk+-3.0 >= 3.9.11
|
||||||
gio-unix-2.0 >= 2.35.1
|
gio-unix-2.0 >= 2.25.10
|
||||||
pango >= 1.2.0
|
pango >= 1.2.0
|
||||||
cairo >= 1.10.0
|
cairo >= 1.10.0
|
||||||
gsettings-desktop-schemas >= 3.15.92
|
gsettings-desktop-schemas >= 3.7.3
|
||||||
$CLUTTER_PACKAGE >= 1.23.4
|
$CLUTTER_PACKAGE >= 1.19.5
|
||||||
|
clutter-egl-1.0
|
||||||
cogl-1.0 >= 1.17.1
|
cogl-1.0 >= 1.17.1
|
||||||
|
gbm
|
||||||
upower-glib >= 0.99.0
|
upower-glib >= 0.99.0
|
||||||
gnome-desktop-3.0
|
gnome-desktop-3.0
|
||||||
xcomposite >= 0.2
|
xcomposite >= 0.2
|
||||||
@@ -77,7 +92,6 @@ MUTTER_PC_MODULES="
|
|||||||
xkeyboard-config
|
xkeyboard-config
|
||||||
xkbcommon >= 0.4.3
|
xkbcommon >= 0.4.3
|
||||||
xkbcommon-x11
|
xkbcommon-x11
|
||||||
xrender
|
|
||||||
x11-xcb
|
x11-xcb
|
||||||
xcb-randr
|
xcb-randr
|
||||||
"
|
"
|
||||||
@@ -113,12 +127,6 @@ AC_ARG_WITH([xwayland-path],
|
|||||||
[XWAYLAND_PATH="$withval"],
|
[XWAYLAND_PATH="$withval"],
|
||||||
[XWAYLAND_PATH="$bindir/Xwayland"])
|
[XWAYLAND_PATH="$bindir/Xwayland"])
|
||||||
|
|
||||||
AC_ARG_ENABLE(installed_tests,
|
|
||||||
AS_HELP_STRING([--enable-installed-tests],
|
|
||||||
[Install test programs (default: no)]),,
|
|
||||||
[enable_installed_tests=no])
|
|
||||||
AM_CONDITIONAL(BUILDOPT_INSTALL_TESTS, test x$enable_installed_tests = xyes)
|
|
||||||
|
|
||||||
## here we get the flags we'll actually use
|
## here we get the flags we'll actually use
|
||||||
|
|
||||||
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
||||||
@@ -188,39 +196,22 @@ AC_SUBST(XWAYLAND_PATH)
|
|||||||
|
|
||||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||||
|
|
||||||
MUTTER_NATIVE_BACKEND_MODULES="clutter-egl-1.0 libdrm libsystemd libinput gudev-1.0 gbm >= 10.3"
|
PKG_CHECK_MODULES(MUTTER_NATIVE_BACKEND, [libdrm libsystemd libinput], [have_native_backend=yes], [have_native_backend=no])
|
||||||
|
if test $have_native_backend = yes; then
|
||||||
|
AC_DEFINE([HAVE_NATIVE_BACKEND],[1],[Define if you want to enable the native (KMS) backend based on systemd])
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test $have_native_backend = yes])
|
||||||
|
|
||||||
AC_ARG_ENABLE(native-backend,
|
PKG_CHECK_MODULES(MUTTER_WAYLAND, [clutter-wayland-1.0 clutter-wayland-compositor-1.0 wayland-server >= 1.5.90], [have_wayland=yes], [have_wayland=no])
|
||||||
AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),,
|
if test $have_wayland = yes; then
|
||||||
enable_native_backend=auto
|
|
||||||
)
|
|
||||||
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]))
|
|
||||||
|
|
||||||
AS_IF([test "$have_native_backend" = "yes"], [
|
|
||||||
PKG_CHECK_MODULES([MUTTER_NATIVE_BACKEND], [$MUTTER_NATIVE_BACKEND_MODULES])
|
|
||||||
AC_DEFINE([HAVE_NATIVE_BACKEND],[1], [Define if you want to enable the native (KMS) backend based on systemd])
|
|
||||||
])
|
|
||||||
AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test "$have_native_backend" = "yes"])
|
|
||||||
|
|
||||||
MUTTER_WAYLAND_MODULES="clutter-wayland-1.0 clutter-wayland-compositor-1.0 wayland-server >= 1.6.90"
|
|
||||||
|
|
||||||
AC_ARG_ENABLE(wayland,
|
|
||||||
AS_HELP_STRING([--disable-wayland], [disable mutter on wayland support]),,
|
|
||||||
enable_wayland=auto
|
|
||||||
)
|
|
||||||
AS_IF([test "$enable_wayland" = "yes"], [have_wayland=yes],
|
|
||||||
[test "$enable_wayland" = "auto"], PKG_CHECK_EXISTS([$MUTTER_WAYLAND_MODULES], [have_wayland=yes]))
|
|
||||||
|
|
||||||
AS_IF([test "$have_wayland" = "yes"], [
|
|
||||||
PKG_CHECK_MODULES([MUTTER_WAYLAND], [$MUTTER_WAYLAND_MODULES])
|
|
||||||
AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no])
|
AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no])
|
||||||
AS_IF([test $WAYLAND_SCANNER = "no"],
|
AS_IF([test $WAYLAND_SCANNER = "no"],
|
||||||
[AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols])])
|
AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols]))
|
||||||
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])
|
||||||
])
|
fi
|
||||||
AM_CONDITIONAL([HAVE_WAYLAND],[test "$have_wayland" = "yes"])
|
AM_CONDITIONAL([HAVE_WAYLAND],[test $have_wayland = yes])
|
||||||
|
|
||||||
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
||||||
AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater]))
|
AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater]))
|
||||||
@@ -271,8 +262,6 @@ AC_CHECK_LIB(Xrandr, XRRUpdateConfiguration,
|
|||||||
|
|
||||||
if test "x$found_randr" = "xyes"; then
|
if test "x$found_randr" = "xyes"; then
|
||||||
AC_DEFINE(HAVE_RANDR, , [Have the Xrandr extension library])
|
AC_DEFINE(HAVE_RANDR, , [Have the Xrandr extension library])
|
||||||
PKG_CHECK_EXISTS([xrandr >= 1.5.0],
|
|
||||||
AC_DEFINE([HAVE_XRANDR15],[1],[Define if you have support for XRandR 1.5 or greater]))
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MUTTER_LIBS="$MUTTER_LIBS $RANDR_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
MUTTER_LIBS="$MUTTER_LIBS $RANDR_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||||
@@ -319,10 +308,7 @@ if test "x$enable_debug" = "xyes"; then
|
|||||||
CFLAGS="$CFLAGS -g -O"
|
CFLAGS="$CFLAGS -g -O"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_CHECK_DECL([GL_EXT_x11_sync_object],
|
GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
|
||||||
[],
|
|
||||||
[AC_MSG_ERROR([GL_EXT_x11_sync_object definition not found, please update your GL headers])],
|
|
||||||
[#include <GL/glx.h>])
|
|
||||||
|
|
||||||
#### Warnings (last since -Werror can disturb other tests)
|
#### Warnings (last since -Werror can disturb other tests)
|
||||||
|
|
||||||
@@ -395,6 +381,8 @@ Makefile
|
|||||||
data/Makefile
|
data/Makefile
|
||||||
doc/Makefile
|
doc/Makefile
|
||||||
doc/man/Makefile
|
doc/man/Makefile
|
||||||
|
doc/reference/Makefile
|
||||||
|
doc/reference/meta-docs.sgml
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/libmutter.pc
|
src/libmutter.pc
|
||||||
src/compositor/plugins/Makefile
|
src/compositor/plugins/Makefile
|
||||||
@@ -424,8 +412,6 @@ mutter-$VERSION
|
|||||||
libcanberra: ${have_libcanberra}
|
libcanberra: ${have_libcanberra}
|
||||||
Introspection: ${found_introspection}
|
Introspection: ${found_introspection}
|
||||||
Session management: ${found_sm}
|
Session management: ${found_sm}
|
||||||
Wayland: ${have_wayland}
|
|
||||||
Native (KMS) backend: ${have_native_backend}
|
|
||||||
"
|
"
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -29,25 +29,5 @@
|
|||||||
<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">
|
|
||||||
<default><![CDATA[['<Primary><Alt>F8']]]></default>
|
|
||||||
<_summary>Switch to VT 8</_summary>
|
|
||||||
</key>
|
|
||||||
<key name="switch-to-session-9" type="as">
|
|
||||||
<default><![CDATA[['<Primary><Alt>F9']]]></default>
|
|
||||||
<_summary>Switch to VT 9</_summary>
|
|
||||||
</key>
|
|
||||||
<key name="switch-to-session-10" type="as">
|
|
||||||
<default><![CDATA[['<Primary><Alt>F10']]]></default>
|
|
||||||
<_summary>Switch to VT 10</_summary>
|
|
||||||
</key>
|
|
||||||
<key name="switch-to-session-11" type="as">
|
|
||||||
<default><![CDATA[['<Primary><Alt>F11']]]></default>
|
|
||||||
<_summary>Switch to VT 11</_summary>
|
|
||||||
</key>
|
|
||||||
<key name="switch-to-session-12" type="as">
|
|
||||||
<default><![CDATA[['<Primary><Alt>F12']]]></default>
|
|
||||||
<_summary>Switch to VT 12</_summary>
|
|
||||||
</key>
|
|
||||||
</schema>
|
</schema>
|
||||||
</schemalist>
|
</schemalist>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
SUBDIRS = man
|
SUBDIRS = man reference
|
||||||
|
|
||||||
EXTRA_DIST = dialogs.txt code-overview.txt \
|
EXTRA_DIST=theme-format.txt dialogs.txt code-overview.txt \
|
||||||
how-to-get-focus-right.txt rationales.txt
|
how-to-get-focus-right.txt rationales.txt
|
||||||
|
|||||||
164
doc/reference/Makefile.am
Normal file
164
doc/reference/Makefile.am
Normal file
@@ -0,0 +1,164 @@
|
|||||||
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
# We require automake 1.6 at least.
|
||||||
|
AUTOMAKE_OPTIONS = 1.6
|
||||||
|
|
||||||
|
# This is a blank Makefile.am for using gtk-doc.
|
||||||
|
# Copy this to your project's API docs directory and modify the variables to
|
||||||
|
# suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples
|
||||||
|
# of using the various options.
|
||||||
|
|
||||||
|
# The name of the module, e.g. 'glib'.
|
||||||
|
DOC_MODULE=meta
|
||||||
|
|
||||||
|
# Uncomment for versioned docs and specify the version of the module, e.g. '2'.
|
||||||
|
#DOC_MODULE_VERSION=2
|
||||||
|
|
||||||
|
|
||||||
|
# The top-level SGML file. You can change this if you want to.
|
||||||
|
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
|
||||||
|
|
||||||
|
# Directories containing the source code, relative to $(srcdir).
|
||||||
|
# gtk-doc will search all .c and .h files beneath these paths
|
||||||
|
# for inline comments documenting functions and macros.
|
||||||
|
# e.g. DOC_SOURCE_DIR=../../../gtk ../../../gdk
|
||||||
|
DOC_SOURCE_DIR=../../src/
|
||||||
|
|
||||||
|
# Extra options to pass to gtkdoc-scangobj. Not normally needed.
|
||||||
|
SCANGOBJ_OPTIONS=
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-scan.
|
||||||
|
# e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED"
|
||||||
|
SCAN_OPTIONS=--rebuild-types
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-mkdb.
|
||||||
|
# e.g. MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||||
|
MKDB_OPTIONS=--xml-mode --output-format=xml
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-mktmpl
|
||||||
|
# e.g. MKTMPL_OPTIONS=--only-section-tmpl
|
||||||
|
MKTMPL_OPTIONS=
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-mkhtml
|
||||||
|
MKHTML_OPTIONS=
|
||||||
|
|
||||||
|
# Extra options to supply to gtkdoc-fixref. Not normally needed.
|
||||||
|
# e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html
|
||||||
|
FIXXREF_OPTIONS=
|
||||||
|
|
||||||
|
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||||
|
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
||||||
|
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
||||||
|
HFILE_GLOB=$(top_srcdir)/src/*/*.h
|
||||||
|
CFILE_GLOB=$(top_srcdir)/src/*/*.c
|
||||||
|
|
||||||
|
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
||||||
|
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
||||||
|
EXTRA_HFILES=
|
||||||
|
|
||||||
|
# Header files or dirs to ignore when scanning. Use base file/dir names
|
||||||
|
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code
|
||||||
|
IGNORE_HFILES= \
|
||||||
|
async-getprop.h \
|
||||||
|
atoms.h \
|
||||||
|
bell.h \
|
||||||
|
boxes-private.h \
|
||||||
|
clutter-utils.h \
|
||||||
|
cogl-utils.h \
|
||||||
|
compositor-private.h \
|
||||||
|
constraints.h \
|
||||||
|
core.h \
|
||||||
|
display-private.h \
|
||||||
|
draw-workspace.h \
|
||||||
|
edge-resistance.h \
|
||||||
|
eventqueue.h \
|
||||||
|
frame.h \
|
||||||
|
frames.h \
|
||||||
|
group-private.h \
|
||||||
|
group-props.h \
|
||||||
|
iconcache.h \
|
||||||
|
inlinepixbufs.h \
|
||||||
|
keybindings-private.h \
|
||||||
|
meta-background-actor-private.h \
|
||||||
|
meta-background-group-private.h \
|
||||||
|
meta-module.h \
|
||||||
|
meta-plugin-manager.h \
|
||||||
|
meta-shadow-factory-private.h \
|
||||||
|
meta-texture-rectangle.h \
|
||||||
|
meta-texture-tower.h \
|
||||||
|
meta-window-actor-private.h \
|
||||||
|
meta-window-group.h \
|
||||||
|
meta-window-shape.h \
|
||||||
|
mutter-enum-types.h \
|
||||||
|
mutter-Xatomtype.h \
|
||||||
|
place.h \
|
||||||
|
preview-widget.h \
|
||||||
|
region-utils.h \
|
||||||
|
resizepopup.h \
|
||||||
|
screen-private.h \
|
||||||
|
session.h \
|
||||||
|
stack.h \
|
||||||
|
stack-tracker.h \
|
||||||
|
stamp-mutter-enum-types.h \
|
||||||
|
tabpopup.h \
|
||||||
|
theme.h \
|
||||||
|
theme-private.h \
|
||||||
|
tile-preview.h \
|
||||||
|
ui.h \
|
||||||
|
window-private.h \
|
||||||
|
window-props.h \
|
||||||
|
workspace-private.h \
|
||||||
|
xprops.h \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
MKDB_OPTIONS+=--ignore-files="$(IGNORE_HFILES)"
|
||||||
|
|
||||||
|
# Images to copy into HTML directory.
|
||||||
|
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
||||||
|
HTML_IMAGES=
|
||||||
|
|
||||||
|
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
|
||||||
|
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml
|
||||||
|
content_files= \
|
||||||
|
mutter-overview.xml \
|
||||||
|
running-mutter.xml \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
|
||||||
|
# These files must be listed here *and* in content_files
|
||||||
|
# e.g. expand_content_files=running.sgml
|
||||||
|
expand_content_files= \
|
||||||
|
mutter-overview.xml \
|
||||||
|
running-mutter.xml \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
# CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library.
|
||||||
|
# Only needed if you are using gtkdoc-scangobj to dynamically query widget
|
||||||
|
# signals and properties.
|
||||||
|
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||||
|
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||||
|
GTKDOC_CFLAGS=$(MUTTER_CFLAGS)
|
||||||
|
GTKDOC_LIBS=$(MUTTER_LIBS) $(top_builddir)/src/libmutter.la
|
||||||
|
|
||||||
|
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||||
|
include $(top_srcdir)/gtk-doc.make
|
||||||
|
|
||||||
|
# Other files to distribute
|
||||||
|
# e.g. EXTRA_DIST += version.xml.in
|
||||||
|
EXTRA_DIST +=
|
||||||
|
|
||||||
|
# Files not to distribute
|
||||||
|
# for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types
|
||||||
|
# for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt
|
||||||
|
DISTCLEANFILES = $(DOC_MODULES).types
|
||||||
|
|
||||||
|
# Comment this out if you want 'make check' to test you doc status
|
||||||
|
# and run some sanity checks
|
||||||
|
if ENABLE_GTK_DOC
|
||||||
|
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
||||||
|
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
||||||
|
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
||||||
|
#TESTS = $(GTKDOC_CHECK)
|
||||||
|
endif
|
||||||
|
|
||||||
|
-include $(top_srcdir)/git.mk
|
||||||
59
doc/reference/meta-docs.sgml.in
Normal file
59
doc/reference/meta-docs.sgml.in
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||||
|
[
|
||||||
|
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||||
|
<!ENTITY version "@VERSION@">
|
||||||
|
]>
|
||||||
|
<book id="index">
|
||||||
|
<bookinfo>
|
||||||
|
<title>Mutter Reference Manual</title>
|
||||||
|
<releaseinfo>
|
||||||
|
This document is for Mutter &version;.
|
||||||
|
The latest version of this documentation can be found on-line at
|
||||||
|
<ulink role="online-location" url="http://developer.gnome.org/meta/">http://developer.gnome.org/meta/</ulink>.
|
||||||
|
</releaseinfo>
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<xi:include href="xml/mutter-overview.xml"/>
|
||||||
|
<xi:include href="xml/running-mutter.xml"/>
|
||||||
|
|
||||||
|
<part id="core-reference">
|
||||||
|
<title>Mutter Core Reference</title>
|
||||||
|
<xi:include href="xml/main.xml"/>
|
||||||
|
<xi:include href="xml/common.xml"/>
|
||||||
|
<xi:include href="xml/gradient.xml"/>
|
||||||
|
<xi:include href="xml/prefs.xml"/>
|
||||||
|
<xi:include href="xml/util.xml"/>
|
||||||
|
<xi:include href="xml/errors.xml"/>
|
||||||
|
<xi:include href="xml/meta-plugin.xml"/>
|
||||||
|
<xi:include href="xml/barrier.xml"/>
|
||||||
|
<xi:include href="xml/boxes.xml"/>
|
||||||
|
<xi:include href="xml/compositor.xml"/>
|
||||||
|
<xi:include href="xml/display.xml"/>
|
||||||
|
<xi:include href="xml/group.xml"/>
|
||||||
|
<xi:include href="xml/keybindings.xml"/>
|
||||||
|
<xi:include href="xml/meta-background-actor.xml"/>
|
||||||
|
<xi:include href="xml/meta-shadow-factory.xml"/>
|
||||||
|
<xi:include href="xml/meta-shaped-texture.xml"/>
|
||||||
|
<xi:include href="xml/meta-window-actor.xml"/>
|
||||||
|
<xi:include href="xml/screen.xml"/>
|
||||||
|
<xi:include href="xml/window.xml"/>
|
||||||
|
<xi:include href="xml/workspace.xml"/>
|
||||||
|
</part>
|
||||||
|
|
||||||
|
<chapter id="object-tree">
|
||||||
|
<title>Object Hierarchy</title>
|
||||||
|
<xi:include href="xml/tree_index.sgml"/>
|
||||||
|
</chapter>
|
||||||
|
<index id="api-index-full">
|
||||||
|
<title>API Index</title>
|
||||||
|
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
||||||
|
</index>
|
||||||
|
<index id="deprecated-api-index" role="deprecated">
|
||||||
|
<title>Index of deprecated API</title>
|
||||||
|
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
|
||||||
|
</index>
|
||||||
|
|
||||||
|
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
||||||
|
</book>
|
||||||
684
doc/reference/meta-sections.txt
Normal file
684
doc/reference/meta-sections.txt
Normal file
@@ -0,0 +1,684 @@
|
|||||||
|
<SECTION>
|
||||||
|
<FILE>barrier</FILE>
|
||||||
|
<TITLE>MetaBarrier</TITLE>
|
||||||
|
MetaBarrier
|
||||||
|
MetaBarrierClass
|
||||||
|
meta_barrier_is_active
|
||||||
|
meta_barrier_destroy
|
||||||
|
meta_barrier_release
|
||||||
|
MetaBarrierDirection
|
||||||
|
MetaBarrierEvent
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_BARRIER
|
||||||
|
META_BARRIER_CLASS
|
||||||
|
META_BARRIER_GET_CLASS
|
||||||
|
META_IS_BARRIER
|
||||||
|
META_IS_BARRIER_CLASS
|
||||||
|
META_TYPE_BARRIER
|
||||||
|
META_TYPE_BARRIER_EVENT
|
||||||
|
MetaBarrierPrivate
|
||||||
|
meta_barrier_event_get_type
|
||||||
|
meta_barrier_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>boxes</FILE>
|
||||||
|
MetaRectangle
|
||||||
|
MetaStrut
|
||||||
|
MetaEdgeType
|
||||||
|
MetaEdge
|
||||||
|
meta_rectangle_copy
|
||||||
|
meta_rectangle_free
|
||||||
|
meta_rect
|
||||||
|
meta_rectangle_area
|
||||||
|
meta_rectangle_intersect
|
||||||
|
meta_rectangle_equal
|
||||||
|
meta_rectangle_union
|
||||||
|
meta_rectangle_overlap
|
||||||
|
meta_rectangle_vert_overlap
|
||||||
|
meta_rectangle_horiz_overlap
|
||||||
|
meta_rectangle_could_fit_rect
|
||||||
|
meta_rectangle_contains_rect
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_TYPE_RECTANGLE
|
||||||
|
meta_rectangle_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>common</FILE>
|
||||||
|
META_VIRTUAL_CORE_POINTER_ID
|
||||||
|
META_VIRTUAL_CORE_KEYBOARD_ID
|
||||||
|
MetaFrameFlags
|
||||||
|
MetaMenuOp
|
||||||
|
MetaWindowMenuFunc
|
||||||
|
MetaGrabOp
|
||||||
|
MetaCursor
|
||||||
|
MetaFrameType
|
||||||
|
MetaVirtualModifier
|
||||||
|
MetaDirection
|
||||||
|
MetaMotionDirection
|
||||||
|
MetaSide
|
||||||
|
MetaButtonFunction
|
||||||
|
MAX_BUTTONS_PER_CORNER
|
||||||
|
MetaButtonLayout
|
||||||
|
MetaFrameBorders
|
||||||
|
meta_frame_borders_clear
|
||||||
|
META_ICON_WIDTH
|
||||||
|
META_ICON_HEIGHT
|
||||||
|
META_MINI_ICON_WIDTH
|
||||||
|
META_MINI_ICON_HEIGHT
|
||||||
|
META_DEFAULT_ICON_NAME
|
||||||
|
META_PRIORITY_RESIZE
|
||||||
|
META_PRIORITY_BEFORE_REDRAW
|
||||||
|
META_PRIORITY_REDRAW
|
||||||
|
META_PRIORITY_PREFS_NOTIFY
|
||||||
|
POINT_IN_RECT
|
||||||
|
MetaStackLayer
|
||||||
|
MetaWindowMenu
|
||||||
|
MetaResizePopup
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>compositor</FILE>
|
||||||
|
MetaCompEffect
|
||||||
|
MetaCompositor
|
||||||
|
meta_compositor_new
|
||||||
|
meta_compositor_destroy
|
||||||
|
meta_compositor_manage_screen
|
||||||
|
meta_compositor_unmanage_screen
|
||||||
|
meta_compositor_window_shape_changed
|
||||||
|
meta_compositor_process_event
|
||||||
|
meta_compositor_filter_keybinding
|
||||||
|
meta_compositor_add_window
|
||||||
|
meta_compositor_remove_window
|
||||||
|
meta_compositor_show_window
|
||||||
|
meta_compositor_hide_window
|
||||||
|
meta_compositor_switch_workspace
|
||||||
|
meta_compositor_maximize_window
|
||||||
|
meta_compositor_unmaximize_window
|
||||||
|
meta_compositor_sync_window_geometry
|
||||||
|
meta_compositor_set_updates_frozen
|
||||||
|
meta_compositor_queue_frame_drawn
|
||||||
|
meta_compositor_sync_stack
|
||||||
|
meta_compositor_sync_screen_size
|
||||||
|
meta_compositor_flash_screen
|
||||||
|
meta_get_stage_for_screen
|
||||||
|
meta_get_overlay_group_for_screen
|
||||||
|
meta_get_overlay_window
|
||||||
|
meta_get_window_actors
|
||||||
|
meta_get_window_group_for_screen
|
||||||
|
meta_get_top_window_group_for_screen
|
||||||
|
meta_disable_unredirect_for_screen
|
||||||
|
meta_enable_unredirect_for_screen
|
||||||
|
meta_set_stage_input_region
|
||||||
|
meta_empty_stage_input_region
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>display</FILE>
|
||||||
|
MetaTabList
|
||||||
|
MetaTabShowType
|
||||||
|
meta_XFree
|
||||||
|
meta_display_get_compositor_version
|
||||||
|
meta_display_get_xinput_opcode
|
||||||
|
meta_display_supports_extended_barriers
|
||||||
|
meta_display_get_xdisplay
|
||||||
|
meta_display_get_compositor
|
||||||
|
meta_display_get_screens
|
||||||
|
meta_display_has_shape
|
||||||
|
meta_display_screen_for_root
|
||||||
|
meta_display_get_focus_window
|
||||||
|
meta_display_xwindow_is_a_no_focus_window
|
||||||
|
meta_display_get_damage_event_base
|
||||||
|
meta_display_get_shape_event_base
|
||||||
|
meta_display_xserver_time_is_before
|
||||||
|
meta_display_get_last_user_time
|
||||||
|
meta_display_get_current_time
|
||||||
|
meta_display_get_current_time_roundtrip
|
||||||
|
meta_display_get_ignored_modifier_mask
|
||||||
|
meta_display_get_tab_list
|
||||||
|
meta_display_get_tab_next
|
||||||
|
meta_display_get_tab_current
|
||||||
|
meta_display_begin_grab_op
|
||||||
|
meta_display_end_grab_op
|
||||||
|
meta_display_get_grab_op
|
||||||
|
meta_display_add_keybinding
|
||||||
|
meta_display_remove_keybinding
|
||||||
|
meta_display_get_keybinding_action
|
||||||
|
meta_display_set_input_focus_window
|
||||||
|
meta_display_focus_the_no_focus_window
|
||||||
|
meta_display_sort_windows_by_stacking
|
||||||
|
meta_display_get_leader_window
|
||||||
|
meta_display_add_ignored_crossing_serial
|
||||||
|
meta_display_unmanage_screen
|
||||||
|
meta_display_clear_mouse_mode
|
||||||
|
MetaDisplay
|
||||||
|
MetaDisplayClass
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_DISPLAY
|
||||||
|
META_DISPLAY_CLASS
|
||||||
|
META_DISPLAY_GET_CLASS
|
||||||
|
META_IS_DISPLAY
|
||||||
|
META_IS_DISPLAY_CLASS
|
||||||
|
META_TYPE_DISPLAY
|
||||||
|
meta_display_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>errors</FILE>
|
||||||
|
meta_error_trap_push
|
||||||
|
meta_error_trap_pop
|
||||||
|
meta_error_trap_push_with_return
|
||||||
|
meta_error_trap_pop_with_return
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>gradient</FILE>
|
||||||
|
MetaGradientType
|
||||||
|
meta_gradient_create_simple
|
||||||
|
meta_gradient_create_multi
|
||||||
|
meta_gradient_create_interwoven
|
||||||
|
meta_gradient_add_alpha
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>group</FILE>
|
||||||
|
MetaGroup
|
||||||
|
meta_window_get_group
|
||||||
|
meta_window_compute_group
|
||||||
|
meta_window_shutdown_group
|
||||||
|
meta_window_group_leader_changed
|
||||||
|
meta_display_lookup_group
|
||||||
|
meta_group_list_windows
|
||||||
|
meta_group_update_layers
|
||||||
|
meta_group_get_startup_id
|
||||||
|
meta_group_get_size
|
||||||
|
meta_group_property_notify
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>keybindings</FILE>
|
||||||
|
MetaKeyBinding
|
||||||
|
META_TYPE_KEY_BINDING
|
||||||
|
meta_key_binding_get_name
|
||||||
|
meta_key_binding_get_modifiers
|
||||||
|
meta_key_binding_get_mask
|
||||||
|
meta_key_binding_is_builtin
|
||||||
|
meta_keybindings_set_custom_handler
|
||||||
|
meta_screen_ungrab_all_keys
|
||||||
|
meta_screen_grab_all_keys
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>main</FILE>
|
||||||
|
meta_get_option_context
|
||||||
|
meta_init
|
||||||
|
meta_run
|
||||||
|
meta_get_replace_current_wm
|
||||||
|
meta_set_wm_name
|
||||||
|
meta_set_gnome_wm_keybindings
|
||||||
|
MetaExitCode
|
||||||
|
meta_exit
|
||||||
|
meta_quit
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>meta-background</FILE>
|
||||||
|
<TITLE>MetaBackground</TITLE>
|
||||||
|
MetaBackgroundEffects
|
||||||
|
MetaBackground
|
||||||
|
MetaBackgroundClass
|
||||||
|
meta_background_new
|
||||||
|
meta_background_copy
|
||||||
|
meta_background_load_gradient
|
||||||
|
meta_background_load_color
|
||||||
|
meta_background_load_still_frame
|
||||||
|
meta_background_load_file_async
|
||||||
|
meta_background_load_file_finish
|
||||||
|
meta_background_get_filename
|
||||||
|
meta_background_get_style
|
||||||
|
meta_background_get_shading
|
||||||
|
meta_background_get_color
|
||||||
|
meta_background_get_second_color
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_BACKGROUND
|
||||||
|
META_BACKGROUND_CLASS
|
||||||
|
META_BACKGROUND_GET_CLASS
|
||||||
|
META_IS_BACKGROUND
|
||||||
|
META_IS_BACKGROUND_CLASS
|
||||||
|
META_TYPE_BACKGROUND
|
||||||
|
MetaBackgroundPrivate
|
||||||
|
meta_background_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>meta-background-actor</FILE>
|
||||||
|
<TITLE>MetaBackgroundActor</TITLE>
|
||||||
|
MetaBackgroundActor
|
||||||
|
MetaBackgroundActorClass
|
||||||
|
meta_background_actor_new_for_screen
|
||||||
|
MetaSnippetHook
|
||||||
|
meta_background_actor_add_glsl_snippet
|
||||||
|
meta_background_actor_set_uniform_float
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_BACKGROUND_ACTOR
|
||||||
|
META_BACKGROUND_ACTOR_CLASS
|
||||||
|
META_BACKGROUND_ACTOR_GET_CLASS
|
||||||
|
META_IS_BACKGROUND_ACTOR
|
||||||
|
META_IS_BACKGROUND_ACTOR_CLASS
|
||||||
|
META_TYPE_BACKGROUND_ACTOR
|
||||||
|
MetaBackgroundActorPrivate
|
||||||
|
meta_background_actor_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>meta-background-group</FILE>
|
||||||
|
<TITLE>MetaBackgroundGroup</TITLE>
|
||||||
|
MetaBackgroundGroupClass
|
||||||
|
meta_background_group_new
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_BACKGROUND_GROUP
|
||||||
|
META_BACKGROUND_GROUP_CLASS
|
||||||
|
META_BACKGROUND_GROUP_GET_CLASS
|
||||||
|
META_IS_BACKGROUND_GROUP
|
||||||
|
META_IS_BACKGROUND_GROUP_CLASS
|
||||||
|
META_TYPE_BACKGROUND_GROUP
|
||||||
|
MetaBackgroundGroupPrivate
|
||||||
|
meta_background_group_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>meta-plugin</FILE>
|
||||||
|
<TITLE>MetaPlugin</TITLE>
|
||||||
|
MetaPlugin
|
||||||
|
MetaPluginClass
|
||||||
|
MetaPluginInfo
|
||||||
|
meta_plugin_running
|
||||||
|
meta_plugin_debug_mode
|
||||||
|
meta_plugin_get_info
|
||||||
|
MetaPluginVersion
|
||||||
|
META_PLUGIN_DECLARE
|
||||||
|
meta_plugin_switch_workspace_completed
|
||||||
|
meta_plugin_minimize_completed
|
||||||
|
meta_plugin_unminimize_completed
|
||||||
|
meta_plugin_maximize_completed
|
||||||
|
meta_plugin_unmaximize_completed
|
||||||
|
meta_plugin_map_completed
|
||||||
|
meta_plugin_destroy_completed
|
||||||
|
MetaModalOptions
|
||||||
|
meta_plugin_begin_modal
|
||||||
|
meta_plugin_end_modal
|
||||||
|
meta_plugin_get_screen
|
||||||
|
meta_plugin_manager_set_plugin_type
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_IS_PLUGIN
|
||||||
|
META_IS_PLUGIN_CLASS
|
||||||
|
META_PLUGIN
|
||||||
|
META_PLUGIN_CLASS
|
||||||
|
META_PLUGIN_GET_CLASS
|
||||||
|
META_TYPE_PLUGIN
|
||||||
|
MetaPluginPrivate
|
||||||
|
meta_plugin_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>meta-shadow-factory</FILE>
|
||||||
|
MetaShadowParams
|
||||||
|
meta_shadow_factory_get_default
|
||||||
|
meta_shadow_factory_set_params
|
||||||
|
meta_shadow_factory_get_params
|
||||||
|
MetaShadowFactory
|
||||||
|
MetaShadowFactoryClass
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_IS_SHADOW_FACTORY
|
||||||
|
META_IS_SHADOW_FACTORY_CLASS
|
||||||
|
META_SHADOW_FACTORY
|
||||||
|
META_SHADOW_FACTORY_CLASS
|
||||||
|
META_SHADOW_FACTORY_GET_CLASS
|
||||||
|
META_TYPE_SHADOW_FACTORY
|
||||||
|
meta_shadow_factory_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>meta-shaped-texture</FILE>
|
||||||
|
<TITLE>MetaShapedTexture</TITLE>
|
||||||
|
MetaShapedTexture
|
||||||
|
MetaShapedTextureClass
|
||||||
|
meta_shaped_texture_new
|
||||||
|
meta_shaped_texture_set_create_mipmaps
|
||||||
|
meta_shaped_texture_update_area
|
||||||
|
meta_shaped_texture_set_pixmap
|
||||||
|
meta_shaped_texture_get_texture
|
||||||
|
meta_shaped_texture_set_mask_texture
|
||||||
|
meta_shaped_texture_set_clip_region
|
||||||
|
meta_shaped_texture_get_image
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_IS_SHAPED_TEXTURE
|
||||||
|
META_IS_SHAPED_TEXTURE_CLASS
|
||||||
|
META_SHAPED_TEXTURE
|
||||||
|
META_SHAPED_TEXTURE_CLASS
|
||||||
|
META_SHAPED_TEXTURE_GET_CLASS
|
||||||
|
META_TYPE_SHAPED_TEXTURE
|
||||||
|
MetaShapedTexturePrivate
|
||||||
|
meta_shaped_texture_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>meta-window-actor</FILE>
|
||||||
|
<TITLE>MetaWindowActor</TITLE>
|
||||||
|
MetaWindowActor
|
||||||
|
MetaWindowActorClass
|
||||||
|
meta_window_actor_get_x_window
|
||||||
|
meta_window_actor_get_workspace
|
||||||
|
meta_window_actor_get_meta_window
|
||||||
|
meta_window_actor_get_texture
|
||||||
|
meta_window_actor_is_override_redirect
|
||||||
|
meta_window_actor_get_description
|
||||||
|
meta_window_actor_showing_on_its_workspace
|
||||||
|
meta_window_actor_is_destroyed
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_IS_WINDOW_ACTOR
|
||||||
|
META_IS_WINDOW_ACTOR_CLASS
|
||||||
|
META_TYPE_WINDOW_ACTOR
|
||||||
|
META_WINDOW_ACTOR
|
||||||
|
META_WINDOW_ACTOR_CLASS
|
||||||
|
META_WINDOW_ACTOR_GET_CLASS
|
||||||
|
MetaWindowActorPrivate
|
||||||
|
meta_window_actor_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>meta-cullable</FILE>
|
||||||
|
<TITLE>MetaCullable</TITLE>
|
||||||
|
MetaCullable
|
||||||
|
MetaCullableInterface
|
||||||
|
meta_cullable_cull_out
|
||||||
|
meta_cullable_reset_culling
|
||||||
|
meta_cullable_cull_out_children
|
||||||
|
meta_cullable_reset_culling_children
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_TYPE_CULLABLE
|
||||||
|
META_CULLABLE
|
||||||
|
META_IS_CULLABLE
|
||||||
|
META_CULLABLE_GET_IFACE
|
||||||
|
meta_cullable_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>prefs</FILE>
|
||||||
|
MetaPreference
|
||||||
|
MetaPrefsChangedFunc
|
||||||
|
meta_prefs_add_listener
|
||||||
|
meta_prefs_remove_listener
|
||||||
|
meta_prefs_init
|
||||||
|
meta_prefs_override_preference_schema
|
||||||
|
meta_preference_to_string
|
||||||
|
meta_prefs_get_mouse_button_mods
|
||||||
|
meta_prefs_get_mouse_button_resize
|
||||||
|
meta_prefs_get_mouse_button_menu
|
||||||
|
meta_prefs_get_focus_mode
|
||||||
|
meta_prefs_get_focus_new_windows
|
||||||
|
meta_prefs_get_attach_modal_dialogs
|
||||||
|
meta_prefs_get_raise_on_click
|
||||||
|
meta_prefs_get_theme
|
||||||
|
meta_prefs_get_titlebar_font
|
||||||
|
meta_prefs_get_num_workspaces
|
||||||
|
meta_prefs_get_dynamic_workspaces
|
||||||
|
meta_prefs_get_disable_workarounds
|
||||||
|
meta_prefs_get_auto_raise
|
||||||
|
meta_prefs_get_auto_raise_delay
|
||||||
|
meta_prefs_get_focus_change_on_pointer_rest
|
||||||
|
meta_prefs_get_gnome_accessibility
|
||||||
|
meta_prefs_get_gnome_animations
|
||||||
|
meta_prefs_get_edge_tiling
|
||||||
|
meta_prefs_get_auto_maximize
|
||||||
|
meta_prefs_get_button_layout
|
||||||
|
meta_prefs_get_action_double_click_titlebar
|
||||||
|
meta_prefs_get_action_middle_click_titlebar
|
||||||
|
meta_prefs_get_action_right_click_titlebar
|
||||||
|
meta_prefs_set_num_workspaces
|
||||||
|
meta_prefs_get_workspace_name
|
||||||
|
meta_prefs_change_workspace_name
|
||||||
|
meta_prefs_get_cursor_theme
|
||||||
|
meta_prefs_get_cursor_size
|
||||||
|
meta_prefs_get_compositing_manager
|
||||||
|
meta_prefs_get_force_fullscreen
|
||||||
|
meta_prefs_set_force_fullscreen
|
||||||
|
meta_prefs_get_workspaces_only_on_primary
|
||||||
|
meta_prefs_get_no_tab_popup
|
||||||
|
meta_prefs_set_no_tab_popup
|
||||||
|
meta_prefs_get_draggable_border_width
|
||||||
|
meta_prefs_get_ignore_request_hide_titlebar
|
||||||
|
meta_prefs_set_ignore_request_hide_titlebar
|
||||||
|
MetaKeyBindingAction
|
||||||
|
MetaKeyBindingFlags
|
||||||
|
MetaKeyCombo
|
||||||
|
MetaKeyHandlerFunc
|
||||||
|
meta_prefs_get_keybindings
|
||||||
|
meta_prefs_get_keybinding_action
|
||||||
|
meta_prefs_get_window_binding
|
||||||
|
meta_prefs_get_overlay_binding
|
||||||
|
meta_prefs_get_visual_bell
|
||||||
|
meta_prefs_bell_is_audible
|
||||||
|
meta_prefs_get_visual_bell_type
|
||||||
|
MetaKeyHandler
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
meta_key_binding_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>screen</FILE>
|
||||||
|
MetaScreen
|
||||||
|
MetaScreenClass
|
||||||
|
meta_screen_get_screen_number
|
||||||
|
meta_screen_get_display
|
||||||
|
meta_screen_get_xroot
|
||||||
|
meta_screen_get_size
|
||||||
|
meta_screen_get_compositor_data
|
||||||
|
meta_screen_set_compositor_data
|
||||||
|
meta_screen_for_x_screen
|
||||||
|
meta_screen_set_cm_selection
|
||||||
|
meta_screen_unset_cm_selection
|
||||||
|
meta_screen_get_startup_sequences
|
||||||
|
meta_screen_get_workspaces
|
||||||
|
meta_screen_get_n_workspaces
|
||||||
|
meta_screen_get_workspace_by_index
|
||||||
|
meta_screen_remove_workspace
|
||||||
|
meta_screen_append_new_workspace
|
||||||
|
meta_screen_get_active_workspace_index
|
||||||
|
meta_screen_get_active_workspace
|
||||||
|
meta_screen_get_n_monitors
|
||||||
|
meta_screen_get_primary_monitor
|
||||||
|
meta_screen_get_current_monitor
|
||||||
|
meta_screen_get_monitor_geometry
|
||||||
|
meta_screen_get_monitor_index_for_rect
|
||||||
|
meta_screen_focus_default_window
|
||||||
|
MetaScreenCorner
|
||||||
|
meta_screen_override_workspace_layout
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_IS_SCREEN
|
||||||
|
META_IS_SCREEN_CLASS
|
||||||
|
META_SCREEN
|
||||||
|
META_SCREEN_CLASS
|
||||||
|
META_SCREEN_GET_CLASS
|
||||||
|
META_TYPE_SCREEN
|
||||||
|
meta_screen_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>util</FILE>
|
||||||
|
meta_is_verbose
|
||||||
|
meta_set_verbose
|
||||||
|
meta_is_debugging
|
||||||
|
meta_set_debugging
|
||||||
|
meta_is_syncing
|
||||||
|
meta_set_syncing
|
||||||
|
meta_set_replace_current_wm
|
||||||
|
meta_debug_spew_real
|
||||||
|
meta_verbose_real
|
||||||
|
meta_bug
|
||||||
|
meta_warning
|
||||||
|
meta_fatal
|
||||||
|
MetaDebugTopic
|
||||||
|
meta_topic_real
|
||||||
|
meta_add_verbose_topic
|
||||||
|
meta_remove_verbose_topic
|
||||||
|
meta_push_no_msg_prefix
|
||||||
|
meta_pop_no_msg_prefix
|
||||||
|
meta_unsigned_long_equal
|
||||||
|
meta_unsigned_long_hash
|
||||||
|
meta_frame_type_to_string
|
||||||
|
meta_gravity_to_string
|
||||||
|
_
|
||||||
|
N_
|
||||||
|
meta_g_utf8_strndup
|
||||||
|
meta_free_gslist_and_elements
|
||||||
|
meta_show_dialog
|
||||||
|
meta_debug_spew
|
||||||
|
meta_verbose
|
||||||
|
meta_topic
|
||||||
|
MetaLaterType
|
||||||
|
meta_later_add
|
||||||
|
meta_later_remove
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>window</FILE>
|
||||||
|
MetaWindow
|
||||||
|
MetaWindowClass
|
||||||
|
MetaWindowType
|
||||||
|
MetaMaximizeFlags
|
||||||
|
meta_window_get_frame
|
||||||
|
meta_window_has_focus
|
||||||
|
meta_window_appears_focused
|
||||||
|
meta_window_is_shaded
|
||||||
|
meta_window_is_monitor_sized
|
||||||
|
meta_window_is_override_redirect
|
||||||
|
meta_window_is_skip_taskbar
|
||||||
|
meta_window_get_rect
|
||||||
|
meta_window_get_buffer_rect
|
||||||
|
meta_window_get_frame_rect
|
||||||
|
meta_window_get_outer_rect
|
||||||
|
meta_window_client_rect_to_frame_rect
|
||||||
|
meta_window_frame_rect_to_client_rect
|
||||||
|
meta_window_get_screen
|
||||||
|
meta_window_get_display
|
||||||
|
meta_window_get_xwindow
|
||||||
|
meta_window_get_window_type
|
||||||
|
meta_window_get_window_type_atom
|
||||||
|
meta_window_get_workspace
|
||||||
|
meta_window_get_monitor
|
||||||
|
meta_window_is_on_all_workspaces
|
||||||
|
meta_window_located_on_workspace
|
||||||
|
meta_window_is_hidden
|
||||||
|
meta_window_activate
|
||||||
|
meta_window_activate_with_workspace
|
||||||
|
meta_window_get_description
|
||||||
|
meta_window_get_wm_class
|
||||||
|
meta_window_get_wm_class_instance
|
||||||
|
meta_window_showing_on_its_workspace
|
||||||
|
meta_window_get_gtk_application_id
|
||||||
|
meta_window_get_gtk_unique_bus_name
|
||||||
|
meta_window_get_gtk_application_object_path
|
||||||
|
meta_window_get_gtk_window_object_path
|
||||||
|
meta_window_get_gtk_app_menu_object_path
|
||||||
|
meta_window_get_gtk_menubar_object_path
|
||||||
|
meta_window_move
|
||||||
|
meta_window_move_frame
|
||||||
|
meta_window_move_resize_frame
|
||||||
|
meta_window_move_to_monitor
|
||||||
|
meta_window_resize
|
||||||
|
meta_window_set_demands_attention
|
||||||
|
meta_window_unset_demands_attention
|
||||||
|
meta_window_get_startup_id
|
||||||
|
meta_window_change_workspace_by_index
|
||||||
|
meta_window_change_workspace
|
||||||
|
meta_window_get_compositor_private
|
||||||
|
meta_window_set_compositor_private
|
||||||
|
meta_window_configure_notify
|
||||||
|
meta_window_get_role
|
||||||
|
meta_window_get_layer
|
||||||
|
meta_window_find_root_ancestor
|
||||||
|
meta_window_is_ancestor_of_transient
|
||||||
|
MetaWindowForeachFunc
|
||||||
|
meta_window_foreach_transient
|
||||||
|
meta_window_foreach_ancestor
|
||||||
|
meta_window_get_maximized
|
||||||
|
meta_window_is_fullscreen
|
||||||
|
meta_window_is_on_primary_monitor
|
||||||
|
meta_window_requested_bypass_compositor
|
||||||
|
meta_window_requested_dont_bypass_compositor
|
||||||
|
meta_window_is_mapped
|
||||||
|
meta_window_toplevel_is_mapped
|
||||||
|
meta_window_get_icon_geometry
|
||||||
|
meta_window_set_icon_geometry
|
||||||
|
meta_window_maximize
|
||||||
|
meta_window_unmaximize
|
||||||
|
meta_window_minimize
|
||||||
|
meta_window_unminimize
|
||||||
|
meta_window_raise
|
||||||
|
meta_window_lower
|
||||||
|
meta_window_get_title
|
||||||
|
meta_window_get_transient_for
|
||||||
|
meta_window_get_transient_for_as_xid
|
||||||
|
meta_window_delete
|
||||||
|
meta_window_get_stable_sequence
|
||||||
|
meta_window_get_user_time
|
||||||
|
meta_window_get_pid
|
||||||
|
meta_window_get_client_machine
|
||||||
|
meta_window_is_remote
|
||||||
|
meta_window_is_modal
|
||||||
|
meta_window_is_attached_dialog
|
||||||
|
meta_window_get_mutter_hints
|
||||||
|
meta_window_get_frame_type
|
||||||
|
meta_window_get_frame_bounds
|
||||||
|
meta_window_get_tile_match
|
||||||
|
meta_window_make_fullscreen
|
||||||
|
meta_window_unmake_fullscreen
|
||||||
|
meta_window_make_above
|
||||||
|
meta_window_unmake_above
|
||||||
|
meta_window_shade
|
||||||
|
meta_window_unshade
|
||||||
|
meta_window_stick
|
||||||
|
meta_window_unstick
|
||||||
|
meta_window_kill
|
||||||
|
meta_window_focus
|
||||||
|
meta_window_check_alive
|
||||||
|
meta_window_get_work_area_current_monitor
|
||||||
|
meta_window_get_work_area_for_monitor
|
||||||
|
meta_window_get_work_area_all_monitors
|
||||||
|
meta_window_begin_grab_op
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_IS_WINDOW
|
||||||
|
META_IS_WINDOW_CLASS
|
||||||
|
META_TYPE_WINDOW
|
||||||
|
META_WINDOW
|
||||||
|
META_WINDOW_CLASS
|
||||||
|
META_WINDOW_GET_CLASS
|
||||||
|
meta_window_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
|
<SECTION>
|
||||||
|
<FILE>workspace</FILE>
|
||||||
|
MetaWorkspace
|
||||||
|
MetaWorkspaceClass
|
||||||
|
meta_workspace_index
|
||||||
|
meta_workspace_get_screen
|
||||||
|
meta_workspace_list_windows
|
||||||
|
meta_workspace_get_work_area_for_monitor
|
||||||
|
meta_workspace_get_work_area_all_monitors
|
||||||
|
meta_workspace_activate
|
||||||
|
meta_workspace_activate_with_focus
|
||||||
|
meta_workspace_update_window_hints
|
||||||
|
meta_workspace_set_builtin_struts
|
||||||
|
meta_workspace_get_neighbor
|
||||||
|
<SUBSECTION Standard>
|
||||||
|
META_IS_WORKSPACE
|
||||||
|
META_IS_WORKSPACE_CLASS
|
||||||
|
META_TYPE_WORKSPACE
|
||||||
|
META_WORKSPACE
|
||||||
|
META_WORKSPACE_CLASS
|
||||||
|
META_WORKSPACE_GET_CLASS
|
||||||
|
meta_workspace_get_type
|
||||||
|
</SECTION>
|
||||||
|
|
||||||
15
doc/reference/mutter-overview.xml
Normal file
15
doc/reference/mutter-overview.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<part id="mutter-overview">
|
||||||
|
|
||||||
|
<title>Overview</title>
|
||||||
|
|
||||||
|
<partintro>
|
||||||
|
|
||||||
|
<para>Mutter is a GObject-based library for creating compositing window managers.</para>
|
||||||
|
|
||||||
|
<para>Compositors that wish to use Mutter must implement a subclass of #MetaPlugin and register it with meta_plugin_manager_set_plugin_type() before calling meta_init() but after g_type_init().</para>
|
||||||
|
|
||||||
|
<para>#MetaPlugin provides virtual functions that allow to override default behavior in the window management code, such as the effect to perform when a window is created or when switching workspaces.</para>
|
||||||
|
|
||||||
|
</partintro>
|
||||||
|
|
||||||
|
</part>
|
||||||
100
doc/reference/running-mutter.xml
Normal file
100
doc/reference/running-mutter.xml
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
<part id="running-mutter">
|
||||||
|
|
||||||
|
<title>Running Mutter</title>
|
||||||
|
|
||||||
|
<partintro>
|
||||||
|
|
||||||
|
<section id="environment-variables">
|
||||||
|
<title>Environment Variables</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Mutter automatically checks environment variables during
|
||||||
|
its initialization. These environment variables are meant
|
||||||
|
as debug tools or overrides for default behaviours:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_VERBOSE</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Enable verbose mode, in which more information is printed to the console. Mutter needs to be built with the --enable-verbose-mode option (enabled by default). For more fine-grained control of the output, see meta_add_verbose_topic().</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_DEBUG</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Traps and prints X errors to the console.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_G_FATAL_WARNINGS</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Causes any logging from the domains Mutter, Gtk, Gdk, Pango or GLib to terminate the process (only when using the log functions in GLib).</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_USE_LOGFILE</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Log all messages to a temporary file.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_DEBUG_XINERAMA</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Log extra information about support of the XINERAMA extension.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_DEBUG_SM</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Log extra information about session management.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_DEBUG_BUTTON_GRABS</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Log extra information about button grabs.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_SYNC</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Call XSync after each X call.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_DISPLAY</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Name of the X11 display to use.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>META_DISABLE_MIPMAPS</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Disable use of mipmaps for the textures that back window pixmaps.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_USE_STATIC_GRAVITY</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Enable support for clients with static bit-gravity.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_WM_CLASS_FILTER</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Comma-separated list of WM_CLASS names to which to restrict Mutter to.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>MUTTER_DISABLE_FALLBACK_COLOR</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Disable fallback for themed colors, for easier detection of typographical errors.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</partintro>
|
||||||
|
</part>
|
||||||
396
doc/theme-format.txt
Normal file
396
doc/theme-format.txt
Normal file
@@ -0,0 +1,396 @@
|
|||||||
|
Themes are in a simple XML-subset format. There are multiple versions
|
||||||
|
of the theme format, and a given theme can support more than one format.
|
||||||
|
|
||||||
|
Version 1: THEMEDIR/metacity-1/metacity-theme-1.xml
|
||||||
|
(original metacity format)
|
||||||
|
Version 2: THEMEDIR/metacity-1/metacity-theme-2.xml
|
||||||
|
Version 3: THEMEDIR/metacity-1/metacity-theme-3.xml
|
||||||
|
|
||||||
|
The subdirectory name is "metacity-1" in all versions.
|
||||||
|
|
||||||
|
As you might expect, older versions of metacity will not understand
|
||||||
|
newer theme formats. However, newer versions will use old themes.
|
||||||
|
Metacity will always use the newest theme format it understands that
|
||||||
|
the X server supports. Some format versions are only supported if you
|
||||||
|
have the right X server features.
|
||||||
|
|
||||||
|
Each format *requires* the corresponding filename. If you put version
|
||||||
|
2 format features in the metacity-1/metacity-theme-1.xml file, then
|
||||||
|
metacity will get angry.
|
||||||
|
|
||||||
|
This document has separate sections for each format version. You may
|
||||||
|
want to read the document in reverse order, since the base features
|
||||||
|
are discussed under version 1.
|
||||||
|
|
||||||
|
New Features in Theme Format Version 3.4
|
||||||
|
========================================
|
||||||
|
|
||||||
|
An additional color type is added to pick up custom colors defined
|
||||||
|
in the GTK+ theme's CSS:
|
||||||
|
|
||||||
|
gtk:custom(name,fallback)
|
||||||
|
|
||||||
|
where <name> refers to a custom color defined with @define-color in
|
||||||
|
the GTK+ theme, and <fallback> provides an alternative color definition
|
||||||
|
in case the color referenced by <name> is not found.
|
||||||
|
|
||||||
|
New Features in Theme Format Version 3.3
|
||||||
|
========================================
|
||||||
|
|
||||||
|
Add two additional button background functions - left_single_background and
|
||||||
|
right_single_background - for button groups with just a single button.
|
||||||
|
|
||||||
|
There are now additional frame states to style left/right tiled windows
|
||||||
|
differently ("tiled_left", "tiled_right", "tiled_left_and_shaded",
|
||||||
|
"tiled_right_and_shaded").
|
||||||
|
|
||||||
|
New Features in Theme Format Version 3.2
|
||||||
|
========================================
|
||||||
|
|
||||||
|
A new window type 'attached' is added for modal dialogs which are
|
||||||
|
attached to their parent window. (When the attach_modal_dialogs preference
|
||||||
|
is turned on.) If no style is defined for the 'attached' window type,
|
||||||
|
the 'border' window type will be used instead.
|
||||||
|
|
||||||
|
New Features in Theme Format Version 3.1
|
||||||
|
========================================
|
||||||
|
|
||||||
|
Additional predefined variables are added for positioning expressions:
|
||||||
|
|
||||||
|
frame_x_center: the X center of the entire frame, with respect to the
|
||||||
|
piece currently being drawn.
|
||||||
|
frame_y_center: the Y center of the entire frame, with respect to the
|
||||||
|
piece currently being drawn.
|
||||||
|
|
||||||
|
The <title/> element now supports an "ellipsize_width" attribute. When
|
||||||
|
specified, this gives a width at which to ellipsize the title. If not
|
||||||
|
specified, the title will simply be clipped to the title area.
|
||||||
|
|
||||||
|
New Features in Theme Format Version 3
|
||||||
|
======================================
|
||||||
|
|
||||||
|
Format version 3 has exactly one new feature; any element in the file
|
||||||
|
can now have a version attribute:
|
||||||
|
|
||||||
|
version="[<|<=|=>|>] MAJOR.MINOR"
|
||||||
|
|
||||||
|
(< and > should be to be entity escaped as < and >). If this
|
||||||
|
version check is not met, then the element and its children will be
|
||||||
|
ignored. This allows having alternate sections of the theme file for
|
||||||
|
older and newer version of the Metacity theme format.
|
||||||
|
|
||||||
|
When placed on the toplevel <metacity_theme> element, an unsatisfied
|
||||||
|
version check will not just cause the contents of the file to be
|
||||||
|
ignored, it will also cause the lookup of a theme file to proceed on
|
||||||
|
and look for an older format 2 or format 1 file. This allows making a
|
||||||
|
metacity-theme-3.xml file that is only used the format version 3.2 or
|
||||||
|
newer is supported, and using metacity-theme-1.xml for older window
|
||||||
|
managers.
|
||||||
|
|
||||||
|
New Features in Theme Format Version 2
|
||||||
|
======================================
|
||||||
|
|
||||||
|
The optional attributes rounded_top_left, rounded_top_right,
|
||||||
|
rounded_bottom_left and rounded_bottom_right on <frame_geometry>
|
||||||
|
should now be the radius of the corner in pixels. You may still use
|
||||||
|
the values "false" for 0 and "true" for 5, which means v1 values will
|
||||||
|
still work just fine.
|
||||||
|
|
||||||
|
<frame_geometry> has a new optional attribute, hide_buttons. If this
|
||||||
|
is true, no buttons will be displayed on the titlebar.
|
||||||
|
|
||||||
|
Anywhere you can use a positive integer, you can use an integer constant.
|
||||||
|
|
||||||
|
As well as constant integers and reals, you may define constant colours,
|
||||||
|
thus:
|
||||||
|
<constant name="RevoltingPink" value="#FF00FF"/>
|
||||||
|
<constant name="Background" value="gtk:bg[NORMAL]"/>
|
||||||
|
|
||||||
|
<frame_style> has two new optional attributes, background and alpha.
|
||||||
|
If you specify alpha, you must specify background. background is a
|
||||||
|
colour used for the background of the frame. alpha is the transparency
|
||||||
|
as a real between 0.0 and 1.0. If the current X server does not support
|
||||||
|
alpha channels, the value is ignored.
|
||||||
|
|
||||||
|
The filename attribute of <image> may begin with "theme:". If so, the
|
||||||
|
rest of the string is the name of a theme icon. The 64x64 version of the
|
||||||
|
icon is used, except for fallback mini_icons, which use the 16x16 version.
|
||||||
|
This does not affect ordinary resizing. For example:
|
||||||
|
<button function="close" state="normal">
|
||||||
|
<draw_ops>
|
||||||
|
<include name="active_button"/>
|
||||||
|
<image filename="theme:gnome-logout" x="2" y="2"
|
||||||
|
width="width-4" height="height-4"/>
|
||||||
|
<!-- Note: not "theme:gnome-logout.png" or similar. -->
|
||||||
|
</draw_ops>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<menu_icon>s are parsed but ignored.
|
||||||
|
|
||||||
|
Fallback icons can be specified using <fallback>. There are two
|
||||||
|
optional arguments, icon and mini_icon. The values of these arguments
|
||||||
|
are identical to that of the filename attribute of <image>. Fallback
|
||||||
|
icons are used when a window does not supply its own icon. If a fallback
|
||||||
|
icon is not specified with <fallback>, Metacity will use a built-in
|
||||||
|
icon, as in metacity-theme-1.
|
||||||
|
|
||||||
|
The <arc> element, as well as the original start_angle and end_angle
|
||||||
|
attributes, may be given from and to attributes. The values of these
|
||||||
|
attributes are given in degrees clockwise, with 0 being straight up.
|
||||||
|
For example:
|
||||||
|
<arc from="0.0" to="90.0" filled="true" color="#FF00FF"
|
||||||
|
x="0" y="5" width="15" height="15"/>
|
||||||
|
|
||||||
|
<frame state="shaded"> may now take an optional resize attribute, with
|
||||||
|
the same interpretation as the resize attribute on <frame state="normal">.
|
||||||
|
If this attribute is omitted for state="shaded", it defaults to "both".
|
||||||
|
(If it is omitted for state="normal", it remains an error.)
|
||||||
|
|
||||||
|
In addition to the four <button> functions which are required in
|
||||||
|
metacity-theme-1, there are six new functions in metacity-theme-2:
|
||||||
|
shade, unshade, above, unabove, stick and unstick.
|
||||||
|
|
||||||
|
Overview of Theme Format Version 1
|
||||||
|
==================================
|
||||||
|
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<metacity_theme>
|
||||||
|
<!-- Only one info section is allowed -->
|
||||||
|
<info>
|
||||||
|
<name>Foo</name>
|
||||||
|
<author>Foo P. Bar</author>
|
||||||
|
<copyright>whoever, 2002</copyright>
|
||||||
|
<date>Jan 31 2005</date>
|
||||||
|
<description>A sentence about the theme.</description>
|
||||||
|
</info>
|
||||||
|
|
||||||
|
<!-- define a frame geometry to be referenced later -->
|
||||||
|
<!-- frame_geometry has an optional has_title attribute which
|
||||||
|
determines whether the title text height is included in the
|
||||||
|
height calculation. if not specified, defaults to true.
|
||||||
|
It also has an optional text_size="medium" attribute
|
||||||
|
(same sizes as with Pango markup, xx-small thru medium thru
|
||||||
|
xx-large)
|
||||||
|
|
||||||
|
Finally it has optional args rounded_top_left=true,
|
||||||
|
rounded_top_right=true, rounded_bottom_left=true,
|
||||||
|
rounded_bottom_right=true.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<frame_geometry name="normal" has_title="true" title_scale="medium">
|
||||||
|
<distance name="left_width" value="6"/>
|
||||||
|
<distance name="right_width" value="6"/>
|
||||||
|
<distance name="bottom_height" value="7"/>
|
||||||
|
<distance name="left_titlebar_edge" value="6"/>
|
||||||
|
<distance name="right_titlebar_edge" value="6"/>
|
||||||
|
<distance name="button_width" value="17"/>
|
||||||
|
<distance name="button_height" value="17"/>
|
||||||
|
<!-- alternative to button_width button_height distances -->
|
||||||
|
<aspect_ratio name="button" value="1.0"/>
|
||||||
|
<distance name="title_vertical_pad" value="4"/>
|
||||||
|
<border name="title_border" left="3" right="12" top="4" bottom="3"/>
|
||||||
|
<border name="button_border" left="0" right="0" top="1" bottom="1"/>
|
||||||
|
</frame_geometry>
|
||||||
|
|
||||||
|
<!-- inheritance is allowed; simply overwrites values from parent -->
|
||||||
|
<frame_geometry name="borderless" parent="normal">
|
||||||
|
<distance name="left_width" value="0"/>
|
||||||
|
<distance name="right_width" value="0"/>
|
||||||
|
<distance name="bottom_height" value="0"/>
|
||||||
|
<distance name="left_titlebar_edge" value="0"/>
|
||||||
|
<distance name="right_titlebar_edge" value="0"/>
|
||||||
|
</frame_geometry>
|
||||||
|
|
||||||
|
<!-- define a constant to use in positions/sizes of draw operations;
|
||||||
|
constant names must start with a capital letter.
|
||||||
|
-->
|
||||||
|
<constant name="LineOffset" value="3"/>
|
||||||
|
|
||||||
|
<!-- define drawing operations to be referenced later;
|
||||||
|
these draw-op lists can also be placed inline.
|
||||||
|
|
||||||
|
Positions/lengths are given as expressions.
|
||||||
|
Operators are: +,-,*,/,%,`max`,`min`
|
||||||
|
All operators are infix including `max` and `min`,
|
||||||
|
i.e. "2 `max` 5"
|
||||||
|
|
||||||
|
Some variables are predefined, and constants can also
|
||||||
|
be used. Variables are:
|
||||||
|
|
||||||
|
width - width of target area
|
||||||
|
height - height of target area
|
||||||
|
object_width - natural width of object being drawn
|
||||||
|
object_height - natural height of object being drawn
|
||||||
|
left_width - distance from left of frame to client window
|
||||||
|
right_width - distance from right of frame to client window
|
||||||
|
top_height - distance from top of frame to client window
|
||||||
|
bottom_height - distance from bottom of frame to client window
|
||||||
|
mini_icon_width - width of mini icon for window
|
||||||
|
mini_icon_height - height of mini icon
|
||||||
|
icon_width - width of large icon
|
||||||
|
icon_height - height of large icon
|
||||||
|
title_width - width of title text
|
||||||
|
title_height - height of title text
|
||||||
|
|
||||||
|
All these are always defined, except object_width/object_height
|
||||||
|
which only exists for <image> right now.
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<draw_ops name="demo_all_ops">
|
||||||
|
<line color="#00FF00" x1="LineOffset" y1="0" x2="0" y2="height"/>
|
||||||
|
<line color="gtk:fg[NORMAL]"
|
||||||
|
x1="width - 1" y1="0" x2="width - 1" y2="height"
|
||||||
|
width="3" dash_on_length="2" dash_off_length="3"/>
|
||||||
|
<rectangle color="blend/gtk:fg[NORMAL]/gtk:bg[NORMAL]/0.7"
|
||||||
|
x="0" y="0" width="width - 1" height="height - 1" filled="true"/>
|
||||||
|
<arc color="dark gray" x="0" y="0" width="width - 1" height="height - 1"
|
||||||
|
filled="false" start_angle="30" extent_angle="180"/>
|
||||||
|
<tint color="orange" alpha="0.5" x="0" y="0" width="width" height="height"/>
|
||||||
|
<!-- may be vertical, horizontal, diagonal -->
|
||||||
|
<gradient type="diagonal"
|
||||||
|
x="10" y="30" width="width / 3" height="height / 4">
|
||||||
|
<!-- any number of colors allowed here. A color can be
|
||||||
|
a color name like "blue" (look at gcolorsel), a hex color
|
||||||
|
as in HTML (#FFBB99), or a color from the gtk theme
|
||||||
|
given as "gtk:base[NORMAL]", "gtk:fg[ACTIVE]", etc.
|
||||||
|
-->
|
||||||
|
<color value="gtk:fg[SELECTED]"/>
|
||||||
|
<!-- color obtained by a 0.5 alpha composite of the second color onto the first -->
|
||||||
|
<color value="blend/gtk:bg[SELECTED]/gtk:fg[SELECTED]/0.5"/>
|
||||||
|
</gradient>
|
||||||
|
<!-- image has an optional colorize="#color" attribute to give the
|
||||||
|
image a certain color -->
|
||||||
|
<image filename="foo.png" alpha="0.7"
|
||||||
|
x="10" y="30" width="width / 3" height="height / 4"/>
|
||||||
|
<gtk_arrow state="normal" shadow="in" arrow="up"
|
||||||
|
filled="true"
|
||||||
|
x="2" y="2" width="width - 4" height="height - 4"/>
|
||||||
|
<gtk_box state="normal" shadow="out"
|
||||||
|
x="2" y="2" width="width - 4" height="height - 4"/>
|
||||||
|
<gtk_vline state="normal" x="2" y1="0" y2="height"/>
|
||||||
|
<!-- window's icon -->
|
||||||
|
<icon alpha="0.7"
|
||||||
|
x="10" y="30" width="width / 3" height="height / 4"/>
|
||||||
|
<!-- window's title -->
|
||||||
|
<title color="gtk:text[NORMAL]" x="20" y="30"/>
|
||||||
|
<!-- include another draw ops list; has optional x/y/width/height attrs -->
|
||||||
|
<include name="some_other_draw_ops"/>
|
||||||
|
<!-- tile another draw ops list; has optional
|
||||||
|
x/y/width/height/tile_xoffset/tile_yoffset -->
|
||||||
|
<tile name="some_other_draw_ops" tile_width="10" tile_height="10"/>
|
||||||
|
</draw_ops>
|
||||||
|
|
||||||
|
<frame_style name="normal" geometry="normal">
|
||||||
|
<!-- How to draw each piece of the frame.
|
||||||
|
For each piece, a draw_ops can be given inline or referenced
|
||||||
|
by name. If a piece is omitted, then nothing will be drawn
|
||||||
|
for that piece.
|
||||||
|
|
||||||
|
For each piece, the "width" and "height" variables in
|
||||||
|
coordinate expressions refers to the dimensions of the piece,
|
||||||
|
the origin is at the top left of the piece.
|
||||||
|
|
||||||
|
So <rectangle x="0" y="0" width="width-1" height="height-1"/>
|
||||||
|
will outline a piece.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<piece position="entire_background" draw_ops="demo_all_ops"/>
|
||||||
|
<piece position="left_titlebar_edge">
|
||||||
|
<draw_ops>
|
||||||
|
<line color="#00FF00" x1="0" y1="0" x2="0" y2="height"/>
|
||||||
|
</draw_ops>
|
||||||
|
</piece>
|
||||||
|
|
||||||
|
<!-- The complete list of frame pieces:
|
||||||
|
|
||||||
|
entire_background: whole frame
|
||||||
|
titlebar: entire area above the app's window
|
||||||
|
titlebar_middle: area of titlebar_background not considered
|
||||||
|
part of an edge
|
||||||
|
left_titlebar_edge: left side of titlebar background
|
||||||
|
right_titlebar_edge: right side of titlebar background
|
||||||
|
top_titlebar_edge: top side of titlebar background
|
||||||
|
bottom_titlebar_edge: bottom side of titlebar background
|
||||||
|
title: the title area (doesn't include buttons)
|
||||||
|
left_edge: left edge of the frame
|
||||||
|
right_edge: right edge of the frame
|
||||||
|
bottom_edge: bottom edge of the frame
|
||||||
|
overlay: same area as entire_background, but drawn after
|
||||||
|
drawing all sub-pieces instead of before
|
||||||
|
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- For buttons, drawing methods have to be provided for
|
||||||
|
each of three states:
|
||||||
|
normal, pressed, prelight
|
||||||
|
and the button function or position must be provided:
|
||||||
|
close, maximize, minimize, menu,
|
||||||
|
left_left_background, left_middle_background,
|
||||||
|
left_right_background, right_left_background,
|
||||||
|
right_middle_background, right_right_background
|
||||||
|
So a working theme needs 3*4 = 12 button declarations
|
||||||
|
and a theme may have up to 3*10 = 30 button declarations
|
||||||
|
in order to handle button-rearrangement preferences.
|
||||||
|
|
||||||
|
(The name "function" for the attribute is from before the
|
||||||
|
background values existed.)
|
||||||
|
-->
|
||||||
|
|
||||||
|
<button function="close" state="normal" draw_ops="previously_named"/>
|
||||||
|
<button function="menu" state="normal">
|
||||||
|
<draw_ops>
|
||||||
|
<icon alpha="0.7"
|
||||||
|
x="0" y="0" width="object_width" height="object_height"/>
|
||||||
|
</draw_ops>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</frame_style>
|
||||||
|
|
||||||
|
<!-- styles can inherit from each other with the parent="" attribute.
|
||||||
|
In a subclass anything can be re-specified to override
|
||||||
|
the parent style. -->
|
||||||
|
<frame_style name="focused" parent="normal">
|
||||||
|
<piece position="title">
|
||||||
|
<draw_ops>
|
||||||
|
<rectangle color="gtk:bg[SELECTED]"
|
||||||
|
x="0" y="0" width="width-1" height="height-1"/>
|
||||||
|
<title color="gtk:fg[SELECTED]" x="(width - title_width) / 2"
|
||||||
|
y="(height - title_height) / 2"/>
|
||||||
|
</draw_ops>
|
||||||
|
</piece>
|
||||||
|
</frame_style>
|
||||||
|
|
||||||
|
<!-- Maps styles to states of frame.
|
||||||
|
|
||||||
|
Focus: yes (focused), no (not focused)
|
||||||
|
Window states: normal, maximized, shaded, maximized_and_shaded
|
||||||
|
Window resizability: none, vertical, horizontal, both
|
||||||
|
|
||||||
|
Everything unspecified just does the same as
|
||||||
|
unfocused/normal/both.
|
||||||
|
|
||||||
|
only state="normal" needs a resize="" attribute.
|
||||||
|
-->
|
||||||
|
<frame_style_set name="normal">
|
||||||
|
<frame focus="yes" state="normal" resize="both" style="focused"/>
|
||||||
|
<frame focus="no" state="normal" resize="both" style="normal"/>
|
||||||
|
</frame_style_set>
|
||||||
|
|
||||||
|
<!-- Each window type needs a style set
|
||||||
|
Types: normal, dialog, modal_dialog, menu, utility, border
|
||||||
|
-->
|
||||||
|
<window type="normal" style_set="normal"/>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- For menu icons, drawing methods are needed for the same
|
||||||
|
four types as the buttons, and GTK states
|
||||||
|
(insensitive,prelight,normal,etc.)
|
||||||
|
-->
|
||||||
|
|
||||||
|
<menu_icon function="close" state="normal" draw_ops="previously_named"/>
|
||||||
|
|
||||||
|
|
||||||
|
</metacity_theme>
|
||||||
|
|
||||||
|
|
||||||
@@ -22,7 +22,9 @@ src/core/screen.c
|
|||||||
src/core/util.c
|
src/core/util.c
|
||||||
src/core/window.c
|
src/core/window.c
|
||||||
src/ui/frames.c
|
src/ui/frames.c
|
||||||
|
src/ui/resizepopup.c
|
||||||
src/ui/theme.c
|
src/ui/theme.c
|
||||||
|
src/ui/theme-parser.c
|
||||||
src/x11/session.c
|
src/x11/session.c
|
||||||
src/x11/window-props.c
|
src/x11/window-props.c
|
||||||
src/x11/xprops.c
|
src/x11/xprops.c
|
||||||
|
|||||||
2681
po/bn_IN.po
2681
po/bn_IN.po
File diff suppressed because it is too large
Load Diff
1275
po/ca@valencia.po
1275
po/ca@valencia.po
File diff suppressed because it is too large
Load Diff
818
po/fr.po
818
po/fr.po
@@ -1,5 +1,5 @@
|
|||||||
# French translation of mutter.
|
# French translation of mutter.
|
||||||
# Copyright (C) 2002-2015 Free Software Foundation, Inc.
|
# Copyright (C) 2002-2014 Free Software Foundation, Inc.
|
||||||
# This file is distributed under the same license as the metacity package.
|
# This file is distributed under the same license as the metacity package.
|
||||||
#
|
#
|
||||||
# Christophe Fergeau <teuf@users.sourceforge.net>, 2002.
|
# Christophe Fergeau <teuf@users.sourceforge.net>, 2002.
|
||||||
@@ -11,16 +11,17 @@
|
|||||||
# Cyprien Le Pannérer <cyplp@free.fr>, 2006.
|
# Cyprien Le Pannérer <cyplp@free.fr>, 2006.
|
||||||
# Robert-André Mauchin <zebob.m@gmail.com>, 2007.
|
# Robert-André Mauchin <zebob.m@gmail.com>, 2007.
|
||||||
# Stéphane Raimbault <stephane.raimbault@gmail.com>, 2007.
|
# Stéphane Raimbault <stephane.raimbault@gmail.com>, 2007.
|
||||||
# Claude Paroz <claude@2xlibre.net>, 2008-2015.
|
# Claude Paroz <claude@2xlibre.net>, 2008-2014.
|
||||||
# Bruno Brouard <annoa.b@gmail.com>, 2011-12.
|
# Bruno Brouard <annoa.b@gmail.com>, 2011-12.
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter master\n"
|
"Project-Id-Version: mutter masterReport-Msgid-Bugs-To: http://bugzilla.gnome."
|
||||||
|
"org/enter_bug.cgi?product=mutter&component=general\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2015-02-23 23:11+0000\n"
|
"POT-Creation-Date: 2014-08-29 21:52+0000\n"
|
||||||
"PO-Revision-Date: 2015-02-24 10:08+0100\n"
|
"PO-Revision-Date: 2014-08-30 11:59+0200\n"
|
||||||
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
|
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
|
||||||
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
|
"Language-Team: GNOME French Team <gnomefr@traduc.org>\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
@@ -407,8 +408,8 @@ msgid ""
|
|||||||
"When true, the new windows will always be put in the center of the active "
|
"When true, the new windows will always be put in the center of the active "
|
||||||
"screen of the monitor."
|
"screen of the monitor."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Si true (vrai), les nouvelles fenêtres seront toujours placées au centre de "
|
"Si true (vrai), les nouvelles fenêtres seront toujours placées au centre "
|
||||||
"l'écran actif du moniteur."
|
"de l'écran actif du moniteur."
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||||
msgid "Select window from tab popup"
|
msgid "Select window from tab popup"
|
||||||
@@ -448,49 +449,29 @@ msgstr "Passer à l'émulateur de terminal 6"
|
|||||||
msgid "Switch to VT 7"
|
msgid "Switch to VT 7"
|
||||||
msgstr "Passer à l'émulateur de terminal 7"
|
msgstr "Passer à l'émulateur de terminal 7"
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
#: ../src/backends/meta-monitor-manager.c:412
|
||||||
msgid "Switch to VT 8"
|
|
||||||
msgstr "Passer à l'émulateur de terminal 8"
|
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
|
||||||
msgid "Switch to VT 9"
|
|
||||||
msgstr "Passer à l'émulateur de terminal 9"
|
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
|
||||||
msgid "Switch to VT 10"
|
|
||||||
msgstr "Passer à l'émulateur de terminal 10"
|
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
|
||||||
msgid "Switch to VT 11"
|
|
||||||
msgstr "Passer à l'émulateur de terminal 11"
|
|
||||||
|
|
||||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
|
||||||
msgid "Switch to VT 12"
|
|
||||||
msgstr "Passer à l'émulateur de terminal 12"
|
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:364
|
|
||||||
msgid "Built-in display"
|
msgid "Built-in display"
|
||||||
msgstr "Affichage intégré"
|
msgstr "Affichage intégré"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:391
|
#: ../src/backends/meta-monitor-manager.c:437
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Inconnu"
|
msgstr "Inconnu"
|
||||||
|
|
||||||
#: ../src/backends/meta-monitor-manager.c:393
|
#: ../src/backends/meta-monitor-manager.c:439
|
||||||
msgid "Unknown Display"
|
msgid "Unknown Display"
|
||||||
msgstr "Affichage inconnu"
|
msgstr "Affichage inconnu"
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
#. * size in inches, like 'Dell 15"'
|
#. * size in inches, like 'Dell 15"'
|
||||||
#.
|
#.
|
||||||
#: ../src/backends/meta-monitor-manager.c:401
|
#: ../src/backends/meta-monitor-manager.c:447
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s %s"
|
msgid "%s %s"
|
||||||
msgstr "%s %s"
|
msgstr "%s %s"
|
||||||
|
|
||||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||||
#. * we have no way to get it to exit
|
#. * we have no way to get it to exit
|
||||||
#: ../src/compositor/compositor.c:456
|
#: ../src/compositor/compositor.c:443
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Another compositing manager is already running on screen %i on display \"%s"
|
"Another compositing manager is already running on screen %i on display \"%s"
|
||||||
@@ -499,6 +480,10 @@ msgstr ""
|
|||||||
"Un autre gestionnaire de composition est déjà lancé sur l'écran %i de "
|
"Un autre gestionnaire de composition est déjà lancé sur l'écran %i de "
|
||||||
"l'affichage « %s »."
|
"l'affichage « %s »."
|
||||||
|
|
||||||
|
#: ../src/compositor/meta-background.c:1044
|
||||||
|
msgid "background texture could not be created from file"
|
||||||
|
msgstr "la texture d'arrière-plan n'a pas pu être créée depuis le fichier"
|
||||||
|
|
||||||
#: ../src/core/bell.c:185
|
#: ../src/core/bell.c:185
|
||||||
msgid "Bell event"
|
msgid "Bell event"
|
||||||
msgstr "Évènement sonore"
|
msgstr "Évènement sonore"
|
||||||
@@ -528,7 +513,7 @@ msgstr "_Attendre"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Forcer à quitter"
|
msgstr "_Forcer à quitter"
|
||||||
|
|
||||||
#: ../src/core/display.c:562
|
#: ../src/core/display.c:547
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "Impossible d'ouvrir l'affichage « %s » du système X Window\n"
|
msgstr "Impossible d'ouvrir l'affichage « %s » du système X Window\n"
|
||||||
@@ -565,6 +550,19 @@ msgstr "Lancer comme un compositeur wayland"
|
|||||||
msgid "Run as a full display server, rather than nested"
|
msgid "Run as a full display server, rather than nested"
|
||||||
msgstr "Lancer comme un serveur d'affichage complet, plutôt qu'imbriqué"
|
msgstr "Lancer comme un serveur d'affichage complet, plutôt qu'imbriqué"
|
||||||
|
|
||||||
|
#: ../src/core/main.c:459
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed to scan themes directory: %s\n"
|
||||||
|
msgstr "Le parcours du répertoire de thèmes a échoué : %s\n"
|
||||||
|
|
||||||
|
#: ../src/core/main.c:475
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||||
|
msgstr ""
|
||||||
|
"Impossible de trouver un thème ! Assurez-vous que %s existe et contient les "
|
||||||
|
"thèmes habituels.\n"
|
||||||
|
|
||||||
#: ../src/core/mutter.c:39
|
#: ../src/core/mutter.c:39
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -589,29 +587,759 @@ msgstr "Afficher la version"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Greffon de Mutter à utiliser"
|
msgstr "Greffon de Mutter à utiliser"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:2004
|
#: ../src/core/prefs.c:2101
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Espace de travail %d"
|
msgstr "Espace de travail %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:525
|
#: ../src/core/screen.c:548
|
||||||
#, c-format
|
|
||||||
msgid ""
|
|
||||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
|
||||||
"to replace the current window manager."
|
|
||||||
msgstr ""
|
|
||||||
"L'affichage « %s » a déjà un gestionnaire de fenêtres ; essayez d'utiliser "
|
|
||||||
"l'option --replace pour remplacer le gestionnaire de fenêtres actuel."
|
|
||||||
|
|
||||||
#: ../src/core/screen.c:607
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "L'écran %d sur l'affichage « %s » n'est pas valide\n"
|
msgstr "L'écran %d sur l'affichage « %s » n'est pas valide\n"
|
||||||
|
|
||||||
|
#: ../src/core/screen.c:564
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||||
|
"replace option to replace the current window manager.\n"
|
||||||
|
msgstr ""
|
||||||
|
"L'écran %d sur l'affichage « %s » a déjà un gestionnaire de fenêtres ; "
|
||||||
|
"essayez d'utiliser l'option --replace pour remplacer le gestionnaire de "
|
||||||
|
"fenêtres actuel.\n"
|
||||||
|
|
||||||
|
#: ../src/core/screen.c:657
|
||||||
|
#, c-format
|
||||||
|
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
|
msgstr "L'écran %d sur l'affichage « %s » a déjà un gestionnaire de fenêtres\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:118
|
#: ../src/core/util.c:118
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Mutter a été compilé sans la prise en charge du mode bavard\n"
|
msgstr "Mutter a été compilé sans la prise en charge du mode bavard\n"
|
||||||
|
|
||||||
|
#. Translators: This represents the size of a window. The first number is
|
||||||
|
#. * the width of the window and the second is the height.
|
||||||
|
#.
|
||||||
|
#: ../src/ui/resizepopup.c:134
|
||||||
|
#, c-format
|
||||||
|
msgid "%d x %d"
|
||||||
|
msgstr "%d x %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:233
|
||||||
|
msgid "top"
|
||||||
|
msgstr "haut"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:235
|
||||||
|
msgid "bottom"
|
||||||
|
msgstr "bas"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:237
|
||||||
|
msgid "left"
|
||||||
|
msgstr "gauche"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:239
|
||||||
|
msgid "right"
|
||||||
|
msgstr "droite"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:267
|
||||||
|
#, c-format
|
||||||
|
msgid "frame geometry does not specify \"%s\" dimension"
|
||||||
|
msgstr "la géométrie du cadre n'indique pas la dimension « %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:286
|
||||||
|
#, c-format
|
||||||
|
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||||
|
msgstr ""
|
||||||
|
"la géométrie du cadre n'indique pas la dimension « %s » pour la bordure "
|
||||||
|
"« %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:323
|
||||||
|
#, c-format
|
||||||
|
msgid "Button aspect ratio %g is not reasonable"
|
||||||
|
msgstr "La proportion du bouton %g n'est pas raisonnable"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:335
|
||||||
|
#, c-format
|
||||||
|
msgid "Frame geometry does not specify size of buttons"
|
||||||
|
msgstr "La géométrie du cadre n'indique pas la taille des boutons"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1061
|
||||||
|
#, c-format
|
||||||
|
msgid "Gradients should have at least two colors"
|
||||||
|
msgstr "Les dégradés doivent comporter au moins deux couleurs"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1211
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"GTK custom color specification must have color name and fallback in "
|
||||||
|
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
|
||||||
|
msgstr ""
|
||||||
|
"Une spécification de couleur personnalisée GTK doit comporter un nom de "
|
||||||
|
"couleur et un substitut entre parenthèses, par ex. gtk:custom(foo,bar) ; "
|
||||||
|
"impossible d'analyser « %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1227
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||||
|
"_ are valid"
|
||||||
|
msgstr ""
|
||||||
|
"Caractère « %c » non valide dans le paramètre color_name de gtk:custom, "
|
||||||
|
"seuls A-Za-z0-9-_ sont acceptés"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1241
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||||
|
"fit the format"
|
||||||
|
msgstr ""
|
||||||
|
"Le format de gtk:custom est « gtk:custom(nom_couleur,substitut) », « %s » ne "
|
||||||
|
"correspond pas à ce format"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1286
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||||
|
"where NORMAL is the state; could not parse \"%s\""
|
||||||
|
msgstr ""
|
||||||
|
"La spécification de couleur GTK doit présenter l'état entre crochets, p. ex. "
|
||||||
|
"gtk:fg[NORMAL] où NORMAL est l'état ; impossible d'analyser « %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1300
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||||
|
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
|
||||||
|
msgstr ""
|
||||||
|
"La spécification de couleur GTK doit comporter un crochet de fermeture après "
|
||||||
|
"l'état, p. ex. gtk:fg[NORMAL] où NORMAL est l'état ; impossible d'analyser "
|
||||||
|
"« %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1311
|
||||||
|
#, c-format
|
||||||
|
msgid "Did not understand state \"%s\" in color specification"
|
||||||
|
msgstr ""
|
||||||
|
"Impossible de comprendre l'état « %s » dans la spécification de couleur"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1324
|
||||||
|
#, c-format
|
||||||
|
msgid "Did not understand color component \"%s\" in color specification"
|
||||||
|
msgstr ""
|
||||||
|
"Impossible de comprendre le composant de couleur « %s » dans la "
|
||||||
|
"spécification de couleur"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1352
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||||
|
"format"
|
||||||
|
msgstr ""
|
||||||
|
"Le format de mélange est « blend/bg_color/fg_color/alpha », « %s » ne "
|
||||||
|
"correspond pas à ce format ."
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1363
|
||||||
|
#, c-format
|
||||||
|
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||||
|
msgstr "Impossible d'analyser la valeur alpha « %s » en couleur mélangée"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1373
|
||||||
|
#, c-format
|
||||||
|
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||||
|
msgstr ""
|
||||||
|
"La valeur alpha « %s » en couleur mélangée n'est pas comprise entre 0,0 et "
|
||||||
|
"1,0"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1419
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||||
|
msgstr ""
|
||||||
|
"Le format d'ombre est « shade/base_color/factor », « %s » ne correspond pas "
|
||||||
|
"au format"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1430
|
||||||
|
#, c-format
|
||||||
|
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||||
|
msgstr "Impossible d'analyser le facteur d'ombre « %s » en couleur ombrée"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1440
|
||||||
|
#, c-format
|
||||||
|
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||||
|
msgstr "Le facteur d'ombre « %s » en couleur ombrée est négatif"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1469
|
||||||
|
#, c-format
|
||||||
|
msgid "Could not parse color \"%s\""
|
||||||
|
msgstr "Impossible d'analyser la couleur « %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1778
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée contient le caractère « %s » qui n'est pas "
|
||||||
|
"autorisé"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1805
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Coordinate expression contains floating point number '%s' which could not be "
|
||||||
|
"parsed"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée contient la valeur en virgule flottante « %s » "
|
||||||
|
"qui ne peut pas être analysée"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1819
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée contient l'entier « %s » qui n'a pas pu être "
|
||||||
|
"analysé"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1940
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Coordinate expression contained unknown operator at the start of this text: "
|
||||||
|
"\"%s\""
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée contenait un opérateur inconnu au début de ce "
|
||||||
|
"texte : « %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:1997
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression was empty or not understood"
|
||||||
|
msgstr "L'expression de la coordonnée était vide ou incomprise"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2110 ../src/ui/theme.c:2120 ../src/ui/theme.c:2154
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression results in division by zero"
|
||||||
|
msgstr "L'expression de la coordonnée entraîne une division par zéro"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2162
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée tente d'utiliser l'opérateur mod sur une "
|
||||||
|
"valeur en virgule flottante"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2218
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée a un opérateur « %s » là où un opérande était "
|
||||||
|
"attendu"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2227
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression had an operand where an operator was expected"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée a un opérande là où un opérateur était attendu"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2235
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée était terminée par un opérateur au lieu d'un "
|
||||||
|
"opérande"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2245
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||||
|
"operand in between"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée a un opérateur « %c » suivant l'opérateur "
|
||||||
|
"« %c » sans opérande entre eux"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2396 ../src/ui/theme.c:2441
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée possède une variable ou constante inconnue "
|
||||||
|
"« %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2495
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression parser overflowed its buffer."
|
||||||
|
msgstr ""
|
||||||
|
"L'analyseur d'expression de coordonnées a dépassé la capacité de son tampon."
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2524
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée comporte une parenthèse de fermeture, mais pas "
|
||||||
|
"de parenthèse d'ouverture"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2588
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée comporte une parenthèse d'ouverture, mais pas "
|
||||||
|
"de parenthèse de fermeture"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2599
|
||||||
|
#, c-format
|
||||||
|
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||||
|
msgstr ""
|
||||||
|
"L'expression de la coordonnée ne semble pas comprendre d'opérateur ni "
|
||||||
|
"d'opérande"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:2812 ../src/ui/theme.c:2832 ../src/ui/theme.c:2852
|
||||||
|
#, c-format
|
||||||
|
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||||
|
msgstr "Le thème contient une expression qui a entraîné une erreur : %s\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:4455
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||||
|
"specified for this frame style"
|
||||||
|
msgstr ""
|
||||||
|
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> doit être "
|
||||||
|
"indiqué pour ce style de cadre"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:4970 ../src/ui/theme.c:4995
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||||
|
msgstr ""
|
||||||
|
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> manquant"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:5041
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed to load theme \"%s\": %s\n"
|
||||||
|
msgstr "Impossible de charger le thème « %s » : %s\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:5177 ../src/ui/theme.c:5184 ../src/ui/theme.c:5191
|
||||||
|
#: ../src/ui/theme.c:5198 ../src/ui/theme.c:5205
|
||||||
|
#, c-format
|
||||||
|
msgid "No <%s> set for theme \"%s\""
|
||||||
|
msgstr "Aucun <%s> défini pour le thème « %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:5213
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||||
|
"type=\"%s\" style_set=\"whatever\"/> element"
|
||||||
|
msgstr ""
|
||||||
|
"Aucun style de cadre défini pour le type de fenêtre « %s » dans le thème "
|
||||||
|
"« %s », ajoutez un élément <window type=\"%s\" style_set=\"whatever\"/>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:5620 ../src/ui/theme.c:5682 ../src/ui/theme.c:5745
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||||
|
msgstr ""
|
||||||
|
"Les constantes définies par l'utilisateur doivent commencer par une "
|
||||||
|
"majuscule ; « %s » commence par une minuscule"
|
||||||
|
|
||||||
|
#: ../src/ui/theme.c:5628 ../src/ui/theme.c:5690 ../src/ui/theme.c:5753
|
||||||
|
#, c-format
|
||||||
|
msgid "Constant \"%s\" has already been defined"
|
||||||
|
msgstr "La constante « %s » a déjà été définie"
|
||||||
|
|
||||||
|
#. Translators: This means that an attribute which should have been found
|
||||||
|
#. * on an XML element was not in fact found.
|
||||||
|
#.
|
||||||
|
#: ../src/ui/theme-parser.c:234
|
||||||
|
#, c-format
|
||||||
|
msgid "No \"%s\" attribute on element <%s>"
|
||||||
|
msgstr "Aucun attribut « %s » sur l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:263 ../src/ui/theme-parser.c:281
|
||||||
|
#, c-format
|
||||||
|
msgid "Line %d character %d: %s"
|
||||||
|
msgstr "Ligne %d caractère %d: %s"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:481
|
||||||
|
#, c-format
|
||||||
|
msgid "Attribute \"%s\" repeated twice on the same <%s> element"
|
||||||
|
msgstr "Attribut « %s » répété deux fois sur le même élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:505 ../src/ui/theme-parser.c:554
|
||||||
|
#, c-format
|
||||||
|
msgid "Attribute \"%s\" is invalid on <%s> element in this context"
|
||||||
|
msgstr "Attribut « %s » non valide sur l'élément <%s> dans ce contexte"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:596
|
||||||
|
#, c-format
|
||||||
|
msgid "Could not parse \"%s\" as an integer"
|
||||||
|
msgstr "Impossible d'analyser « %s » en tant qu'entier"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:605 ../src/ui/theme-parser.c:660
|
||||||
|
#, c-format
|
||||||
|
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
|
||||||
|
msgstr "Caractères de fin « %s » non compris dans la chaîne « %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:615
|
||||||
|
#, c-format
|
||||||
|
msgid "Integer %ld must be positive"
|
||||||
|
msgstr "L'entier %ld doit être positif"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:623
|
||||||
|
#, c-format
|
||||||
|
msgid "Integer %ld is too large, current max is %d"
|
||||||
|
msgstr "L'entier %ld est trop élevé, le max. actuel est %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:651 ../src/ui/theme-parser.c:767
|
||||||
|
#, c-format
|
||||||
|
msgid "Could not parse \"%s\" as a floating point number"
|
||||||
|
msgstr "Impossible d'analyser « %s » en tant que valeur en virgule flottante"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:682 ../src/ui/theme-parser.c:710
|
||||||
|
#, c-format
|
||||||
|
msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
|
||||||
|
msgstr ""
|
||||||
|
"Les valeurs booléennes doivent être « true » ou « false » et non « %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:737
|
||||||
|
#, c-format
|
||||||
|
msgid "Angle must be between 0.0 and 360.0, was %g\n"
|
||||||
|
msgstr "L'angle doit être compris entre 0,0 et 360,0. Il était de %g\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:800
|
||||||
|
#, c-format
|
||||||
|
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
|
||||||
|
msgstr ""
|
||||||
|
"La valeur alpha doit être comprise entre 0,0 (invisible) et 1,0 (entièrement "
|
||||||
|
"opaque). Elle était de %g\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:865
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
|
||||||
|
"large,x-large,xx-large)\n"
|
||||||
|
msgstr ""
|
||||||
|
"Échelle de titre non valide « %s » (elle doit avoir l'une des valeurs "
|
||||||
|
"suivantes : xx-small, x-small, small, medium,large, x-large, xx-large)\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1021 ../src/ui/theme-parser.c:1084
|
||||||
|
#: ../src/ui/theme-parser.c:1118 ../src/ui/theme-parser.c:1221
|
||||||
|
#, c-format
|
||||||
|
msgid "<%s> name \"%s\" used a second time"
|
||||||
|
msgstr "<%s> - nom « %s » utilisé une deuxième fois"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1033 ../src/ui/theme-parser.c:1130
|
||||||
|
#: ../src/ui/theme-parser.c:1233
|
||||||
|
#, c-format
|
||||||
|
msgid "<%s> parent \"%s\" has not been defined"
|
||||||
|
msgstr "<%s> - parent « %s » non défini"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1143
|
||||||
|
#, c-format
|
||||||
|
msgid "<%s> geometry \"%s\" has not been defined"
|
||||||
|
msgstr "<%s> - géométrie « %s » non définie"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1156
|
||||||
|
#, c-format
|
||||||
|
msgid "<%s> must specify either a geometry or a parent that has a geometry"
|
||||||
|
msgstr "<%s> doit indiquer une géométrie ou un parent qui en possède une"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1198
|
||||||
|
msgid "You must specify a background for an alpha value to be meaningful"
|
||||||
|
msgstr ""
|
||||||
|
"Vous devez indiquer un arrière-plan pour qu'une valeur alpha ait du sens."
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1266
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown type \"%s\" on <%s> element"
|
||||||
|
msgstr "Type inconnu « %s » sur l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1277
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown style_set \"%s\" on <%s> element"
|
||||||
|
msgstr "style_set inconnu « %s » sur l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1285
|
||||||
|
#, c-format
|
||||||
|
msgid "Window type \"%s\" has already been assigned a style set"
|
||||||
|
msgstr "Le type de fenêtre « %s » s'est déjà vu attribuer un jeu de styles"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1315 ../src/ui/theme-parser.c:1379
|
||||||
|
#: ../src/ui/theme-parser.c:1605 ../src/ui/theme-parser.c:2840
|
||||||
|
#: ../src/ui/theme-parser.c:2886 ../src/ui/theme-parser.c:3036
|
||||||
|
#: ../src/ui/theme-parser.c:3272 ../src/ui/theme-parser.c:3310
|
||||||
|
#: ../src/ui/theme-parser.c:3348 ../src/ui/theme-parser.c:3386
|
||||||
|
#, c-format
|
||||||
|
msgid "Element <%s> is not allowed below <%s>"
|
||||||
|
msgstr "L'élément <%s> n'est pas autorisé sous <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1429 ../src/ui/theme-parser.c:1443
|
||||||
|
#: ../src/ui/theme-parser.c:1488
|
||||||
|
msgid ""
|
||||||
|
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
||||||
|
"for buttons"
|
||||||
|
msgstr ""
|
||||||
|
"Impossible d'indiquer à la fois « button_width » / "
|
||||||
|
"« button_height » (largeur/hauteur) et « aspect_ratio » (proportion) pour "
|
||||||
|
"les boutons"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1452
|
||||||
|
#, c-format
|
||||||
|
msgid "Distance \"%s\" is unknown"
|
||||||
|
msgstr "Distance « %s » inconnue"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1497
|
||||||
|
#, c-format
|
||||||
|
msgid "Aspect ratio \"%s\" is unknown"
|
||||||
|
msgstr "Proportion « %s » inconnue"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1559
|
||||||
|
#, c-format
|
||||||
|
msgid "Border \"%s\" is unknown"
|
||||||
|
msgstr "Bordure « %s » inconnue"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1870
|
||||||
|
#, c-format
|
||||||
|
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
|
||||||
|
msgstr ""
|
||||||
|
"Aucun attribut « start_angle » (« début d'angle ») ou « from » (« depuis ») "
|
||||||
|
"sur l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:1877
|
||||||
|
#, c-format
|
||||||
|
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
|
||||||
|
msgstr ""
|
||||||
|
"Aucun attribut « extent_angle » (« extension d'angle ») ou « to » (« vers ») "
|
||||||
|
"sur l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2117
|
||||||
|
#, c-format
|
||||||
|
msgid "Did not understand value \"%s\" for type of gradient"
|
||||||
|
msgstr "Impossible de comprendre la valeur « %s » pour le type de dégradé"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2195 ../src/ui/theme-parser.c:2570
|
||||||
|
#, c-format
|
||||||
|
msgid "Did not understand fill type \"%s\" for <%s> element"
|
||||||
|
msgstr ""
|
||||||
|
"Impossible de comprendre le type de remplissage « %s » pour l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2362 ../src/ui/theme-parser.c:2445
|
||||||
|
#: ../src/ui/theme-parser.c:2508
|
||||||
|
#, c-format
|
||||||
|
msgid "Did not understand state \"%s\" for <%s> element"
|
||||||
|
msgstr "Impossible de comprendre l'état « %s » pour l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2372 ../src/ui/theme-parser.c:2455
|
||||||
|
#, c-format
|
||||||
|
msgid "Did not understand shadow \"%s\" for <%s> element"
|
||||||
|
msgstr "Impossible de comprendre l'ombre « %s » pour l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2382
|
||||||
|
#, c-format
|
||||||
|
msgid "Did not understand arrow \"%s\" for <%s> element"
|
||||||
|
msgstr "Impossible de comprendre la flèche « %s » pour l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2696 ../src/ui/theme-parser.c:2792
|
||||||
|
#, c-format
|
||||||
|
msgid "No <draw_ops> called \"%s\" has been defined"
|
||||||
|
msgstr "Aucun <draw_ops> appelé « %s » n'a été défini"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2708 ../src/ui/theme-parser.c:2804
|
||||||
|
#, c-format
|
||||||
|
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
||||||
|
msgstr "L'inclusion du draw_ops « %s » ici créerait une référence circulaire"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2919
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown position \"%s\" for frame piece"
|
||||||
|
msgstr "Position inconnue « %s » de la pièce du cadre"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2927
|
||||||
|
#, c-format
|
||||||
|
msgid "Frame style already has a piece at position %s"
|
||||||
|
msgstr "Le style de cadre a déjà une pièce à la position %s"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2944 ../src/ui/theme-parser.c:3021
|
||||||
|
#, c-format
|
||||||
|
msgid "No <draw_ops> with the name \"%s\" has been defined"
|
||||||
|
msgstr "Aucun <draw_ops> avec le nom « %s » n'a été défini"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2974
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown function \"%s\" for button"
|
||||||
|
msgstr "Fonction inconnue « %s » pour le bouton"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2984
|
||||||
|
#, c-format
|
||||||
|
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
|
||||||
|
msgstr ""
|
||||||
|
"La fonction « %s » du bouton n'existe pas dans la version (%d, a besoin de "
|
||||||
|
"%d)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:2996
|
||||||
|
#, c-format
|
||||||
|
msgid "Unknown state \"%s\" for button"
|
||||||
|
msgstr "État inconnu « %s » pour le bouton"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3004
|
||||||
|
#, c-format
|
||||||
|
msgid "Frame style already has a button for function %s state %s"
|
||||||
|
msgstr "Le style de cadre a déjà un bouton pour la fonction %s, état %s"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3075
|
||||||
|
#, c-format
|
||||||
|
msgid "\"%s\" is not a valid value for focus attribute"
|
||||||
|
msgstr "« %s » n'est pas une valeur valide pour l'attribut de focus"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3084
|
||||||
|
#, c-format
|
||||||
|
msgid "\"%s\" is not a valid value for state attribute"
|
||||||
|
msgstr "« %s » n'est pas une valeur valide pour l'attribut d'état"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3094
|
||||||
|
#, c-format
|
||||||
|
msgid "A style called \"%s\" has not been defined"
|
||||||
|
msgstr "Aucun style appelé « %s » n'a été défini"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3115 ../src/ui/theme-parser.c:3138
|
||||||
|
#, c-format
|
||||||
|
msgid "\"%s\" is not a valid value for resize attribute"
|
||||||
|
msgstr ""
|
||||||
|
"« %s » n'est pas une valeur valide pour l'attribut de redimensionnement"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3149
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
|
||||||
|
"states"
|
||||||
|
msgstr ""
|
||||||
|
"L'attribut « resize » (« redimensionnement ») ne devrait pas figurer sur "
|
||||||
|
"l'élément <%s> pour les états maximisé/réduit dans la barre de titre"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3163
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Should not have \"resize\" attribute on <%s> element for maximized states"
|
||||||
|
msgstr ""
|
||||||
|
"L'attribut « resize » (« redimensionnement ») ne devrait pas figurer sur "
|
||||||
|
"l'élément <%s> pour l'état maximisé"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3177 ../src/ui/theme-parser.c:3221
|
||||||
|
#, c-format
|
||||||
|
msgid "Style has already been specified for state %s resize %s focus %s"
|
||||||
|
msgstr ""
|
||||||
|
"Le style a déjà été indiqué pour l'état %s, redimensionnement %s, focus %s"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3188 ../src/ui/theme-parser.c:3199
|
||||||
|
#: ../src/ui/theme-parser.c:3210 ../src/ui/theme-parser.c:3232
|
||||||
|
#: ../src/ui/theme-parser.c:3243 ../src/ui/theme-parser.c:3254
|
||||||
|
#, c-format
|
||||||
|
msgid "Style has already been specified for state %s focus %s"
|
||||||
|
msgstr "Le style a déjà été indiqué pour l'état %s, focus %s"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3293
|
||||||
|
msgid ""
|
||||||
|
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
|
||||||
|
"attribute and also a <draw_ops> element, or specified two elements)"
|
||||||
|
msgstr ""
|
||||||
|
"Impossible d'avoir deux attributs draw_ops pour un élément <piece> (le thème "
|
||||||
|
"indiquait un attribut draw_ops et un élément <draw_ops> ou deux éléments)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3331
|
||||||
|
msgid ""
|
||||||
|
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
|
||||||
|
"attribute and also a <draw_ops> element, or specified two elements)"
|
||||||
|
msgstr ""
|
||||||
|
"Impossible d'avoir deux attributs draw_ops pour un élément <button> (le "
|
||||||
|
"thème indiquait un attribut draw_ops et un élément <draw_ops> ou deux "
|
||||||
|
"éléments)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3369
|
||||||
|
msgid ""
|
||||||
|
"Can't have a two draw_ops for a <menu_icon> element (theme specified a "
|
||||||
|
"draw_ops attribute and also a <draw_ops> element, or specified two elements)"
|
||||||
|
msgstr ""
|
||||||
|
"Impossible d'avoir deux attributs draw_ops pour un élément <menu_icon> (le "
|
||||||
|
"thème indiquait un attribut draw_ops et un élément <draw_ops> ou deux "
|
||||||
|
"éléments)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3433
|
||||||
|
#, c-format
|
||||||
|
msgid "Bad version specification '%s'"
|
||||||
|
msgstr "Mauvaise spécification de version « %s »"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3506
|
||||||
|
msgid ""
|
||||||
|
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
|
||||||
|
"theme-2.xml"
|
||||||
|
msgstr ""
|
||||||
|
"L'attribut « version » ne peut pas être utilisé dans metacity-theme-1.xml or "
|
||||||
|
"metacity-theme-2.xml"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3529
|
||||||
|
#, c-format
|
||||||
|
msgid "Theme requires version %s but latest supported theme version is %d.%d"
|
||||||
|
msgstr ""
|
||||||
|
"Le thème nécessite la version %s mais la version de thème la plus récente "
|
||||||
|
"prise en charge est %d.%d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3561
|
||||||
|
#, c-format
|
||||||
|
msgid "Outermost element in theme must be <metacity_theme> not <%s>"
|
||||||
|
msgstr ""
|
||||||
|
"L'élément le plus extérieur dans le thème doit être <metacity_theme> et non <"
|
||||||
|
"%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3581
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Element <%s> is not allowed inside a name/author/date/description element"
|
||||||
|
msgstr ""
|
||||||
|
"L'élément <%s> n'est pas autorisé dans un élément name/author/date/"
|
||||||
|
"description"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3586
|
||||||
|
#, c-format
|
||||||
|
msgid "Element <%s> is not allowed inside a <constant> element"
|
||||||
|
msgstr "L'élément <%s> n'est pas autorisé dans un élément <constant>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3598
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Element <%s> is not allowed inside a distance/border/aspect_ratio element"
|
||||||
|
msgstr ""
|
||||||
|
"L'élément <%s> n'est pas autorisé dans un élément distance/border/"
|
||||||
|
"aspect_ratio"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3620
|
||||||
|
#, c-format
|
||||||
|
msgid "Element <%s> is not allowed inside a draw operation element"
|
||||||
|
msgstr ""
|
||||||
|
"L'élément <%s> n'est pas autorisé dans un élément d'opération de dessin"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3630 ../src/ui/theme-parser.c:3660
|
||||||
|
#: ../src/ui/theme-parser.c:3665 ../src/ui/theme-parser.c:3670
|
||||||
|
#, c-format
|
||||||
|
msgid "Element <%s> is not allowed inside a <%s> element"
|
||||||
|
msgstr "L'élément <%s> n'est pas autorisé dans un élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3898
|
||||||
|
msgid "No draw_ops provided for frame piece"
|
||||||
|
msgstr "Aucun attribut draw_ops fourni pour la pièce du cadre"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3913
|
||||||
|
msgid "No draw_ops provided for button"
|
||||||
|
msgstr "Aucun attribut draw_ops fourni pour le bouton"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:3967
|
||||||
|
#, c-format
|
||||||
|
msgid "No text is allowed inside element <%s>"
|
||||||
|
msgstr "Aucun texte autorisé dans l'élément <%s>"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:4025 ../src/ui/theme-parser.c:4037
|
||||||
|
#: ../src/ui/theme-parser.c:4049 ../src/ui/theme-parser.c:4061
|
||||||
|
#: ../src/ui/theme-parser.c:4073
|
||||||
|
#, c-format
|
||||||
|
msgid "<%s> specified twice for this theme"
|
||||||
|
msgstr "<%s> indiqué deux fois pour ce thème"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-parser.c:4335
|
||||||
|
#, c-format
|
||||||
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
|
msgstr "Impossible de trouver un fichier valide pour le thème %s\n"
|
||||||
|
|
||||||
#: ../src/x11/session.c:1815
|
#: ../src/x11/session.c:1815
|
||||||
msgid ""
|
msgid ""
|
||||||
"These windows do not support "save current setup" and will have to "
|
"These windows do not support "save current setup" and will have to "
|
||||||
@@ -621,7 +1349,7 @@ msgstr ""
|
|||||||
"configuration actuelle » et devront être redémarrées manuellement à la "
|
"configuration actuelle » et devront être redémarrées manuellement à la "
|
||||||
"prochaine connexion."
|
"prochaine connexion."
|
||||||
|
|
||||||
#: ../src/x11/window-props.c:549
|
#: ../src/x11/window-props.c:515
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (sur %s)"
|
msgstr "%s (sur %s)"
|
||||||
|
|||||||
1284
po/pt_BR.po
1284
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
2394
po/sr@latin.po
2394
po/sr@latin.po
File diff suppressed because it is too large
Load Diff
1240
po/zh_CN.po
1240
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
1184
po/zh_TW.po
1184
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -1,46 +0,0 @@
|
|||||||
# A framework for running scripted tests
|
|
||||||
|
|
||||||
if HAVE_WAYLAND
|
|
||||||
|
|
||||||
if BUILDOPT_INSTALL_TESTS
|
|
||||||
stackingdir = $(pkgdatadir)/tests/stacking
|
|
||||||
dist_stacking_DATA = \
|
|
||||||
tests/stacking/basic-x11.metatest \
|
|
||||||
tests/stacking/basic-wayland.metatest \
|
|
||||||
tests/stacking/minimized.metatest \
|
|
||||||
tests/stacking/mixed-windows.metatest \
|
|
||||||
tests/stacking/override-redirect.metatest
|
|
||||||
|
|
||||||
mutter-all.test: tests/mutter-all.test.in
|
|
||||||
$(AM_V_GEN) sed -e "s|@libexecdir[@]|$(libexecdir)|g" $< > $@.tmp && mv $@.tmp $@
|
|
||||||
|
|
||||||
installedtestsdir = $(datadir)/installed-tests/mutter
|
|
||||||
installedtests_DATA = mutter-all.test
|
|
||||||
|
|
||||||
installedtestsbindir = $(libexecdir)/installed-tests/mutter
|
|
||||||
installedtestsbin_PROGRAMS = mutter-test-client mutter-test-runner
|
|
||||||
else
|
|
||||||
noinst_PROGRAMS += mutter-test-client mutter-test-runner
|
|
||||||
endif
|
|
||||||
|
|
||||||
EXTRA_DIST += tests/mutter-all.test.in
|
|
||||||
|
|
||||||
mutter_test_client_SOURCES = tests/test-client.c
|
|
||||||
mutter_test_client_LDADD = $(MUTTER_LIBS) libmutter.la
|
|
||||||
|
|
||||||
mutter_test_runner_SOURCES = tests/test-runner.c
|
|
||||||
mutter_test_runner_LDADD = $(MUTTER_LIBS) libmutter.la
|
|
||||||
|
|
||||||
.PHONY: run-tests
|
|
||||||
|
|
||||||
run-tests: mutter-test-client mutter-test-runner
|
|
||||||
./mutter-test-runner $(dist_stacking_DATA)
|
|
||||||
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Some random test programs for bits of the code
|
|
||||||
|
|
||||||
testboxes_SOURCES = core/testboxes.c
|
|
||||||
testboxes_LDADD = $(MUTTER_LIBS) libmutter.la
|
|
||||||
|
|
||||||
noinst_PROGRAMS += testboxes
|
|
||||||
152
src/Makefile.am
152
src/Makefile.am
@@ -5,9 +5,6 @@ lib_LTLIBRARIES = libmutter.la
|
|||||||
|
|
||||||
SUBDIRS=compositor/plugins
|
SUBDIRS=compositor/plugins
|
||||||
|
|
||||||
EXTRA_DIST =
|
|
||||||
NULL =
|
|
||||||
|
|
||||||
AM_CPPFLAGS = \
|
AM_CPPFLAGS = \
|
||||||
-DCLUTTER_ENABLE_COMPOSITOR_API \
|
-DCLUTTER_ENABLE_COMPOSITOR_API \
|
||||||
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
|
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
|
||||||
@@ -32,40 +29,31 @@ AM_CPPFLAGS = \
|
|||||||
-DMUTTER_PKGLIBDIR=\"$(pkglibdir)\" \
|
-DMUTTER_PKGLIBDIR=\"$(pkglibdir)\" \
|
||||||
-DMUTTER_PLUGIN_DIR=\"$(MUTTER_PLUGIN_DIR)\" \
|
-DMUTTER_PLUGIN_DIR=\"$(MUTTER_PLUGIN_DIR)\" \
|
||||||
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\" \
|
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\" \
|
||||||
-DXWAYLAND_PATH=\"$(XWAYLAND_PATH)\" \
|
-DXWAYLAND_PATH=\"$(XWAYLAND_PATH)\"
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
mutter_built_sources = \
|
mutter_built_sources = \
|
||||||
$(dbus_idle_built_sources) \
|
$(dbus_idle_built_sources) \
|
||||||
$(dbus_display_config_built_sources) \
|
$(dbus_display_config_built_sources) \
|
||||||
$(dbus_login1_built_sources) \
|
$(dbus_login1_built_sources) \
|
||||||
meta/meta-enum-types.h \
|
mutter-enum-types.h \
|
||||||
meta-enum-types.c \
|
mutter-enum-types.c
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
if HAVE_WAYLAND
|
if HAVE_WAYLAND
|
||||||
mutter_built_sources += \
|
mutter_built_sources += \
|
||||||
pointer-gestures-protocol.c \
|
|
||||||
pointer-gestures-server-protocol.h \
|
|
||||||
gtk-shell-protocol.c \
|
gtk-shell-protocol.c \
|
||||||
gtk-shell-server-protocol.h \
|
gtk-shell-server-protocol.h \
|
||||||
xdg-shell-protocol.c \
|
xdg-shell-protocol.c \
|
||||||
xdg-shell-server-protocol.h \
|
xdg-shell-server-protocol.h
|
||||||
$(NULL)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
wayland_protocols = \
|
wayland_protocols = \
|
||||||
wayland/protocol/pointer-gestures.xml \
|
|
||||||
wayland/protocol/gtk-shell.xml \
|
wayland/protocol/gtk-shell.xml \
|
||||||
wayland/protocol/xdg-shell.xml \
|
wayland/protocol/xdg-shell.xml
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
libmutter_la_SOURCES = \
|
libmutter_la_SOURCES = \
|
||||||
backends/meta-backend.c \
|
backends/meta-backend.c \
|
||||||
meta/meta-backend.h \
|
meta/meta-backend.h \
|
||||||
backends/meta-backend-private.h \
|
backends/meta-backend-private.h \
|
||||||
backends/meta-barrier.c \
|
|
||||||
backends/meta-barrier-private.h \
|
|
||||||
backends/meta-cursor.c \
|
backends/meta-cursor.c \
|
||||||
backends/meta-cursor.h \
|
backends/meta-cursor.h \
|
||||||
backends/meta-cursor-private.h \
|
backends/meta-cursor-private.h \
|
||||||
@@ -78,13 +66,10 @@ libmutter_la_SOURCES = \
|
|||||||
backends/meta-idle-monitor-private.h \
|
backends/meta-idle-monitor-private.h \
|
||||||
backends/meta-idle-monitor-dbus.c \
|
backends/meta-idle-monitor-dbus.c \
|
||||||
backends/meta-idle-monitor-dbus.h \
|
backends/meta-idle-monitor-dbus.h \
|
||||||
backends/meta-input-settings.c \
|
|
||||||
backends/meta-input-settings-private.h \
|
|
||||||
backends/meta-monitor-config.c \
|
backends/meta-monitor-config.c \
|
||||||
backends/meta-monitor-config.h \
|
backends/meta-monitor-config.h \
|
||||||
backends/meta-monitor-manager.c \
|
backends/meta-monitor-manager.c \
|
||||||
meta/meta-monitor-manager.h \
|
backends/meta-monitor-manager.h \
|
||||||
backends/meta-monitor-manager-private.h \
|
|
||||||
backends/meta-monitor-manager-dummy.c \
|
backends/meta-monitor-manager-dummy.c \
|
||||||
backends/meta-monitor-manager-dummy.h \
|
backends/meta-monitor-manager-dummy.h \
|
||||||
backends/meta-stage.h \
|
backends/meta-stage.h \
|
||||||
@@ -93,18 +78,15 @@ libmutter_la_SOURCES = \
|
|||||||
backends/edid.h \
|
backends/edid.h \
|
||||||
backends/x11/meta-backend-x11.c \
|
backends/x11/meta-backend-x11.c \
|
||||||
backends/x11/meta-backend-x11.h \
|
backends/x11/meta-backend-x11.h \
|
||||||
backends/x11/meta-barrier-x11.c \
|
|
||||||
backends/x11/meta-barrier-x11.h \
|
|
||||||
backends/x11/meta-cursor-renderer-x11.c \
|
backends/x11/meta-cursor-renderer-x11.c \
|
||||||
backends/x11/meta-cursor-renderer-x11.h \
|
backends/x11/meta-cursor-renderer-x11.h \
|
||||||
backends/x11/meta-idle-monitor-xsync.c \
|
backends/x11/meta-idle-monitor-xsync.c \
|
||||||
backends/x11/meta-idle-monitor-xsync.h \
|
backends/x11/meta-idle-monitor-xsync.h \
|
||||||
backends/x11/meta-input-settings-x11.c \
|
|
||||||
backends/x11/meta-input-settings-x11.h \
|
|
||||||
backends/x11/meta-monitor-manager-xrandr.c \
|
backends/x11/meta-monitor-manager-xrandr.c \
|
||||||
backends/x11/meta-monitor-manager-xrandr.h \
|
backends/x11/meta-monitor-manager-xrandr.h \
|
||||||
core/meta-accel-parse.c \
|
core/meta-accel-parse.c \
|
||||||
core/meta-accel-parse.h \
|
core/meta-accel-parse.h \
|
||||||
|
core/barrier.c \
|
||||||
meta/barrier.h \
|
meta/barrier.h \
|
||||||
core/bell.c \
|
core/bell.c \
|
||||||
core/bell.h \
|
core/bell.h \
|
||||||
@@ -118,31 +100,24 @@ libmutter_la_SOURCES = \
|
|||||||
compositor/compositor.c \
|
compositor/compositor.c \
|
||||||
compositor/compositor-private.h \
|
compositor/compositor-private.h \
|
||||||
compositor/meta-background.c \
|
compositor/meta-background.c \
|
||||||
compositor/meta-background-private.h \
|
|
||||||
compositor/meta-background-actor.c \
|
compositor/meta-background-actor.c \
|
||||||
compositor/meta-background-actor-private.h \
|
compositor/meta-background-actor-private.h \
|
||||||
compositor/meta-background-image.c \
|
|
||||||
compositor/meta-background-group.c \
|
compositor/meta-background-group.c \
|
||||||
compositor/meta-cullable.c \
|
compositor/meta-cullable.c \
|
||||||
compositor/meta-cullable.h \
|
compositor/meta-cullable.h \
|
||||||
compositor/meta-dnd-actor.c \
|
|
||||||
compositor/meta-dnd-actor-private.h \
|
|
||||||
compositor/meta-feedback-actor.c \
|
|
||||||
compositor/meta-feedback-actor-private.h \
|
|
||||||
compositor/meta-module.c \
|
compositor/meta-module.c \
|
||||||
compositor/meta-module.h \
|
compositor/meta-module.h \
|
||||||
compositor/meta-plugin.c \
|
compositor/meta-plugin.c \
|
||||||
compositor/meta-plugin-manager.c \
|
compositor/meta-plugin-manager.c \
|
||||||
compositor/meta-plugin-manager.h \
|
compositor/meta-plugin-manager.h \
|
||||||
compositor/meta-shadow-factory.c \
|
compositor/meta-shadow-factory.c \
|
||||||
|
compositor/meta-shadow-factory-private.h \
|
||||||
compositor/meta-shaped-texture.c \
|
compositor/meta-shaped-texture.c \
|
||||||
compositor/meta-shaped-texture-private.h \
|
compositor/meta-shaped-texture-private.h \
|
||||||
compositor/meta-surface-actor.c \
|
compositor/meta-surface-actor.c \
|
||||||
compositor/meta-surface-actor.h \
|
compositor/meta-surface-actor.h \
|
||||||
compositor/meta-surface-actor-x11.c \
|
compositor/meta-surface-actor-x11.c \
|
||||||
compositor/meta-surface-actor-x11.h \
|
compositor/meta-surface-actor-x11.h \
|
||||||
compositor/meta-sync-ring.c \
|
|
||||||
compositor/meta-sync-ring.h \
|
|
||||||
compositor/meta-texture-rectangle.c \
|
compositor/meta-texture-rectangle.c \
|
||||||
compositor/meta-texture-rectangle.h \
|
compositor/meta-texture-rectangle.h \
|
||||||
compositor/meta-texture-tower.c \
|
compositor/meta-texture-tower.c \
|
||||||
@@ -152,17 +127,16 @@ libmutter_la_SOURCES = \
|
|||||||
compositor/meta-window-group.c \
|
compositor/meta-window-group.c \
|
||||||
compositor/meta-window-group.h \
|
compositor/meta-window-group.h \
|
||||||
compositor/meta-window-shape.c \
|
compositor/meta-window-shape.c \
|
||||||
|
compositor/meta-window-shape.h \
|
||||||
compositor/region-utils.c \
|
compositor/region-utils.c \
|
||||||
compositor/region-utils.h \
|
compositor/region-utils.h \
|
||||||
meta/compositor.h \
|
meta/compositor.h \
|
||||||
meta/meta-background.h \
|
meta/meta-background.h \
|
||||||
meta/meta-background-actor.h \
|
meta/meta-background-actor.h \
|
||||||
meta/meta-background-image.h \
|
|
||||||
meta/meta-background-group.h \
|
meta/meta-background-group.h \
|
||||||
meta/meta-plugin.h \
|
meta/meta-plugin.h \
|
||||||
meta/meta-shadow-factory.h \
|
meta/meta-shadow-factory.h \
|
||||||
meta/meta-window-actor.h \
|
meta/meta-window-actor.h \
|
||||||
meta/meta-window-shape.h \
|
|
||||||
meta/compositor-mutter.h \
|
meta/compositor-mutter.h \
|
||||||
core/constraints.c \
|
core/constraints.c \
|
||||||
core/constraints.h \
|
core/constraints.h \
|
||||||
@@ -179,6 +153,8 @@ libmutter_la_SOURCES = \
|
|||||||
meta/errors.h \
|
meta/errors.h \
|
||||||
core/frame.c \
|
core/frame.c \
|
||||||
core/frame.h \
|
core/frame.h \
|
||||||
|
ui/gradient.c \
|
||||||
|
meta/gradient.h \
|
||||||
core/meta-gesture-tracker.c \
|
core/meta-gesture-tracker.c \
|
||||||
core/meta-gesture-tracker-private.h \
|
core/meta-gesture-tracker-private.h \
|
||||||
core/keybindings.c \
|
core/keybindings.c \
|
||||||
@@ -210,11 +186,17 @@ libmutter_la_SOURCES = \
|
|||||||
ui/ui.h \
|
ui/ui.h \
|
||||||
ui/frames.c \
|
ui/frames.c \
|
||||||
ui/frames.h \
|
ui/frames.h \
|
||||||
|
ui/resizepopup.c \
|
||||||
|
ui/resizepopup.h \
|
||||||
|
ui/theme-parser.c \
|
||||||
ui/theme.c \
|
ui/theme.c \
|
||||||
meta/theme.h \
|
meta/theme.h \
|
||||||
ui/theme-private.h \
|
ui/theme-private.h \
|
||||||
ui/ui.c \
|
ui/ui.c \
|
||||||
x11/atomnames.h \
|
x11/iconcache.c \
|
||||||
|
x11/iconcache.h \
|
||||||
|
x11/async-getprop.c \
|
||||||
|
x11/async-getprop.h \
|
||||||
x11/events.c \
|
x11/events.c \
|
||||||
x11/events.h \
|
x11/events.h \
|
||||||
x11/group-private.h \
|
x11/group-private.h \
|
||||||
@@ -222,8 +204,6 @@ libmutter_la_SOURCES = \
|
|||||||
x11/group-props.h \
|
x11/group-props.h \
|
||||||
x11/group.c \
|
x11/group.c \
|
||||||
meta/group.h \
|
meta/group.h \
|
||||||
x11/iconcache.c \
|
|
||||||
x11/iconcache.h \
|
|
||||||
x11/session.c \
|
x11/session.c \
|
||||||
x11/session.h \
|
x11/session.h \
|
||||||
x11/window-props.c \
|
x11/window-props.c \
|
||||||
@@ -233,8 +213,7 @@ libmutter_la_SOURCES = \
|
|||||||
x11/window-x11-private.h \
|
x11/window-x11-private.h \
|
||||||
x11/xprops.c \
|
x11/xprops.c \
|
||||||
x11/xprops.h \
|
x11/xprops.h \
|
||||||
x11/mutter-Xatomtype.h \
|
x11/mutter-Xatomtype.h
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
if HAVE_WAYLAND
|
if HAVE_WAYLAND
|
||||||
libmutter_la_SOURCES += \
|
libmutter_la_SOURCES += \
|
||||||
@@ -245,28 +224,13 @@ libmutter_la_SOURCES += \
|
|||||||
wayland/meta-wayland-private.h \
|
wayland/meta-wayland-private.h \
|
||||||
wayland/meta-xwayland.c \
|
wayland/meta-xwayland.c \
|
||||||
wayland/meta-xwayland.h \
|
wayland/meta-xwayland.h \
|
||||||
wayland/meta-xwayland-selection.c \
|
|
||||||
wayland/meta-xwayland-selection-private.h \
|
|
||||||
wayland/meta-xwayland-private.h \
|
wayland/meta-xwayland-private.h \
|
||||||
wayland/meta-wayland-buffer.c \
|
|
||||||
wayland/meta-wayland-buffer.h \
|
|
||||||
wayland/meta-wayland-region.c \
|
|
||||||
wayland/meta-wayland-region.h \
|
|
||||||
wayland/meta-wayland-data-device.c \
|
wayland/meta-wayland-data-device.c \
|
||||||
wayland/meta-wayland-data-device.h \
|
wayland/meta-wayland-data-device.h \
|
||||||
wayland/meta-wayland-data-device-private.h \
|
|
||||||
wayland/meta-wayland-pointer-gestures.c \
|
|
||||||
wayland/meta-wayland-pointer-gestures.h \
|
|
||||||
wayland/meta-wayland-pointer-gesture-swipe.c \
|
|
||||||
wayland/meta-wayland-pointer-gesture-swipe.h \
|
|
||||||
wayland/meta-wayland-pointer-gesture-pinch.c \
|
|
||||||
wayland/meta-wayland-pointer-gesture-pinch.h \
|
|
||||||
wayland/meta-wayland-keyboard.c \
|
wayland/meta-wayland-keyboard.c \
|
||||||
wayland/meta-wayland-keyboard.h \
|
wayland/meta-wayland-keyboard.h \
|
||||||
wayland/meta-wayland-pointer.c \
|
wayland/meta-wayland-pointer.c \
|
||||||
wayland/meta-wayland-pointer.h \
|
wayland/meta-wayland-pointer.h \
|
||||||
wayland/meta-wayland-popup.c \
|
|
||||||
wayland/meta-wayland-popup.h \
|
|
||||||
wayland/meta-wayland-seat.c \
|
wayland/meta-wayland-seat.c \
|
||||||
wayland/meta-wayland-seat.h \
|
wayland/meta-wayland-seat.h \
|
||||||
wayland/meta-wayland-touch.c \
|
wayland/meta-wayland-touch.c \
|
||||||
@@ -277,36 +241,30 @@ libmutter_la_SOURCES += \
|
|||||||
wayland/meta-wayland-versions.h \
|
wayland/meta-wayland-versions.h \
|
||||||
wayland/meta-wayland-outputs.c \
|
wayland/meta-wayland-outputs.c \
|
||||||
wayland/meta-wayland-outputs.h \
|
wayland/meta-wayland-outputs.h \
|
||||||
wayland/meta-window-wayland.c \
|
wayland/window-wayland.c \
|
||||||
wayland/meta-window-wayland.h \
|
wayland/window-wayland.h
|
||||||
$(NULL)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if HAVE_NATIVE_BACKEND
|
if HAVE_NATIVE_BACKEND
|
||||||
libmutter_la_SOURCES += \
|
libmutter_la_SOURCES += \
|
||||||
backends/native/meta-backend-native.c \
|
backends/native/meta-backend-native.c \
|
||||||
backends/native/meta-backend-native.h \
|
backends/native/meta-backend-native.h \
|
||||||
backends/native/meta-backend-native-private.h \
|
|
||||||
backends/native/meta-barrier-native.c \
|
|
||||||
backends/native/meta-barrier-native.h \
|
|
||||||
backends/native/meta-cursor-renderer-native.c \
|
backends/native/meta-cursor-renderer-native.c \
|
||||||
backends/native/meta-cursor-renderer-native.h \
|
backends/native/meta-cursor-renderer-native.h \
|
||||||
backends/native/meta-idle-monitor-native.c \
|
backends/native/meta-idle-monitor-native.c \
|
||||||
backends/native/meta-idle-monitor-native.h \
|
backends/native/meta-idle-monitor-native.h \
|
||||||
backends/native/meta-input-settings-native.c \
|
|
||||||
backends/native/meta-input-settings-native.h \
|
|
||||||
backends/native/meta-monitor-manager-kms.c \
|
backends/native/meta-monitor-manager-kms.c \
|
||||||
backends/native/meta-monitor-manager-kms.h \
|
backends/native/meta-monitor-manager-kms.h \
|
||||||
backends/native/meta-launcher.c \
|
backends/native/meta-launcher.c \
|
||||||
backends/native/meta-launcher.h \
|
backends/native/meta-launcher.h \
|
||||||
backends/native/dbus-utils.c \
|
backends/native/dbus-utils.c \
|
||||||
backends/native/dbus-utils.h \
|
backends/native/dbus-utils.h
|
||||||
$(NULL)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
nodist_libmutter_la_SOURCES = $(mutter_built_sources)
|
nodist_libmutter_la_SOURCES = \
|
||||||
|
$(mutter_built_sources)
|
||||||
|
|
||||||
libmutter_la_LDFLAGS = -no-undefined -export-symbols-regex "^(meta|ag)_.*"
|
libmutter_la_LDFLAGS = -no-undefined
|
||||||
libmutter_la_LIBADD = $(MUTTER_LIBS) $(MUTTER_NATIVE_BACKEND_LIBS)
|
libmutter_la_LIBADD = $(MUTTER_LIBS) $(MUTTER_NATIVE_BACKEND_LIBS)
|
||||||
|
|
||||||
# Headers installed for plugins; introspected information will
|
# Headers installed for plugins; introspected information will
|
||||||
@@ -319,50 +277,50 @@ libmutterinclude_headers = \
|
|||||||
meta/compositor.h \
|
meta/compositor.h \
|
||||||
meta/display.h \
|
meta/display.h \
|
||||||
meta/errors.h \
|
meta/errors.h \
|
||||||
|
meta/gradient.h \
|
||||||
meta/group.h \
|
meta/group.h \
|
||||||
meta/keybindings.h \
|
meta/keybindings.h \
|
||||||
meta/main.h \
|
meta/main.h \
|
||||||
meta/meta-backend.h \
|
meta/meta-backend.h \
|
||||||
meta/meta-background.h \
|
|
||||||
meta/meta-background-actor.h \
|
meta/meta-background-actor.h \
|
||||||
meta/meta-background-image.h \
|
|
||||||
meta/meta-background-group.h \
|
meta/meta-background-group.h \
|
||||||
|
meta/meta-background.h \
|
||||||
meta/meta-cursor-tracker.h \
|
meta/meta-cursor-tracker.h \
|
||||||
meta/meta-idle-monitor.h \
|
meta/meta-idle-monitor.h \
|
||||||
meta/meta-plugin.h \
|
meta/meta-plugin.h \
|
||||||
meta/meta-monitor-manager.h \
|
|
||||||
meta/meta-shaped-texture.h \
|
meta/meta-shaped-texture.h \
|
||||||
meta/meta-shadow-factory.h \
|
meta/meta-shadow-factory.h \
|
||||||
meta/meta-window-actor.h \
|
meta/meta-window-actor.h \
|
||||||
meta/meta-window-shape.h \
|
|
||||||
meta/prefs.h \
|
meta/prefs.h \
|
||||||
meta/screen.h \
|
meta/screen.h \
|
||||||
meta/theme.h \
|
meta/theme.h \
|
||||||
meta/types.h \
|
meta/types.h \
|
||||||
meta/util.h \
|
meta/util.h \
|
||||||
meta/window.h \
|
meta/window.h \
|
||||||
meta/workspace.h \
|
meta/workspace.h
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
libmutterinclude_built_headers = \
|
libmutterinclude_built_headers = \
|
||||||
meta/meta-version.h \
|
meta/meta-version.h
|
||||||
meta/meta-enum-types.h \
|
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
libmutterinclude_base_headers = \
|
libmutterinclude_base_headers = \
|
||||||
$(libmutterinclude_headers) \
|
$(libmutterinclude_headers) \
|
||||||
$(libmutterinclude_built_headers)
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
|
# Excluded from scanning for introspection but installed
|
||||||
|
# atomnames.h: macros cause problems for scanning process
|
||||||
|
libmutterinclude_extra_headers = \
|
||||||
|
meta/atomnames.h
|
||||||
|
|
||||||
libmutterincludedir = $(includedir)/mutter/meta
|
libmutterincludedir = $(includedir)/mutter/meta
|
||||||
|
|
||||||
libmutterinclude_HEADERS = \
|
libmutterinclude_HEADERS = \
|
||||||
$(libmutterinclude_headers)
|
$(libmutterinclude_headers) \
|
||||||
|
$(libmutterinclude_extra_headers)
|
||||||
|
|
||||||
nodist_libmutterinclude_HEADERS = \
|
nodist_libmutterinclude_HEADERS = \
|
||||||
$(libmutterinclude_built_headers)
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
bin_PROGRAMS=mutter
|
bin_PROGRAMS=mutter
|
||||||
noinst_PROGRAMS=
|
|
||||||
|
|
||||||
mutter_SOURCES = core/mutter.c
|
mutter_SOURCES = core/mutter.c
|
||||||
mutter_LDADD = $(MUTTER_LIBS) libmutter.la
|
mutter_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
@@ -371,8 +329,6 @@ libexec_PROGRAMS = mutter-restart-helper
|
|||||||
mutter_restart_helper_SOURCES = core/restart-helper.c
|
mutter_restart_helper_SOURCES = core/restart-helper.c
|
||||||
mutter_restart_helper_LDADD = $(MUTTER_LIBS)
|
mutter_restart_helper_LDADD = $(MUTTER_LIBS)
|
||||||
|
|
||||||
include Makefile-tests.am
|
|
||||||
|
|
||||||
if HAVE_INTROSPECTION
|
if HAVE_INTROSPECTION
|
||||||
include $(INTROSPECTION_MAKEFILE)
|
include $(INTROSPECTION_MAKEFILE)
|
||||||
|
|
||||||
@@ -399,12 +355,23 @@ Meta-$(api_version).gir: libmutter.la
|
|||||||
@META_GIR@_CFLAGS = $(AM_CPPFLAGS)
|
@META_GIR@_CFLAGS = $(AM_CPPFLAGS)
|
||||||
@META_GIR@_LIBS = libmutter.la
|
@META_GIR@_LIBS = libmutter.la
|
||||||
@META_GIR@_FILES = \
|
@META_GIR@_FILES = \
|
||||||
|
mutter-enum-types.h \
|
||||||
$(libmutterinclude_base_headers) \
|
$(libmutterinclude_base_headers) \
|
||||||
$(filter %.c,$(libmutter_la_SOURCES) $(nodist_libmutter_la_SOURCES))
|
$(filter %.c,$(libmutter_la_SOURCES) $(nodist_libmutter_la_SOURCES))
|
||||||
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error
|
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
testboxes_SOURCES = core/testboxes.c
|
||||||
|
testgradient_SOURCES = ui/testgradient.c
|
||||||
|
testasyncgetprop_SOURCES = x11/testasyncgetprop.c
|
||||||
|
|
||||||
|
noinst_PROGRAMS=testboxes testgradient testasyncgetprop
|
||||||
|
|
||||||
|
testboxes_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
|
testgradient_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
|
testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
|
|
||||||
dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h
|
dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h
|
||||||
|
|
||||||
CLEANFILES = \
|
CLEANFILES = \
|
||||||
@@ -418,40 +385,39 @@ DISTCLEANFILES = \
|
|||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = libmutter.pc
|
pkgconfig_DATA = libmutter.pc
|
||||||
|
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST = \
|
||||||
$(wayland_protocols) \
|
$(wayland_protocols) \
|
||||||
libmutter.pc.in \
|
libmutter.pc.in \
|
||||||
meta-enum-types.h.in \
|
mutter-enum-types.h.in \
|
||||||
meta-enum-types.c.in \
|
mutter-enum-types.c.in \
|
||||||
org.freedesktop.login1.xml \
|
org.freedesktop.login1.xml \
|
||||||
org.gnome.Mutter.DisplayConfig.xml \
|
org.gnome.Mutter.DisplayConfig.xml \
|
||||||
org.gnome.Mutter.IdleMonitor.xml \
|
org.gnome.Mutter.IdleMonitor.xml
|
||||||
$(NULL)
|
|
||||||
|
|
||||||
BUILT_SOURCES = \
|
BUILT_SOURCES = \
|
||||||
$(mutter_built_sources) \
|
$(mutter_built_sources) \
|
||||||
$(libmutterinclude_built_headers)
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
MUTTER_STAMP_FILES = stamp-meta-enum-types.h
|
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
||||||
CLEANFILES += $(MUTTER_STAMP_FILES)
|
CLEANFILES += $(MUTTER_STAMP_FILES)
|
||||||
|
|
||||||
meta/meta-enum-types.h: stamp-meta-enum-types.h Makefile
|
mutter-enum-types.h: stamp-mutter-enum-types.h Makefile
|
||||||
@true
|
@true
|
||||||
stamp-meta-enum-types.h: $(libmutterinclude_headers) meta-enum-types.h.in
|
stamp-mutter-enum-types.h: $(libmutterinclude_base_headers) mutter-enum-types.h.in
|
||||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
$(AM_V_GEN) ( cd $(srcdir) && \
|
||||||
$(GLIB_MKENUMS) \
|
$(GLIB_MKENUMS) \
|
||||||
--template meta-enum-types.h.in \
|
--template mutter-enum-types.h.in \
|
||||||
$(libmutterinclude_base_headers) ) >> xgen-teth && \
|
$(libmutterinclude_base_headers) ) >> xgen-teth && \
|
||||||
(cmp -s xgen-teth meta/meta-enum-types.h || cp xgen-teth meta/meta-enum-types.h) && \
|
(cmp -s xgen-teth mutter-enum-types.h || cp xgen-teth mutter-enum-types.h) && \
|
||||||
rm -f xgen-teth && \
|
rm -f xgen-teth && \
|
||||||
echo timestamp > $(@F)
|
echo timestamp > $(@F)
|
||||||
|
|
||||||
meta-enum-types.c: stamp-meta-enum-types.h meta-enum-types.c.in
|
mutter-enum-types.c: stamp-mutter-enum-types.h mutter-enum-types.c.in
|
||||||
$(AM_V_GEN) ( cd $(srcdir) && \
|
$(AM_V_GEN) ( cd $(srcdir) && \
|
||||||
$(GLIB_MKENUMS) \
|
$(GLIB_MKENUMS) \
|
||||||
--template meta-enum-types.c.in \
|
--template mutter-enum-types.c.in \
|
||||||
$(libmutterinclude_base_headers) ) >> xgen-tetc && \
|
$(libmutterinclude_base_headers) ) >> xgen-tetc && \
|
||||||
cp xgen-tetc meta-enum-types.c && \
|
cp xgen-tetc mutter-enum-types.c && \
|
||||||
rm -f xgen-tetc
|
rm -f xgen-tetc
|
||||||
|
|
||||||
dbus_display_config_built_sources = meta-dbus-display-config.c meta-dbus-display-config.h
|
dbus_display_config_built_sources = meta-dbus-display-config.c meta-dbus-display-config.h
|
||||||
|
|||||||
@@ -189,5 +189,7 @@ struct MonitorInfo
|
|||||||
};
|
};
|
||||||
|
|
||||||
MonitorInfo *decode_edid (const uchar *data);
|
MonitorInfo *decode_edid (const uchar *data);
|
||||||
|
char *make_display_name (const MonitorInfo *info);
|
||||||
|
char *make_display_size_string (int width_mm, int height_mm);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
#include <meta/meta-backend.h>
|
#include <meta/meta-backend.h>
|
||||||
#include <meta/meta-idle-monitor.h>
|
#include <meta/meta-idle-monitor.h>
|
||||||
#include "meta-cursor-renderer.h"
|
#include "meta-cursor-renderer.h"
|
||||||
#include "meta-monitor-manager-private.h"
|
#include "meta-monitor-manager.h"
|
||||||
|
|
||||||
#define DEFAULT_XKB_RULES_FILE "evdev"
|
#define DEFAULT_XKB_RULES_FILE "evdev"
|
||||||
#define DEFAULT_XKB_MODEL "pc105+inet"
|
#define DEFAULT_XKB_MODEL "pc105+inet"
|
||||||
@@ -49,8 +49,8 @@ struct _MetaBackend
|
|||||||
{
|
{
|
||||||
GObject parent;
|
GObject parent;
|
||||||
|
|
||||||
GHashTable *device_monitors;
|
MetaIdleMonitor *device_monitors[256];
|
||||||
gint current_device_id;
|
int device_id_max;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaBackendClass
|
struct _MetaBackendClass
|
||||||
@@ -107,7 +107,4 @@ void meta_backend_warp_pointer (MetaBackend *backend,
|
|||||||
|
|
||||||
struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend);
|
struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend);
|
||||||
|
|
||||||
void meta_backend_update_last_device (MetaBackend *backend,
|
|
||||||
int device_id);
|
|
||||||
|
|
||||||
#endif /* META_BACKEND_PRIVATE_H */
|
#endif /* META_BACKEND_PRIVATE_H */
|
||||||
|
|||||||
@@ -26,20 +26,14 @@
|
|||||||
|
|
||||||
#include <meta/meta-backend.h>
|
#include <meta/meta-backend.h>
|
||||||
#include "meta-backend-private.h"
|
#include "meta-backend-private.h"
|
||||||
#include "meta-input-settings-private.h"
|
|
||||||
|
|
||||||
#include "backends/x11/meta-backend-x11.h"
|
#include "backends/x11/meta-backend-x11.h"
|
||||||
#include "meta-cursor-tracker-private.h"
|
|
||||||
#include "meta-stage.h"
|
#include "meta-stage.h"
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
#ifdef HAVE_NATIVE_BACKEND
|
||||||
#include "backends/native/meta-backend-native.h"
|
#include "backends/native/meta-backend-native.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "backends/meta-idle-monitor-private.h"
|
|
||||||
|
|
||||||
#include "backends/meta-monitor-manager-dummy.h"
|
|
||||||
|
|
||||||
static MetaBackend *_backend;
|
static MetaBackend *_backend;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -59,7 +53,6 @@ struct _MetaBackendPrivate
|
|||||||
{
|
{
|
||||||
MetaMonitorManager *monitor_manager;
|
MetaMonitorManager *monitor_manager;
|
||||||
MetaCursorRenderer *cursor_renderer;
|
MetaCursorRenderer *cursor_renderer;
|
||||||
MetaInputSettings *input_settings;
|
|
||||||
|
|
||||||
ClutterActor *stage;
|
ClutterActor *stage;
|
||||||
};
|
};
|
||||||
@@ -72,11 +65,15 @@ meta_backend_finalize (GObject *object)
|
|||||||
{
|
{
|
||||||
MetaBackend *backend = META_BACKEND (object);
|
MetaBackend *backend = META_BACKEND (object);
|
||||||
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||||
|
int i;
|
||||||
|
|
||||||
g_clear_object (&priv->monitor_manager);
|
g_clear_object (&priv->monitor_manager);
|
||||||
g_clear_object (&priv->input_settings);
|
|
||||||
|
|
||||||
g_hash_table_destroy (backend->device_monitors);
|
for (i = 0; i <= backend->device_id_max; i++)
|
||||||
|
{
|
||||||
|
if (backend->device_monitors[i])
|
||||||
|
g_object_unref (backend->device_monitors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@@ -92,169 +89,12 @@ meta_backend_sync_screen_size (MetaBackend *backend)
|
|||||||
META_BACKEND_GET_CLASS (backend)->update_screen_size (backend, width, height);
|
META_BACKEND_GET_CLASS (backend)->update_screen_size (backend, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
center_pointer (MetaBackend *backend)
|
|
||||||
{
|
|
||||||
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
|
||||||
MetaMonitorInfo *monitors, *primary;
|
|
||||||
guint n_monitors;
|
|
||||||
|
|
||||||
monitors = meta_monitor_manager_get_monitor_infos (priv->monitor_manager, &n_monitors);
|
|
||||||
primary = &monitors[meta_monitor_manager_get_primary_index (priv->monitor_manager)];
|
|
||||||
meta_backend_warp_pointer (backend,
|
|
||||||
primary->rect.x + primary->rect.width / 2,
|
|
||||||
primary->rect.y + primary->rect.height / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_monitors_changed (MetaMonitorManager *monitors,
|
on_monitors_changed (MetaMonitorManager *monitors,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
MetaBackend *backend = META_BACKEND (user_data);
|
MetaBackend *backend = META_BACKEND (user_data);
|
||||||
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
|
||||||
ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE);
|
|
||||||
ClutterPoint point;
|
|
||||||
|
|
||||||
meta_backend_sync_screen_size (backend);
|
meta_backend_sync_screen_size (backend);
|
||||||
|
|
||||||
if (clutter_input_device_get_coords (device, NULL, &point))
|
|
||||||
{
|
|
||||||
/* If we're outside all monitors, warp the pointer back inside */
|
|
||||||
if (meta_monitor_manager_get_monitor_at_point (monitors, point.x, point.y) < 0)
|
|
||||||
center_pointer (backend);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaIdleMonitor *
|
|
||||||
meta_backend_create_idle_monitor (MetaBackend *backend,
|
|
||||||
int device_id)
|
|
||||||
{
|
|
||||||
return META_BACKEND_GET_CLASS (backend)->create_idle_monitor (backend, device_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
create_device_monitor (MetaBackend *backend,
|
|
||||||
int device_id)
|
|
||||||
{
|
|
||||||
MetaIdleMonitor *idle_monitor;
|
|
||||||
|
|
||||||
g_assert (g_hash_table_lookup (backend->device_monitors, &device_id) == NULL);
|
|
||||||
|
|
||||||
idle_monitor = meta_backend_create_idle_monitor (backend, device_id);
|
|
||||||
g_hash_table_insert (backend->device_monitors, &idle_monitor->device_id, idle_monitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
destroy_device_monitor (MetaBackend *backend,
|
|
||||||
int device_id)
|
|
||||||
{
|
|
||||||
g_hash_table_remove (backend->device_monitors, &device_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
on_device_added (ClutterDeviceManager *device_manager,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaBackend *backend = META_BACKEND (user_data);
|
|
||||||
int device_id = clutter_input_device_get_device_id (device);
|
|
||||||
|
|
||||||
create_device_monitor (backend, device_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline gboolean
|
|
||||||
device_is_slave_touchscreen (ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
return (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER &&
|
|
||||||
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline gboolean
|
|
||||||
check_has_pointing_device (ClutterDeviceManager *manager)
|
|
||||||
{
|
|
||||||
const GSList *devices;
|
|
||||||
|
|
||||||
devices = clutter_device_manager_peek_devices (manager);
|
|
||||||
|
|
||||||
for (; devices; devices = devices->next)
|
|
||||||
{
|
|
||||||
ClutterInputDevice *device = devices->data;
|
|
||||||
|
|
||||||
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
|
||||||
continue;
|
|
||||||
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE ||
|
|
||||||
clutter_input_device_get_device_type (device) == CLUTTER_KEYBOARD_DEVICE)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline gboolean
|
|
||||||
check_has_slave_touchscreen (ClutterDeviceManager *manager)
|
|
||||||
{
|
|
||||||
const GSList *devices;
|
|
||||||
|
|
||||||
devices = clutter_device_manager_peek_devices (manager);
|
|
||||||
|
|
||||||
for (; devices; devices = devices->next)
|
|
||||||
{
|
|
||||||
ClutterInputDevice *device = devices->data;
|
|
||||||
|
|
||||||
if (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER &&
|
|
||||||
clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE)
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
on_device_removed (ClutterDeviceManager *device_manager,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaBackend *backend = META_BACKEND (user_data);
|
|
||||||
int device_id = clutter_input_device_get_device_id (device);
|
|
||||||
|
|
||||||
destroy_device_monitor (backend, device_id);
|
|
||||||
|
|
||||||
/* If the device the user last interacted goes away, check again pointer
|
|
||||||
* visibility.
|
|
||||||
*/
|
|
||||||
if (backend->current_device_id == device_id)
|
|
||||||
{
|
|
||||||
MetaCursorTracker *cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
|
|
||||||
gboolean has_touchscreen, has_pointing_device;
|
|
||||||
ClutterInputDeviceType device_type;
|
|
||||||
|
|
||||||
device_type = clutter_input_device_get_device_type (device);
|
|
||||||
has_touchscreen = check_has_slave_touchscreen (device_manager);
|
|
||||||
|
|
||||||
if (device_type == CLUTTER_TOUCHSCREEN_DEVICE && has_touchscreen)
|
|
||||||
{
|
|
||||||
/* There's more touchscreens left, keep the pointer hidden */
|
|
||||||
meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
|
|
||||||
}
|
|
||||||
else if (device_type != CLUTTER_KEYBOARD_DEVICE)
|
|
||||||
{
|
|
||||||
has_pointing_device = check_has_pointing_device (device_manager);
|
|
||||||
meta_cursor_tracker_set_pointer_visible (cursor_tracker,
|
|
||||||
has_pointing_device &&
|
|
||||||
!has_touchscreen);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaMonitorManager *
|
|
||||||
create_monitor_manager (MetaBackend *backend)
|
|
||||||
{
|
|
||||||
if (g_getenv ("META_DUMMY_MONITORS"))
|
|
||||||
return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
|
|
||||||
|
|
||||||
return META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -266,50 +106,13 @@ meta_backend_real_post_init (MetaBackend *backend)
|
|||||||
clutter_actor_realize (priv->stage);
|
clutter_actor_realize (priv->stage);
|
||||||
META_BACKEND_GET_CLASS (backend)->select_stage_events (backend);
|
META_BACKEND_GET_CLASS (backend)->select_stage_events (backend);
|
||||||
|
|
||||||
priv->monitor_manager = create_monitor_manager (backend);
|
priv->monitor_manager = META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend);
|
||||||
|
|
||||||
g_signal_connect (priv->monitor_manager, "monitors-changed",
|
g_signal_connect (priv->monitor_manager, "monitors-changed",
|
||||||
G_CALLBACK (on_monitors_changed), backend);
|
G_CALLBACK (on_monitors_changed), backend);
|
||||||
meta_backend_sync_screen_size (backend);
|
meta_backend_sync_screen_size (backend);
|
||||||
|
|
||||||
priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend);
|
priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend);
|
||||||
|
|
||||||
backend->device_monitors = g_hash_table_new_full (g_int_hash, g_int_equal,
|
|
||||||
NULL, (GDestroyNotify) g_object_unref);
|
|
||||||
|
|
||||||
{
|
|
||||||
MetaCursorTracker *cursor_tracker;
|
|
||||||
ClutterDeviceManager *manager;
|
|
||||||
gboolean has_touchscreen = FALSE;
|
|
||||||
GSList *devices, *l;
|
|
||||||
|
|
||||||
/* Create the core device monitor. */
|
|
||||||
create_device_monitor (backend, 0);
|
|
||||||
|
|
||||||
manager = clutter_device_manager_get_default ();
|
|
||||||
g_signal_connect_object (manager, "device-added",
|
|
||||||
G_CALLBACK (on_device_added), backend, 0);
|
|
||||||
g_signal_connect_object (manager, "device-removed",
|
|
||||||
G_CALLBACK (on_device_removed), backend, 0);
|
|
||||||
|
|
||||||
devices = clutter_device_manager_list_devices (manager);
|
|
||||||
|
|
||||||
for (l = devices; l != NULL; l = l->next)
|
|
||||||
{
|
|
||||||
ClutterInputDevice *device = l->data;
|
|
||||||
on_device_added (manager, device, backend);
|
|
||||||
has_touchscreen |= device_is_slave_touchscreen (device);
|
|
||||||
}
|
|
||||||
|
|
||||||
cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
|
|
||||||
meta_cursor_tracker_set_pointer_visible (cursor_tracker, !has_touchscreen);
|
|
||||||
|
|
||||||
g_slist_free (devices);
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->input_settings = meta_input_settings_create ();
|
|
||||||
|
|
||||||
center_pointer (backend);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaCursorRenderer *
|
static MetaCursorRenderer *
|
||||||
@@ -371,18 +174,6 @@ meta_backend_class_init (MetaBackendClass *klass)
|
|||||||
0,
|
0,
|
||||||
NULL, NULL, NULL,
|
NULL, NULL, NULL,
|
||||||
G_TYPE_NONE, 0);
|
G_TYPE_NONE, 0);
|
||||||
g_signal_new ("keymap-layout-group-changed",
|
|
||||||
G_TYPE_FROM_CLASS (object_class),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
0,
|
|
||||||
NULL, NULL, NULL,
|
|
||||||
G_TYPE_NONE, 1, G_TYPE_UINT);
|
|
||||||
g_signal_new ("last-device-changed",
|
|
||||||
G_TYPE_FROM_CLASS (object_class),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
0,
|
|
||||||
NULL, NULL, NULL,
|
|
||||||
G_TYPE_NONE, 1, G_TYPE_INT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -391,6 +182,23 @@ meta_backend_init (MetaBackend *backend)
|
|||||||
_backend = backend;
|
_backend = backend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FIXME -- destroy device monitors at some point */
|
||||||
|
G_GNUC_UNUSED static void
|
||||||
|
destroy_device_monitor (MetaBackend *backend,
|
||||||
|
int device_id)
|
||||||
|
{
|
||||||
|
g_clear_object (&backend->device_monitors[device_id]);
|
||||||
|
if (device_id == backend->device_id_max)
|
||||||
|
backend->device_id_max--;
|
||||||
|
}
|
||||||
|
|
||||||
|
static MetaIdleMonitor *
|
||||||
|
meta_backend_create_idle_monitor (MetaBackend *backend,
|
||||||
|
int device_id)
|
||||||
|
{
|
||||||
|
return META_BACKEND_GET_CLASS (backend)->create_idle_monitor (backend, device_id);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_backend_post_init (MetaBackend *backend)
|
meta_backend_post_init (MetaBackend *backend)
|
||||||
{
|
{
|
||||||
@@ -404,7 +212,15 @@ MetaIdleMonitor *
|
|||||||
meta_backend_get_idle_monitor (MetaBackend *backend,
|
meta_backend_get_idle_monitor (MetaBackend *backend,
|
||||||
int device_id)
|
int device_id)
|
||||||
{
|
{
|
||||||
return g_hash_table_lookup (backend->device_monitors, &device_id);
|
g_return_val_if_fail (device_id >= 0 && device_id < 256, NULL);
|
||||||
|
|
||||||
|
if (!backend->device_monitors[device_id])
|
||||||
|
{
|
||||||
|
backend->device_monitors[device_id] = meta_backend_create_idle_monitor (backend, device_id);
|
||||||
|
backend->device_id_max = MAX (backend->device_id_max, device_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return backend->device_monitors[device_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -503,45 +319,6 @@ meta_backend_get_stage (MetaBackend *backend)
|
|||||||
return priv->stage;
|
return priv->stage;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_backend_update_last_device (MetaBackend *backend,
|
|
||||||
int device_id)
|
|
||||||
{
|
|
||||||
ClutterInputDeviceType device_type;
|
|
||||||
MetaCursorTracker *cursor_tracker;
|
|
||||||
ClutterDeviceManager *manager;
|
|
||||||
ClutterInputDevice *device;
|
|
||||||
|
|
||||||
if (backend->current_device_id == device_id)
|
|
||||||
return;
|
|
||||||
|
|
||||||
manager = clutter_device_manager_get_default ();
|
|
||||||
device = clutter_device_manager_get_device (manager, device_id);
|
|
||||||
|
|
||||||
if (!device ||
|
|
||||||
clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
|
||||||
return;
|
|
||||||
|
|
||||||
device_type = clutter_input_device_get_device_type (device);
|
|
||||||
|
|
||||||
cursor_tracker = meta_cursor_tracker_get_for_screen (NULL);
|
|
||||||
backend->current_device_id = device_id;
|
|
||||||
g_signal_emit_by_name (backend, "last-device-changed", device_id);
|
|
||||||
|
|
||||||
if (device_type == CLUTTER_KEYBOARD_DEVICE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (device_type)
|
|
||||||
{
|
|
||||||
case CLUTTER_TOUCHSCREEN_DEVICE:
|
|
||||||
meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
meta_cursor_tracker_set_pointer_visible (cursor_tracker, TRUE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GType
|
static GType
|
||||||
get_backend_type (void)
|
get_backend_type (void)
|
||||||
{
|
{
|
||||||
@@ -620,7 +397,6 @@ static GSourceFuncs event_funcs = {
|
|||||||
void
|
void
|
||||||
meta_clutter_init (void)
|
meta_clutter_init (void)
|
||||||
{
|
{
|
||||||
ClutterSettings *clutter_settings;
|
|
||||||
GSource *source;
|
GSource *source;
|
||||||
|
|
||||||
meta_create_backend ();
|
meta_create_backend ();
|
||||||
@@ -628,13 +404,6 @@ meta_clutter_init (void)
|
|||||||
if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS)
|
if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS)
|
||||||
g_error ("Unable to initialize Clutter.\n");
|
g_error ("Unable to initialize Clutter.\n");
|
||||||
|
|
||||||
/*
|
|
||||||
* XXX: We cannot handle high dpi scaling yet, so fix the scale to 1
|
|
||||||
* for now.
|
|
||||||
*/
|
|
||||||
clutter_settings = clutter_settings_get_default ();
|
|
||||||
g_object_set (clutter_settings, "window-scaling-factor", 1, NULL);
|
|
||||||
|
|
||||||
source = g_source_new (&event_funcs, sizeof (GSource));
|
source = g_source_new (&event_funcs, sizeof (GSource));
|
||||||
g_source_attach (source, NULL);
|
g_source_attach (source, NULL);
|
||||||
g_source_unref (source);
|
g_source_unref (source);
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2014-2015 Red Hat
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Written by:
|
|
||||||
* Jasper St. Pierre <jstpierre@mecheye.net>
|
|
||||||
* Jonas Ådahl <jadahl@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef META_BARRIER_PRIVATE_H
|
|
||||||
#define META_BARRIER_PRIVATE_H
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define META_TYPE_BARRIER_IMPL (meta_barrier_impl_get_type ())
|
|
||||||
#define META_BARRIER_IMPL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BARRIER_IMPL, MetaBarrierImpl))
|
|
||||||
#define META_BARRIER_IMPL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_BARRIER_IMPL, MetaBarrierImplClass))
|
|
||||||
#define META_IS_BARRIER_IMPL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BARRIER_IMPL))
|
|
||||||
#define META_IS_BARRIER_IMPL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_BARRIER_IMPL))
|
|
||||||
#define META_BARRIER_IMPL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_BARRIER_IMPL, MetaBarrierImplClass))
|
|
||||||
|
|
||||||
typedef struct _MetaBarrierImpl MetaBarrierImpl;
|
|
||||||
typedef struct _MetaBarrierImplClass MetaBarrierImplClass;
|
|
||||||
|
|
||||||
struct _MetaBarrierImpl
|
|
||||||
{
|
|
||||||
GObject parent;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaBarrierImplClass
|
|
||||||
{
|
|
||||||
GObjectClass parent_class;
|
|
||||||
|
|
||||||
gboolean (*is_active) (MetaBarrierImpl *barrier);
|
|
||||||
void (*release) (MetaBarrierImpl *barrier,
|
|
||||||
MetaBarrierEvent *event);
|
|
||||||
void (*destroy) (MetaBarrierImpl *barrier);
|
|
||||||
};
|
|
||||||
|
|
||||||
GType meta_barrier_impl_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
void _meta_barrier_emit_hit_signal (MetaBarrier *barrier,
|
|
||||||
MetaBarrierEvent *event);
|
|
||||||
void _meta_barrier_emit_left_signal (MetaBarrier *barrier,
|
|
||||||
MetaBarrierEvent *event);
|
|
||||||
|
|
||||||
void meta_barrier_event_unref (MetaBarrierEvent *event);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
struct _MetaBarrierPrivate
|
|
||||||
{
|
|
||||||
MetaDisplay *display;
|
|
||||||
|
|
||||||
int x1;
|
|
||||||
int y1;
|
|
||||||
int x2;
|
|
||||||
int y2;
|
|
||||||
|
|
||||||
MetaBarrierDirection directions;
|
|
||||||
|
|
||||||
MetaBarrierImpl *impl;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* META_BARRIER_PRIVATE_H */
|
|
||||||
@@ -24,43 +24,28 @@
|
|||||||
|
|
||||||
#include "meta-cursor.h"
|
#include "meta-cursor.h"
|
||||||
|
|
||||||
#include <X11/Xcursor/Xcursor.h>
|
|
||||||
#include <cogl/cogl.h>
|
#include <cogl/cogl.h>
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
#include <gbm.h>
|
#include <gbm.h>
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
CoglTexture2D *texture;
|
CoglTexture2D *texture;
|
||||||
int hot_x, hot_y;
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
struct gbm_bo *bo;
|
struct gbm_bo *bo;
|
||||||
#endif
|
int offset_x, offset_y;
|
||||||
} MetaCursorImage;
|
} MetaCursorImage;
|
||||||
|
|
||||||
struct _MetaCursorReference {
|
struct _MetaCursorReference {
|
||||||
int ref_count;
|
int ref_count;
|
||||||
|
|
||||||
int current_frame;
|
|
||||||
XcursorImages *xcursor_images;
|
|
||||||
MetaCursor cursor;
|
MetaCursor cursor;
|
||||||
MetaCursorImage image;
|
MetaCursorImage image;
|
||||||
};
|
};
|
||||||
|
|
||||||
CoglTexture *meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
CoglTexture *meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
||||||
int *hot_x,
|
int *offset_x,
|
||||||
int *hot_y);
|
int *offset_y);
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
struct gbm_bo *meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
struct gbm_bo *meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
||||||
int *hot_x,
|
int *offset_x,
|
||||||
int *hot_y);
|
int *offset_y);
|
||||||
#endif
|
|
||||||
|
|
||||||
gboolean meta_cursor_reference_is_animated (MetaCursorReference *self);
|
|
||||||
void meta_cursor_reference_tick_frame (MetaCursorReference *self);
|
|
||||||
guint meta_cursor_reference_get_current_frame_time (MetaCursorReference *self);
|
|
||||||
|
|
||||||
#endif /* META_CURSOR_PRIVATE_H */
|
#endif /* META_CURSOR_PRIVATE_H */
|
||||||
|
|||||||
@@ -35,13 +35,21 @@
|
|||||||
|
|
||||||
#include "meta-stage.h"
|
#include "meta-stage.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
CoglTexture *texture;
|
||||||
|
MetaRectangle current_rect;
|
||||||
|
gboolean handled_by_backend;
|
||||||
|
} MetaCursorLayer;
|
||||||
|
|
||||||
struct _MetaCursorRendererPrivate
|
struct _MetaCursorRendererPrivate
|
||||||
{
|
{
|
||||||
int current_x, current_y;
|
int current_x, current_y;
|
||||||
MetaRectangle current_rect;
|
|
||||||
|
MetaCursorLayer core_layer;
|
||||||
|
MetaCursorLayer dnd_layer;
|
||||||
|
|
||||||
MetaCursorReference *displayed_cursor;
|
MetaCursorReference *displayed_cursor;
|
||||||
gboolean handled_by_backend;
|
|
||||||
};
|
};
|
||||||
typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
|
typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate;
|
||||||
|
|
||||||
@@ -53,18 +61,14 @@ queue_redraw (MetaCursorRenderer *renderer)
|
|||||||
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
MetaBackend *backend = meta_get_backend ();
|
MetaBackend *backend = meta_get_backend ();
|
||||||
ClutterActor *stage = meta_backend_get_stage (backend);
|
ClutterActor *stage = meta_backend_get_stage (backend);
|
||||||
CoglTexture *texture;
|
|
||||||
|
|
||||||
/* During early initialization, we can have no stage */
|
/* During early initialization, we can have no stage */
|
||||||
if (!stage)
|
if (!stage)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (priv->displayed_cursor && !priv->handled_by_backend)
|
if (priv->core_layer.texture && !priv->core_layer.handled_by_backend)
|
||||||
texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, NULL, NULL);
|
meta_stage_set_cursor (META_STAGE (stage), layer->texture, &priv->current_rect);
|
||||||
else
|
meta_stage_set_dnd_surface (META_STAGE (stage),
|
||||||
texture = NULL;
|
|
||||||
|
|
||||||
meta_stage_set_cursor (META_STAGE (stage), texture, &priv->current_rect);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -84,33 +88,68 @@ meta_cursor_renderer_init (MetaCursorRenderer *renderer)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_layer (MetaCursorRenderer *renderer,
|
||||||
|
MetaCursorLayer *layer,
|
||||||
|
CoglTexture *texture,
|
||||||
|
int offset_x,
|
||||||
|
int offset_y)
|
||||||
|
{
|
||||||
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
|
layer->texture = texture;
|
||||||
|
|
||||||
|
if (layer->texture)
|
||||||
|
{
|
||||||
|
layer->current_rect.x = priv->current_x + offset_x;
|
||||||
|
layer->current_rect.y = priv->current_y + offset_y;
|
||||||
|
layer->current_rect.width = cogl_texture_get_width (layer->texture);
|
||||||
|
layer->current_rect.height = cogl_texture_get_height (layer->texture);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
layer->current_rect.x = 0;
|
||||||
|
layer->current_rect.y = 0;
|
||||||
|
layer->current_rect.width = 0;
|
||||||
|
layer->current_rect.height = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_cursor (MetaCursorRenderer *renderer)
|
update_cursor (MetaCursorRenderer *renderer)
|
||||||
{
|
{
|
||||||
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
gboolean handled_by_backend;
|
gboolean handled_by_backend;
|
||||||
gboolean should_redraw = FALSE;
|
gboolean should_redraw = FALSE;
|
||||||
|
|
||||||
if (priv->displayed_cursor)
|
|
||||||
{
|
|
||||||
CoglTexture *texture;
|
CoglTexture *texture;
|
||||||
int hot_x, hot_y;
|
int hot_x, hot_y;
|
||||||
|
|
||||||
texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, &hot_x, &hot_y);
|
if (priv->displayed_cursor)
|
||||||
|
{
|
||||||
|
<<<<<<< HEAD
|
||||||
|
CoglTexture *texture;
|
||||||
|
int offset_x, offset_y;
|
||||||
|
|
||||||
priv->current_rect.x = priv->current_x - hot_x;
|
texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, &offset_x, &offset_y);
|
||||||
priv->current_rect.y = priv->current_y - hot_y;
|
|
||||||
|
priv->current_rect.x = priv->current_x + offset_x;
|
||||||
|
priv->current_rect.y = priv->current_y + offset_y;
|
||||||
priv->current_rect.width = cogl_texture_get_width (COGL_TEXTURE (texture));
|
priv->current_rect.width = cogl_texture_get_width (COGL_TEXTURE (texture));
|
||||||
priv->current_rect.height = cogl_texture_get_height (COGL_TEXTURE (texture));
|
priv->current_rect.height = cogl_texture_get_height (COGL_TEXTURE (texture));
|
||||||
|
=======
|
||||||
|
texture = meta_cursor_reference_get_cogl_texture (priv->displayed_cursor, &hot_x, &hot_y);
|
||||||
|
>>>>>>> 75e7834... dnd 2
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
priv->current_rect.x = 0;
|
texture = NULL;
|
||||||
priv->current_rect.y = 0;
|
hot_x = 0;
|
||||||
priv->current_rect.width = 0;
|
hot_y = 0;
|
||||||
priv->current_rect.height = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_layer (renderer, &priv->core_layer, texture, hot_x, hot_y);
|
||||||
|
update_layer (renderer, &priv->
|
||||||
|
|
||||||
handled_by_backend = META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer);
|
handled_by_backend = META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer);
|
||||||
if (handled_by_backend != priv->handled_by_backend)
|
if (handled_by_backend != priv->handled_by_backend)
|
||||||
{
|
{
|
||||||
@@ -145,10 +184,14 @@ meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_cursor_renderer_force_update (MetaCursorRenderer *renderer)
|
meta_cursor_renderer_set_dnd_surface (MetaCursorRenderer *renderer,
|
||||||
|
CoglTexture *texture,
|
||||||
|
int offset_x,
|
||||||
|
int offset_y)
|
||||||
{
|
{
|
||||||
update_cursor (renderer);
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
queue_redraw (renderer);
|
|
||||||
|
update_layer (renderer, &priv->dnd_layer,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -178,5 +221,5 @@ meta_cursor_renderer_get_rect (MetaCursorRenderer *renderer)
|
|||||||
{
|
{
|
||||||
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer);
|
||||||
|
|
||||||
return &priv->current_rect;
|
return &priv->core_layer.current_rect;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
#include <meta/screen.h>
|
#include <meta/screen.h>
|
||||||
#include "meta-cursor.h"
|
#include "meta-cursor.h"
|
||||||
|
|
||||||
|
#include <gbm.h>
|
||||||
|
|
||||||
#define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ())
|
#define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ())
|
||||||
#define META_CURSOR_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_CURSOR_RENDERER, MetaCursorRenderer))
|
#define META_CURSOR_RENDERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_CURSOR_RENDERER, MetaCursorRenderer))
|
||||||
#define META_CURSOR_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_CURSOR_RENDERER, MetaCursorRendererClass))
|
#define META_CURSOR_RENDERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_CURSOR_RENDERER, MetaCursorRendererClass))
|
||||||
@@ -61,7 +63,6 @@ void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
|
|||||||
|
|
||||||
void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
|
void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
|
||||||
int x, int y);
|
int x, int y);
|
||||||
void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer);
|
|
||||||
|
|
||||||
MetaCursorReference * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
|
MetaCursorReference * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
|
||||||
const MetaRectangle * meta_cursor_renderer_get_rect (MetaCursorRenderer *renderer);
|
const MetaRectangle * meta_cursor_renderer_get_rect (MetaCursorRenderer *renderer);
|
||||||
|
|||||||
@@ -27,9 +27,7 @@
|
|||||||
* pointer abstraction"
|
* pointer abstraction"
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include <config.h>
|
||||||
#include "meta-cursor-tracker-private.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include <meta/util.h>
|
#include <meta/util.h>
|
||||||
@@ -40,10 +38,11 @@
|
|||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
#include <gdk/gdkx.h>
|
#include <gdk/gdkx.h>
|
||||||
#include <X11/extensions/Xfixes.h>
|
|
||||||
|
|
||||||
#include "meta-backend-private.h"
|
#include "meta-backend-private.h"
|
||||||
|
|
||||||
#include "meta-cursor-private.h"
|
#include "meta-cursor-private.h"
|
||||||
|
#include "meta-cursor-tracker-private.h"
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
|
G_DEFINE_TYPE (MetaCursorTracker, meta_cursor_tracker, G_TYPE_OBJECT);
|
||||||
|
|
||||||
@@ -185,7 +184,6 @@ meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
g_clear_pointer (&tracker->xfixes_cursor, meta_cursor_reference_unref);
|
g_clear_pointer (&tracker->xfixes_cursor, meta_cursor_reference_unref);
|
||||||
g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -312,6 +310,7 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
|
|||||||
int *y)
|
int *y)
|
||||||
{
|
{
|
||||||
MetaCursorReference *cursor;
|
MetaCursorReference *cursor;
|
||||||
|
int offset_x, offset_y;
|
||||||
|
|
||||||
g_return_if_fail (META_IS_CURSOR_TRACKER (tracker));
|
g_return_if_fail (META_IS_CURSOR_TRACKER (tracker));
|
||||||
|
|
||||||
@@ -326,14 +325,19 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cursor)
|
if (cursor)
|
||||||
meta_cursor_reference_get_cogl_texture (cursor, x, y);
|
{
|
||||||
|
meta_cursor_reference_get_cogl_texture (cursor, &offset_x, &offset_y);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (x)
|
offset_x = 0;
|
||||||
*x = 0;
|
offset_y = 0;
|
||||||
if (y)
|
|
||||||
*y = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (x)
|
||||||
|
*x = -offset_x;
|
||||||
|
if (y)
|
||||||
|
*y = -offset_y;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -55,20 +55,14 @@ meta_cursor_reference_ref (MetaCursorReference *self)
|
|||||||
static void
|
static void
|
||||||
meta_cursor_image_free (MetaCursorImage *image)
|
meta_cursor_image_free (MetaCursorImage *image)
|
||||||
{
|
{
|
||||||
if (image->texture)
|
|
||||||
cogl_object_unref (image->texture);
|
cogl_object_unref (image->texture);
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
if (image->bo)
|
if (image->bo)
|
||||||
gbm_bo_destroy (image->bo);
|
gbm_bo_destroy (image->bo);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_reference_free (MetaCursorReference *self)
|
meta_cursor_reference_free (MetaCursorReference *self)
|
||||||
{
|
{
|
||||||
if (self->xcursor_images)
|
|
||||||
XcursorImagesDestroy (self->xcursor_images);
|
|
||||||
meta_cursor_image_free (&self->image);
|
meta_cursor_image_free (&self->image);
|
||||||
g_slice_free (MetaCursorReference, self);
|
g_slice_free (MetaCursorReference, self);
|
||||||
}
|
}
|
||||||
@@ -137,98 +131,78 @@ meta_cursor_create_x_cursor (Display *xdisplay,
|
|||||||
return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor));
|
return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor));
|
||||||
}
|
}
|
||||||
|
|
||||||
static XcursorImages *
|
static XcursorImage *
|
||||||
load_cursor_on_client (MetaCursor cursor)
|
load_cursor_on_client (MetaCursor cursor)
|
||||||
{
|
{
|
||||||
return XcursorLibraryLoadImages (translate_meta_cursor (cursor),
|
return XcursorLibraryLoadImage (translate_meta_cursor (cursor),
|
||||||
meta_prefs_get_cursor_theme (),
|
meta_prefs_get_cursor_theme (),
|
||||||
meta_prefs_get_cursor_size ());
|
meta_prefs_get_cursor_size ());
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
static void
|
|
||||||
get_hardware_cursor_size (uint64_t *cursor_width, uint64_t *cursor_height)
|
|
||||||
{
|
|
||||||
MetaBackend *meta_backend = meta_get_backend ();
|
|
||||||
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (meta_backend);
|
|
||||||
|
|
||||||
if (META_IS_CURSOR_RENDERER_NATIVE (renderer))
|
|
||||||
{
|
|
||||||
meta_cursor_renderer_native_get_cursor_size (META_CURSOR_RENDERER_NATIVE (renderer), cursor_width, cursor_height);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_image_load_gbm_buffer (struct gbm_device *gbm,
|
meta_cursor_image_load_gbm_buffer (struct gbm_device *gbm,
|
||||||
MetaCursorImage *image,
|
MetaCursorImage *image,
|
||||||
uint8_t *pixels,
|
uint8_t *pixels,
|
||||||
uint width,
|
int width,
|
||||||
uint height,
|
int height,
|
||||||
int rowstride,
|
int rowstride,
|
||||||
uint32_t gbm_format)
|
uint32_t gbm_format)
|
||||||
{
|
{
|
||||||
uint64_t cursor_width, cursor_height;
|
if (width > 64 || height > 64)
|
||||||
get_hardware_cursor_size (&cursor_width, &cursor_height);
|
|
||||||
|
|
||||||
if (width > cursor_width || height > cursor_height)
|
|
||||||
{
|
{
|
||||||
meta_warning ("Invalid theme cursor size (must be at most %ux%u)\n",
|
meta_warning ("Invalid theme cursor size (must be at most 64x64)\n");
|
||||||
(unsigned int)cursor_width, (unsigned int)cursor_height);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gbm_device_is_format_supported (gbm, gbm_format,
|
if (gbm_device_is_format_supported (gbm, gbm_format,
|
||||||
GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE))
|
GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_WRITE))
|
||||||
{
|
{
|
||||||
uint8_t buf[4 * cursor_width * cursor_height];
|
uint8_t buf[4 * 64 * 64];
|
||||||
uint i;
|
int i;
|
||||||
|
|
||||||
image->bo = gbm_bo_create (gbm, cursor_width, cursor_height,
|
image->bo = gbm_bo_create (gbm, 64, 64,
|
||||||
gbm_format, GBM_BO_USE_CURSOR | GBM_BO_USE_WRITE);
|
gbm_format, GBM_BO_USE_CURSOR_64X64 | GBM_BO_USE_WRITE);
|
||||||
|
|
||||||
memset (buf, 0, sizeof(buf));
|
memset (buf, 0, sizeof(buf));
|
||||||
for (i = 0; i < height; i++)
|
for (i = 0; i < height; i++)
|
||||||
memcpy (buf + i * 4 * cursor_width, pixels + i * rowstride, width * 4);
|
memcpy (buf + i * 4 * 64, pixels + i * rowstride, width * 4);
|
||||||
|
|
||||||
gbm_bo_write (image->bo, buf, cursor_width * cursor_height * 4);
|
gbm_bo_write (image->bo, buf, 64 * 64 * 4);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
meta_warning ("HW cursor for format %d not supported\n", gbm_format);
|
meta_warning ("HW cursor for format %d not supported\n", gbm_format);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
static struct gbm_device *
|
static struct gbm_device *
|
||||||
get_gbm_device (void)
|
get_gbm_device (void)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_NATIVE_BACKEND
|
||||||
MetaBackend *meta_backend = meta_get_backend ();
|
MetaBackend *meta_backend = meta_get_backend ();
|
||||||
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (meta_backend);
|
MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (meta_backend);
|
||||||
|
|
||||||
if (META_IS_CURSOR_RENDERER_NATIVE (renderer))
|
if (META_IS_CURSOR_RENDERER_NATIVE (renderer))
|
||||||
return meta_cursor_renderer_native_get_gbm_device (META_CURSOR_RENDERER_NATIVE (renderer));
|
return meta_cursor_renderer_native_get_gbm_device (META_CURSOR_RENDERER_NATIVE (renderer));
|
||||||
else
|
#endif
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_cursor_image_load_from_xcursor_image (MetaCursorImage *image,
|
meta_cursor_image_load_from_xcursor_image (MetaCursorImage *image,
|
||||||
XcursorImage *xc_image)
|
XcursorImage *xc_image)
|
||||||
{
|
{
|
||||||
uint width, height, rowstride;
|
int width, height, rowstride;
|
||||||
CoglPixelFormat cogl_format;
|
CoglPixelFormat cogl_format;
|
||||||
|
uint32_t gbm_format;
|
||||||
ClutterBackend *clutter_backend;
|
ClutterBackend *clutter_backend;
|
||||||
CoglContext *cogl_context;
|
CoglContext *cogl_context;
|
||||||
|
struct gbm_device *gbm;
|
||||||
|
|
||||||
width = xc_image->width;
|
width = xc_image->width;
|
||||||
height = xc_image->height;
|
height = xc_image->height;
|
||||||
rowstride = width * 4;
|
rowstride = width * 4;
|
||||||
|
|
||||||
|
gbm_format = GBM_FORMAT_ARGB8888;
|
||||||
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
|
||||||
cogl_format = COGL_PIXEL_FORMAT_BGRA_8888;
|
cogl_format = COGL_PIXEL_FORMAT_BGRA_8888;
|
||||||
#else
|
#else
|
||||||
@@ -247,85 +221,31 @@ meta_cursor_image_load_from_xcursor_image (MetaCursorImage *image,
|
|||||||
(uint8_t *) xc_image->pixels,
|
(uint8_t *) xc_image->pixels,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
gbm = get_gbm_device ();
|
||||||
struct gbm_device *gbm = get_gbm_device ();
|
|
||||||
if (gbm)
|
if (gbm)
|
||||||
meta_cursor_image_load_gbm_buffer (gbm,
|
meta_cursor_image_load_gbm_buffer (gbm,
|
||||||
image,
|
image,
|
||||||
(uint8_t *) xc_image->pixels,
|
(uint8_t *) xc_image->pixels,
|
||||||
width, height, rowstride,
|
width, height, rowstride,
|
||||||
GBM_FORMAT_ARGB8888);
|
gbm_format);
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static XcursorImage *
|
|
||||||
meta_cursor_reference_get_current_frame_image (MetaCursorReference *self)
|
|
||||||
{
|
|
||||||
return self->xcursor_images->images[self->current_frame];
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_cursor_reference_tick_frame (MetaCursorReference *self)
|
|
||||||
{
|
|
||||||
XcursorImage *image;
|
|
||||||
|
|
||||||
if (!meta_cursor_reference_is_animated (self))
|
|
||||||
return;
|
|
||||||
|
|
||||||
self->current_frame++;
|
|
||||||
|
|
||||||
if (self->current_frame >= self->xcursor_images->nimage)
|
|
||||||
self->current_frame = 0;
|
|
||||||
|
|
||||||
meta_cursor_image_free (&self->image);
|
|
||||||
image = meta_cursor_reference_get_current_frame_image (self);
|
|
||||||
meta_cursor_image_load_from_xcursor_image (&self->image, image);
|
|
||||||
}
|
|
||||||
|
|
||||||
guint
|
|
||||||
meta_cursor_reference_get_current_frame_time (MetaCursorReference *self)
|
|
||||||
{
|
|
||||||
if (!meta_cursor_reference_is_animated (self))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return self->xcursor_images->images[self->current_frame]->delay;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_cursor_reference_is_animated (MetaCursorReference *self)
|
|
||||||
{
|
|
||||||
return (self->xcursor_images &&
|
|
||||||
self->xcursor_images->nimage > 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
load_cursor_image (MetaCursorReference *cursor)
|
|
||||||
{
|
|
||||||
XcursorImage *image;
|
|
||||||
|
|
||||||
/* Either cursors are loaded from X cursors or buffers. Since
|
|
||||||
* buffers are converted over immediately, we can make sure to
|
|
||||||
* load this directly. */
|
|
||||||
g_assert (cursor->cursor != META_CURSOR_NONE);
|
|
||||||
|
|
||||||
if (!cursor->xcursor_images)
|
|
||||||
{
|
|
||||||
cursor->current_frame = 0;
|
|
||||||
cursor->xcursor_images = load_cursor_on_client (cursor->cursor);
|
|
||||||
if (!cursor->xcursor_images)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
image = meta_cursor_reference_get_current_frame_image (cursor);
|
|
||||||
meta_cursor_image_load_from_xcursor_image (&cursor->image, image);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaCursorReference *
|
MetaCursorReference *
|
||||||
meta_cursor_reference_from_theme (MetaCursor cursor)
|
meta_cursor_reference_from_theme (MetaCursor cursor)
|
||||||
{
|
{
|
||||||
MetaCursorReference *self = g_slice_new0 (MetaCursorReference);
|
MetaCursorReference *self;
|
||||||
|
XcursorImage *image;
|
||||||
|
|
||||||
|
image = load_cursor_on_client (cursor);
|
||||||
|
if (!image)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
self = g_slice_new0 (MetaCursorReference);
|
||||||
self->ref_count = 1;
|
self->ref_count = 1;
|
||||||
self->cursor = cursor;
|
self->cursor = cursor;
|
||||||
|
meta_cursor_image_load_from_xcursor_image (&self->image, image);
|
||||||
|
|
||||||
|
XcursorImageDestroy (image);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,8 +256,13 @@ meta_cursor_image_load_from_buffer (MetaCursorImage *image,
|
|||||||
int hot_x,
|
int hot_x,
|
||||||
int hot_y)
|
int hot_y)
|
||||||
{
|
{
|
||||||
|
struct gbm_device *gbm = get_gbm_device ();
|
||||||
|
|
||||||
ClutterBackend *backend;
|
ClutterBackend *backend;
|
||||||
CoglContext *cogl_context;
|
CoglContext *cogl_context;
|
||||||
|
struct wl_shm_buffer *shm_buffer;
|
||||||
|
uint32_t gbm_format;
|
||||||
|
int width, height;
|
||||||
|
|
||||||
image->hot_x = hot_x;
|
image->hot_x = hot_x;
|
||||||
image->hot_y = hot_y;
|
image->hot_y = hot_y;
|
||||||
@@ -347,24 +272,16 @@ meta_cursor_image_load_from_buffer (MetaCursorImage *image,
|
|||||||
|
|
||||||
image->texture = cogl_wayland_texture_2d_new_from_buffer (cogl_context, buffer, NULL);
|
image->texture = cogl_wayland_texture_2d_new_from_buffer (cogl_context, buffer, NULL);
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
struct gbm_device *gbm = get_gbm_device ();
|
|
||||||
if (gbm)
|
|
||||||
{
|
|
||||||
uint32_t gbm_format;
|
|
||||||
uint64_t cursor_width, cursor_height;
|
|
||||||
uint width, height;
|
|
||||||
|
|
||||||
width = cogl_texture_get_width (COGL_TEXTURE (image->texture));
|
width = cogl_texture_get_width (COGL_TEXTURE (image->texture));
|
||||||
height = cogl_texture_get_height (COGL_TEXTURE (image->texture));
|
height = cogl_texture_get_height (COGL_TEXTURE (image->texture));
|
||||||
|
|
||||||
struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get (buffer);
|
shm_buffer = wl_shm_buffer_get (buffer);
|
||||||
if (shm_buffer)
|
if (shm_buffer)
|
||||||
|
{
|
||||||
|
if (gbm)
|
||||||
{
|
{
|
||||||
int rowstride = wl_shm_buffer_get_stride (shm_buffer);
|
int rowstride = wl_shm_buffer_get_stride (shm_buffer);
|
||||||
|
|
||||||
wl_shm_buffer_begin_access (shm_buffer);
|
|
||||||
|
|
||||||
switch (wl_shm_buffer_get_format (shm_buffer))
|
switch (wl_shm_buffer_get_format (shm_buffer))
|
||||||
{
|
{
|
||||||
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
#if G_BYTE_ORDER == G_BIG_ENDIAN
|
||||||
@@ -392,31 +309,30 @@ meta_cursor_image_load_from_buffer (MetaCursorImage *image,
|
|||||||
(uint8_t *) wl_shm_buffer_get_data (shm_buffer),
|
(uint8_t *) wl_shm_buffer_get_data (shm_buffer),
|
||||||
width, height, rowstride,
|
width, height, rowstride,
|
||||||
gbm_format);
|
gbm_format);
|
||||||
|
}
|
||||||
wl_shm_buffer_end_access (shm_buffer);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* HW cursors have a predefined size (at least 64x64), which usually is bigger than cursor theme
|
/* HW cursors must be 64x64, but 64x64 is huge, and no cursor theme actually uses
|
||||||
size, so themed cursors must be padded with transparent pixels to fill the
|
that, so themed cursors must be padded with transparent pixels to fill the
|
||||||
overlay. This is trivial if we have CPU access to the data, but it's not
|
overlay. This is trivial if we have CPU access to the data, but it's not
|
||||||
possible if the buffer is in GPU memory (and possibly tiled too), so if we
|
possible if the buffer is in GPU memory (and possibly tiled too), so if we
|
||||||
don't get the right size, we fallback to GL.
|
don't get the right size, we fallback to GL.
|
||||||
*/
|
*/
|
||||||
get_hardware_cursor_size (&cursor_width, &cursor_height);
|
if (width != 64 || height != 64)
|
||||||
|
|
||||||
if (width != cursor_width || height != cursor_height)
|
|
||||||
{
|
{
|
||||||
meta_warning ("Invalid cursor size (must be 64x64), falling back to software (GL) cursors\n");
|
meta_warning ("Invalid cursor size (must be 64x64), falling back to software (GL) cursors\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
image->bo = gbm_bo_import (gbm, GBM_BO_IMPORT_WL_BUFFER, buffer, GBM_BO_USE_CURSOR);
|
if (gbm)
|
||||||
|
{
|
||||||
|
image->bo = gbm_bo_import (gbm, GBM_BO_IMPORT_WL_BUFFER,
|
||||||
|
buffer, GBM_BO_USE_CURSOR_64X64);
|
||||||
if (!image->bo)
|
if (!image->bo)
|
||||||
meta_warning ("Importing HW cursor from wl_buffer failed\n");
|
meta_warning ("Importing HW cursor from wl_buffer failed\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaCursorReference *
|
MetaCursorReference *
|
||||||
@@ -436,36 +352,27 @@ meta_cursor_reference_from_buffer (struct wl_resource *buffer,
|
|||||||
|
|
||||||
CoglTexture *
|
CoglTexture *
|
||||||
meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
meta_cursor_reference_get_cogl_texture (MetaCursorReference *cursor,
|
||||||
int *hot_x,
|
int *offset_x,
|
||||||
int *hot_y)
|
int *offset_y)
|
||||||
{
|
{
|
||||||
if (!cursor->image.texture)
|
if (offset_x)
|
||||||
load_cursor_image (cursor);
|
*offset_x = cursor->image.offset_x;
|
||||||
|
if (offset_y)
|
||||||
if (hot_x)
|
*offset_y = cursor->image.offset_y;
|
||||||
*hot_x = cursor->image.hot_x;
|
|
||||||
if (hot_y)
|
|
||||||
*hot_y = cursor->image.hot_y;
|
|
||||||
|
|
||||||
return COGL_TEXTURE (cursor->image.texture);
|
return COGL_TEXTURE (cursor->image.texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
struct gbm_bo *
|
struct gbm_bo *
|
||||||
meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
meta_cursor_reference_get_gbm_bo (MetaCursorReference *cursor,
|
||||||
int *hot_x,
|
int *offset_x,
|
||||||
int *hot_y)
|
int *offset_y)
|
||||||
{
|
{
|
||||||
if (!cursor->image.bo)
|
if (offset_x)
|
||||||
load_cursor_image (cursor);
|
*offset_x = cursor->image.offset_x;
|
||||||
|
if (offset_y)
|
||||||
if (hot_x)
|
*offset_y = cursor->image.offset_y;
|
||||||
*hot_x = cursor->image.hot_x;
|
|
||||||
if (hot_y)
|
|
||||||
*hot_y = cursor->image.hot_y;
|
|
||||||
return cursor->image.bo;
|
return cursor->image.bo;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
MetaCursor
|
MetaCursor
|
||||||
meta_cursor_reference_get_meta_cursor (MetaCursorReference *cursor)
|
meta_cursor_reference_get_meta_cursor (MetaCursorReference *cursor)
|
||||||
|
|||||||
@@ -34,8 +34,7 @@ MetaCursorReference * meta_cursor_reference_from_theme (MetaCursor cur
|
|||||||
#ifdef HAVE_WAYLAND
|
#ifdef HAVE_WAYLAND
|
||||||
#include <wayland-server.h>
|
#include <wayland-server.h>
|
||||||
MetaCursorReference * meta_cursor_reference_from_buffer (struct wl_resource *buffer,
|
MetaCursorReference * meta_cursor_reference_from_buffer (struct wl_resource *buffer,
|
||||||
int hot_x,
|
int offset_x, int offset_y);
|
||||||
int hot_y);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MetaCursor meta_cursor_reference_get_meta_cursor (MetaCursorReference *cursor);
|
MetaCursor meta_cursor_reference_get_meta_cursor (MetaCursorReference *cursor);
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2014 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef META_INPUT_SETTINGS_PRIVATE_H
|
|
||||||
#define META_INPUT_SETTINGS_PRIVATE_H
|
|
||||||
|
|
||||||
#include "display-private.h"
|
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
|
||||||
|
|
||||||
#define META_TYPE_INPUT_SETTINGS (meta_input_settings_get_type ())
|
|
||||||
#define META_INPUT_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_INPUT_SETTINGS, MetaInputSettings))
|
|
||||||
#define META_INPUT_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_INPUT_SETTINGS, MetaInputSettingsClass))
|
|
||||||
#define META_IS_INPUT_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_INPUT_SETTINGS))
|
|
||||||
#define META_IS_INPUT_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_INPUT_SETTINGS))
|
|
||||||
#define META_INPUT_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_INPUT_SETTINGS, MetaInputSettingsClass))
|
|
||||||
|
|
||||||
typedef struct _MetaInputSettings MetaInputSettings;
|
|
||||||
typedef struct _MetaInputSettingsClass MetaInputSettingsClass;
|
|
||||||
|
|
||||||
struct _MetaInputSettings
|
|
||||||
{
|
|
||||||
GObject parent_instance;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaInputSettingsClass
|
|
||||||
{
|
|
||||||
GObjectClass parent_class;
|
|
||||||
|
|
||||||
void (* set_send_events) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
GDesktopDeviceSendEvents mode);
|
|
||||||
void (* set_matrix) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gfloat matrix[6]);
|
|
||||||
void (* set_speed) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gdouble speed);
|
|
||||||
void (* set_left_handed) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean enabled);
|
|
||||||
void (* set_tap_enabled) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean enabled);
|
|
||||||
void (* set_invert_scroll) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean inverted);
|
|
||||||
void (* set_scroll_method) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
GDesktopTouchpadScrollMethod mode);
|
|
||||||
void (* set_scroll_button) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
guint button);
|
|
||||||
|
|
||||||
void (* set_click_method) (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
GDesktopTouchpadClickMethod mode);
|
|
||||||
|
|
||||||
void (* set_keyboard_repeat) (MetaInputSettings *settings,
|
|
||||||
gboolean repeat,
|
|
||||||
guint delay,
|
|
||||||
guint interval);
|
|
||||||
};
|
|
||||||
|
|
||||||
GType meta_input_settings_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
MetaInputSettings * meta_input_settings_create (void);
|
|
||||||
|
|
||||||
#endif /* META_INPUT_SETTINGS_PRIVATE_H */
|
|
||||||
@@ -1,895 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2014 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SECTION:input-settings
|
|
||||||
* @title: MetaInputSettings
|
|
||||||
* @short_description: Mutter input device configuration
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "meta-backend-private.h"
|
|
||||||
#include "meta-input-settings-private.h"
|
|
||||||
#include "x11/meta-input-settings-x11.h"
|
|
||||||
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
#include "native/meta-backend-native.h"
|
|
||||||
#include "native/meta-input-settings-native.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <meta/util.h>
|
|
||||||
|
|
||||||
typedef struct _MetaInputSettingsPrivate MetaInputSettingsPrivate;
|
|
||||||
typedef struct _DeviceMappingInfo DeviceMappingInfo;
|
|
||||||
|
|
||||||
struct _DeviceMappingInfo
|
|
||||||
{
|
|
||||||
MetaInputSettings *input_settings;
|
|
||||||
ClutterInputDevice *device;
|
|
||||||
GSettings *settings;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaInputSettingsPrivate
|
|
||||||
{
|
|
||||||
ClutterDeviceManager *device_manager;
|
|
||||||
MetaMonitorManager *monitor_manager;
|
|
||||||
guint monitors_changed_id;
|
|
||||||
|
|
||||||
GSettings *mouse_settings;
|
|
||||||
GSettings *touchpad_settings;
|
|
||||||
GSettings *trackball_settings;
|
|
||||||
GSettings *keyboard_settings;
|
|
||||||
|
|
||||||
GHashTable *mappable_devices;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef void (*ConfigBoolFunc) (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean setting);
|
|
||||||
typedef void (*ConfigDoubleFunc) (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gdouble value);
|
|
||||||
typedef void (*ConfigUintFunc) (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
guint value);
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettings, meta_input_settings, G_TYPE_OBJECT)
|
|
||||||
|
|
||||||
static GSList *
|
|
||||||
meta_input_settings_get_devices (MetaInputSettings *settings,
|
|
||||||
ClutterInputDeviceType type)
|
|
||||||
{
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
const GSList *devices;
|
|
||||||
GSList *list = NULL;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (settings);
|
|
||||||
devices = clutter_device_manager_peek_devices (priv->device_manager);
|
|
||||||
|
|
||||||
while (devices)
|
|
||||||
{
|
|
||||||
ClutterInputDevice *device = devices->data;
|
|
||||||
|
|
||||||
if (clutter_input_device_get_device_type (device) == type &&
|
|
||||||
clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER)
|
|
||||||
list = g_slist_prepend (list, device);
|
|
||||||
|
|
||||||
devices = devices->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
MetaInputSettings *settings = META_INPUT_SETTINGS (object);
|
|
||||||
MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (settings);
|
|
||||||
|
|
||||||
g_clear_object (&priv->mouse_settings);
|
|
||||||
g_clear_object (&priv->touchpad_settings);
|
|
||||||
g_clear_object (&priv->trackball_settings);
|
|
||||||
g_clear_object (&priv->keyboard_settings);
|
|
||||||
g_clear_pointer (&priv->mappable_devices, g_hash_table_unref);
|
|
||||||
|
|
||||||
if (priv->monitors_changed_id && priv->monitor_manager)
|
|
||||||
{
|
|
||||||
g_signal_handler_disconnect (priv->monitor_manager,
|
|
||||||
priv->monitors_changed_id);
|
|
||||||
priv->monitors_changed_id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_clear_object (&priv->monitor_manager);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_input_settings_parent_class)->dispose (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
settings_device_set_bool_setting (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
ConfigBoolFunc func,
|
|
||||||
gboolean enabled)
|
|
||||||
{
|
|
||||||
func (input_settings, device, enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
settings_set_bool_setting (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDeviceType type,
|
|
||||||
ConfigBoolFunc func,
|
|
||||||
gboolean enabled)
|
|
||||||
{
|
|
||||||
GSList *devices, *d;
|
|
||||||
|
|
||||||
devices = meta_input_settings_get_devices (input_settings, type);
|
|
||||||
|
|
||||||
for (d = devices; d; d = d->next)
|
|
||||||
settings_device_set_bool_setting (input_settings, d->data, func, enabled);
|
|
||||||
|
|
||||||
g_slist_free (devices);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
settings_device_set_double_setting (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
ConfigDoubleFunc func,
|
|
||||||
gdouble value)
|
|
||||||
{
|
|
||||||
func (input_settings, device, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
settings_set_double_setting (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDeviceType type,
|
|
||||||
ConfigDoubleFunc func,
|
|
||||||
gdouble value)
|
|
||||||
{
|
|
||||||
GSList *devices, *d;
|
|
||||||
|
|
||||||
devices = meta_input_settings_get_devices (input_settings, type);
|
|
||||||
|
|
||||||
for (d = devices; d; d = d->next)
|
|
||||||
settings_device_set_double_setting (input_settings, d->data, func, value);
|
|
||||||
|
|
||||||
g_slist_free (devices);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
settings_device_set_uint_setting (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
ConfigUintFunc func,
|
|
||||||
guint value)
|
|
||||||
{
|
|
||||||
(func) (input_settings, device, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
settings_set_uint_setting (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDeviceType type,
|
|
||||||
ConfigUintFunc func,
|
|
||||||
guint value)
|
|
||||||
{
|
|
||||||
GSList *devices, *d;
|
|
||||||
|
|
||||||
devices = meta_input_settings_get_devices (input_settings, type);
|
|
||||||
|
|
||||||
for (d = devices; d; d = d->next)
|
|
||||||
settings_device_set_uint_setting (input_settings, d->data, func, value);
|
|
||||||
|
|
||||||
g_slist_free (devices);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_touchpad_left_handed (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class;
|
|
||||||
GDesktopTouchpadHandedness handedness;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
gboolean enabled = FALSE;
|
|
||||||
|
|
||||||
if (device &&
|
|
||||||
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
|
||||||
handedness = g_settings_get_enum (priv->touchpad_settings, "left-handed");
|
|
||||||
|
|
||||||
switch (handedness)
|
|
||||||
{
|
|
||||||
case G_DESKTOP_TOUCHPAD_HANDEDNESS_RIGHT:
|
|
||||||
enabled = FALSE;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_HANDEDNESS_LEFT:
|
|
||||||
enabled = TRUE;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_HANDEDNESS_MOUSE:
|
|
||||||
enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (device)
|
|
||||||
{
|
|
||||||
settings_device_set_bool_setting (input_settings, device,
|
|
||||||
input_settings_class->set_left_handed,
|
|
||||||
enabled);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
|
|
||||||
input_settings_class->set_left_handed,
|
|
||||||
enabled);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_mouse_left_handed (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
gboolean enabled;
|
|
||||||
|
|
||||||
if (device &&
|
|
||||||
clutter_input_device_get_device_type (device) != CLUTTER_POINTER_DEVICE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
|
||||||
enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed");
|
|
||||||
|
|
||||||
if (device)
|
|
||||||
{
|
|
||||||
settings_device_set_bool_setting (input_settings, device,
|
|
||||||
input_settings_class->set_left_handed,
|
|
||||||
enabled);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GDesktopTouchpadHandedness touchpad_handedness;
|
|
||||||
|
|
||||||
settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE,
|
|
||||||
input_settings_class->set_left_handed,
|
|
||||||
enabled);
|
|
||||||
|
|
||||||
touchpad_handedness = g_settings_get_enum (priv->touchpad_settings,
|
|
||||||
"left-handed");
|
|
||||||
|
|
||||||
/* Also update touchpads if they're following mouse settings */
|
|
||||||
if (touchpad_handedness == G_DESKTOP_TOUCHPAD_HANDEDNESS_MOUSE)
|
|
||||||
update_touchpad_left_handed (input_settings, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static GSettings *
|
|
||||||
get_settings_for_device_type (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDeviceType type)
|
|
||||||
{
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case CLUTTER_POINTER_DEVICE:
|
|
||||||
return priv->mouse_settings;
|
|
||||||
case CLUTTER_TOUCHPAD_DEVICE:
|
|
||||||
return priv->touchpad_settings;
|
|
||||||
default:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_device_speed (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
GSettings *settings;
|
|
||||||
ConfigDoubleFunc func;
|
|
||||||
const gchar *key = "speed";
|
|
||||||
|
|
||||||
func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_speed;
|
|
||||||
|
|
||||||
if (device)
|
|
||||||
{
|
|
||||||
settings = get_settings_for_device_type (input_settings,
|
|
||||||
clutter_input_device_get_device_type (device));
|
|
||||||
if (!settings)
|
|
||||||
return;
|
|
||||||
|
|
||||||
settings_device_set_double_setting (input_settings, device, func,
|
|
||||||
g_settings_get_double (settings, key));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE);
|
|
||||||
settings_set_double_setting (input_settings, CLUTTER_POINTER_DEVICE, func,
|
|
||||||
g_settings_get_double (settings, key));
|
|
||||||
settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE);
|
|
||||||
settings_set_double_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func,
|
|
||||||
g_settings_get_double (settings, key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_device_natural_scroll (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
GSettings *settings;
|
|
||||||
ConfigBoolFunc func;
|
|
||||||
const gchar *key = "natural-scroll";
|
|
||||||
|
|
||||||
func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_invert_scroll;
|
|
||||||
|
|
||||||
if (device)
|
|
||||||
{
|
|
||||||
settings = get_settings_for_device_type (input_settings,
|
|
||||||
clutter_input_device_get_device_type (device));
|
|
||||||
if (!settings)
|
|
||||||
return;
|
|
||||||
|
|
||||||
settings_device_set_bool_setting (input_settings, device, func,
|
|
||||||
g_settings_get_boolean (settings, key));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE);
|
|
||||||
settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE, func,
|
|
||||||
g_settings_get_boolean (settings, key));
|
|
||||||
settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE);
|
|
||||||
settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func,
|
|
||||||
g_settings_get_boolean (settings, key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_touchpad_tap_enabled (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
gboolean enabled;
|
|
||||||
|
|
||||||
if (device &&
|
|
||||||
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
|
||||||
enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-to-click");
|
|
||||||
|
|
||||||
if (device)
|
|
||||||
{
|
|
||||||
settings_device_set_bool_setting (input_settings, device,
|
|
||||||
input_settings_class->set_tap_enabled,
|
|
||||||
enabled);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
|
|
||||||
input_settings_class->set_tap_enabled,
|
|
||||||
enabled);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_touchpad_scroll_method (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class;
|
|
||||||
GDesktopTouchpadScrollMethod method;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
|
|
||||||
if (device &&
|
|
||||||
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
|
||||||
method = g_settings_get_enum (priv->touchpad_settings, "scroll-method");
|
|
||||||
|
|
||||||
if (device)
|
|
||||||
{
|
|
||||||
settings_device_set_uint_setting (input_settings, device,
|
|
||||||
input_settings_class->set_scroll_method,
|
|
||||||
method);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
|
|
||||||
(ConfigUintFunc) input_settings_class->set_scroll_method,
|
|
||||||
method);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_touchpad_click_method (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class;
|
|
||||||
GDesktopTouchpadScrollMethod method;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
|
|
||||||
if (device &&
|
|
||||||
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
|
||||||
method = g_settings_get_enum (priv->touchpad_settings, "click-method");
|
|
||||||
|
|
||||||
if (device)
|
|
||||||
{
|
|
||||||
settings_device_set_uint_setting (input_settings, device,
|
|
||||||
input_settings_class->set_click_method,
|
|
||||||
method);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
|
|
||||||
(ConfigUintFunc) input_settings_class->set_click_method,
|
|
||||||
method);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_touchpad_send_events (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
GDesktopDeviceSendEvents mode;
|
|
||||||
|
|
||||||
if (device &&
|
|
||||||
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
|
||||||
mode = g_settings_get_enum (priv->touchpad_settings, "send-events");
|
|
||||||
|
|
||||||
if (device)
|
|
||||||
{
|
|
||||||
settings_device_set_uint_setting (input_settings, device,
|
|
||||||
input_settings_class->set_send_events,
|
|
||||||
mode);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
|
|
||||||
input_settings_class->set_send_events,
|
|
||||||
mode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
device_is_trackball (ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
gboolean is_trackball;
|
|
||||||
char *name;
|
|
||||||
|
|
||||||
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
name = g_ascii_strdown (clutter_input_device_get_device_name (device), -1);
|
|
||||||
is_trackball = strstr (name, "trackball") != NULL;
|
|
||||||
g_free (name);
|
|
||||||
|
|
||||||
return is_trackball;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_trackball_scroll_button (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
guint button;
|
|
||||||
|
|
||||||
if (device && !device_is_trackball (device))
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
|
||||||
/* This key is 'i' in the schema but it also specifies a minimum
|
|
||||||
* range of 0 so the cast here is safe. */
|
|
||||||
button = (guint) g_settings_get_int (priv->trackball_settings, "scroll-wheel-emulation-button");
|
|
||||||
|
|
||||||
if (device)
|
|
||||||
{
|
|
||||||
input_settings_class->set_scroll_button (input_settings, device, button);
|
|
||||||
}
|
|
||||||
else if (!device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
const GSList *devices;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
devices = clutter_device_manager_peek_devices (priv->device_manager);
|
|
||||||
|
|
||||||
while (devices)
|
|
||||||
{
|
|
||||||
ClutterInputDevice *device = devices->data;
|
|
||||||
|
|
||||||
if (device_is_trackball (device))
|
|
||||||
input_settings_class->set_scroll_button (input_settings, device, button);
|
|
||||||
|
|
||||||
devices = devices->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_keyboard_repeat (MetaInputSettings *input_settings)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
guint delay, interval;
|
|
||||||
gboolean repeat;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
repeat = g_settings_get_boolean (priv->keyboard_settings, "repeat");
|
|
||||||
delay = g_settings_get_uint (priv->keyboard_settings, "delay");
|
|
||||||
interval = g_settings_get_uint (priv->keyboard_settings, "repeat-interval");
|
|
||||||
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
|
||||||
input_settings_class->set_keyboard_repeat (input_settings,
|
|
||||||
repeat, delay, interval);
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaOutput *
|
|
||||||
meta_input_settings_find_output (MetaInputSettings *input_settings,
|
|
||||||
GSettings *settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
guint n_values, n_outputs, i;
|
|
||||||
MetaOutput *outputs;
|
|
||||||
gchar **edid;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
edid = g_settings_get_strv (settings, "display");
|
|
||||||
n_values = g_strv_length (edid);
|
|
||||||
|
|
||||||
if (n_values != 3)
|
|
||||||
{
|
|
||||||
g_warning ("EDID configuration for device '%s' "
|
|
||||||
"is incorrect, must have 3 values",
|
|
||||||
clutter_input_device_get_device_name (device));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!*edid[0] && !*edid[1] && !*edid[2])
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
outputs = meta_monitor_manager_get_outputs (priv->monitor_manager,
|
|
||||||
&n_outputs);
|
|
||||||
for (i = 0; i < n_outputs; i++)
|
|
||||||
{
|
|
||||||
if (g_strcmp0 (outputs[i].vendor, edid[0]) == 0 &&
|
|
||||||
g_strcmp0 (outputs[i].product, edid[1]) == 0 &&
|
|
||||||
g_strcmp0 (outputs[i].serial, edid[2]) == 0)
|
|
||||||
return &outputs[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_device_display (MetaInputSettings *input_settings,
|
|
||||||
GSettings *settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class;
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
gfloat matrix[6] = { 1, 0, 0, 0, 1, 0 };
|
|
||||||
MetaOutput *output;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
|
||||||
output = meta_input_settings_find_output (input_settings, settings, device);
|
|
||||||
|
|
||||||
if (output)
|
|
||||||
meta_monitor_manager_get_monitor_matrix (priv->monitor_manager,
|
|
||||||
output, matrix);
|
|
||||||
|
|
||||||
input_settings_class->set_matrix (input_settings, device, matrix);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_changed_cb (GSettings *settings,
|
|
||||||
const char *key,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaInputSettings *input_settings = META_INPUT_SETTINGS (user_data);
|
|
||||||
MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
|
|
||||||
if (settings == priv->mouse_settings)
|
|
||||||
{
|
|
||||||
if (strcmp (key, "left-handed") == 0)
|
|
||||||
update_mouse_left_handed (input_settings, NULL);
|
|
||||||
else if (strcmp (key, "speed") == 0)
|
|
||||||
update_device_speed (input_settings, NULL);
|
|
||||||
else if (strcmp (key, "natural-scroll") == 0)
|
|
||||||
update_device_natural_scroll (input_settings, NULL);
|
|
||||||
}
|
|
||||||
else if (settings == priv->touchpad_settings)
|
|
||||||
{
|
|
||||||
if (strcmp (key, "left-handed") == 0)
|
|
||||||
update_touchpad_left_handed (input_settings, NULL);
|
|
||||||
else if (strcmp (key, "speed") == 0)
|
|
||||||
update_device_speed (input_settings, NULL);
|
|
||||||
else if (strcmp (key, "natural-scroll") == 0)
|
|
||||||
update_device_natural_scroll (input_settings, NULL);
|
|
||||||
else if (strcmp (key, "tap-to-click") == 0)
|
|
||||||
update_touchpad_tap_enabled (input_settings, NULL);
|
|
||||||
else if (strcmp (key, "send-events") == 0)
|
|
||||||
update_touchpad_send_events (input_settings, NULL);
|
|
||||||
else if (strcmp (key, "scroll-method") == 0)
|
|
||||||
update_touchpad_scroll_method (input_settings, NULL);
|
|
||||||
else if (strcmp (key, "click-method") == 0)
|
|
||||||
update_touchpad_click_method (input_settings, NULL);
|
|
||||||
}
|
|
||||||
else if (settings == priv->trackball_settings)
|
|
||||||
{
|
|
||||||
if (strcmp (key, "scroll-wheel-emulation-button") == 0)
|
|
||||||
update_trackball_scroll_button (input_settings, NULL);
|
|
||||||
}
|
|
||||||
else if (settings == priv->keyboard_settings)
|
|
||||||
{
|
|
||||||
if (strcmp (key, "repeat") == 0 ||
|
|
||||||
strcmp (key, "repeat-interval") == 0 ||
|
|
||||||
strcmp (key, "delay") == 0)
|
|
||||||
update_keyboard_repeat (input_settings);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
mapped_device_changed_cb (GSettings *settings,
|
|
||||||
const gchar *key,
|
|
||||||
DeviceMappingInfo *info)
|
|
||||||
{
|
|
||||||
if (strcmp (key, "display") == 0)
|
|
||||||
update_device_display (info->input_settings, settings, info->device);
|
|
||||||
}
|
|
||||||
|
|
||||||
static GSettings *
|
|
||||||
lookup_device_settings (ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
const gchar *group, *schema, *vendor, *product;
|
|
||||||
ClutterInputDeviceType type;
|
|
||||||
GSettings *settings;
|
|
||||||
gchar *path;
|
|
||||||
|
|
||||||
type = clutter_input_device_get_device_type (device);
|
|
||||||
|
|
||||||
if (type == CLUTTER_TOUCHSCREEN_DEVICE)
|
|
||||||
{
|
|
||||||
group = "touchscreens";
|
|
||||||
schema = "org.gnome.desktop.peripherals.touchscreen";
|
|
||||||
}
|
|
||||||
else if (type == CLUTTER_TABLET_DEVICE ||
|
|
||||||
type == CLUTTER_PEN_DEVICE ||
|
|
||||||
type == CLUTTER_ERASER_DEVICE ||
|
|
||||||
type == CLUTTER_CURSOR_DEVICE)
|
|
||||||
{
|
|
||||||
group = "tablets";
|
|
||||||
schema = "org.gnome.desktop.peripherals.tablet";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
vendor = clutter_input_device_get_vendor_id (device);
|
|
||||||
product = clutter_input_device_get_product_id (device);
|
|
||||||
path = g_strdup_printf ("/org/gnome/desktop/peripherals/%s/%s:%s/",
|
|
||||||
group, vendor, product);
|
|
||||||
|
|
||||||
settings = g_settings_new_with_path (schema, path);
|
|
||||||
g_free (path);
|
|
||||||
|
|
||||||
return settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
monitors_changed_cb (MetaMonitorManager *monitor_manager,
|
|
||||||
MetaInputSettings *input_settings)
|
|
||||||
{
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
ClutterInputDevice *device;
|
|
||||||
GSettings *settings;
|
|
||||||
GHashTableIter iter;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
g_hash_table_iter_init (&iter, priv->mappable_devices);
|
|
||||||
|
|
||||||
while (g_hash_table_iter_next (&iter, (gpointer *) &device,
|
|
||||||
(gpointer *) &settings))
|
|
||||||
update_device_display (input_settings, settings, device);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
check_add_mappable_device (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
DeviceMappingInfo *info;
|
|
||||||
GSettings *settings;
|
|
||||||
|
|
||||||
settings = lookup_device_settings (device);
|
|
||||||
|
|
||||||
if (!settings)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
|
|
||||||
info = g_new0 (DeviceMappingInfo, 1);
|
|
||||||
info->input_settings = input_settings;
|
|
||||||
info->device = device;
|
|
||||||
info->settings = settings;
|
|
||||||
|
|
||||||
g_signal_connect_data (settings, "changed",
|
|
||||||
G_CALLBACK (mapped_device_changed_cb),
|
|
||||||
info, (GClosureNotify) g_free, 0);
|
|
||||||
|
|
||||||
g_hash_table_insert (priv->mappable_devices, device, settings);
|
|
||||||
|
|
||||||
update_device_display (input_settings, settings, device);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
apply_device_settings (MetaInputSettings *input_settings,
|
|
||||||
ClutterInputDevice *device)
|
|
||||||
{
|
|
||||||
update_mouse_left_handed (input_settings, device);
|
|
||||||
update_device_speed (input_settings, device);
|
|
||||||
update_device_natural_scroll (input_settings, device);
|
|
||||||
|
|
||||||
update_touchpad_left_handed (input_settings, device);
|
|
||||||
update_device_speed (input_settings, device);
|
|
||||||
update_device_natural_scroll (input_settings, device);
|
|
||||||
update_touchpad_tap_enabled (input_settings, device);
|
|
||||||
update_touchpad_send_events (input_settings, device);
|
|
||||||
update_touchpad_scroll_method (input_settings, device);
|
|
||||||
update_touchpad_click_method (input_settings, device);
|
|
||||||
|
|
||||||
update_trackball_scroll_button (input_settings, device);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_device_added (ClutterDeviceManager *device_manager,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
MetaInputSettings *input_settings)
|
|
||||||
{
|
|
||||||
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
|
||||||
return;
|
|
||||||
|
|
||||||
apply_device_settings (input_settings, device);
|
|
||||||
check_add_mappable_device (input_settings, device);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_device_removed (ClutterDeviceManager *device_manager,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
MetaInputSettings *input_settings)
|
|
||||||
{
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
g_hash_table_remove (priv->mappable_devices, device);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
check_mappable_devices (MetaInputSettings *input_settings)
|
|
||||||
{
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
const GSList *devices, *l;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
|
||||||
devices = clutter_device_manager_peek_devices (priv->device_manager);
|
|
||||||
|
|
||||||
for (l = devices; l; l = l->next)
|
|
||||||
{
|
|
||||||
ClutterInputDevice *device = l->data;
|
|
||||||
|
|
||||||
if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
check_add_mappable_device (input_settings, device);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_constructed (GObject *object)
|
|
||||||
{
|
|
||||||
MetaInputSettings *input_settings = META_INPUT_SETTINGS (object);
|
|
||||||
|
|
||||||
apply_device_settings (input_settings, NULL);
|
|
||||||
update_keyboard_repeat (input_settings);
|
|
||||||
check_mappable_devices (input_settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_class_init (MetaInputSettingsClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->dispose = meta_input_settings_dispose;
|
|
||||||
object_class->constructed = meta_input_settings_constructed;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_init (MetaInputSettings *settings)
|
|
||||||
{
|
|
||||||
MetaInputSettingsPrivate *priv;
|
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (settings);
|
|
||||||
priv->device_manager = clutter_device_manager_get_default ();
|
|
||||||
g_signal_connect (priv->device_manager, "device-added",
|
|
||||||
G_CALLBACK (meta_input_settings_device_added), settings);
|
|
||||||
g_signal_connect (priv->device_manager, "device-removed",
|
|
||||||
G_CALLBACK (meta_input_settings_device_removed), settings);
|
|
||||||
|
|
||||||
priv->mouse_settings = g_settings_new ("org.gnome.desktop.peripherals.mouse");
|
|
||||||
g_signal_connect (priv->mouse_settings, "changed",
|
|
||||||
G_CALLBACK (meta_input_settings_changed_cb), settings);
|
|
||||||
|
|
||||||
priv->touchpad_settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad");
|
|
||||||
g_signal_connect (priv->touchpad_settings, "changed",
|
|
||||||
G_CALLBACK (meta_input_settings_changed_cb), settings);
|
|
||||||
|
|
||||||
priv->trackball_settings = g_settings_new ("org.gnome.desktop.peripherals.trackball");
|
|
||||||
g_signal_connect (priv->trackball_settings, "changed",
|
|
||||||
G_CALLBACK (meta_input_settings_changed_cb), settings);
|
|
||||||
|
|
||||||
priv->keyboard_settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard");
|
|
||||||
g_signal_connect (priv->keyboard_settings, "changed",
|
|
||||||
G_CALLBACK (meta_input_settings_changed_cb), settings);
|
|
||||||
|
|
||||||
priv->mappable_devices =
|
|
||||||
g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_object_unref);
|
|
||||||
|
|
||||||
priv->monitor_manager = g_object_ref (meta_monitor_manager_get ());
|
|
||||||
g_signal_connect (priv->monitor_manager, "monitors-changed",
|
|
||||||
G_CALLBACK (monitors_changed_cb), settings);
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaInputSettings *
|
|
||||||
meta_input_settings_create (void)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_NATIVE_BACKEND
|
|
||||||
MetaBackend *backend;
|
|
||||||
|
|
||||||
backend = meta_get_backend ();
|
|
||||||
|
|
||||||
if (META_IS_BACKEND_NATIVE (backend))
|
|
||||||
return g_object_new (META_TYPE_INPUT_SETTINGS_NATIVE, NULL);
|
|
||||||
#endif
|
|
||||||
if (!meta_is_wayland_compositor ())
|
|
||||||
return g_object_new (META_TYPE_INPUT_SETTINGS_X11, NULL);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -23,7 +23,7 @@
|
|||||||
#ifndef META_MONITOR_CONFIG_H
|
#ifndef META_MONITOR_CONFIG_H
|
||||||
#define META_MONITOR_CONFIG_H
|
#define META_MONITOR_CONFIG_H
|
||||||
|
|
||||||
#include "meta-monitor-manager-private.h"
|
#include "meta-monitor-manager.h"
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_CONFIG (meta_monitor_config_get_type ())
|
#define META_TYPE_MONITOR_CONFIG (meta_monitor_config_get_type ())
|
||||||
#define META_MONITOR_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_CONFIG, MetaMonitorConfig))
|
#define META_MONITOR_CONFIG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_CONFIG, MetaMonitorConfig))
|
||||||
@@ -36,6 +36,9 @@ GType meta_monitor_config_get_type (void) G_GNUC_CONST;
|
|||||||
|
|
||||||
MetaMonitorConfig *meta_monitor_config_new (void);
|
MetaMonitorConfig *meta_monitor_config_new (void);
|
||||||
|
|
||||||
|
gboolean meta_monitor_config_match_current (MetaMonitorConfig *config,
|
||||||
|
MetaMonitorManager *manager);
|
||||||
|
|
||||||
gboolean meta_monitor_config_apply_stored (MetaMonitorConfig *config,
|
gboolean meta_monitor_config_apply_stored (MetaMonitorConfig *config,
|
||||||
MetaMonitorManager *manager);
|
MetaMonitorManager *manager);
|
||||||
|
|
||||||
|
|||||||
@@ -27,10 +27,6 @@
|
|||||||
|
|
||||||
#include "meta-monitor-manager-dummy.h"
|
#include "meta-monitor-manager-dummy.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <meta/util.h>
|
|
||||||
|
|
||||||
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
|
||||||
|
|
||||||
struct _MetaMonitorManagerDummy
|
struct _MetaMonitorManagerDummy
|
||||||
@@ -48,69 +44,9 @@ G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy, META_TYPE_MO
|
|||||||
static void
|
static void
|
||||||
meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
unsigned int num_monitors = 1;
|
|
||||||
int *monitor_scales = NULL;
|
|
||||||
const char *num_monitors_str;
|
|
||||||
const char *monitor_scales_str;
|
|
||||||
unsigned int i;
|
|
||||||
int current_x = 0;
|
|
||||||
|
|
||||||
/* To control what monitor configuration is generated, there are two available
|
|
||||||
* environmental variables that can be used:
|
|
||||||
*
|
|
||||||
* MUTTER_DEBUG_NUM_DUMMY_MONITORS
|
|
||||||
*
|
|
||||||
* Specifies the number of dummy monitors to include in the stage. Every
|
|
||||||
* monitor is 1024x786 pixels and they are placed on a horizontal row.
|
|
||||||
*
|
|
||||||
* MUTTER_DEBUG_DUMMY_MONITOR_SCALES
|
|
||||||
*
|
|
||||||
* A comma separated list that specifies the scales of the dummy monitors.
|
|
||||||
*
|
|
||||||
* For example the following configuration results in two monitors, where the
|
|
||||||
* first one has the monitor scale 1, and the other the monitor scale 2.
|
|
||||||
*
|
|
||||||
* MUTTER_DEBUG_NUM_DUMMY_MONITORS=2
|
|
||||||
* MUTTER_DEBUG_DUMMY_MONITOR_SCALES=1,2
|
|
||||||
*/
|
|
||||||
num_monitors_str = getenv ("MUTTER_DEBUG_NUM_DUMMY_MONITORS");
|
|
||||||
if (num_monitors_str)
|
|
||||||
{
|
|
||||||
num_monitors = g_ascii_strtoll (num_monitors_str, NULL, 10);
|
|
||||||
if (num_monitors <= 0)
|
|
||||||
{
|
|
||||||
meta_warning ("Invalid number of dummy monitors");
|
|
||||||
num_monitors = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
monitor_scales = g_newa (int, num_monitors);
|
|
||||||
for (i = 0; i < num_monitors; i++)
|
|
||||||
monitor_scales[i] = 1;
|
|
||||||
|
|
||||||
monitor_scales_str = getenv ("MUTTER_DEBUG_DUMMY_MONITOR_SCALES");
|
|
||||||
if (monitor_scales_str)
|
|
||||||
{
|
|
||||||
gchar **scales_str_list;
|
|
||||||
|
|
||||||
scales_str_list = g_strsplit (monitor_scales_str, ",", -1);
|
|
||||||
if (g_strv_length (scales_str_list) != num_monitors)
|
|
||||||
meta_warning ("Number of specified monitor scales differ from number "
|
|
||||||
"of monitors (defaults to 1).\n");
|
|
||||||
for (i = 0; i < num_monitors && scales_str_list[i]; i++)
|
|
||||||
{
|
|
||||||
int scale = g_ascii_strtoll (scales_str_list[i], NULL, 10);
|
|
||||||
if (scale == 1 || scale == 2)
|
|
||||||
monitor_scales[i] = scale;
|
|
||||||
else
|
|
||||||
meta_warning ("Invalid dummy monitor scale");
|
|
||||||
}
|
|
||||||
g_strfreev (scales_str_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
manager->max_screen_width = 65535;
|
manager->max_screen_width = 65535;
|
||||||
manager->max_screen_height = 65535;
|
manager->max_screen_height = 65535;
|
||||||
manager->screen_width = 1024 * num_monitors;
|
manager->screen_width = 1024;
|
||||||
manager->screen_height = 768;
|
manager->screen_height = 768;
|
||||||
|
|
||||||
manager->modes = g_new0 (MetaMonitorMode, 1);
|
manager->modes = g_new0 (MetaMonitorMode, 1);
|
||||||
@@ -121,52 +57,44 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager)
|
|||||||
manager->modes[0].height = 768;
|
manager->modes[0].height = 768;
|
||||||
manager->modes[0].refresh_rate = 60.0;
|
manager->modes[0].refresh_rate = 60.0;
|
||||||
|
|
||||||
manager->crtcs = g_new0 (MetaCRTC, num_monitors);
|
manager->crtcs = g_new0 (MetaCRTC, 1);
|
||||||
manager->n_crtcs = num_monitors;
|
manager->n_crtcs = 1;
|
||||||
manager->outputs = g_new0 (MetaOutput, num_monitors);
|
|
||||||
manager->n_outputs = num_monitors;
|
|
||||||
|
|
||||||
for (i = 0; i < num_monitors; i++)
|
manager->crtcs[0].crtc_id = 1;
|
||||||
{
|
manager->crtcs[0].rect.x = 0;
|
||||||
manager->crtcs[i].crtc_id = i + 1;
|
manager->crtcs[0].rect.y = 0;
|
||||||
manager->crtcs[i].rect.x = current_x;
|
manager->crtcs[0].rect.width = manager->modes[0].width;
|
||||||
manager->crtcs[i].rect.y = 0;
|
manager->crtcs[0].rect.height = manager->modes[0].height;
|
||||||
manager->crtcs[i].rect.width = manager->modes[0].width;
|
manager->crtcs[0].current_mode = &manager->modes[0];
|
||||||
manager->crtcs[i].rect.height = manager->modes[0].height;
|
manager->crtcs[0].transform = META_MONITOR_TRANSFORM_NORMAL;
|
||||||
manager->crtcs[i].current_mode = &manager->modes[0];
|
manager->crtcs[0].all_transforms = ALL_TRANSFORMS;
|
||||||
manager->crtcs[i].transform = META_MONITOR_TRANSFORM_NORMAL;
|
manager->crtcs[0].is_dirty = FALSE;
|
||||||
manager->crtcs[i].all_transforms = ALL_TRANSFORMS;
|
manager->crtcs[0].logical_monitor = NULL;
|
||||||
manager->crtcs[i].is_dirty = FALSE;
|
|
||||||
manager->crtcs[i].logical_monitor = NULL;
|
|
||||||
|
|
||||||
current_x += manager->crtcs[i].rect.width;
|
manager->outputs = g_new0 (MetaOutput, 1);
|
||||||
|
manager->n_outputs = 1;
|
||||||
|
|
||||||
manager->outputs[i].crtc = &manager->crtcs[i];
|
manager->outputs[0].crtc = &manager->crtcs[0];
|
||||||
manager->outputs[i].winsys_id = i + 1;
|
manager->outputs[0].winsys_id = 1;
|
||||||
manager->outputs[i].name = g_strdup_printf ("LVDS%d", i + 1);
|
manager->outputs[0].name = g_strdup ("LVDS");
|
||||||
manager->outputs[i].vendor = g_strdup ("MetaProducts Inc.");
|
manager->outputs[0].vendor = g_strdup ("MetaProducts Inc.");
|
||||||
manager->outputs[i].product = g_strdup ("unknown");
|
manager->outputs[0].product = g_strdup ("unknown");
|
||||||
manager->outputs[i].serial = g_strdup ("0xC0FFEE");
|
manager->outputs[0].serial = g_strdup ("0xC0FFEE");
|
||||||
manager->outputs[i].suggested_x = -1;
|
manager->outputs[0].width_mm = 222;
|
||||||
manager->outputs[i].suggested_y = -1;
|
manager->outputs[0].height_mm = 125;
|
||||||
manager->outputs[i].width_mm = 222;
|
manager->outputs[0].subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
||||||
manager->outputs[i].height_mm = 125;
|
manager->outputs[0].preferred_mode = &manager->modes[0];
|
||||||
manager->outputs[i].subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN;
|
manager->outputs[0].n_modes = 1;
|
||||||
manager->outputs[i].preferred_mode = &manager->modes[0];
|
manager->outputs[0].modes = g_new0 (MetaMonitorMode *, 1);
|
||||||
manager->outputs[i].n_modes = 1;
|
manager->outputs[0].modes[0] = &manager->modes[0];
|
||||||
manager->outputs[i].modes = g_new0 (MetaMonitorMode *, 1);
|
manager->outputs[0].n_possible_crtcs = 1;
|
||||||
manager->outputs[i].modes[0] = &manager->modes[0];
|
manager->outputs[0].possible_crtcs = g_new0 (MetaCRTC *, 1);
|
||||||
manager->outputs[i].n_possible_crtcs = 1;
|
manager->outputs[0].possible_crtcs[0] = &manager->crtcs[0];
|
||||||
manager->outputs[i].possible_crtcs = g_new0 (MetaCRTC *, 1);
|
manager->outputs[0].n_possible_clones = 0;
|
||||||
manager->outputs[i].possible_crtcs[0] = &manager->crtcs[i];
|
manager->outputs[0].possible_clones = g_new0 (MetaOutput *, 0);
|
||||||
manager->outputs[i].n_possible_clones = 0;
|
manager->outputs[0].backlight = -1;
|
||||||
manager->outputs[i].possible_clones = g_new0 (MetaOutput *, 0);
|
manager->outputs[0].backlight_min = 0;
|
||||||
manager->outputs[i].backlight = -1;
|
manager->outputs[0].backlight_max = 0;
|
||||||
manager->outputs[i].backlight_min = 0;
|
|
||||||
manager->outputs[i].backlight_max = 0;
|
|
||||||
manager->outputs[i].connector_type = META_CONNECTOR_TYPE_LVDS;
|
|
||||||
manager->outputs[i].scale = monitor_scales[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#ifndef META_MONITOR_MANAGER_DUMMY_H
|
#ifndef META_MONITOR_MANAGER_DUMMY_H
|
||||||
#define META_MONITOR_MANAGER_DUMMY_H
|
#define META_MONITOR_MANAGER_DUMMY_H
|
||||||
|
|
||||||
#include "meta-monitor-manager-private.h"
|
#include "meta-monitor-manager.h"
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_MANAGER_DUMMY (meta_monitor_manager_dummy_get_type ())
|
#define META_TYPE_MONITOR_MANAGER_DUMMY (meta_monitor_manager_dummy_get_type ())
|
||||||
#define META_MONITOR_MANAGER_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummy))
|
#define META_MONITOR_MANAGER_DUMMY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummy))
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "meta-monitor-manager-private.h"
|
#include "meta-monitor-manager.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@@ -35,7 +35,6 @@
|
|||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include "util-private.h"
|
#include "util-private.h"
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "edid.h"
|
|
||||||
#include "meta-monitor-config.h"
|
#include "meta-monitor-config.h"
|
||||||
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
#include "backends/x11/meta-monitor-manager-xrandr.h"
|
||||||
#include "meta-backend-private.h"
|
#include "meta-backend-private.h"
|
||||||
@@ -45,16 +44,10 @@ enum {
|
|||||||
SIGNALS_LAST
|
SIGNALS_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Array index matches MetaMonitorTransform */
|
enum {
|
||||||
static gfloat transform_matrices[][6] = {
|
PROP_0,
|
||||||
{ 1, 0, 0, 0, 1, 0 }, /* normal */
|
PROP_POWER_SAVE_MODE,
|
||||||
{ 0, -1, 1, 1, 0, 0 }, /* 90° */
|
PROP_LAST
|
||||||
{ -1, 0, 1, 0, -1, 1 }, /* 180° */
|
|
||||||
{ 0, 1, 0, -1, 0, 1 }, /* 270° */
|
|
||||||
{ -1, 0, 1, 0, 1, 0 }, /* normal flipped */
|
|
||||||
{ 0, 1, 0, 1, 0, 0 }, /* 90° flipped */
|
|
||||||
{ 1, 0, 0, 0, -1, 1 }, /* 180° flipped */
|
|
||||||
{ 0, -1, 1, -1, 0, 1 }, /* 270° flipped */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int signals[SIGNALS_LAST];
|
static int signals[SIGNALS_LAST];
|
||||||
@@ -71,96 +64,12 @@ meta_monitor_manager_init (MetaMonitorManager *manager)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* rules for constructing a tiled monitor
|
|
||||||
* 1. find a tile_group_id
|
|
||||||
* 2. iterate over all outputs for that tile group id
|
|
||||||
* 3. see if output has a crtc and if it is configured for the tile size
|
|
||||||
* 4. calculate the total tile size
|
|
||||||
* 5. set tile finished size
|
|
||||||
* 6. check for more tile_group_id
|
|
||||||
*/
|
|
||||||
static void
|
static void
|
||||||
construct_tile_monitor (MetaMonitorManager *manager,
|
read_current_config (MetaMonitorManager *manager)
|
||||||
GArray *monitor_infos,
|
|
||||||
guint32 tile_group_id)
|
|
||||||
{
|
{
|
||||||
MetaMonitorInfo info;
|
manager->serial++;
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
for (i = 0; i < monitor_infos->len; i++)
|
META_MONITOR_MANAGER_GET_CLASS (manager)->read_current (manager);
|
||||||
{
|
|
||||||
MetaMonitorInfo *pinfo = &g_array_index (monitor_infos, MetaMonitorInfo, i);
|
|
||||||
|
|
||||||
if (pinfo->tile_group_id == tile_group_id)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* didn't find it */
|
|
||||||
info.number = monitor_infos->len;
|
|
||||||
info.tile_group_id = tile_group_id;
|
|
||||||
info.is_presentation = FALSE;
|
|
||||||
info.refresh_rate = 0.0;
|
|
||||||
info.width_mm = 0;
|
|
||||||
info.height_mm = 0;
|
|
||||||
info.is_primary = FALSE;
|
|
||||||
info.rect.x = INT_MAX;
|
|
||||||
info.rect.y = INT_MAX;
|
|
||||||
info.rect.width = 0;
|
|
||||||
info.rect.height = 0;
|
|
||||||
info.winsys_id = 0;
|
|
||||||
info.n_outputs = 0;
|
|
||||||
info.monitor_winsys_xid = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
|
||||||
{
|
|
||||||
MetaOutput *output = &manager->outputs[i];
|
|
||||||
|
|
||||||
if (!output->tile_info.group_id)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (output->tile_info.group_id != tile_group_id)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!output->crtc)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (output->crtc->rect.width != (int)output->tile_info.tile_w ||
|
|
||||||
output->crtc->rect.height != (int)output->tile_info.tile_h)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (output->tile_info.loc_h_tile == 0 && output->tile_info.loc_v_tile == 0)
|
|
||||||
{
|
|
||||||
info.refresh_rate = output->crtc->current_mode->refresh_rate;
|
|
||||||
info.width_mm = output->width_mm;
|
|
||||||
info.height_mm = output->height_mm;
|
|
||||||
info.winsys_id = output->winsys_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* hack */
|
|
||||||
if (output->crtc->rect.x < info.rect.x)
|
|
||||||
info.rect.x = output->crtc->rect.x;
|
|
||||||
if (output->crtc->rect.y < info.rect.y)
|
|
||||||
info.rect.y = output->crtc->rect.y;
|
|
||||||
|
|
||||||
if (output->tile_info.loc_h_tile == 0)
|
|
||||||
info.rect.height += output->tile_info.tile_h;
|
|
||||||
|
|
||||||
if (output->tile_info.loc_v_tile == 0)
|
|
||||||
info.rect.width += output->tile_info.tile_w;
|
|
||||||
|
|
||||||
if (info.n_outputs > META_MAX_OUTPUTS_PER_MONITOR)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
info.outputs[info.n_outputs++] = output;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if we don't have a winsys id, i.e. we haven't found tile 0,0
|
|
||||||
don't try and add this to the monitor infos */
|
|
||||||
if (!info.winsys_id)
|
|
||||||
return;
|
|
||||||
|
|
||||||
g_array_append_val (monitor_infos, info);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -173,7 +82,6 @@ construct_tile_monitor (MetaMonitorManager *manager,
|
|||||||
static void
|
static void
|
||||||
make_logical_config (MetaMonitorManager *manager)
|
make_logical_config (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (manager);
|
|
||||||
GArray *monitor_infos;
|
GArray *monitor_infos;
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
|
|
||||||
@@ -184,15 +92,6 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
for each of them, unless they reference a rectangle that
|
for each of them, unless they reference a rectangle that
|
||||||
is already there.
|
is already there.
|
||||||
*/
|
*/
|
||||||
/* for tiling we need to work out how many tiled outputs there are */
|
|
||||||
for (i = 0; i < manager->n_outputs; i++)
|
|
||||||
{
|
|
||||||
MetaOutput *output = &manager->outputs[i];
|
|
||||||
|
|
||||||
if (output->tile_info.group_id)
|
|
||||||
construct_tile_monitor (manager, monitor_infos, output->tile_info.group_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < manager->n_crtcs; i++)
|
for (i = 0; i < manager->n_crtcs; i++)
|
||||||
{
|
{
|
||||||
MetaCRTC *crtc = &manager->crtcs[i];
|
MetaCRTC *crtc = &manager->crtcs[i];
|
||||||
@@ -204,8 +103,8 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
for (j = 0; j < monitor_infos->len; j++)
|
for (j = 0; j < monitor_infos->len; j++)
|
||||||
{
|
{
|
||||||
MetaMonitorInfo *info = &g_array_index (monitor_infos, MetaMonitorInfo, j);
|
MetaMonitorInfo *info = &g_array_index (monitor_infos, MetaMonitorInfo, j);
|
||||||
if (meta_rectangle_contains_rect (&info->rect,
|
if (meta_rectangle_equal (&crtc->rect,
|
||||||
&crtc->rect))
|
&info->rect))
|
||||||
{
|
{
|
||||||
crtc->logical_monitor = info;
|
crtc->logical_monitor = info;
|
||||||
break;
|
break;
|
||||||
@@ -217,10 +116,7 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
MetaMonitorInfo info;
|
MetaMonitorInfo info;
|
||||||
|
|
||||||
info.number = monitor_infos->len;
|
info.number = monitor_infos->len;
|
||||||
info.tile_group_id = 0;
|
|
||||||
info.rect = crtc->rect;
|
info.rect = crtc->rect;
|
||||||
info.refresh_rate = crtc->current_mode->refresh_rate;
|
|
||||||
info.scale = 1;
|
|
||||||
info.is_primary = FALSE;
|
info.is_primary = FALSE;
|
||||||
/* This starts true because we want
|
/* This starts true because we want
|
||||||
is_presentation only if all outputs are
|
is_presentation only if all outputs are
|
||||||
@@ -230,8 +126,7 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
info.is_presentation = TRUE;
|
info.is_presentation = TRUE;
|
||||||
info.in_fullscreen = -1;
|
info.in_fullscreen = -1;
|
||||||
info.winsys_id = 0;
|
info.winsys_id = 0;
|
||||||
info.n_outputs = 0;
|
|
||||||
info.monitor_winsys_xid = 0;
|
|
||||||
g_array_append_val (monitor_infos, info);
|
g_array_append_val (monitor_infos, info);
|
||||||
|
|
||||||
crtc->logical_monitor = &g_array_index (monitor_infos, MetaMonitorInfo,
|
crtc->logical_monitor = &g_array_index (monitor_infos, MetaMonitorInfo,
|
||||||
@@ -253,9 +148,6 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
if (output->crtc == NULL)
|
if (output->crtc == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (output->tile_info.group_id)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* We must have a logical monitor on every CRTC at this point */
|
/* We must have a logical monitor on every CRTC at this point */
|
||||||
g_assert (output->crtc->logical_monitor != NULL);
|
g_assert (output->crtc->logical_monitor != NULL);
|
||||||
|
|
||||||
@@ -264,17 +156,8 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
info->is_primary = info->is_primary || output->is_primary;
|
info->is_primary = info->is_primary || output->is_primary;
|
||||||
info->is_presentation = info->is_presentation && output->is_presentation;
|
info->is_presentation = info->is_presentation && output->is_presentation;
|
||||||
|
|
||||||
info->width_mm = output->width_mm;
|
|
||||||
info->height_mm = output->height_mm;
|
|
||||||
|
|
||||||
info->outputs[0] = output;
|
|
||||||
info->n_outputs = 1;
|
|
||||||
|
|
||||||
if (output->is_primary || info->winsys_id == 0)
|
if (output->is_primary || info->winsys_id == 0)
|
||||||
{
|
|
||||||
info->scale = output->scale;
|
|
||||||
info->winsys_id = output->winsys_id;
|
info->winsys_id = output->winsys_id;
|
||||||
}
|
|
||||||
|
|
||||||
if (info->is_primary)
|
if (info->is_primary)
|
||||||
manager->primary_monitor_index = info->number;
|
manager->primary_monitor_index = info->number;
|
||||||
@@ -282,35 +165,6 @@ make_logical_config (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
manager->n_monitor_infos = monitor_infos->len;
|
manager->n_monitor_infos = monitor_infos->len;
|
||||||
manager->monitor_infos = (void*)g_array_free (monitor_infos, FALSE);
|
manager->monitor_infos = (void*)g_array_free (monitor_infos, FALSE);
|
||||||
|
|
||||||
if (manager_class->add_monitor)
|
|
||||||
for (i = 0; i < manager->n_monitor_infos; i++)
|
|
||||||
manager_class->add_monitor (manager, &manager->monitor_infos[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
power_save_mode_changed (MetaMonitorManager *manager,
|
|
||||||
GParamSpec *pspec,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaMonitorManagerClass *klass;
|
|
||||||
int mode = meta_dbus_display_config_get_power_save_mode (META_DBUS_DISPLAY_CONFIG (manager));
|
|
||||||
|
|
||||||
if (mode == META_POWER_SAVE_UNSUPPORTED)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* If DPMS is unsupported, force the property back. */
|
|
||||||
if (manager->power_save_mode == META_POWER_SAVE_UNSUPPORTED)
|
|
||||||
{
|
|
||||||
meta_dbus_display_config_set_power_save_mode (META_DBUS_DISPLAY_CONFIG (manager), META_POWER_SAVE_UNSUPPORTED);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
klass = META_MONITOR_MANAGER_GET_CLASS (manager);
|
|
||||||
if (klass->set_power_save_mode)
|
|
||||||
klass->set_power_save_mode (manager, mode);
|
|
||||||
|
|
||||||
manager->power_save_mode = mode;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -318,14 +172,11 @@ meta_monitor_manager_constructed (GObject *object)
|
|||||||
{
|
{
|
||||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
MetaMonitorManager *manager = META_MONITOR_MANAGER (object);
|
||||||
|
|
||||||
g_signal_connect_object (manager, "notify::power-save-mode",
|
|
||||||
G_CALLBACK (power_save_mode_changed), manager, 0);
|
|
||||||
|
|
||||||
manager->in_init = TRUE;
|
manager->in_init = TRUE;
|
||||||
|
|
||||||
manager->config = meta_monitor_config_new ();
|
manager->config = meta_monitor_config_new ();
|
||||||
|
|
||||||
meta_monitor_manager_read_current_config (manager);
|
read_current_config (manager);
|
||||||
|
|
||||||
if (!meta_monitor_config_apply_stored (manager->config, manager))
|
if (!meta_monitor_config_apply_stored (manager->config, manager))
|
||||||
meta_monitor_config_make_default (manager->config, manager);
|
meta_monitor_config_make_default (manager->config, manager);
|
||||||
@@ -338,7 +189,24 @@ meta_monitor_manager_constructed (GObject *object)
|
|||||||
so this is not needed.
|
so this is not needed.
|
||||||
*/
|
*/
|
||||||
if (META_IS_MONITOR_MANAGER_XRANDR (manager))
|
if (META_IS_MONITOR_MANAGER_XRANDR (manager))
|
||||||
meta_monitor_manager_read_current_config (manager);
|
{
|
||||||
|
MetaOutput *old_outputs;
|
||||||
|
MetaCRTC *old_crtcs;
|
||||||
|
MetaMonitorMode *old_modes;
|
||||||
|
unsigned int n_old_outputs, n_old_modes;
|
||||||
|
|
||||||
|
old_outputs = manager->outputs;
|
||||||
|
n_old_outputs = manager->n_outputs;
|
||||||
|
old_modes = manager->modes;
|
||||||
|
n_old_modes = manager->n_modes;
|
||||||
|
old_crtcs = manager->crtcs;
|
||||||
|
|
||||||
|
read_current_config (manager);
|
||||||
|
|
||||||
|
meta_monitor_manager_free_output_array (old_outputs, n_old_outputs);
|
||||||
|
meta_monitor_manager_free_mode_array (old_modes, n_old_modes);
|
||||||
|
g_free (old_crtcs);
|
||||||
|
}
|
||||||
|
|
||||||
make_logical_config (manager);
|
make_logical_config (manager);
|
||||||
initialize_dbus_interface (manager);
|
initialize_dbus_interface (manager);
|
||||||
@@ -347,6 +215,23 @@ meta_monitor_manager_constructed (GObject *object)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
meta_monitor_manager_set_power_save_mode (MetaMonitorManager *manager,
|
||||||
|
MetaPowerSave mode)
|
||||||
|
{
|
||||||
|
MetaMonitorManagerClass *klass;
|
||||||
|
|
||||||
|
if (manager->power_save_mode == META_POWER_SAVE_UNSUPPORTED ||
|
||||||
|
mode == META_POWER_SAVE_UNSUPPORTED)
|
||||||
|
return;
|
||||||
|
|
||||||
|
klass = META_MONITOR_MANAGER_GET_CLASS (manager);
|
||||||
|
if (klass->set_power_save_mode)
|
||||||
|
klass->set_power_save_mode (manager, mode);
|
||||||
|
|
||||||
|
manager->power_save_mode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
|
meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
|
||||||
int n_old_outputs)
|
int n_old_outputs)
|
||||||
{
|
{
|
||||||
@@ -369,7 +254,7 @@ meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
|
|||||||
g_free (old_outputs);
|
g_free (old_outputs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
void
|
||||||
meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
|
meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
|
||||||
int n_old_modes)
|
int n_old_modes)
|
||||||
{
|
{
|
||||||
@@ -386,21 +271,6 @@ meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
|
|||||||
g_free (old_modes);
|
g_free (old_modes);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_monitor_manager_free_crtc_array (MetaCRTC *old_crtcs,
|
|
||||||
int n_old_crtcs)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < n_old_crtcs; i++)
|
|
||||||
{
|
|
||||||
if (old_crtcs[i].driver_notify)
|
|
||||||
old_crtcs[i].driver_notify (&old_crtcs[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (old_crtcs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_finalize (GObject *object)
|
meta_monitor_manager_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
@@ -408,8 +278,8 @@ meta_monitor_manager_finalize (GObject *object)
|
|||||||
|
|
||||||
meta_monitor_manager_free_output_array (manager->outputs, manager->n_outputs);
|
meta_monitor_manager_free_output_array (manager->outputs, manager->n_outputs);
|
||||||
meta_monitor_manager_free_mode_array (manager->modes, manager->n_modes);
|
meta_monitor_manager_free_mode_array (manager->modes, manager->n_modes);
|
||||||
meta_monitor_manager_free_crtc_array (manager->crtcs, manager->n_crtcs);
|
|
||||||
g_free (manager->monitor_infos);
|
g_free (manager->monitor_infos);
|
||||||
|
g_free (manager->crtcs);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@@ -428,6 +298,44 @@ meta_monitor_manager_dispose (GObject *object)
|
|||||||
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->dispose (object);
|
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_manager_set_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
const GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
MetaMonitorManager *self = META_MONITOR_MANAGER (object);
|
||||||
|
|
||||||
|
switch (prop_id)
|
||||||
|
{
|
||||||
|
case PROP_POWER_SAVE_MODE:
|
||||||
|
meta_monitor_manager_set_power_save_mode (self, g_value_get_int (value));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_manager_get_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
MetaMonitorManager *self = META_MONITOR_MANAGER (object);
|
||||||
|
|
||||||
|
switch (prop_id)
|
||||||
|
{
|
||||||
|
case PROP_POWER_SAVE_MODE:
|
||||||
|
g_value_set_int (value, self->power_save_mode);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static GBytes *
|
static GBytes *
|
||||||
meta_monitor_manager_real_read_edid (MetaMonitorManager *manager,
|
meta_monitor_manager_real_read_edid (MetaMonitorManager *manager,
|
||||||
MetaOutput *output)
|
MetaOutput *output)
|
||||||
@@ -448,6 +356,8 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
|
|||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
object_class->constructed = meta_monitor_manager_constructed;
|
object_class->constructed = meta_monitor_manager_constructed;
|
||||||
|
object_class->get_property = meta_monitor_manager_get_property;
|
||||||
|
object_class->set_property = meta_monitor_manager_set_property;
|
||||||
object_class->dispose = meta_monitor_manager_dispose;
|
object_class->dispose = meta_monitor_manager_dispose;
|
||||||
object_class->finalize = meta_monitor_manager_finalize;
|
object_class->finalize = meta_monitor_manager_finalize;
|
||||||
|
|
||||||
@@ -461,6 +371,8 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
|
|||||||
0,
|
0,
|
||||||
NULL, NULL, NULL,
|
NULL, NULL, NULL,
|
||||||
G_TYPE_NONE, 0);
|
G_TYPE_NONE, 0);
|
||||||
|
|
||||||
|
g_object_class_override_property (object_class, PROP_POWER_SAVE_MODE, "power-save-mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
static const double known_diagonals[] = {
|
static const double known_diagonals[] = {
|
||||||
@@ -490,16 +402,15 @@ static char *
|
|||||||
make_display_name (MetaMonitorManager *manager,
|
make_display_name (MetaMonitorManager *manager,
|
||||||
MetaOutput *output)
|
MetaOutput *output)
|
||||||
{
|
{
|
||||||
g_autofree char *inches = NULL;
|
char *inches = NULL;
|
||||||
g_autofree char *vendor_name = NULL;
|
char *vendor_name = NULL;
|
||||||
|
char *ret;
|
||||||
|
|
||||||
switch (output->connector_type)
|
if (g_str_has_prefix (output->name, "LVDS") ||
|
||||||
|
g_str_has_prefix (output->name, "eDP"))
|
||||||
{
|
{
|
||||||
case META_CONNECTOR_TYPE_LVDS:
|
ret = g_strdup (_("Built-in display"));
|
||||||
case META_CONNECTOR_TYPE_eDP:
|
goto out;
|
||||||
return g_strdup (_("Built-in display"));
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (output->width_mm > 0 && output->height_mm > 0)
|
if (output->width_mm > 0 && output->height_mm > 0)
|
||||||
@@ -533,38 +444,18 @@ make_display_name (MetaMonitorManager *manager,
|
|||||||
/* TRANSLATORS: this is a monitor vendor name, followed by a
|
/* TRANSLATORS: this is a monitor vendor name, followed by a
|
||||||
* size in inches, like 'Dell 15"'
|
* size in inches, like 'Dell 15"'
|
||||||
*/
|
*/
|
||||||
return g_strdup_printf (_("%s %s"), vendor_name, inches);
|
ret = g_strdup_printf (_("%s %s"), vendor_name, inches);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return g_strdup (vendor_name);
|
ret = g_strdup (vendor_name);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static const char *
|
out:
|
||||||
get_connector_type_name (MetaConnectorType connector_type)
|
g_free (inches);
|
||||||
{
|
g_free (vendor_name);
|
||||||
switch (connector_type)
|
|
||||||
{
|
return ret;
|
||||||
case META_CONNECTOR_TYPE_Unknown: return "Unknown";
|
|
||||||
case META_CONNECTOR_TYPE_VGA: return "VGA";
|
|
||||||
case META_CONNECTOR_TYPE_DVII: return "DVII";
|
|
||||||
case META_CONNECTOR_TYPE_DVID: return "DVID";
|
|
||||||
case META_CONNECTOR_TYPE_DVIA: return "DVIA";
|
|
||||||
case META_CONNECTOR_TYPE_Composite: return "Composite";
|
|
||||||
case META_CONNECTOR_TYPE_SVIDEO: return "SVIDEO";
|
|
||||||
case META_CONNECTOR_TYPE_LVDS: return "LVDS";
|
|
||||||
case META_CONNECTOR_TYPE_Component: return "Component";
|
|
||||||
case META_CONNECTOR_TYPE_9PinDIN: return "9PinDIN";
|
|
||||||
case META_CONNECTOR_TYPE_DisplayPort: return "DisplayPort";
|
|
||||||
case META_CONNECTOR_TYPE_HDMIA: return "HDMIA";
|
|
||||||
case META_CONNECTOR_TYPE_HDMIB: return "HDMIB";
|
|
||||||
case META_CONNECTOR_TYPE_TV: return "TV";
|
|
||||||
case META_CONNECTOR_TYPE_eDP: return "eDP";
|
|
||||||
case META_CONNECTOR_TYPE_VIRTUAL: return "VIRTUAL";
|
|
||||||
case META_CONNECTOR_TYPE_DSI: return "DSI";
|
|
||||||
default: g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -647,12 +538,6 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
g_variant_new_boolean (output->is_primary));
|
g_variant_new_boolean (output->is_primary));
|
||||||
g_variant_builder_add (&properties, "{sv}", "presentation",
|
g_variant_builder_add (&properties, "{sv}", "presentation",
|
||||||
g_variant_new_boolean (output->is_presentation));
|
g_variant_new_boolean (output->is_presentation));
|
||||||
g_variant_builder_add (&properties, "{sv}", "connector-type",
|
|
||||||
g_variant_new_string (get_connector_type_name (output->connector_type)));
|
|
||||||
g_variant_builder_add (&properties, "{sv}", "underscanning",
|
|
||||||
g_variant_new_boolean (output->is_underscanning));
|
|
||||||
g_variant_builder_add (&properties, "{sv}", "supports-underscanning",
|
|
||||||
g_variant_new_boolean (output->supports_underscanning));
|
|
||||||
|
|
||||||
edid_file = manager_class->get_edid_file (manager, output);
|
edid_file = manager_class->get_edid_file (manager, output);
|
||||||
if (edid_file)
|
if (edid_file)
|
||||||
@@ -673,20 +558,6 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (output->tile_info.group_id)
|
|
||||||
{
|
|
||||||
g_variant_builder_add (&properties, "{sv}", "tile",
|
|
||||||
g_variant_new ("(uuuuuuuu)",
|
|
||||||
output->tile_info.group_id,
|
|
||||||
output->tile_info.flags,
|
|
||||||
output->tile_info.max_h_tiles,
|
|
||||||
output->tile_info.max_v_tiles,
|
|
||||||
output->tile_info.loc_h_tile,
|
|
||||||
output->tile_info.loc_v_tile,
|
|
||||||
output->tile_info.tile_w,
|
|
||||||
output->tile_info.tile_h));
|
|
||||||
}
|
|
||||||
|
|
||||||
g_variant_builder_add (&output_builder, "(uxiausauaua{sv})",
|
g_variant_builder_add (&output_builder, "(uxiausauaua{sv})",
|
||||||
i, /* ID */
|
i, /* ID */
|
||||||
(gint64)output->winsys_id,
|
(gint64)output->winsys_id,
|
||||||
@@ -955,7 +826,7 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
while (g_variant_iter_loop (&output_iter, "(u@a{sv})", &output_index, &properties))
|
while (g_variant_iter_loop (&output_iter, "(u@a{sv})", &output_index, &properties))
|
||||||
{
|
{
|
||||||
MetaOutputInfo *output_info;
|
MetaOutputInfo *output_info;
|
||||||
gboolean primary, presentation, underscanning;
|
gboolean primary, presentation;
|
||||||
|
|
||||||
if (output_index >= manager->n_outputs)
|
if (output_index >= manager->n_outputs)
|
||||||
{
|
{
|
||||||
@@ -974,9 +845,6 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
if (g_variant_lookup (properties, "presentation", "b", &presentation))
|
if (g_variant_lookup (properties, "presentation", "b", &presentation))
|
||||||
output_info->is_presentation = presentation;
|
output_info->is_presentation = presentation;
|
||||||
|
|
||||||
if (g_variant_lookup (properties, "underscanning", "b", &underscanning))
|
|
||||||
output_info->is_underscanning = underscanning;
|
|
||||||
|
|
||||||
g_ptr_array_add (output_infos, output_info);
|
g_ptr_array_add (output_infos, output_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1257,13 +1125,6 @@ initialize_dbus_interface (MetaMonitorManager *manager)
|
|||||||
g_object_unref);
|
g_object_unref);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_monitor_manager_get:
|
|
||||||
*
|
|
||||||
* Accessor for the singleton MetaMonitorManager.
|
|
||||||
*
|
|
||||||
* Returns: (transfer none): The only #MetaMonitorManager there is.
|
|
||||||
*/
|
|
||||||
MetaMonitorManager *
|
MetaMonitorManager *
|
||||||
meta_monitor_manager_get (void)
|
meta_monitor_manager_get (void)
|
||||||
{
|
{
|
||||||
@@ -1338,238 +1199,20 @@ meta_monitor_manager_get_screen_limits (MetaMonitorManager *manager,
|
|||||||
*height = manager->max_screen_height;
|
*height = manager->max_screen_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_monitor_manager_read_current_config (MetaMonitorManager *manager)
|
|
||||||
{
|
|
||||||
MetaOutput *old_outputs;
|
|
||||||
MetaCRTC *old_crtcs;
|
|
||||||
MetaMonitorMode *old_modes;
|
|
||||||
unsigned int n_old_outputs, n_old_crtcs, n_old_modes;
|
|
||||||
|
|
||||||
/* Some implementations of read_current use the existing information
|
|
||||||
* we have available, so don't free the old configuration until after
|
|
||||||
* read_current finishes. */
|
|
||||||
old_outputs = manager->outputs;
|
|
||||||
n_old_outputs = manager->n_outputs;
|
|
||||||
old_crtcs = manager->crtcs;
|
|
||||||
n_old_crtcs = manager->n_crtcs;
|
|
||||||
old_modes = manager->modes;
|
|
||||||
n_old_modes = manager->n_modes;
|
|
||||||
|
|
||||||
manager->serial++;
|
|
||||||
META_MONITOR_MANAGER_GET_CLASS (manager)->read_current (manager);
|
|
||||||
|
|
||||||
meta_monitor_manager_free_output_array (old_outputs, n_old_outputs);
|
|
||||||
meta_monitor_manager_free_mode_array (old_modes, n_old_modes);
|
|
||||||
meta_monitor_manager_free_crtc_array (old_crtcs, n_old_crtcs);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager)
|
meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (manager);
|
|
||||||
MetaMonitorInfo *old_monitor_infos;
|
MetaMonitorInfo *old_monitor_infos;
|
||||||
unsigned old_n_monitor_infos;
|
|
||||||
unsigned i, j;
|
|
||||||
old_monitor_infos = manager->monitor_infos;
|
old_monitor_infos = manager->monitor_infos;
|
||||||
old_n_monitor_infos = manager->n_monitor_infos;
|
|
||||||
|
|
||||||
if (manager->in_init)
|
if (manager->in_init)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
make_logical_config (manager);
|
make_logical_config (manager);
|
||||||
|
|
||||||
if (manager_class->delete_monitor)
|
|
||||||
{
|
|
||||||
for (i = 0; i < old_n_monitor_infos; i++)
|
|
||||||
{
|
|
||||||
gboolean delete_mon = TRUE;
|
|
||||||
for (j = 0; j < manager->n_monitor_infos; j++)
|
|
||||||
{
|
|
||||||
if (manager->monitor_infos[j].monitor_winsys_xid == old_monitor_infos[i].monitor_winsys_xid)
|
|
||||||
{
|
|
||||||
delete_mon = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (delete_mon)
|
|
||||||
manager_class->delete_monitor (manager, old_monitor_infos[i].monitor_winsys_xid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
g_signal_emit_by_name (manager, "monitors-changed");
|
g_signal_emit_by_name (manager, "monitors-changed");
|
||||||
|
|
||||||
g_free (old_monitor_infos);
|
g_free (old_monitor_infos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_output_parse_edid (MetaOutput *meta_output,
|
|
||||||
GBytes *edid)
|
|
||||||
{
|
|
||||||
MonitorInfo *parsed_edid;
|
|
||||||
gsize len;
|
|
||||||
|
|
||||||
if (!edid)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
parsed_edid = decode_edid (g_bytes_get_data (edid, &len));
|
|
||||||
|
|
||||||
if (parsed_edid)
|
|
||||||
{
|
|
||||||
meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4);
|
|
||||||
if (!g_utf8_validate (meta_output->vendor, -1, NULL))
|
|
||||||
g_clear_pointer (&meta_output->vendor, g_free);
|
|
||||||
|
|
||||||
meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14);
|
|
||||||
if (!g_utf8_validate (meta_output->product, -1, NULL) ||
|
|
||||||
meta_output->product[0] == '\0')
|
|
||||||
{
|
|
||||||
g_clear_pointer (&meta_output->product, g_free);
|
|
||||||
meta_output->product = g_strdup_printf ("0x%04x", (unsigned) parsed_edid->product_code);
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14);
|
|
||||||
if (!g_utf8_validate (meta_output->serial, -1, NULL) ||
|
|
||||||
meta_output->serial[0] == '\0')
|
|
||||||
{
|
|
||||||
g_clear_pointer (&meta_output->serial, g_free);
|
|
||||||
meta_output->serial = g_strdup_printf ("0x%08x", parsed_edid->serial_number);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (parsed_edid);
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (!meta_output->vendor)
|
|
||||||
meta_output->vendor = g_strdup ("unknown");
|
|
||||||
if (!meta_output->product)
|
|
||||||
meta_output->product = g_strdup ("unknown");
|
|
||||||
if (!meta_output->serial)
|
|
||||||
meta_output->serial = g_strdup ("unknown");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_monitor_manager_on_hotplug (MetaMonitorManager *manager)
|
|
||||||
{
|
|
||||||
gboolean applied_config = FALSE;
|
|
||||||
|
|
||||||
/* If the monitor has hotplug_mode_update (which is used by VMs), don't bother
|
|
||||||
* applying our stored configuration, because it's likely the user just resizing
|
|
||||||
* the window.
|
|
||||||
*/
|
|
||||||
if (!meta_monitor_manager_has_hotplug_mode_update (manager))
|
|
||||||
{
|
|
||||||
if (meta_monitor_config_apply_stored (manager->config, manager))
|
|
||||||
applied_config = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we haven't applied any configuration, apply the default configuration. */
|
|
||||||
if (!applied_config)
|
|
||||||
meta_monitor_config_make_default (manager->config, manager);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
calculate_viewport_matrix (MetaMonitorManager *manager,
|
|
||||||
MetaOutput *output,
|
|
||||||
gfloat viewport[6])
|
|
||||||
{
|
|
||||||
gfloat x, y, width, height;
|
|
||||||
|
|
||||||
if (!output->crtc)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
x = (float) output->crtc->rect.x / manager->screen_width;
|
|
||||||
y = (float) output->crtc->rect.y / manager->screen_height;
|
|
||||||
width = (float) output->crtc->rect.width / manager->screen_width;
|
|
||||||
height = (float) output->crtc->rect.height / manager->screen_height;
|
|
||||||
|
|
||||||
viewport[0] = width;
|
|
||||||
viewport[1] = 0.0f;
|
|
||||||
viewport[2] = x;
|
|
||||||
viewport[3] = 0.0f;
|
|
||||||
viewport[4] = height;
|
|
||||||
viewport[5] = y;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void
|
|
||||||
multiply_matrix (float a[6],
|
|
||||||
float b[6],
|
|
||||||
float res[6])
|
|
||||||
{
|
|
||||||
res[0] = a[0] * b[0] + a[1] * b[3];
|
|
||||||
res[1] = a[0] * b[1] + a[1] * b[4];
|
|
||||||
res[2] = a[0] * b[2] + a[1] * b[5] + a[2];
|
|
||||||
res[3] = a[3] * b[0] + a[4] * b[3];
|
|
||||||
res[4] = a[3] * b[1] + a[4] * b[4];
|
|
||||||
res[5] = a[3] * b[2] + a[4] * b[5] + a[5];
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
|
|
||||||
MetaOutput *output,
|
|
||||||
gfloat matrix[6])
|
|
||||||
{
|
|
||||||
gfloat viewport[9];
|
|
||||||
|
|
||||||
if (!calculate_viewport_matrix (manager, output, viewport))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
multiply_matrix (viewport, transform_matrices[output->crtc->transform],
|
|
||||||
matrix);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_monitor_manager_get_output_geometry:
|
|
||||||
* @manager: A #MetaMonitorManager
|
|
||||||
* @id: A valid #MetaOutput id
|
|
||||||
*
|
|
||||||
* Returns: The monitor index or -1 if @id isn't valid or the output
|
|
||||||
* isn't associated with a logical monitor.
|
|
||||||
*/
|
|
||||||
gint
|
|
||||||
meta_monitor_manager_get_monitor_for_output (MetaMonitorManager *manager,
|
|
||||||
guint id)
|
|
||||||
{
|
|
||||||
MetaOutput *output;
|
|
||||||
guint i;
|
|
||||||
|
|
||||||
g_return_val_if_fail (META_IS_MONITOR_MANAGER (manager), -1);
|
|
||||||
g_return_val_if_fail (id < manager->n_outputs, -1);
|
|
||||||
|
|
||||||
output = &manager->outputs[id];
|
|
||||||
if (!output || !output->crtc)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
for (i = 0; i < manager->n_monitor_infos; i++)
|
|
||||||
if (meta_rectangle_contains_rect (&manager->monitor_infos[i].rect,
|
|
||||||
&output->crtc->rect))
|
|
||||||
return i;
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
gint
|
|
||||||
meta_monitor_manager_get_monitor_at_point (MetaMonitorManager *manager,
|
|
||||||
gfloat x,
|
|
||||||
gfloat y)
|
|
||||||
{
|
|
||||||
unsigned int i;
|
|
||||||
|
|
||||||
for (i = 0; i < manager->n_monitor_infos; i++)
|
|
||||||
{
|
|
||||||
MetaMonitorInfo *monitor = &manager->monitor_infos[i];
|
|
||||||
int left, right, top, bottom;
|
|
||||||
|
|
||||||
left = monitor->rect.x;
|
|
||||||
right = left + monitor->rect.width;
|
|
||||||
top = monitor->rect.y;
|
|
||||||
bottom = top + monitor->rect.height;
|
|
||||||
|
|
||||||
if ((x >= left) && (x < right) && (y >= top) && (y < bottom))
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -41,22 +41,22 @@
|
|||||||
#include "display-private.h"
|
#include "display-private.h"
|
||||||
#include <meta/screen.h>
|
#include <meta/screen.h>
|
||||||
#include "stack-tracker.h"
|
#include "stack-tracker.h"
|
||||||
#include <meta/meta-monitor-manager.h>
|
|
||||||
|
|
||||||
#include "meta-display-config-shared.h"
|
#include "meta-display-config-shared.h"
|
||||||
#include "meta-dbus-display-config.h"
|
#include "meta-dbus-display-config.h"
|
||||||
#include "meta-cursor.h"
|
#include "meta-cursor.h"
|
||||||
|
|
||||||
|
typedef struct _MetaMonitorManagerClass MetaMonitorManagerClass;
|
||||||
|
typedef struct _MetaMonitorManager MetaMonitorManager;
|
||||||
typedef struct _MetaMonitorConfigClass MetaMonitorConfigClass;
|
typedef struct _MetaMonitorConfigClass MetaMonitorConfigClass;
|
||||||
typedef struct _MetaMonitorConfig MetaMonitorConfig;
|
typedef struct _MetaMonitorConfig MetaMonitorConfig;
|
||||||
|
|
||||||
typedef struct _MetaCRTC MetaCRTC;
|
|
||||||
typedef struct _MetaOutput MetaOutput;
|
typedef struct _MetaOutput MetaOutput;
|
||||||
|
typedef struct _MetaCRTC MetaCRTC;
|
||||||
typedef struct _MetaMonitorMode MetaMonitorMode;
|
typedef struct _MetaMonitorMode MetaMonitorMode;
|
||||||
typedef struct _MetaMonitorInfo MetaMonitorInfo;
|
typedef struct _MetaMonitorInfo MetaMonitorInfo;
|
||||||
typedef struct _MetaCRTCInfo MetaCRTCInfo;
|
typedef struct _MetaCRTCInfo MetaCRTCInfo;
|
||||||
typedef struct _MetaOutputInfo MetaOutputInfo;
|
typedef struct _MetaOutputInfo MetaOutputInfo;
|
||||||
typedef struct _MetaTileInfo MetaTileInfo;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
META_MONITOR_TRANSFORM_NORMAL,
|
META_MONITOR_TRANSFORM_NORMAL,
|
||||||
@@ -69,38 +69,6 @@ typedef enum {
|
|||||||
META_MONITOR_TRANSFORM_FLIPPED_270,
|
META_MONITOR_TRANSFORM_FLIPPED_270,
|
||||||
} MetaMonitorTransform;
|
} MetaMonitorTransform;
|
||||||
|
|
||||||
/* This matches the values in drm_mode.h */
|
|
||||||
typedef enum {
|
|
||||||
META_CONNECTOR_TYPE_Unknown = 0,
|
|
||||||
META_CONNECTOR_TYPE_VGA = 1,
|
|
||||||
META_CONNECTOR_TYPE_DVII = 2,
|
|
||||||
META_CONNECTOR_TYPE_DVID = 3,
|
|
||||||
META_CONNECTOR_TYPE_DVIA = 4,
|
|
||||||
META_CONNECTOR_TYPE_Composite = 5,
|
|
||||||
META_CONNECTOR_TYPE_SVIDEO = 6,
|
|
||||||
META_CONNECTOR_TYPE_LVDS = 7,
|
|
||||||
META_CONNECTOR_TYPE_Component = 8,
|
|
||||||
META_CONNECTOR_TYPE_9PinDIN = 9,
|
|
||||||
META_CONNECTOR_TYPE_DisplayPort = 10,
|
|
||||||
META_CONNECTOR_TYPE_HDMIA = 11,
|
|
||||||
META_CONNECTOR_TYPE_HDMIB = 12,
|
|
||||||
META_CONNECTOR_TYPE_TV = 13,
|
|
||||||
META_CONNECTOR_TYPE_eDP = 14,
|
|
||||||
META_CONNECTOR_TYPE_VIRTUAL = 15,
|
|
||||||
META_CONNECTOR_TYPE_DSI = 16,
|
|
||||||
} MetaConnectorType;
|
|
||||||
|
|
||||||
struct _MetaTileInfo {
|
|
||||||
guint32 group_id;
|
|
||||||
guint32 flags;
|
|
||||||
guint32 max_h_tiles;
|
|
||||||
guint32 max_v_tiles;
|
|
||||||
guint32 loc_h_tile;
|
|
||||||
guint32 loc_v_tile;
|
|
||||||
guint32 tile_w;
|
|
||||||
guint32 tile_h;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaOutput
|
struct _MetaOutput
|
||||||
{
|
{
|
||||||
/* The CRTC driving this output, NULL if the output is not enabled */
|
/* The CRTC driving this output, NULL if the output is not enabled */
|
||||||
@@ -116,8 +84,6 @@ struct _MetaOutput
|
|||||||
CoglSubpixelOrder subpixel_order;
|
CoglSubpixelOrder subpixel_order;
|
||||||
int scale;
|
int scale;
|
||||||
|
|
||||||
MetaConnectorType connector_type;
|
|
||||||
|
|
||||||
MetaMonitorMode *preferred_mode;
|
MetaMonitorMode *preferred_mode;
|
||||||
MetaMonitorMode **modes;
|
MetaMonitorMode **modes;
|
||||||
unsigned int n_modes;
|
unsigned int n_modes;
|
||||||
@@ -144,18 +110,12 @@ struct _MetaOutput
|
|||||||
*/
|
*/
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation;
|
gboolean is_presentation;
|
||||||
gboolean is_underscanning;
|
|
||||||
gboolean supports_underscanning;
|
|
||||||
|
|
||||||
gpointer driver_private;
|
gpointer driver_private;
|
||||||
GDestroyNotify driver_notify;
|
GDestroyNotify driver_notify;
|
||||||
|
|
||||||
/* get a new preferred mode on hotplug events, to handle dynamic guest resizing */
|
/* get a new preferred mode on hotplug events, to handle dynamic guest resizing */
|
||||||
gboolean hotplug_mode_update;
|
gboolean hotplug_mode_update;
|
||||||
gint suggested_x;
|
|
||||||
gint suggested_y;
|
|
||||||
|
|
||||||
MetaTileInfo tile_info;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaCRTC
|
struct _MetaCRTC
|
||||||
@@ -175,9 +135,6 @@ struct _MetaCRTC
|
|||||||
gboolean is_dirty;
|
gboolean is_dirty;
|
||||||
|
|
||||||
MetaCursorReference *cursor;
|
MetaCursorReference *cursor;
|
||||||
|
|
||||||
gpointer driver_private;
|
|
||||||
GDestroyNotify driver_notify;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaMonitorMode
|
struct _MetaMonitorMode
|
||||||
@@ -194,7 +151,6 @@ struct _MetaMonitorMode
|
|||||||
GDestroyNotify driver_notify;
|
GDestroyNotify driver_notify;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define META_MAX_OUTPUTS_PER_MONITOR 4
|
|
||||||
/**
|
/**
|
||||||
* MetaMonitorInfo:
|
* MetaMonitorInfo:
|
||||||
*
|
*
|
||||||
@@ -210,14 +166,9 @@ struct _MetaMonitorInfo
|
|||||||
int number;
|
int number;
|
||||||
int xinerama_index;
|
int xinerama_index;
|
||||||
MetaRectangle rect;
|
MetaRectangle rect;
|
||||||
/* for tiled monitors these are calculated, from untiled just copied */
|
|
||||||
float refresh_rate;
|
|
||||||
int width_mm;
|
|
||||||
int height_mm;
|
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation; /* XXX: not yet used */
|
gboolean is_presentation; /* XXX: not yet used */
|
||||||
gboolean in_fullscreen;
|
gboolean in_fullscreen;
|
||||||
int scale;
|
|
||||||
|
|
||||||
/* The primary or first output for this monitor, 0 if we can't figure out.
|
/* The primary or first output for this monitor, 0 if we can't figure out.
|
||||||
It can be matched to a winsys_id of a MetaOutput.
|
It can be matched to a winsys_id of a MetaOutput.
|
||||||
@@ -228,12 +179,6 @@ struct _MetaMonitorInfo
|
|||||||
the primary one).
|
the primary one).
|
||||||
*/
|
*/
|
||||||
glong winsys_id;
|
glong winsys_id;
|
||||||
|
|
||||||
guint32 tile_group_id;
|
|
||||||
|
|
||||||
int monitor_winsys_xid;
|
|
||||||
int n_outputs;
|
|
||||||
MetaOutput *outputs[META_MAX_OUTPUTS_PER_MONITOR];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -255,13 +200,12 @@ struct _MetaCRTCInfo {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* MetaOutputInfo:
|
* MetaOutputInfo:
|
||||||
* this is the same as MetaCRTCInfo, but for outputs
|
* this is the same as MetaOutputInfo, but for CRTCs
|
||||||
*/
|
*/
|
||||||
struct _MetaOutputInfo {
|
struct _MetaOutputInfo {
|
||||||
MetaOutput *output;
|
MetaOutput *output;
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation;
|
gboolean is_presentation;
|
||||||
gboolean is_underscanning;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_MANAGER (meta_monitor_manager_get_type ())
|
#define META_TYPE_MONITOR_MANAGER (meta_monitor_manager_get_type ())
|
||||||
@@ -351,15 +295,12 @@ struct _MetaMonitorManagerClass
|
|||||||
unsigned short *,
|
unsigned short *,
|
||||||
unsigned short *,
|
unsigned short *,
|
||||||
unsigned short *);
|
unsigned short *);
|
||||||
|
|
||||||
void (*add_monitor) (MetaMonitorManager *,
|
|
||||||
MetaMonitorInfo *);
|
|
||||||
|
|
||||||
void (*delete_monitor) (MetaMonitorManager *,
|
|
||||||
int monitor_winsys_xid);
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GType meta_monitor_manager_get_type (void);
|
||||||
|
|
||||||
|
MetaMonitorManager *meta_monitor_manager_get (void);
|
||||||
|
|
||||||
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager);
|
void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager);
|
||||||
|
|
||||||
MetaMonitorInfo *meta_monitor_manager_get_monitor_infos (MetaMonitorManager *manager,
|
MetaMonitorInfo *meta_monitor_manager_get_monitor_infos (MetaMonitorManager *manager,
|
||||||
@@ -395,23 +336,14 @@ void meta_monitor_manager_apply_configuration (MetaMonitorManager
|
|||||||
void meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager,
|
void meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager,
|
||||||
gboolean ok);
|
gboolean ok);
|
||||||
|
|
||||||
void meta_output_parse_edid (MetaOutput *output,
|
|
||||||
GBytes *edid);
|
|
||||||
|
|
||||||
void meta_crtc_info_free (MetaCRTCInfo *info);
|
void meta_crtc_info_free (MetaCRTCInfo *info);
|
||||||
void meta_output_info_free (MetaOutputInfo *info);
|
void meta_output_info_free (MetaOutputInfo *info);
|
||||||
|
|
||||||
|
void meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
|
||||||
|
int n_old_outputs);
|
||||||
|
void meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
|
||||||
|
int n_old_modes);
|
||||||
gboolean meta_monitor_manager_has_hotplug_mode_update (MetaMonitorManager *manager);
|
gboolean meta_monitor_manager_has_hotplug_mode_update (MetaMonitorManager *manager);
|
||||||
void meta_monitor_manager_read_current_config (MetaMonitorManager *manager);
|
|
||||||
void meta_monitor_manager_on_hotplug (MetaMonitorManager *manager);
|
|
||||||
|
|
||||||
gboolean meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
|
|
||||||
MetaOutput *output,
|
|
||||||
gfloat matrix[6]);
|
|
||||||
|
|
||||||
gint meta_monitor_manager_get_monitor_at_point (MetaMonitorManager *manager,
|
|
||||||
gfloat x,
|
|
||||||
gfloat y);
|
|
||||||
|
|
||||||
/* Returns true if transform causes width and height to be inverted
|
/* Returns true if transform causes width and height to be inverted
|
||||||
This is true for the odd transforms in the enum */
|
This is true for the odd transforms in the enum */
|
||||||
@@ -40,8 +40,8 @@ typedef struct {
|
|||||||
} MetaOverlay;
|
} MetaOverlay;
|
||||||
|
|
||||||
struct _MetaStagePrivate {
|
struct _MetaStagePrivate {
|
||||||
|
MetaOverlay dnd_overlay;
|
||||||
MetaOverlay cursor_overlay;
|
MetaOverlay cursor_overlay;
|
||||||
gboolean is_active;
|
|
||||||
};
|
};
|
||||||
typedef struct _MetaStagePrivate MetaStagePrivate;
|
typedef struct _MetaStagePrivate MetaStagePrivate;
|
||||||
|
|
||||||
@@ -113,6 +113,7 @@ meta_stage_finalize (GObject *object)
|
|||||||
MetaStage *stage = META_STAGE (object);
|
MetaStage *stage = META_STAGE (object);
|
||||||
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
meta_overlay_free (&priv->dnd_overlay);
|
||||||
meta_overlay_free (&priv->cursor_overlay);
|
meta_overlay_free (&priv->cursor_overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,44 +125,19 @@ meta_stage_paint (ClutterActor *actor)
|
|||||||
|
|
||||||
CLUTTER_ACTOR_CLASS (meta_stage_parent_class)->paint (actor);
|
CLUTTER_ACTOR_CLASS (meta_stage_parent_class)->paint (actor);
|
||||||
|
|
||||||
|
meta_overlay_paint (&priv->dnd_overlay);
|
||||||
meta_overlay_paint (&priv->cursor_overlay);
|
meta_overlay_paint (&priv->cursor_overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_stage_activate (ClutterStage *actor)
|
|
||||||
{
|
|
||||||
MetaStage *stage = META_STAGE (actor);
|
|
||||||
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
|
||||||
|
|
||||||
CLUTTER_STAGE_CLASS (meta_stage_parent_class)->activate (actor);
|
|
||||||
|
|
||||||
priv->is_active = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_stage_deactivate (ClutterStage *actor)
|
|
||||||
{
|
|
||||||
MetaStage *stage = META_STAGE (actor);
|
|
||||||
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
|
||||||
|
|
||||||
CLUTTER_STAGE_CLASS (meta_stage_parent_class)->deactivate (actor);
|
|
||||||
|
|
||||||
priv->is_active = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_stage_class_init (MetaStageClass *klass)
|
meta_stage_class_init (MetaStageClass *klass)
|
||||||
{
|
{
|
||||||
ClutterStageClass *stage_class = (ClutterStageClass *) klass;
|
|
||||||
ClutterActorClass *actor_class = (ClutterActorClass *) klass;
|
ClutterActorClass *actor_class = (ClutterActorClass *) klass;
|
||||||
GObjectClass *object_class = (GObjectClass *) klass;
|
GObjectClass *object_class = (GObjectClass *) klass;
|
||||||
|
|
||||||
object_class->finalize = meta_stage_finalize;
|
object_class->finalize = meta_stage_finalize;
|
||||||
|
|
||||||
actor_class->paint = meta_stage_paint;
|
actor_class->paint = meta_stage_paint;
|
||||||
|
|
||||||
stage_class->activate = meta_stage_activate;
|
|
||||||
stage_class->deactivate = meta_stage_deactivate;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -169,6 +145,7 @@ meta_stage_init (MetaStage *stage)
|
|||||||
{
|
{
|
||||||
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
meta_overlay_init (&priv->dnd_overlay);
|
||||||
meta_overlay_init (&priv->cursor_overlay);
|
meta_overlay_init (&priv->cursor_overlay);
|
||||||
|
|
||||||
clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), FALSE);
|
clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), FALSE);
|
||||||
@@ -210,6 +187,19 @@ queue_redraw_for_overlay (MetaStage *stage,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_stage_set_dnd_surface (MetaStage *stage,
|
||||||
|
CoglTexture *texture,
|
||||||
|
MetaRectangle *rect)
|
||||||
|
{
|
||||||
|
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
||||||
|
|
||||||
|
g_assert (meta_is_wayland_compositor ());
|
||||||
|
|
||||||
|
meta_overlay_set (&priv->dnd_overlay, texture, rect);
|
||||||
|
queue_redraw_for_overlay (stage, &priv->dnd_overlay);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_stage_set_cursor (MetaStage *stage,
|
meta_stage_set_cursor (MetaStage *stage,
|
||||||
CoglTexture *texture,
|
CoglTexture *texture,
|
||||||
@@ -222,43 +212,3 @@ meta_stage_set_cursor (MetaStage *stage,
|
|||||||
meta_overlay_set (&priv->cursor_overlay, texture, rect);
|
meta_overlay_set (&priv->cursor_overlay, texture, rect);
|
||||||
queue_redraw_for_overlay (stage, &priv->cursor_overlay);
|
queue_redraw_for_overlay (stage, &priv->cursor_overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_stage_set_active (MetaStage *stage,
|
|
||||||
gboolean is_active)
|
|
||||||
{
|
|
||||||
MetaStagePrivate *priv = meta_stage_get_instance_private (stage);
|
|
||||||
ClutterEvent event = { 0 };
|
|
||||||
|
|
||||||
/* Used by the native backend to inform accessibility technologies
|
|
||||||
* about when the stage loses and gains input focus.
|
|
||||||
*
|
|
||||||
* For the X11 backend, clutter transparently takes care of this
|
|
||||||
* for us.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (priv->is_active == is_active)
|
|
||||||
return;
|
|
||||||
|
|
||||||
event.type = CLUTTER_STAGE_STATE;
|
|
||||||
clutter_event_set_stage (&event, CLUTTER_STAGE (stage));
|
|
||||||
event.stage_state.changed_mask = CLUTTER_STAGE_STATE_ACTIVATED;
|
|
||||||
|
|
||||||
if (is_active)
|
|
||||||
event.stage_state.new_state = CLUTTER_STAGE_STATE_ACTIVATED;
|
|
||||||
|
|
||||||
/* Emitting this StageState event will result in the stage getting
|
|
||||||
* activated or deactivated (with the activated or deactivated signal
|
|
||||||
* getting emitted from the stage)
|
|
||||||
*
|
|
||||||
* FIXME: This won't update ClutterStage's own notion of its
|
|
||||||
* activeness. For that we would need to somehow trigger a
|
|
||||||
* _clutter_stage_update_state call, which will probably
|
|
||||||
* require new API in clutter. In practice, nothing relies
|
|
||||||
* on the ClutterStage's own notion of activeness when using
|
|
||||||
* the EGL backend.
|
|
||||||
*
|
|
||||||
* See http://bugzilla.gnome.org/746670
|
|
||||||
*/
|
|
||||||
clutter_stage_event (CLUTTER_STAGE (stage), &event);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -51,12 +51,14 @@ GType meta_stage_get_type (void) G_GNUC_CONST;
|
|||||||
|
|
||||||
ClutterActor *meta_stage_new (void);
|
ClutterActor *meta_stage_new (void);
|
||||||
|
|
||||||
|
void meta_stage_set_dnd_surface (MetaStage *stage,
|
||||||
|
CoglTexture *texture,
|
||||||
|
MetaRectangle *rect);
|
||||||
|
|
||||||
void meta_stage_set_cursor (MetaStage *stage,
|
void meta_stage_set_cursor (MetaStage *stage,
|
||||||
CoglTexture *texture,
|
CoglTexture *texture,
|
||||||
MetaRectangle *rect);
|
MetaRectangle *rect);
|
||||||
|
|
||||||
void meta_stage_set_active (MetaStage *stage,
|
|
||||||
gboolean is_active);
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* META_STAGE_H */
|
#endif /* META_STAGE_H */
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2015 Red Hat
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Written by:
|
|
||||||
* Jonas Ådahl <jadahl@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef META_BACKEND_NATIVE_PRIVATE_H
|
|
||||||
#define META_BACKEND_NATIVE_PRIVATE_H
|
|
||||||
|
|
||||||
#include "backends/native/meta-barrier-native.h"
|
|
||||||
|
|
||||||
MetaBarrierManagerNative *meta_backend_native_get_barrier_manager (MetaBackendNative *native);
|
|
||||||
|
|
||||||
#endif /* META_BACKEND_NATIVE_PRIVATE_H */
|
|
||||||
@@ -24,14 +24,10 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "meta-backend-native.h"
|
|
||||||
#include "meta-backend-native-private.h"
|
|
||||||
|
|
||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include <clutter/evdev/clutter-evdev.h>
|
#include <clutter/evdev/clutter-evdev.h>
|
||||||
#include <libupower-glib/upower.h>
|
#include "meta-backend-native.h"
|
||||||
|
|
||||||
#include "meta-barrier-native.h"
|
|
||||||
#include "meta-idle-monitor-native.h"
|
#include "meta-idle-monitor-native.h"
|
||||||
#include "meta-monitor-manager-kms.h"
|
#include "meta-monitor-manager-kms.h"
|
||||||
#include "meta-cursor-renderer-native.h"
|
#include "meta-cursor-renderer-native.h"
|
||||||
@@ -40,103 +36,11 @@
|
|||||||
struct _MetaBackendNativePrivate
|
struct _MetaBackendNativePrivate
|
||||||
{
|
{
|
||||||
MetaLauncher *launcher;
|
MetaLauncher *launcher;
|
||||||
MetaBarrierManagerNative *barrier_manager;
|
|
||||||
UpClient *up_client;
|
|
||||||
guint sleep_signal_id;
|
|
||||||
GCancellable *cancellable;
|
|
||||||
GDBusConnection *system_bus;
|
|
||||||
};
|
};
|
||||||
typedef struct _MetaBackendNativePrivate MetaBackendNativePrivate;
|
typedef struct _MetaBackendNativePrivate MetaBackendNativePrivate;
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendNative, meta_backend_native, META_TYPE_BACKEND);
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendNative, meta_backend_native, META_TYPE_BACKEND);
|
||||||
|
|
||||||
static void
|
|
||||||
meta_backend_native_finalize (GObject *object)
|
|
||||||
{
|
|
||||||
MetaBackendNative *native = META_BACKEND_NATIVE (object);
|
|
||||||
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
|
|
||||||
|
|
||||||
meta_launcher_free (priv->launcher);
|
|
||||||
|
|
||||||
g_object_unref (priv->up_client);
|
|
||||||
if (priv->sleep_signal_id)
|
|
||||||
g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id);
|
|
||||||
g_cancellable_cancel (priv->cancellable);
|
|
||||||
g_clear_object (&priv->cancellable);
|
|
||||||
g_clear_object (&priv->system_bus);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_backend_native_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
prepare_for_sleep_cb (GDBusConnection *connection,
|
|
||||||
const gchar *sender_name,
|
|
||||||
const gchar *object_path,
|
|
||||||
const gchar *interface_name,
|
|
||||||
const gchar *signal_name,
|
|
||||||
GVariant *parameters,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
gboolean suspending;
|
|
||||||
g_variant_get (parameters, "(b)", &suspending);
|
|
||||||
if (suspending)
|
|
||||||
return;
|
|
||||||
meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
system_bus_gotten_cb (GObject *object,
|
|
||||||
GAsyncResult *res,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaBackendNativePrivate *priv;
|
|
||||||
GDBusConnection *bus;
|
|
||||||
|
|
||||||
bus = g_bus_get_finish (res, NULL);
|
|
||||||
if (!bus)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv = meta_backend_native_get_instance_private (META_BACKEND_NATIVE (user_data));
|
|
||||||
priv->system_bus = bus;
|
|
||||||
priv->sleep_signal_id = g_dbus_connection_signal_subscribe (priv->system_bus,
|
|
||||||
"org.freedesktop.login1",
|
|
||||||
"org.freedesktop.login1.Manager",
|
|
||||||
"PrepareForSleep",
|
|
||||||
"/org/freedesktop/login1",
|
|
||||||
NULL,
|
|
||||||
G_DBUS_SIGNAL_FLAGS_NONE,
|
|
||||||
prepare_for_sleep_cb,
|
|
||||||
NULL,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
lid_is_closed_changed_cb (UpClient *client,
|
|
||||||
GParamSpec *pspec,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
if (up_client_get_lid_is_closed (client))
|
|
||||||
return;
|
|
||||||
|
|
||||||
meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
constrain_to_barriers (ClutterInputDevice *device,
|
|
||||||
guint32 time,
|
|
||||||
float *new_x,
|
|
||||||
float *new_y)
|
|
||||||
{
|
|
||||||
MetaBackendNative *native = META_BACKEND_NATIVE (meta_get_backend ());
|
|
||||||
MetaBackendNativePrivate *priv =
|
|
||||||
meta_backend_native_get_instance_private (native);
|
|
||||||
|
|
||||||
meta_barrier_manager_native_process (priv->barrier_manager,
|
|
||||||
device,
|
|
||||||
time,
|
|
||||||
new_x, new_y);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
|
* The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
|
||||||
* (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
|
* (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
|
||||||
@@ -146,6 +50,31 @@ constrain_to_barriers (ClutterInputDevice *device,
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
check_all_screen_monitors(MetaMonitorInfo *monitors,
|
||||||
|
unsigned n_monitors,
|
||||||
|
float x,
|
||||||
|
float y)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = 0; i < n_monitors; i++)
|
||||||
|
{
|
||||||
|
MetaMonitorInfo *monitor = &monitors[i];
|
||||||
|
int left, right, top, bottom;
|
||||||
|
|
||||||
|
left = monitor->rect.x;
|
||||||
|
right = left + monitor->rect.width;
|
||||||
|
top = monitor->rect.y;
|
||||||
|
bottom = left + monitor->rect.height;
|
||||||
|
|
||||||
|
if ((x >= left) && (x < right) && (y >= top) && (y < bottom))
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
constrain_all_screen_monitors (ClutterInputDevice *device,
|
constrain_all_screen_monitors (ClutterInputDevice *device,
|
||||||
MetaMonitorInfo *monitors,
|
MetaMonitorInfo *monitors,
|
||||||
@@ -155,25 +84,25 @@ constrain_all_screen_monitors (ClutterInputDevice *device,
|
|||||||
{
|
{
|
||||||
ClutterPoint current;
|
ClutterPoint current;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
float cx, cy;
|
|
||||||
|
|
||||||
clutter_input_device_get_coords (device, NULL, ¤t);
|
clutter_input_device_get_coords (device, NULL, ¤t);
|
||||||
|
|
||||||
cx = current.x;
|
|
||||||
cy = current.y;
|
|
||||||
|
|
||||||
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
||||||
for (i = 0; i < n_monitors; i++)
|
for (i = 0; i < n_monitors; i++)
|
||||||
{
|
{
|
||||||
MetaMonitorInfo *monitor = &monitors[i];
|
MetaMonitorInfo *monitor = &monitors[i];
|
||||||
int left, right, top, bottom;
|
int left, right, top, bottom;
|
||||||
|
float nx, ny;
|
||||||
|
|
||||||
left = monitor->rect.x;
|
left = monitor->rect.x;
|
||||||
right = left + monitor->rect.width;
|
right = left + monitor->rect.width;
|
||||||
top = monitor->rect.y;
|
top = monitor->rect.y;
|
||||||
bottom = top + monitor->rect.height;
|
bottom = left + monitor->rect.height;
|
||||||
|
|
||||||
if ((cx >= left) && (cx < right) && (cy >= top) && (cy < bottom))
|
nx = current.x;
|
||||||
|
ny = current.y;
|
||||||
|
|
||||||
|
if ((nx >= left) && (nx < right) && (ny >= top) && (ny < bottom))
|
||||||
{
|
{
|
||||||
if (*x < left)
|
if (*x < left)
|
||||||
*x = left;
|
*x = left;
|
||||||
@@ -199,15 +128,14 @@ pointer_constrain_callback (ClutterInputDevice *device,
|
|||||||
MetaMonitorManager *monitor_manager;
|
MetaMonitorManager *monitor_manager;
|
||||||
MetaMonitorInfo *monitors;
|
MetaMonitorInfo *monitors;
|
||||||
unsigned int n_monitors;
|
unsigned int n_monitors;
|
||||||
|
gboolean ret;
|
||||||
/* Constrain to barriers */
|
|
||||||
constrain_to_barriers (device, time, new_x, new_y);
|
|
||||||
|
|
||||||
monitor_manager = meta_monitor_manager_get ();
|
monitor_manager = meta_monitor_manager_get ();
|
||||||
monitors = meta_monitor_manager_get_monitor_infos (monitor_manager, &n_monitors);
|
monitors = meta_monitor_manager_get_monitor_infos (monitor_manager, &n_monitors);
|
||||||
|
|
||||||
/* if we're moving inside a monitor, we're fine */
|
/* if we're moving inside a monitor, we're fine */
|
||||||
if (meta_monitor_manager_get_monitor_at_point (monitor_manager, *new_x, *new_y) >= 0)
|
ret = check_all_screen_monitors(monitors, n_monitors, *new_x, *new_y);
|
||||||
|
if (ret == TRUE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
/* if we're trying to escape, clamp to the CRTC we're coming from */
|
||||||
@@ -301,16 +229,12 @@ meta_backend_native_lock_layout_group (MetaBackend *backend,
|
|||||||
{
|
{
|
||||||
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
||||||
clutter_evdev_set_keyboard_layout_index (manager, idx);
|
clutter_evdev_set_keyboard_layout_index (manager, idx);
|
||||||
g_signal_emit_by_name (backend, "keymap-layout-group-changed", idx, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_backend_native_class_init (MetaBackendNativeClass *klass)
|
meta_backend_native_class_init (MetaBackendNativeClass *klass)
|
||||||
{
|
{
|
||||||
MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
|
MetaBackendClass *backend_class = META_BACKEND_CLASS (klass);
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
||||||
|
|
||||||
object_class->finalize = meta_backend_native_finalize;
|
|
||||||
|
|
||||||
backend_class->post_init = meta_backend_native_post_init;
|
backend_class->post_init = meta_backend_native_post_init;
|
||||||
backend_class->create_idle_monitor = meta_backend_native_create_idle_monitor;
|
backend_class->create_idle_monitor = meta_backend_native_create_idle_monitor;
|
||||||
@@ -330,18 +254,6 @@ meta_backend_native_init (MetaBackendNative *native)
|
|||||||
|
|
||||||
/* We're a display server, so start talking to weston-launch. */
|
/* We're a display server, so start talking to weston-launch. */
|
||||||
priv->launcher = meta_launcher_new ();
|
priv->launcher = meta_launcher_new ();
|
||||||
|
|
||||||
priv->barrier_manager = meta_barrier_manager_native_new ();
|
|
||||||
|
|
||||||
priv->up_client = up_client_new ();
|
|
||||||
g_signal_connect (priv->up_client, "notify::lid-is-closed",
|
|
||||||
G_CALLBACK (lid_is_closed_changed_cb), NULL);
|
|
||||||
|
|
||||||
priv->cancellable = g_cancellable_new ();
|
|
||||||
g_bus_get (G_BUS_TYPE_SYSTEM,
|
|
||||||
priv->cancellable,
|
|
||||||
system_bus_gotten_cb,
|
|
||||||
native);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@@ -354,20 +266,11 @@ meta_activate_vt (int vt, GError **error)
|
|||||||
return meta_launcher_activate_vt (priv->launcher, vt, error);
|
return meta_launcher_activate_vt (priv->launcher, vt, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaBarrierManagerNative *
|
|
||||||
meta_backend_native_get_barrier_manager (MetaBackendNative *native)
|
|
||||||
{
|
|
||||||
MetaBackendNativePrivate *priv =
|
|
||||||
meta_backend_native_get_instance_private (native);
|
|
||||||
|
|
||||||
return priv->barrier_manager;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_activate_session:
|
* meta_activate_session:
|
||||||
*
|
*
|
||||||
* Tells mutter to activate the session. When mutter is a
|
* Tells mutter to activate the session. When mutter is a
|
||||||
* display server, this tells logind to switch over to
|
* Wayland compositor, this tells logind to switch over to
|
||||||
* the new session.
|
* the new session.
|
||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
|
|||||||
@@ -1,744 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2015 Red Hat
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Written by:
|
|
||||||
* Jonas Ådahl <jadahl@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SECTION:barrier-native
|
|
||||||
* @Title: MetaBarrierImplNative
|
|
||||||
* @Short_Description: Pointer barriers implementation for the native backend
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <meta/barrier.h>
|
|
||||||
#include <meta/util.h>
|
|
||||||
#include "backends/meta-backend-private.h"
|
|
||||||
#include "backends/meta-barrier-private.h"
|
|
||||||
#include "backends/native/meta-backend-native.h"
|
|
||||||
#include "backends/native/meta-backend-native-private.h"
|
|
||||||
#include "backends/native/meta-barrier-native.h"
|
|
||||||
|
|
||||||
struct _MetaBarrierManagerNative
|
|
||||||
{
|
|
||||||
GHashTable *barriers;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
/* The barrier is active and responsive to pointer motion. */
|
|
||||||
META_BARRIER_STATE_ACTIVE,
|
|
||||||
|
|
||||||
/* An intermediate state after a pointer hit the pointer barrier. */
|
|
||||||
META_BARRIER_STATE_HIT,
|
|
||||||
|
|
||||||
/* The barrier was hit by a pointer and is still within the hit box and
|
|
||||||
* has not been released.*/
|
|
||||||
META_BARRIER_STATE_HELD,
|
|
||||||
|
|
||||||
/* The pointer was released by the user. If the following motion hits
|
|
||||||
* the barrier, it will pass through. */
|
|
||||||
META_BARRIER_STATE_RELEASE,
|
|
||||||
|
|
||||||
/* An intermediate state when the pointer has left the barrier. */
|
|
||||||
META_BARRIER_STATE_LEFT,
|
|
||||||
} MetaBarrierState;
|
|
||||||
|
|
||||||
struct _MetaBarrierImplNativePrivate
|
|
||||||
{
|
|
||||||
MetaBarrier *barrier;
|
|
||||||
MetaBarrierManagerNative *manager;
|
|
||||||
|
|
||||||
gboolean is_active;
|
|
||||||
MetaBarrierState state;
|
|
||||||
int trigger_serial;
|
|
||||||
guint32 last_event_time;
|
|
||||||
MetaBarrierDirection blocked_dir;
|
|
||||||
};
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaBarrierImplNative, meta_barrier_impl_native,
|
|
||||||
META_TYPE_BARRIER_IMPL)
|
|
||||||
|
|
||||||
static int
|
|
||||||
next_serial (void)
|
|
||||||
{
|
|
||||||
static int barrier_serial = 1;
|
|
||||||
|
|
||||||
barrier_serial++;
|
|
||||||
|
|
||||||
/* If it wraps, avoid 0 as it's not a valid serial. */
|
|
||||||
if (barrier_serial == 0)
|
|
||||||
barrier_serial++;
|
|
||||||
|
|
||||||
return barrier_serial;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct _Vector2
|
|
||||||
{
|
|
||||||
float x, y;
|
|
||||||
} Vector2;
|
|
||||||
|
|
||||||
static float
|
|
||||||
vector2_cross_product (Vector2 a, Vector2 b)
|
|
||||||
{
|
|
||||||
return a.x * b.y - a.y * b.x;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Vector2
|
|
||||||
vector2_add (Vector2 a, Vector2 b)
|
|
||||||
{
|
|
||||||
return (Vector2) {
|
|
||||||
.x = a.x + b.x,
|
|
||||||
.y = a.y + b.y,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static Vector2
|
|
||||||
vector2_subtract (Vector2 a, Vector2 b)
|
|
||||||
{
|
|
||||||
return (Vector2) {
|
|
||||||
.x = a.x - b.x,
|
|
||||||
.y = a.y - b.y,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
static Vector2
|
|
||||||
vector2_multiply_constant (float c, Vector2 a)
|
|
||||||
{
|
|
||||||
return (Vector2) {
|
|
||||||
.x = c * a.x,
|
|
||||||
.y = c * a.y,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct _Line2
|
|
||||||
{
|
|
||||||
Vector2 a;
|
|
||||||
Vector2 b;
|
|
||||||
} Line2;
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
lines_intersect (Line2 *line1, Line2 *line2, Vector2 *intersection)
|
|
||||||
{
|
|
||||||
Vector2 p = line1->a;
|
|
||||||
Vector2 r = vector2_subtract (line1->b, line1->a);
|
|
||||||
Vector2 q = line2->a;
|
|
||||||
Vector2 s = vector2_subtract (line2->b, line2->a);
|
|
||||||
float rxs;
|
|
||||||
float sxr;
|
|
||||||
float t;
|
|
||||||
float u;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The line (p, r) and (q, s) intersects where
|
|
||||||
*
|
|
||||||
* p + t r = q + u s
|
|
||||||
*
|
|
||||||
* Calculate t:
|
|
||||||
*
|
|
||||||
* (p + t r) × s = (q + u s) × s
|
|
||||||
* p × s + t (r × s) = q × s + u (s × s)
|
|
||||||
* p × s + t (r × s) = q × s
|
|
||||||
* t (r × s) = q × s - p × s
|
|
||||||
* t (r × s) = (q - p) × s
|
|
||||||
* t = ((q - p) × s) / (r × s)
|
|
||||||
*
|
|
||||||
* Using the same method, for u we get:
|
|
||||||
*
|
|
||||||
* u = ((p - q) × r) / (s × r)
|
|
||||||
*/
|
|
||||||
|
|
||||||
rxs = vector2_cross_product (r, s);
|
|
||||||
sxr = vector2_cross_product (s, r);
|
|
||||||
|
|
||||||
/* If r × s = 0 then the lines are either parallel or collinear. */
|
|
||||||
if (fabs ( rxs) < DBL_MIN)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
t = vector2_cross_product (vector2_subtract (q, p), s) / rxs;
|
|
||||||
u = vector2_cross_product (vector2_subtract (p, q), r) / sxr;
|
|
||||||
|
|
||||||
|
|
||||||
/* The lines only intersect if 0 ≤ t ≤ 1 and 0 ≤ u ≤ 1. */
|
|
||||||
if (t < 0.0 || t > 1.0 || u < 0.0 || u > 1.0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
*intersection = vector2_add (p, vector2_multiply_constant (t, r));
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
is_barrier_horizontal (MetaBarrier *barrier)
|
|
||||||
{
|
|
||||||
return barrier->priv->y1 == barrier->priv->y2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
is_barrier_blocking_directions (MetaBarrier *barrier,
|
|
||||||
MetaBarrierDirection directions)
|
|
||||||
{
|
|
||||||
/* Barriers doesn't block parallel motions. */
|
|
||||||
if (is_barrier_horizontal (barrier))
|
|
||||||
{
|
|
||||||
if ((directions & (META_BARRIER_DIRECTION_POSITIVE_Y |
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_Y)) == 0)
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((directions & (META_BARRIER_DIRECTION_POSITIVE_X |
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_X)) == 0)
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (barrier->priv->directions & directions) != directions;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
dismiss_pointer (MetaBarrierImplNative *self)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNativePrivate *priv =
|
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
|
|
||||||
priv->state = META_BARRIER_STATE_LEFT;
|
|
||||||
}
|
|
||||||
|
|
||||||
static Line2
|
|
||||||
barrier_to_line (MetaBarrier *barrier)
|
|
||||||
{
|
|
||||||
return (Line2) {
|
|
||||||
.a = (Vector2) {
|
|
||||||
.x = MIN (barrier->priv->x1, barrier->priv->x2),
|
|
||||||
.y = MIN (barrier->priv->y1, barrier->priv->y2),
|
|
||||||
},
|
|
||||||
.b = (Vector2) {
|
|
||||||
.x = MAX (barrier->priv->x1, barrier->priv->x2),
|
|
||||||
.y = MAX (barrier->priv->y1, barrier->priv->y2),
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Calculate the hit box for a held motion. The hit box is a 2 px wide region
|
|
||||||
* in the opposite direction of every direction the barrier blocks. The purpose
|
|
||||||
* of this is to allow small movements without receiving a "left" signal. This
|
|
||||||
* heuristic comes from the X.org pointer barrier implementation.
|
|
||||||
*/
|
|
||||||
static Line2
|
|
||||||
calculate_barrier_hit_box (MetaBarrier *barrier)
|
|
||||||
{
|
|
||||||
Line2 hit_box = barrier_to_line (barrier);
|
|
||||||
|
|
||||||
if (is_barrier_horizontal (barrier))
|
|
||||||
{
|
|
||||||
if (is_barrier_blocking_directions (barrier,
|
|
||||||
META_BARRIER_DIRECTION_POSITIVE_Y))
|
|
||||||
hit_box.a.y -= 2.0f;
|
|
||||||
if (is_barrier_blocking_directions (barrier,
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_Y))
|
|
||||||
hit_box.b.y += 2.0f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (is_barrier_blocking_directions (barrier,
|
|
||||||
META_BARRIER_DIRECTION_POSITIVE_X))
|
|
||||||
hit_box.a.x -= 2.0f;
|
|
||||||
if (is_barrier_blocking_directions (barrier,
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_X))
|
|
||||||
hit_box.b.x += 2.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
return hit_box;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
is_within_box (Line2 box, Vector2 point)
|
|
||||||
{
|
|
||||||
return (point.x >= box.a.x && point.x < box.b.x &&
|
|
||||||
point.y >= box.a.y && point.y < box.b.y);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
maybe_release_barrier (gpointer key,
|
|
||||||
gpointer value,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNative *self = key;
|
|
||||||
MetaBarrierImplNativePrivate *priv =
|
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
MetaBarrier *barrier = priv->barrier;
|
|
||||||
Line2 *motion = user_data;
|
|
||||||
Line2 hit_box;
|
|
||||||
|
|
||||||
if (priv->state != META_BARRIER_STATE_HELD)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Release if we end up outside barrier end points. */
|
|
||||||
if (is_barrier_horizontal (barrier))
|
|
||||||
{
|
|
||||||
if (motion->b.x > MAX (barrier->priv->x1, barrier->priv->x2) ||
|
|
||||||
motion->b.x < MIN (barrier->priv->x1, barrier->priv->x2))
|
|
||||||
{
|
|
||||||
dismiss_pointer (self);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (motion->b.y > MAX (barrier->priv->y1, barrier->priv->y2) ||
|
|
||||||
motion->b.y < MIN (barrier->priv->y1, barrier->priv->y2))
|
|
||||||
{
|
|
||||||
dismiss_pointer (self);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Release if we don't intersect and end up outside of hit box. */
|
|
||||||
hit_box = calculate_barrier_hit_box (barrier);
|
|
||||||
if (!is_within_box (hit_box, motion->b))
|
|
||||||
{
|
|
||||||
dismiss_pointer (self);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
maybe_release_barriers (MetaBarrierManagerNative *manager,
|
|
||||||
float prev_x,
|
|
||||||
float prev_y,
|
|
||||||
float x,
|
|
||||||
float y)
|
|
||||||
{
|
|
||||||
Line2 motion = {
|
|
||||||
.a = {
|
|
||||||
.x = prev_x,
|
|
||||||
.y = prev_y,
|
|
||||||
},
|
|
||||||
.b = {
|
|
||||||
.x = x,
|
|
||||||
.y = y,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
g_hash_table_foreach (manager->barriers,
|
|
||||||
maybe_release_barrier,
|
|
||||||
&motion);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct _MetaClosestBarrierData
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
Line2 motion;
|
|
||||||
MetaBarrierDirection directions;
|
|
||||||
} in;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
float closest_distance_2;
|
|
||||||
MetaBarrierImplNative *barrier_impl;
|
|
||||||
} out;
|
|
||||||
} MetaClosestBarrierData;
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_closest_barrier (gpointer key,
|
|
||||||
gpointer value,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNative *self = key;
|
|
||||||
MetaBarrierImplNativePrivate *priv =
|
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
MetaBarrier *barrier = priv->barrier;
|
|
||||||
MetaClosestBarrierData *data = user_data;
|
|
||||||
Line2 barrier_line;
|
|
||||||
Vector2 intersection;
|
|
||||||
float dx, dy;
|
|
||||||
float distance_2;
|
|
||||||
|
|
||||||
/* Ignore if the barrier is not blocking in any of the motions directions. */
|
|
||||||
if (!is_barrier_blocking_directions (barrier, data->in.directions))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Ignore if the barrier released the pointer. */
|
|
||||||
if (priv->state == META_BARRIER_STATE_RELEASE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Ignore if we are moving away from barrier. */
|
|
||||||
if (priv->state == META_BARRIER_STATE_HELD &&
|
|
||||||
(data->in.directions & priv->blocked_dir) == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Check if the motion intersects with the barrier, and retrieve the
|
|
||||||
* intersection point if any. */
|
|
||||||
barrier_line = (Line2) {
|
|
||||||
.a = {
|
|
||||||
.x = barrier->priv->x1,
|
|
||||||
.y = barrier->priv->y1
|
|
||||||
},
|
|
||||||
.b = {
|
|
||||||
.x = barrier->priv->x2,
|
|
||||||
.y = barrier->priv->y2
|
|
||||||
},
|
|
||||||
};
|
|
||||||
if (!lines_intersect (&barrier_line, &data->in.motion, &intersection))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Calculate the distance to the barrier and keep track of the closest
|
|
||||||
* barrier. */
|
|
||||||
dx = intersection.x - data->in.motion.a.x;
|
|
||||||
dy = intersection.y - data->in.motion.a.y;
|
|
||||||
distance_2 = dx*dx + dy*dy;
|
|
||||||
if (data->out.barrier_impl == NULL ||
|
|
||||||
distance_2 < data->out.closest_distance_2)
|
|
||||||
{
|
|
||||||
data->out.barrier_impl = self;
|
|
||||||
data->out.closest_distance_2 = distance_2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
get_closest_barrier (MetaBarrierManagerNative *manager,
|
|
||||||
float prev_x,
|
|
||||||
float prev_y,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
MetaBarrierDirection motion_dir,
|
|
||||||
MetaBarrierImplNative **barrier_impl)
|
|
||||||
{
|
|
||||||
MetaClosestBarrierData closest_barrier_data;
|
|
||||||
|
|
||||||
closest_barrier_data = (MetaClosestBarrierData) {
|
|
||||||
.in = {
|
|
||||||
.motion = {
|
|
||||||
.a = {
|
|
||||||
.x = prev_x,
|
|
||||||
.y = prev_y,
|
|
||||||
},
|
|
||||||
.b = {
|
|
||||||
.x = x,
|
|
||||||
.y = y,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.directions = motion_dir,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
g_hash_table_foreach (manager->barriers,
|
|
||||||
update_closest_barrier,
|
|
||||||
&closest_barrier_data);
|
|
||||||
|
|
||||||
if (closest_barrier_data.out.barrier_impl != NULL)
|
|
||||||
{
|
|
||||||
*barrier_impl = closest_barrier_data.out.barrier_impl;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct _MetaBarrierEventData
|
|
||||||
{
|
|
||||||
guint32 time;
|
|
||||||
float prev_x;
|
|
||||||
float prev_y;
|
|
||||||
float x;
|
|
||||||
float y;
|
|
||||||
float dx;
|
|
||||||
float dy;
|
|
||||||
} MetaBarrierEventData;
|
|
||||||
|
|
||||||
static void
|
|
||||||
emit_barrier_event (MetaBarrierImplNative *self,
|
|
||||||
guint32 time,
|
|
||||||
float prev_x,
|
|
||||||
float prev_y,
|
|
||||||
float x,
|
|
||||||
float y,
|
|
||||||
float dx,
|
|
||||||
float dy)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNativePrivate *priv =
|
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
MetaBarrier *barrier = priv->barrier;
|
|
||||||
MetaBarrierEvent *event = g_slice_new0 (MetaBarrierEvent);
|
|
||||||
MetaBarrierState old_state = priv->state;
|
|
||||||
|
|
||||||
switch (priv->state)
|
|
||||||
{
|
|
||||||
case META_BARRIER_STATE_HIT:
|
|
||||||
priv->state = META_BARRIER_STATE_HELD;
|
|
||||||
priv->trigger_serial = next_serial ();
|
|
||||||
event->dt = 0;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case META_BARRIER_STATE_RELEASE:
|
|
||||||
case META_BARRIER_STATE_LEFT:
|
|
||||||
priv->state = META_BARRIER_STATE_ACTIVE;
|
|
||||||
|
|
||||||
/* Intentional fall-through. */
|
|
||||||
case META_BARRIER_STATE_HELD:
|
|
||||||
event->dt = time - priv->last_event_time;
|
|
||||||
|
|
||||||
break;
|
|
||||||
case META_BARRIER_STATE_ACTIVE:
|
|
||||||
g_assert_not_reached (); /* Invalid state. */
|
|
||||||
}
|
|
||||||
|
|
||||||
event->ref_count = 1;
|
|
||||||
event->event_id = priv->trigger_serial;
|
|
||||||
event->time = time;
|
|
||||||
|
|
||||||
event->x = x;
|
|
||||||
event->y = y;
|
|
||||||
event->dx = dx;
|
|
||||||
event->dy = dy;
|
|
||||||
|
|
||||||
event->grabbed = priv->state == META_BARRIER_STATE_HELD;
|
|
||||||
event->released = old_state == META_BARRIER_STATE_RELEASE;
|
|
||||||
|
|
||||||
priv->last_event_time = time;
|
|
||||||
|
|
||||||
if (priv->state == META_BARRIER_STATE_HELD)
|
|
||||||
_meta_barrier_emit_hit_signal (barrier, event);
|
|
||||||
else
|
|
||||||
_meta_barrier_emit_left_signal (barrier, event);
|
|
||||||
|
|
||||||
meta_barrier_event_unref (event);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
maybe_emit_barrier_event (gpointer key, gpointer value, gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNative *self = key;
|
|
||||||
MetaBarrierImplNativePrivate *priv =
|
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
MetaBarrierEventData *data = user_data;
|
|
||||||
|
|
||||||
switch (priv->state) {
|
|
||||||
case META_BARRIER_STATE_ACTIVE:
|
|
||||||
break;
|
|
||||||
case META_BARRIER_STATE_HIT:
|
|
||||||
case META_BARRIER_STATE_HELD:
|
|
||||||
case META_BARRIER_STATE_RELEASE:
|
|
||||||
case META_BARRIER_STATE_LEFT:
|
|
||||||
emit_barrier_event (self,
|
|
||||||
data->time,
|
|
||||||
data->prev_x,
|
|
||||||
data->prev_y,
|
|
||||||
data->x,
|
|
||||||
data->y,
|
|
||||||
data->dx,
|
|
||||||
data->dy);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clamp (x, y) to the barrier and remove clamped direction from motion_dir. */
|
|
||||||
static void
|
|
||||||
clamp_to_barrier (MetaBarrierImplNative *self,
|
|
||||||
MetaBarrierDirection *motion_dir,
|
|
||||||
float *x,
|
|
||||||
float *y)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNativePrivate *priv =
|
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
MetaBarrier *barrier = priv->barrier;
|
|
||||||
|
|
||||||
if (is_barrier_horizontal (barrier))
|
|
||||||
{
|
|
||||||
if (*motion_dir & META_BARRIER_DIRECTION_POSITIVE_Y)
|
|
||||||
*y = barrier->priv->y1;
|
|
||||||
else if (*motion_dir & META_BARRIER_DIRECTION_NEGATIVE_Y)
|
|
||||||
*y = barrier->priv->y1;
|
|
||||||
|
|
||||||
priv->blocked_dir = *motion_dir & (META_BARRIER_DIRECTION_POSITIVE_Y |
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_Y);
|
|
||||||
*motion_dir &= ~(META_BARRIER_DIRECTION_POSITIVE_Y |
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_Y);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (*motion_dir & META_BARRIER_DIRECTION_POSITIVE_X)
|
|
||||||
*x = barrier->priv->x1;
|
|
||||||
else if (*motion_dir & META_BARRIER_DIRECTION_NEGATIVE_X)
|
|
||||||
*x = barrier->priv->x1;
|
|
||||||
|
|
||||||
priv->blocked_dir = *motion_dir & (META_BARRIER_DIRECTION_POSITIVE_X |
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_X);
|
|
||||||
*motion_dir &= ~(META_BARRIER_DIRECTION_POSITIVE_X |
|
|
||||||
META_BARRIER_DIRECTION_NEGATIVE_X);
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->state = META_BARRIER_STATE_HIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_barrier_manager_native_process (MetaBarrierManagerNative *manager,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
guint32 time,
|
|
||||||
float *x,
|
|
||||||
float *y)
|
|
||||||
{
|
|
||||||
ClutterPoint prev_pos;
|
|
||||||
float prev_x;
|
|
||||||
float prev_y;
|
|
||||||
float orig_x = *x;
|
|
||||||
float orig_y = *y;
|
|
||||||
MetaBarrierDirection motion_dir = 0;
|
|
||||||
MetaBarrierEventData barrier_event_data;
|
|
||||||
MetaBarrierImplNative *barrier_impl;
|
|
||||||
|
|
||||||
if (!clutter_input_device_get_coords (device, NULL, &prev_pos))
|
|
||||||
return;
|
|
||||||
|
|
||||||
prev_x = prev_pos.x;
|
|
||||||
prev_y = prev_pos.y;
|
|
||||||
|
|
||||||
/* Get the direction of the motion vector. */
|
|
||||||
if (prev_x < *x)
|
|
||||||
motion_dir |= META_BARRIER_DIRECTION_POSITIVE_X;
|
|
||||||
else if (prev_x > *x)
|
|
||||||
motion_dir |= META_BARRIER_DIRECTION_NEGATIVE_X;
|
|
||||||
if (prev_y < *y)
|
|
||||||
motion_dir |= META_BARRIER_DIRECTION_POSITIVE_Y;
|
|
||||||
else if (prev_y > *y)
|
|
||||||
motion_dir |= META_BARRIER_DIRECTION_NEGATIVE_Y;
|
|
||||||
|
|
||||||
/* Clamp to the closest barrier in any direction until either there are no
|
|
||||||
* more barriers to clamp to or all directions have been clamped. */
|
|
||||||
while (motion_dir != 0)
|
|
||||||
{
|
|
||||||
if (get_closest_barrier (manager,
|
|
||||||
prev_x, prev_y,
|
|
||||||
*x, *y,
|
|
||||||
motion_dir,
|
|
||||||
&barrier_impl))
|
|
||||||
clamp_to_barrier (barrier_impl, &motion_dir, x, y);
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Potentially release active barrier movements. */
|
|
||||||
maybe_release_barriers (manager, prev_x, prev_y, *x, *y);
|
|
||||||
|
|
||||||
/* Initiate or continue barrier interaction. */
|
|
||||||
barrier_event_data = (MetaBarrierEventData) {
|
|
||||||
.time = time,
|
|
||||||
.prev_x = prev_x,
|
|
||||||
.prev_y = prev_y,
|
|
||||||
.x = *x,
|
|
||||||
.y = *y,
|
|
||||||
.dx = orig_x - prev_x,
|
|
||||||
.dy = orig_y - prev_y,
|
|
||||||
};
|
|
||||||
|
|
||||||
g_hash_table_foreach (manager->barriers,
|
|
||||||
maybe_emit_barrier_event,
|
|
||||||
&barrier_event_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
_meta_barrier_impl_native_is_active (MetaBarrierImpl *impl)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNative *self = META_BARRIER_IMPL_NATIVE (impl);
|
|
||||||
MetaBarrierImplNativePrivate *priv =
|
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
|
|
||||||
return priv->is_active;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_meta_barrier_impl_native_release (MetaBarrierImpl *impl,
|
|
||||||
MetaBarrierEvent *event)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNative *self = META_BARRIER_IMPL_NATIVE (impl);
|
|
||||||
MetaBarrierImplNativePrivate *priv =
|
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
|
|
||||||
if (priv->state == META_BARRIER_STATE_HELD &&
|
|
||||||
event->event_id == priv->trigger_serial)
|
|
||||||
priv->state = META_BARRIER_STATE_RELEASE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_meta_barrier_impl_native_destroy (MetaBarrierImpl *impl)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNative *self = META_BARRIER_IMPL_NATIVE (impl);
|
|
||||||
MetaBarrierImplNativePrivate *priv =
|
|
||||||
meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
|
|
||||||
g_hash_table_remove (priv->manager->barriers, self);
|
|
||||||
priv->is_active = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaBarrierImpl *
|
|
||||||
meta_barrier_impl_native_new (MetaBarrier *barrier)
|
|
||||||
{
|
|
||||||
MetaBarrierImplNative *self;
|
|
||||||
MetaBarrierImplNativePrivate *priv;
|
|
||||||
MetaBackendNative *native;
|
|
||||||
MetaBarrierManagerNative *manager;
|
|
||||||
|
|
||||||
self = g_object_new (META_TYPE_BARRIER_IMPL_NATIVE, NULL);
|
|
||||||
priv = meta_barrier_impl_native_get_instance_private (self);
|
|
||||||
|
|
||||||
priv->barrier = barrier;
|
|
||||||
priv->is_active = TRUE;
|
|
||||||
|
|
||||||
native = META_BACKEND_NATIVE (meta_get_backend ());
|
|
||||||
manager = meta_backend_native_get_barrier_manager (native);
|
|
||||||
priv->manager = manager;
|
|
||||||
g_hash_table_add (manager->barriers, self);
|
|
||||||
|
|
||||||
return META_BARRIER_IMPL (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_barrier_impl_native_class_init (MetaBarrierImplNativeClass *klass)
|
|
||||||
{
|
|
||||||
MetaBarrierImplClass *impl_class = META_BARRIER_IMPL_CLASS (klass);
|
|
||||||
|
|
||||||
impl_class->is_active = _meta_barrier_impl_native_is_active;
|
|
||||||
impl_class->release = _meta_barrier_impl_native_release;
|
|
||||||
impl_class->destroy = _meta_barrier_impl_native_destroy;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_barrier_impl_native_init (MetaBarrierImplNative *self)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaBarrierManagerNative *
|
|
||||||
meta_barrier_manager_native_new (void)
|
|
||||||
{
|
|
||||||
MetaBarrierManagerNative *manager;
|
|
||||||
|
|
||||||
manager = g_new0 (MetaBarrierManagerNative, 1);
|
|
||||||
|
|
||||||
manager->barriers = g_hash_table_new (NULL, NULL);
|
|
||||||
|
|
||||||
return manager;
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2015 Red Hat
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Written by:
|
|
||||||
* Jonas Ådahl <jadahl@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef META_BARRIER_NATIVE_H
|
|
||||||
#define META_BARRIER_NATIVE_H
|
|
||||||
|
|
||||||
#include "backends/meta-barrier-private.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define META_TYPE_BARRIER_IMPL_NATIVE (meta_barrier_impl_native_get_type ())
|
|
||||||
#define META_BARRIER_IMPL_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BARRIER_IMPL_NATIVE, MetaBarrierImplNative))
|
|
||||||
#define META_BARRIER_IMPL_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_BARRIER_IMPL_NATIVE, MetaBarrierImplNativeClass))
|
|
||||||
#define META_IS_BARRIER_IMPL_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BARRIER_IMPL_NATIVE))
|
|
||||||
#define META_IS_BARRIER_IMPL_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_BARRIER_IMPL_NATIVE))
|
|
||||||
#define META_BARRIER_IMPL_NATIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_BARRIER_IMPL_NATIVE, MetaBarrierImplNativeClass))
|
|
||||||
|
|
||||||
typedef struct _MetaBarrierImplNative MetaBarrierImplNative;
|
|
||||||
typedef struct _MetaBarrierImplNativeClass MetaBarrierImplNativeClass;
|
|
||||||
typedef struct _MetaBarrierImplNativePrivate MetaBarrierImplNativePrivate;
|
|
||||||
|
|
||||||
typedef struct _MetaBarrierManagerNative MetaBarrierManagerNative;
|
|
||||||
|
|
||||||
struct _MetaBarrierImplNative
|
|
||||||
{
|
|
||||||
MetaBarrierImpl parent;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaBarrierImplNativeClass
|
|
||||||
{
|
|
||||||
MetaBarrierImplClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
GType meta_barrier_impl_native_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
MetaBarrierImpl *meta_barrier_impl_native_new (MetaBarrier *barrier);
|
|
||||||
|
|
||||||
MetaBarrierManagerNative *meta_barrier_manager_native_new (void);
|
|
||||||
void meta_barrier_manager_native_process (MetaBarrierManagerNative *manager,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
guint32 time,
|
|
||||||
float *x,
|
|
||||||
float *y);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* META_BARRIER_NATIVE_H */
|
|
||||||
@@ -27,30 +27,16 @@
|
|||||||
#include "meta-cursor-renderer-native.h"
|
#include "meta-cursor-renderer-native.h"
|
||||||
|
|
||||||
#include <gbm.h>
|
#include <gbm.h>
|
||||||
#include <xf86drm.h>
|
|
||||||
|
|
||||||
#include "meta-cursor-private.h"
|
#include "meta-cursor-private.h"
|
||||||
#include "meta-monitor-manager-private.h"
|
#include "meta-monitor-manager.h"
|
||||||
|
|
||||||
#ifndef DRM_CAP_CURSOR_WIDTH
|
|
||||||
#define DRM_CAP_CURSOR_WIDTH 0x8
|
|
||||||
#endif
|
|
||||||
#ifndef DRM_CAP_CURSOR_HEIGHT
|
|
||||||
#define DRM_CAP_CURSOR_HEIGHT 0x9
|
|
||||||
#endif
|
|
||||||
|
|
||||||
struct _MetaCursorRendererNativePrivate
|
struct _MetaCursorRendererNativePrivate
|
||||||
{
|
{
|
||||||
gboolean has_hw_cursor;
|
gboolean has_hw_cursor;
|
||||||
|
|
||||||
MetaCursorReference *last_cursor;
|
|
||||||
guint animation_timeout_id;
|
|
||||||
|
|
||||||
int drm_fd;
|
int drm_fd;
|
||||||
struct gbm_device *gbm;
|
struct gbm_device *gbm;
|
||||||
|
|
||||||
uint64_t cursor_width;
|
|
||||||
uint64_t cursor_height;
|
|
||||||
};
|
};
|
||||||
typedef struct _MetaCursorRendererNativePrivate MetaCursorRendererNativePrivate;
|
typedef struct _MetaCursorRendererNativePrivate MetaCursorRendererNativePrivate;
|
||||||
|
|
||||||
@@ -62,9 +48,6 @@ meta_cursor_renderer_native_finalize (GObject *object)
|
|||||||
MetaCursorRendererNative *renderer = META_CURSOR_RENDERER_NATIVE (object);
|
MetaCursorRendererNative *renderer = META_CURSOR_RENDERER_NATIVE (object);
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (renderer);
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (renderer);
|
||||||
|
|
||||||
if (priv->animation_timeout_id)
|
|
||||||
g_source_remove (priv->animation_timeout_id);
|
|
||||||
|
|
||||||
if (priv->gbm)
|
if (priv->gbm)
|
||||||
gbm_device_destroy (priv->gbm);
|
gbm_device_destroy (priv->gbm);
|
||||||
|
|
||||||
@@ -88,13 +71,17 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
|||||||
{
|
{
|
||||||
struct gbm_bo *bo;
|
struct gbm_bo *bo;
|
||||||
union gbm_bo_handle handle;
|
union gbm_bo_handle handle;
|
||||||
int hot_x, hot_y;
|
int width, height;
|
||||||
|
int offset_x, offset_y;
|
||||||
|
|
||||||
bo = meta_cursor_reference_get_gbm_bo (cursor, &hot_x, &hot_y);
|
bo = meta_cursor_reference_get_gbm_bo (cursor, &offset_x, &offset_y);
|
||||||
|
|
||||||
handle = gbm_bo_get_handle (bo);
|
handle = gbm_bo_get_handle (bo);
|
||||||
|
width = gbm_bo_get_width (bo);
|
||||||
|
height = gbm_bo_get_height (bo);
|
||||||
|
|
||||||
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, handle.u32,
|
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, handle.u32,
|
||||||
priv->cursor_width, priv->cursor_height, hot_x, hot_y);
|
width, height, -offset_x, -offset_y);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -153,66 +140,12 @@ should_have_hw_cursor (MetaCursorRenderer *renderer)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
meta_cursor_renderer_native_update_animation (MetaCursorRendererNative *native)
|
|
||||||
{
|
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
|
||||||
MetaCursorReference *cursor;
|
|
||||||
|
|
||||||
priv->animation_timeout_id = 0;
|
|
||||||
cursor = meta_cursor_renderer_get_cursor (META_CURSOR_RENDERER (native));
|
|
||||||
meta_cursor_reference_tick_frame (cursor);
|
|
||||||
meta_cursor_renderer_force_update (META_CURSOR_RENDERER (native));
|
|
||||||
meta_cursor_renderer_native_force_update (native);
|
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_cursor_renderer_native_trigger_frame (MetaCursorRendererNative *native)
|
|
||||||
{
|
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
|
||||||
MetaCursorReference *cursor;
|
|
||||||
gboolean cursor_change;
|
|
||||||
guint delay;
|
|
||||||
|
|
||||||
cursor = meta_cursor_renderer_get_cursor (META_CURSOR_RENDERER (native));
|
|
||||||
cursor_change = cursor != priv->last_cursor;
|
|
||||||
priv->last_cursor = cursor;
|
|
||||||
|
|
||||||
if (!cursor_change && priv->animation_timeout_id)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (priv->animation_timeout_id)
|
|
||||||
{
|
|
||||||
g_source_remove (priv->animation_timeout_id);
|
|
||||||
priv->animation_timeout_id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cursor && meta_cursor_reference_is_animated (cursor))
|
|
||||||
{
|
|
||||||
delay = meta_cursor_reference_get_current_frame_time (cursor);
|
|
||||||
|
|
||||||
if (delay == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
priv->animation_timeout_id =
|
|
||||||
g_timeout_add (delay,
|
|
||||||
(GSourceFunc) meta_cursor_renderer_native_update_animation,
|
|
||||||
native);
|
|
||||||
g_source_set_name_by_id (priv->animation_timeout_id,
|
|
||||||
"[mutter] meta_cursor_renderer_native_update_animation");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer)
|
meta_cursor_renderer_native_update_cursor (MetaCursorRenderer *renderer)
|
||||||
{
|
{
|
||||||
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||||
|
|
||||||
meta_cursor_renderer_native_trigger_frame (native);
|
|
||||||
|
|
||||||
priv->has_hw_cursor = should_have_hw_cursor (renderer);
|
priv->has_hw_cursor = should_have_hw_cursor (renderer);
|
||||||
update_hw_cursor (native, FALSE);
|
update_hw_cursor (native, FALSE);
|
||||||
return priv->has_hw_cursor;
|
return priv->has_hw_cursor;
|
||||||
@@ -253,19 +186,6 @@ meta_cursor_renderer_native_init (MetaCursorRendererNative *native)
|
|||||||
CoglRenderer *cogl_renderer = cogl_display_get_renderer (cogl_context_get_display (ctx));
|
CoglRenderer *cogl_renderer = cogl_display_get_renderer (cogl_context_get_display (ctx));
|
||||||
priv->drm_fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
priv->drm_fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
||||||
priv->gbm = gbm_create_device (priv->drm_fd);
|
priv->gbm = gbm_create_device (priv->drm_fd);
|
||||||
|
|
||||||
uint64_t width, height;
|
|
||||||
if (drmGetCap (priv->drm_fd, DRM_CAP_CURSOR_WIDTH, &width) == 0 &&
|
|
||||||
drmGetCap (priv->drm_fd, DRM_CAP_CURSOR_HEIGHT, &height) == 0)
|
|
||||||
{
|
|
||||||
priv->cursor_width = width;
|
|
||||||
priv->cursor_height = height;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
priv->cursor_width = 64;
|
|
||||||
priv->cursor_height = 64;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -278,16 +198,6 @@ meta_cursor_renderer_native_get_gbm_device (MetaCursorRendererNative *native)
|
|||||||
return priv->gbm;
|
return priv->gbm;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_cursor_renderer_native_get_cursor_size (MetaCursorRendererNative *native,
|
|
||||||
uint64_t *width, uint64_t *height)
|
|
||||||
{
|
|
||||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
|
||||||
|
|
||||||
*width = priv->cursor_width;
|
|
||||||
*height = priv->cursor_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_cursor_renderer_native_force_update (MetaCursorRendererNative *native)
|
meta_cursor_renderer_native_force_update (MetaCursorRendererNative *native)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ struct _MetaCursorRendererNativeClass
|
|||||||
GType meta_cursor_renderer_native_get_type (void) G_GNUC_CONST;
|
GType meta_cursor_renderer_native_get_type (void) G_GNUC_CONST;
|
||||||
|
|
||||||
struct gbm_device * meta_cursor_renderer_native_get_gbm_device (MetaCursorRendererNative *renderer);
|
struct gbm_device * meta_cursor_renderer_native_get_gbm_device (MetaCursorRendererNative *renderer);
|
||||||
void meta_cursor_renderer_native_get_cursor_size (MetaCursorRendererNative *native, uint64_t *width, uint64_t *height);
|
|
||||||
void meta_cursor_renderer_native_force_update (MetaCursorRendererNative *renderer);
|
void meta_cursor_renderer_native_force_update (MetaCursorRendererNative *renderer);
|
||||||
|
|
||||||
#endif /* META_CURSOR_RENDERER_NATIVE_H */
|
#endif /* META_CURSOR_RENDERER_NATIVE_H */
|
||||||
|
|||||||
@@ -1,264 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2014 Red Hat
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include <clutter/evdev/clutter-evdev.h>
|
|
||||||
#include <libinput.h>
|
|
||||||
|
|
||||||
#include "meta-input-settings-native.h"
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaInputSettingsNative, meta_input_settings_native, META_TYPE_INPUT_SETTINGS)
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_send_events (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
GDesktopDeviceSendEvents mode)
|
|
||||||
{
|
|
||||||
enum libinput_config_send_events_mode libinput_mode;
|
|
||||||
struct libinput_device *libinput_device;
|
|
||||||
|
|
||||||
switch (mode)
|
|
||||||
{
|
|
||||||
case G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED:
|
|
||||||
libinput_mode = LIBINPUT_CONFIG_SEND_EVENTS_DISABLED;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE:
|
|
||||||
libinput_mode = LIBINPUT_CONFIG_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_DEVICE_SEND_EVENTS_ENABLED:
|
|
||||||
libinput_mode = LIBINPUT_CONFIG_SEND_EVENTS_ENABLED;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
|
||||||
libinput_device_config_send_events_set_mode (libinput_device, libinput_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_matrix (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gfloat matrix[6])
|
|
||||||
{
|
|
||||||
struct libinput_device *libinput_device;
|
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
|
||||||
|
|
||||||
if (libinput_device_config_calibration_has_matrix (libinput_device) > 0)
|
|
||||||
libinput_device_config_calibration_set_matrix (libinput_device, matrix);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_speed (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gdouble speed)
|
|
||||||
{
|
|
||||||
struct libinput_device *libinput_device;
|
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
|
||||||
libinput_device_config_accel_set_speed (libinput_device,
|
|
||||||
CLAMP (speed, -1, 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_left_handed (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean enabled)
|
|
||||||
{
|
|
||||||
struct libinput_device *libinput_device;
|
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
|
||||||
|
|
||||||
if (libinput_device_config_left_handed_is_available (libinput_device))
|
|
||||||
libinput_device_config_left_handed_set (libinput_device, enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_tap_enabled (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean enabled)
|
|
||||||
{
|
|
||||||
struct libinput_device *libinput_device;
|
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
|
||||||
|
|
||||||
if (libinput_device_config_tap_get_finger_count (libinput_device) > 0)
|
|
||||||
libinput_device_config_tap_set_enabled (libinput_device,
|
|
||||||
enabled ?
|
|
||||||
LIBINPUT_CONFIG_TAP_ENABLED :
|
|
||||||
LIBINPUT_CONFIG_TAP_DISABLED);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_invert_scroll (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean inverted)
|
|
||||||
{
|
|
||||||
struct libinput_device *libinput_device;
|
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
|
||||||
|
|
||||||
if (libinput_device_config_scroll_has_natural_scroll (libinput_device))
|
|
||||||
libinput_device_config_scroll_set_natural_scroll_enabled (libinput_device,
|
|
||||||
inverted);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
device_set_scroll_method (struct libinput_device *libinput_device,
|
|
||||||
enum libinput_config_scroll_method method)
|
|
||||||
{
|
|
||||||
enum libinput_config_scroll_method supported;
|
|
||||||
|
|
||||||
supported = libinput_device_config_scroll_get_methods (libinput_device);
|
|
||||||
|
|
||||||
if (method & supported)
|
|
||||||
libinput_device_config_scroll_set_method (libinput_device, method);
|
|
||||||
|
|
||||||
return (method & supported) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
device_set_click_method (struct libinput_device *libinput_device,
|
|
||||||
enum libinput_config_click_method method)
|
|
||||||
{
|
|
||||||
enum libinput_config_click_method supported;
|
|
||||||
|
|
||||||
supported = libinput_device_config_click_get_methods (libinput_device);
|
|
||||||
|
|
||||||
if (method & supported)
|
|
||||||
libinput_device_config_click_set_method (libinput_device, method);
|
|
||||||
|
|
||||||
return (method & supported) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_scroll_method (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
GDesktopTouchpadScrollMethod mode)
|
|
||||||
{
|
|
||||||
enum libinput_config_scroll_method scroll_method = 0;
|
|
||||||
struct libinput_device *libinput_device;
|
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
|
||||||
|
|
||||||
switch (mode)
|
|
||||||
{
|
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_DISABLED:
|
|
||||||
scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_EDGE_SCROLLING:
|
|
||||||
scroll_method = LIBINPUT_CONFIG_SCROLL_EDGE;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_TWO_FINGER_SCROLLING:
|
|
||||||
scroll_method = LIBINPUT_CONFIG_SCROLL_2FG;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
device_set_scroll_method (libinput_device, scroll_method);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_scroll_button (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
guint button)
|
|
||||||
{
|
|
||||||
struct libinput_device *libinput_device;
|
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
|
||||||
|
|
||||||
if (!device_set_scroll_method (libinput_device,
|
|
||||||
LIBINPUT_CONFIG_SCROLL_ON_BUTTON_DOWN))
|
|
||||||
return;
|
|
||||||
|
|
||||||
libinput_device_config_scroll_set_button (libinput_device, button);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_click_method (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
GDesktopTouchpadClickMethod mode)
|
|
||||||
{
|
|
||||||
enum libinput_config_click_method click_method = 0;
|
|
||||||
struct libinput_device *libinput_device;
|
|
||||||
|
|
||||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
|
||||||
|
|
||||||
switch (mode)
|
|
||||||
{
|
|
||||||
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_DEFAULT:
|
|
||||||
click_method = libinput_device_config_click_get_default_method (libinput_device);
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_NONE:
|
|
||||||
click_method = LIBINPUT_CONFIG_CLICK_METHOD_NONE;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_AREAS:
|
|
||||||
click_method = LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_FINGERS:
|
|
||||||
click_method = LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
device_set_click_method (libinput_device, click_method);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_set_keyboard_repeat (MetaInputSettings *settings,
|
|
||||||
gboolean enabled,
|
|
||||||
guint delay,
|
|
||||||
guint interval)
|
|
||||||
{
|
|
||||||
ClutterDeviceManager *manager = clutter_device_manager_get_default ();
|
|
||||||
|
|
||||||
clutter_evdev_set_keyboard_repeat (manager, enabled, delay, interval);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class = META_INPUT_SETTINGS_CLASS (klass);
|
|
||||||
|
|
||||||
input_settings_class->set_send_events = meta_input_settings_native_set_send_events;
|
|
||||||
input_settings_class->set_matrix = meta_input_settings_native_set_matrix;
|
|
||||||
input_settings_class->set_speed = meta_input_settings_native_set_speed;
|
|
||||||
input_settings_class->set_left_handed = meta_input_settings_native_set_left_handed;
|
|
||||||
input_settings_class->set_tap_enabled = meta_input_settings_native_set_tap_enabled;
|
|
||||||
input_settings_class->set_invert_scroll = meta_input_settings_native_set_invert_scroll;
|
|
||||||
input_settings_class->set_scroll_method = meta_input_settings_native_set_scroll_method;
|
|
||||||
input_settings_class->set_scroll_button = meta_input_settings_native_set_scroll_button;
|
|
||||||
input_settings_class->set_click_method = meta_input_settings_native_set_click_method;
|
|
||||||
input_settings_class->set_keyboard_repeat = meta_input_settings_native_set_keyboard_repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_native_init (MetaInputSettingsNative *settings)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 2014 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef META_INPUT_SETTINGS_NATIVE_H
|
|
||||||
#define META_INPUT_SETTINGS_NATIVE_H
|
|
||||||
|
|
||||||
#include "meta-input-settings-private.h"
|
|
||||||
|
|
||||||
#define META_TYPE_INPUT_SETTINGS_NATIVE (meta_input_settings_native_get_type ())
|
|
||||||
#define META_INPUT_SETTINGS_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_INPUT_SETTINGS_NATIVE, MetaInputSettingsNative))
|
|
||||||
#define META_INPUT_SETTINGS_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_INPUT_SETTINGS_NATIVE, MetaInputSettingsNativeClass))
|
|
||||||
#define META_IS_INPUT_SETTINGS_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_INPUT_SETTINGS_NATIVE))
|
|
||||||
#define META_IS_INPUT_SETTINGS_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_INPUT_SETTINGS_NATIVE))
|
|
||||||
#define META_INPUT_SETTINGS_NATIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_INPUT_SETTINGS_NATIVE, MetaInputSettingsNativeClass))
|
|
||||||
|
|
||||||
typedef struct _MetaInputSettingsNative MetaInputSettingsNative;
|
|
||||||
typedef struct _MetaInputSettingsNativeClass MetaInputSettingsNativeClass;
|
|
||||||
|
|
||||||
struct _MetaInputSettingsNative
|
|
||||||
{
|
|
||||||
MetaInputSettings parent_instance;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaInputSettingsNativeClass
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
GType meta_input_settings_native_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
#endif /* META_INPUT_SETTINGS_NATIVE_H */
|
|
||||||
@@ -43,7 +43,6 @@
|
|||||||
|
|
||||||
#include "backends/meta-backend-private.h"
|
#include "backends/meta-backend-private.h"
|
||||||
#include "meta-cursor-renderer-native.h"
|
#include "meta-cursor-renderer-native.h"
|
||||||
#include "meta-idle-monitor-native.h"
|
|
||||||
|
|
||||||
struct _MetaLauncher
|
struct _MetaLauncher
|
||||||
{
|
{
|
||||||
@@ -111,7 +110,6 @@ session_unpause (void)
|
|||||||
|
|
||||||
clutter_actor_queue_redraw (stage);
|
clutter_actor_queue_redraw (stage);
|
||||||
meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
|
meta_cursor_renderer_native_force_update (META_CURSOR_RENDERER_NATIVE (renderer));
|
||||||
meta_idle_monitor_native_reset_idletime (meta_idle_monitor_get_core ());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -130,9 +128,10 @@ take_device (Login1Session *session_proxy,
|
|||||||
GCancellable *cancellable,
|
GCancellable *cancellable,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
g_autoptr (GVariant) fd_variant = NULL;
|
gboolean ret = FALSE;
|
||||||
g_autoptr (GUnixFDList) fd_list = NULL;
|
GVariant *fd_variant = NULL;
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
|
GUnixFDList *fd_list;
|
||||||
|
|
||||||
if (!login1_session_call_take_device_sync (session_proxy,
|
if (!login1_session_call_take_device_sync (session_proxy,
|
||||||
dev_major,
|
dev_major,
|
||||||
@@ -143,14 +142,21 @@ take_device (Login1Session *session_proxy,
|
|||||||
&fd_list,
|
&fd_list,
|
||||||
cancellable,
|
cancellable,
|
||||||
error))
|
error))
|
||||||
return FALSE;
|
goto out;
|
||||||
|
|
||||||
fd = g_unix_fd_list_get (fd_list, g_variant_get_handle (fd_variant), error);
|
fd = g_unix_fd_list_get (fd_list, g_variant_get_handle (fd_variant), error);
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
return FALSE;
|
goto out;
|
||||||
|
|
||||||
*out_fd = fd;
|
*out_fd = fd;
|
||||||
return TRUE;
|
ret = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (fd_variant)
|
||||||
|
g_variant_unref (fd_variant);
|
||||||
|
if (fd_list)
|
||||||
|
g_object_unref (fd_list);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -158,16 +164,22 @@ get_device_info_from_path (const char *path,
|
|||||||
int *out_major,
|
int *out_major,
|
||||||
int *out_minor)
|
int *out_minor)
|
||||||
{
|
{
|
||||||
|
gboolean ret = FALSE;
|
||||||
int r;
|
int r;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
r = stat (path, &st);
|
r = stat (path, &st);
|
||||||
if (r < 0 || !S_ISCHR (st.st_mode))
|
if (r < 0)
|
||||||
return FALSE;
|
goto out;
|
||||||
|
if (!S_ISCHR (st.st_mode))
|
||||||
|
goto out;
|
||||||
|
|
||||||
*out_major = major (st.st_rdev);
|
*out_major = major (st.st_rdev);
|
||||||
*out_minor = minor (st.st_rdev);
|
*out_minor = minor (st.st_rdev);
|
||||||
return TRUE;
|
ret = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -175,16 +187,22 @@ get_device_info_from_fd (int fd,
|
|||||||
int *out_major,
|
int *out_major,
|
||||||
int *out_minor)
|
int *out_minor)
|
||||||
{
|
{
|
||||||
|
gboolean ret = FALSE;
|
||||||
int r;
|
int r;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
r = fstat (fd, &st);
|
r = fstat (fd, &st);
|
||||||
if (r < 0 || !S_ISCHR (st.st_mode))
|
if (r < 0)
|
||||||
return FALSE;
|
goto out;
|
||||||
|
if (!S_ISCHR (st.st_mode))
|
||||||
|
goto out;
|
||||||
|
|
||||||
*out_major = major (st.st_rdev);
|
*out_major = major (st.st_rdev);
|
||||||
*out_minor = minor (st.st_rdev);
|
*out_minor = minor (st.st_rdev);
|
||||||
return TRUE;
|
ret = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -223,7 +241,7 @@ on_evdev_device_close (int fd,
|
|||||||
if (!get_device_info_from_fd (fd, &major, &minor))
|
if (!get_device_info_from_fd (fd, &major, &minor))
|
||||||
{
|
{
|
||||||
g_warning ("Could not get device info for fd %d: %m", fd);
|
g_warning ("Could not get device info for fd %d: %m", fd);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!login1_session_call_release_device_sync (self->session_proxy,
|
if (!login1_session_call_release_device_sync (self->session_proxy,
|
||||||
@@ -232,9 +250,6 @@ on_evdev_device_close (int fd,
|
|||||||
{
|
{
|
||||||
g_warning ("Could not release device %d,%d: %s", major, minor, error->message);
|
g_warning ("Could not release device %d,%d: %s", major, minor, error->message);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
|
||||||
close (fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -292,7 +307,7 @@ get_kms_fd (Login1Session *session_proxy,
|
|||||||
MetaLauncher *
|
MetaLauncher *
|
||||||
meta_launcher_new (void)
|
meta_launcher_new (void)
|
||||||
{
|
{
|
||||||
MetaLauncher *self = NULL;
|
MetaLauncher *self;
|
||||||
Login1Session *session_proxy;
|
Login1Session *session_proxy;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
int kms_fd;
|
int kms_fd;
|
||||||
@@ -302,14 +317,14 @@ meta_launcher_new (void)
|
|||||||
{
|
{
|
||||||
g_warning ("Could not take control: %s", error->message);
|
g_warning ("Could not take control: %s", error->message);
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
goto out;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!get_kms_fd (session_proxy, &kms_fd))
|
if (!get_kms_fd (session_proxy, &kms_fd))
|
||||||
goto out;
|
return NULL;
|
||||||
|
|
||||||
self = g_slice_new0 (MetaLauncher);
|
self = g_slice_new0 (MetaLauncher);
|
||||||
self->session_proxy = g_object_ref (session_proxy);
|
self->session_proxy = session_proxy;
|
||||||
self->seat_proxy = get_seat_proxy (NULL);
|
self->seat_proxy = get_seat_proxy (NULL);
|
||||||
|
|
||||||
self->session_active = TRUE;
|
self->session_active = TRUE;
|
||||||
@@ -321,9 +336,6 @@ meta_launcher_new (void)
|
|||||||
|
|
||||||
g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self);
|
g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self);
|
||||||
|
|
||||||
out:
|
|
||||||
g_object_unref (session_proxy);
|
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,6 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "meta-monitor-manager-kms.h"
|
#include "meta-monitor-manager-kms.h"
|
||||||
#include "meta-monitor-config.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -39,8 +38,7 @@
|
|||||||
|
|
||||||
#include <meta/main.h>
|
#include <meta/main.h>
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
|
#include "edid.h"
|
||||||
#include <gudev/gudev.h>
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
drmModeConnector *connector;
|
drmModeConnector *connector;
|
||||||
@@ -55,19 +53,8 @@ typedef struct {
|
|||||||
|
|
||||||
uint32_t dpms_prop_id;
|
uint32_t dpms_prop_id;
|
||||||
uint32_t edid_blob_id;
|
uint32_t edid_blob_id;
|
||||||
uint32_t tile_blob_id;
|
|
||||||
|
|
||||||
int suggested_x;
|
|
||||||
int suggested_y;
|
|
||||||
uint32_t hotplug_mode_update;
|
|
||||||
} MetaOutputKms;
|
} MetaOutputKms;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t underscan_prop_id;
|
|
||||||
uint32_t underscan_hborder_prop_id;
|
|
||||||
uint32_t underscan_vborder_prop_id;
|
|
||||||
} MetaCRTCKms;
|
|
||||||
|
|
||||||
struct _MetaMonitorManagerKms
|
struct _MetaMonitorManagerKms
|
||||||
{
|
{
|
||||||
MetaMonitorManager parent_instance;
|
MetaMonitorManager parent_instance;
|
||||||
@@ -77,9 +64,10 @@ struct _MetaMonitorManagerKms
|
|||||||
drmModeConnector **connectors;
|
drmModeConnector **connectors;
|
||||||
unsigned int n_connectors;
|
unsigned int n_connectors;
|
||||||
|
|
||||||
GUdevClient *udev;
|
drmModeEncoder **encoders;
|
||||||
|
unsigned int n_encoders;
|
||||||
|
|
||||||
GSettings *desktop_settings;
|
drmModeEncoder *current_encoder;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaMonitorManagerKmsClass
|
struct _MetaMonitorManagerKmsClass
|
||||||
@@ -94,9 +82,12 @@ free_resources (MetaMonitorManagerKms *manager_kms)
|
|||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
|
for (i = 0; i < manager_kms->n_encoders; i++)
|
||||||
|
drmModeFreeEncoder (manager_kms->encoders[i]);
|
||||||
for (i = 0; i < manager_kms->n_connectors; i++)
|
for (i = 0; i < manager_kms->n_connectors; i++)
|
||||||
drmModeFreeConnector (manager_kms->connectors[i]);
|
drmModeFreeConnector (manager_kms->connectors[i]);
|
||||||
|
|
||||||
|
g_free (manager_kms->encoders);
|
||||||
g_free (manager_kms->connectors);
|
g_free (manager_kms->connectors);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,7 +106,7 @@ make_output_name (drmModeConnector *connector)
|
|||||||
static const char * const connector_type_names[] = {
|
static const char * const connector_type_names[] = {
|
||||||
"unknown", "VGA", "DVII", "DVID", "DVID", "Composite",
|
"unknown", "VGA", "DVII", "DVID", "DVID", "Composite",
|
||||||
"SVIDEO", "LVDS", "Component", "9PinDIN", "DisplayPort",
|
"SVIDEO", "LVDS", "Component", "9PinDIN", "DisplayPort",
|
||||||
"HDMIA", "HDMIB", "TV", "eDP", "Virtual", "DSI"
|
"HDMIA", "HDMIB", "TV", "eDP"
|
||||||
};
|
};
|
||||||
const char *connector_type_name;
|
const char *connector_type_name;
|
||||||
|
|
||||||
@@ -148,12 +139,6 @@ meta_monitor_mode_destroy_notify (MetaMonitorMode *output)
|
|||||||
g_slice_free (drmModeModeInfo, output->driver_private);
|
g_slice_free (drmModeModeInfo, output->driver_private);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_crtc_destroy_notify (MetaCRTC *crtc)
|
|
||||||
{
|
|
||||||
g_free (crtc->driver_private);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
drm_mode_equal (gconstpointer one,
|
drm_mode_equal (gconstpointer one,
|
||||||
gconstpointer two)
|
gconstpointer two)
|
||||||
@@ -198,69 +183,26 @@ drm_mode_hash (gconstpointer ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
find_connector_properties (MetaMonitorManagerKms *manager_kms,
|
find_properties (MetaMonitorManagerKms *manager_kms,
|
||||||
MetaOutputKms *output_kms)
|
MetaOutputKms *output_kms)
|
||||||
{
|
{
|
||||||
|
drmModePropertyPtr prop;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
output_kms->hotplug_mode_update = 0;
|
|
||||||
output_kms->suggested_x = -1;
|
|
||||||
output_kms->suggested_y = -1;
|
|
||||||
for (i = 0; i < output_kms->connector->count_props; i++)
|
for (i = 0; i < output_kms->connector->count_props; i++)
|
||||||
{
|
{
|
||||||
drmModePropertyPtr prop = drmModeGetProperty (manager_kms->fd, output_kms->connector->props[i]);
|
prop = drmModeGetProperty (manager_kms->fd, output_kms->connector->props[i]);
|
||||||
if (!prop)
|
if (!prop)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((prop->flags & DRM_MODE_PROP_ENUM) && strcmp (prop->name, "DPMS") == 0)
|
if ((prop->flags & DRM_MODE_PROP_ENUM) &&
|
||||||
|
strcmp(prop->name, "DPMS") == 0)
|
||||||
output_kms->dpms_prop_id = prop->prop_id;
|
output_kms->dpms_prop_id = prop->prop_id;
|
||||||
else if ((prop->flags & DRM_MODE_PROP_BLOB) && strcmp (prop->name, "EDID") == 0)
|
|
||||||
output_kms->edid_blob_id = output_kms->connector->prop_values[i];
|
|
||||||
else if ((prop->flags & DRM_MODE_PROP_BLOB) &&
|
else if ((prop->flags & DRM_MODE_PROP_BLOB) &&
|
||||||
strcmp (prop->name, "TILE") == 0)
|
strcmp (prop->name, "EDID") == 0)
|
||||||
output_kms->tile_blob_id = output_kms->connector->prop_values[i];
|
output_kms->edid_blob_id = output_kms->connector->prop_values[i];
|
||||||
else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
|
|
||||||
strcmp (prop->name, "suggested X") == 0)
|
|
||||||
output_kms->suggested_x = output_kms->connector->prop_values[i];
|
|
||||||
else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
|
|
||||||
strcmp (prop->name, "suggested Y") == 0)
|
|
||||||
output_kms->suggested_y = output_kms->connector->prop_values[i];
|
|
||||||
else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
|
|
||||||
strcmp (prop->name, "hotplug_mode_update") == 0)
|
|
||||||
output_kms->hotplug_mode_update = output_kms->connector->prop_values[i];
|
|
||||||
|
|
||||||
drmModeFreeProperty (prop);
|
drmModeFreeProperty(prop);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
find_crtc_properties (MetaMonitorManagerKms *manager_kms,
|
|
||||||
MetaCRTC *meta_crtc)
|
|
||||||
{
|
|
||||||
MetaCRTCKms *crtc_kms;
|
|
||||||
drmModeObjectPropertiesPtr props;
|
|
||||||
size_t i;
|
|
||||||
|
|
||||||
crtc_kms = meta_crtc->driver_private;
|
|
||||||
|
|
||||||
props = drmModeObjectGetProperties (manager_kms->fd, meta_crtc->crtc_id, DRM_MODE_OBJECT_CRTC);
|
|
||||||
if (!props)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < props->count_props; i++)
|
|
||||||
{
|
|
||||||
drmModePropertyPtr prop = drmModeGetProperty (manager_kms->fd, props->props[i]);
|
|
||||||
if (!prop)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if ((prop->flags & DRM_MODE_PROP_ENUM) && strcmp (prop->name, "underscan") == 0)
|
|
||||||
crtc_kms->underscan_prop_id = prop->prop_id;
|
|
||||||
else if ((prop->flags & DRM_MODE_PROP_RANGE) && strcmp (prop->name, "underscan hborder") == 0)
|
|
||||||
crtc_kms->underscan_hborder_prop_id = prop->prop_id;
|
|
||||||
else if ((prop->flags & DRM_MODE_PROP_RANGE) && strcmp (prop->name, "underscan vborder") == 0)
|
|
||||||
crtc_kms->underscan_vborder_prop_id = prop->prop_id;
|
|
||||||
|
|
||||||
drmModeFreeProperty (prop);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -282,10 +224,8 @@ read_output_edid (MetaMonitorManagerKms *manager_kms,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (edid_blob->length > 0)
|
if (edid_blob->length > 0)
|
||||||
{
|
|
||||||
return g_bytes_new_with_free_func (edid_blob->data, edid_blob->length,
|
return g_bytes_new_with_free_func (edid_blob->data, edid_blob->length,
|
||||||
(GDestroyNotify)drmModeFreePropertyBlob, edid_blob);
|
(GDestroyNotify)drmModeFreePropertyBlob, edid_blob);
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
drmModeFreePropertyBlob (edid_blob);
|
drmModeFreePropertyBlob (edid_blob);
|
||||||
@@ -293,47 +233,6 @@ read_output_edid (MetaMonitorManagerKms *manager_kms,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
output_get_tile_info (MetaMonitorManagerKms *manager_kms,
|
|
||||||
MetaOutput *output)
|
|
||||||
{
|
|
||||||
MetaOutputKms *output_kms = output->driver_private;
|
|
||||||
drmModePropertyBlobPtr tile_blob = NULL;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (output_kms->tile_blob_id == 0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
tile_blob = drmModeGetPropertyBlob (manager_kms->fd, output_kms->tile_blob_id);
|
|
||||||
if (!tile_blob)
|
|
||||||
{
|
|
||||||
meta_warning ("Failed to read TILE of output %s: %s\n", output->name, strerror(errno));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tile_blob->length > 0)
|
|
||||||
{
|
|
||||||
ret = sscanf ((char *)tile_blob->data, "%d:%d:%d:%d:%d:%d:%d:%d",
|
|
||||||
&output->tile_info.group_id,
|
|
||||||
&output->tile_info.flags,
|
|
||||||
&output->tile_info.max_h_tiles,
|
|
||||||
&output->tile_info.max_v_tiles,
|
|
||||||
&output->tile_info.loc_h_tile,
|
|
||||||
&output->tile_info.loc_v_tile,
|
|
||||||
&output->tile_info.tile_w,
|
|
||||||
&output->tile_info.tile_h);
|
|
||||||
|
|
||||||
if (ret != 8)
|
|
||||||
return FALSE;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
drmModeFreePropertyBlob (tile_blob);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static MetaMonitorMode *
|
static MetaMonitorMode *
|
||||||
find_meta_mode (MetaMonitorManager *manager,
|
find_meta_mode (MetaMonitorManager *manager,
|
||||||
const drmModeModeInfo *drm_mode)
|
const drmModeModeInfo *drm_mode)
|
||||||
@@ -364,77 +263,11 @@ find_output_by_id (MetaOutput *outputs,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The minimum resolution at which we turn on a window-scale of 2 */
|
|
||||||
#define HIDPI_LIMIT 192
|
|
||||||
|
|
||||||
/* The minimum screen height at which we turn on a window-scale of 2;
|
|
||||||
* below this there just isn't enough vertical real estate for GNOME
|
|
||||||
* apps to work, and it's better to just be tiny */
|
|
||||||
#define HIDPI_MIN_HEIGHT 1200
|
|
||||||
|
|
||||||
/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */
|
|
||||||
#define SMALLEST_4K_WIDTH 3656
|
|
||||||
|
|
||||||
/* Based on code from gnome-settings-daemon */
|
|
||||||
static int
|
|
||||||
compute_scale (MetaOutput *output)
|
|
||||||
{
|
|
||||||
int scale = 1;
|
|
||||||
|
|
||||||
if (!output->crtc)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* Scaling makes no sense */
|
|
||||||
if (output->crtc->rect.width < HIDPI_MIN_HEIGHT)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* 4K TV */
|
|
||||||
if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
|
|
||||||
output->crtc->rect.width >= SMALLEST_4K_WIDTH)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* Somebody encoded the aspect ratio (16/9 or 16/10)
|
|
||||||
* instead of the physical size */
|
|
||||||
if ((output->width_mm == 160 && output->height_mm == 90) ||
|
|
||||||
(output->width_mm == 160 && output->height_mm == 100) ||
|
|
||||||
(output->width_mm == 16 && output->height_mm == 9) ||
|
|
||||||
(output->width_mm == 16 && output->height_mm == 10))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (output->width_mm > 0 && output->height_mm > 0)
|
|
||||||
{
|
|
||||||
double dpi_x, dpi_y;
|
|
||||||
dpi_x = (double)output->crtc->rect.width / (output->width_mm / 25.4);
|
|
||||||
dpi_y = (double)output->crtc->rect.height / (output->height_mm / 25.4);
|
|
||||||
/* We don't completely trust these values so both
|
|
||||||
must be high, and never pick higher ratio than
|
|
||||||
2 automatically */
|
|
||||||
if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT)
|
|
||||||
scale = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
return scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
get_output_scale (MetaMonitorManager *manager,
|
|
||||||
MetaOutput *output)
|
|
||||||
{
|
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
|
||||||
int scale = g_settings_get_uint (manager_kms->desktop_settings, "scaling-factor");
|
|
||||||
if (scale > 0)
|
|
||||||
return scale;
|
|
||||||
else
|
|
||||||
return compute_scale (output);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
drmModeRes *resources;
|
drmModeRes *resources;
|
||||||
drmModeEncoder **encoders;
|
|
||||||
GHashTable *modes;
|
GHashTable *modes;
|
||||||
GHashTableIter iter;
|
GHashTableIter iter;
|
||||||
drmModeModeInfo *mode;
|
drmModeModeInfo *mode;
|
||||||
@@ -470,7 +303,7 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
connector = drmModeGetConnector (manager_kms->fd, resources->connectors[i]);
|
connector = drmModeGetConnector (manager_kms->fd, resources->connectors[i]);
|
||||||
manager_kms->connectors[i] = connector;
|
manager_kms->connectors[i] = connector;
|
||||||
|
|
||||||
if (connector && connector->connection == DRM_MODE_CONNECTED)
|
if (connector->connection == DRM_MODE_CONNECTED)
|
||||||
{
|
{
|
||||||
/* Collect all modes for this connector */
|
/* Collect all modes for this connector */
|
||||||
for (j = 0; j < (unsigned)connector->count_modes; j++)
|
for (j = 0; j < (unsigned)connector->count_modes; j++)
|
||||||
@@ -478,9 +311,13 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
encoders = g_new (drmModeEncoder *, resources->count_encoders);
|
manager_kms->n_encoders = resources->count_encoders;
|
||||||
for (i = 0; i < (unsigned)resources->count_encoders; i++)
|
manager_kms->encoders = g_new (drmModeEncoder *, manager_kms->n_encoders);
|
||||||
encoders[i] = drmModeGetEncoder (manager_kms->fd, resources->encoders[i]);
|
for (i = 0; i < manager_kms->n_encoders; i++)
|
||||||
|
{
|
||||||
|
manager_kms->encoders[i] = drmModeGetEncoder (manager_kms->fd,
|
||||||
|
resources->encoders[i]);
|
||||||
|
}
|
||||||
|
|
||||||
manager->n_modes = g_hash_table_size (modes);
|
manager->n_modes = g_hash_table_size (modes);
|
||||||
manager->modes = g_new0 (MetaMonitorMode, manager->n_modes);
|
manager->modes = g_new0 (MetaMonitorMode, manager->n_modes);
|
||||||
@@ -543,10 +380,6 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
height = MAX (height, meta_crtc->rect.y + meta_crtc->rect.height);
|
height = MAX (height, meta_crtc->rect.y + meta_crtc->rect.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_crtc->driver_private = g_new0 (MetaCRTCKms, 1);
|
|
||||||
meta_crtc->driver_notify = (GDestroyNotify) meta_crtc_destroy_notify;
|
|
||||||
find_crtc_properties (manager_kms, meta_crtc);
|
|
||||||
|
|
||||||
drmModeFreeCrtc (crtc);
|
drmModeFreeCrtc (crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,7 +401,7 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
connector = manager_kms->connectors[i];
|
connector = manager_kms->connectors[i];
|
||||||
meta_output = &manager->outputs[n_actual_outputs];
|
meta_output = &manager->outputs[n_actual_outputs];
|
||||||
|
|
||||||
if (connector && connector->connection == DRM_MODE_CONNECTED)
|
if (connector->connection == DRM_MODE_CONNECTED)
|
||||||
{
|
{
|
||||||
meta_output->driver_private = output_kms = g_slice_new0 (MetaOutputKms);
|
meta_output->driver_private = output_kms = g_slice_new0 (MetaOutputKms);
|
||||||
meta_output->driver_notify = (GDestroyNotify)meta_output_destroy_notify;
|
meta_output->driver_notify = (GDestroyNotify)meta_output_destroy_notify;
|
||||||
@@ -601,16 +434,10 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_output->preferred_mode = NULL;
|
|
||||||
meta_output->n_modes = connector->count_modes;
|
meta_output->n_modes = connector->count_modes;
|
||||||
meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes);
|
meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes);
|
||||||
for (j = 0; j < meta_output->n_modes; j++) {
|
for (j = 0; j < meta_output->n_modes; j++)
|
||||||
meta_output->modes[j] = find_meta_mode (manager, &connector->modes[j]);
|
meta_output->modes[j] = find_meta_mode (manager, &connector->modes[j]);
|
||||||
if (connector->modes[j].type & DRM_MODE_TYPE_PREFERRED)
|
|
||||||
meta_output->preferred_mode = meta_output->modes[j];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!meta_output->preferred_mode)
|
|
||||||
meta_output->preferred_mode = meta_output->modes[0];
|
meta_output->preferred_mode = meta_output->modes[0];
|
||||||
|
|
||||||
output_kms->connector = connector;
|
output_kms->connector = connector;
|
||||||
@@ -621,8 +448,6 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
for (j = 0; j < output_kms->n_encoders; j++)
|
for (j = 0; j < output_kms->n_encoders; j++)
|
||||||
{
|
{
|
||||||
output_kms->encoders[j] = drmModeGetEncoder (manager_kms->fd, connector->encoders[j]);
|
output_kms->encoders[j] = drmModeGetEncoder (manager_kms->fd, connector->encoders[j]);
|
||||||
if (!output_kms->encoders[j])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* We only list CRTCs as supported if they are supported by all encoders
|
/* We only list CRTCs as supported if they are supported by all encoders
|
||||||
for this connectors.
|
for this connectors.
|
||||||
@@ -676,21 +501,32 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
meta_output->is_presentation = FALSE;
|
meta_output->is_presentation = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
find_connector_properties (manager_kms, output_kms);
|
find_properties (manager_kms, output_kms);
|
||||||
meta_output->suggested_x = output_kms->suggested_x;
|
|
||||||
meta_output->suggested_y = output_kms->suggested_y;
|
|
||||||
meta_output->hotplug_mode_update = output_kms->hotplug_mode_update;
|
|
||||||
|
|
||||||
edid = read_output_edid (manager_kms, meta_output);
|
edid = read_output_edid (manager_kms, meta_output);
|
||||||
meta_output_parse_edid (meta_output, edid);
|
if (edid)
|
||||||
|
{
|
||||||
|
MonitorInfo *parsed_edid;
|
||||||
|
gsize len;
|
||||||
|
|
||||||
|
parsed_edid = decode_edid (g_bytes_get_data (edid, &len));
|
||||||
|
if (parsed_edid)
|
||||||
|
{
|
||||||
|
meta_output->vendor = g_strndup (parsed_edid->manufacturer_code, 4);
|
||||||
|
meta_output->product = g_strndup (parsed_edid->dsc_product_name, 14);
|
||||||
|
meta_output->serial = g_strndup (parsed_edid->dsc_serial_number, 14);
|
||||||
|
|
||||||
|
g_free (parsed_edid);
|
||||||
|
}
|
||||||
|
|
||||||
g_bytes_unref (edid);
|
g_bytes_unref (edid);
|
||||||
|
}
|
||||||
/* MetaConnectorType matches DRM's connector types */
|
if (!meta_output->vendor)
|
||||||
meta_output->connector_type = (MetaConnectorType) connector->connector_type;
|
{
|
||||||
|
meta_output->vendor = g_strdup ("unknown");
|
||||||
meta_output->scale = get_output_scale (manager, meta_output);
|
meta_output->product = g_strdup ("unknown");
|
||||||
|
meta_output->serial = g_strdup ("unknown");
|
||||||
output_get_tile_info (manager_kms, meta_output);
|
}
|
||||||
|
|
||||||
/* FIXME: backlight is a very driver specific thing unfortunately,
|
/* FIXME: backlight is a very driver specific thing unfortunately,
|
||||||
every DDX does its own thing, and the dumb KMS API does not include it.
|
every DDX does its own thing, and the dumb KMS API does not include it.
|
||||||
@@ -733,10 +569,9 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
for (j = 0; j < output_kms->n_encoders; j++)
|
for (j = 0; j < output_kms->n_encoders; j++)
|
||||||
{
|
{
|
||||||
for (k = 0; k < (unsigned)resources->count_encoders; k++)
|
for (k = 0; k < manager_kms->n_encoders; k++)
|
||||||
{
|
{
|
||||||
if (output_kms->encoders[j] && encoders[k] &&
|
if (output_kms->encoders[j]->encoder_id == manager_kms->encoders[k]->encoder_id)
|
||||||
output_kms->encoders[j]->encoder_id == encoders[k]->encoder_id)
|
|
||||||
{
|
{
|
||||||
output_kms->encoder_mask |= (1 << k);
|
output_kms->encoder_mask |= (1 << k);
|
||||||
break;
|
break;
|
||||||
@@ -783,10 +618,6 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < (unsigned)resources->count_encoders; i++)
|
|
||||||
drmModeFreeEncoder (encoders[i]);
|
|
||||||
g_free (encoders);
|
|
||||||
|
|
||||||
drmModeFreeResources (resources);
|
drmModeFreeResources (resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -804,9 +635,6 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
MetaPowerSave mode)
|
MetaPowerSave mode)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
ClutterBackend *backend;
|
|
||||||
CoglContext *cogl_context;
|
|
||||||
CoglDisplay *cogl_display;
|
|
||||||
uint64_t state;
|
uint64_t state;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
@@ -837,8 +665,7 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
|
|
||||||
if (output_kms->dpms_prop_id != 0)
|
if (output_kms->dpms_prop_id != 0)
|
||||||
{
|
{
|
||||||
int ok = drmModeObjectSetProperty (manager_kms->fd, meta_output->winsys_id,
|
int ok = drmModeConnectorSetProperty(manager_kms->fd, meta_output->winsys_id,
|
||||||
DRM_MODE_OBJECT_CONNECTOR,
|
|
||||||
output_kms->dpms_prop_id, state);
|
output_kms->dpms_prop_id, state);
|
||||||
|
|
||||||
if (ok < 0)
|
if (ok < 0)
|
||||||
@@ -846,14 +673,6 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
meta_output->name, strerror (errno));
|
meta_output->name, strerror (errno));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
backend = clutter_get_default_backend ();
|
|
||||||
cogl_context = clutter_backend_get_cogl_context (backend);
|
|
||||||
cogl_display = cogl_context_get_display (cogl_context);
|
|
||||||
|
|
||||||
for (i = 0; i < manager->n_crtcs; i++)
|
|
||||||
cogl_kms_display_set_ignore_crtc (cogl_display, manager->crtcs[i].crtc_id,
|
|
||||||
mode != META_POWER_SAVE_ON);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -863,48 +682,6 @@ crtc_free (CoglKmsCrtc *crtc)
|
|||||||
g_slice_free (CoglKmsCrtc, crtc);
|
g_slice_free (CoglKmsCrtc, crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
set_underscan (MetaMonitorManagerKms *manager_kms,
|
|
||||||
MetaOutput *output)
|
|
||||||
{
|
|
||||||
if (!output->crtc)
|
|
||||||
return;
|
|
||||||
|
|
||||||
MetaCRTC *crtc = output->crtc;
|
|
||||||
MetaCRTCKms *crtc_kms = crtc->driver_private;
|
|
||||||
if (!crtc_kms->underscan_prop_id)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (output->is_underscanning)
|
|
||||||
{
|
|
||||||
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
|
||||||
DRM_MODE_OBJECT_CRTC,
|
|
||||||
crtc_kms->underscan_prop_id, (uint64_t) 1);
|
|
||||||
|
|
||||||
if (crtc_kms->underscan_hborder_prop_id)
|
|
||||||
{
|
|
||||||
uint64_t value = crtc->current_mode->width * 0.05;
|
|
||||||
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
|
||||||
DRM_MODE_OBJECT_CRTC,
|
|
||||||
crtc_kms->underscan_hborder_prop_id, value);
|
|
||||||
}
|
|
||||||
if (crtc_kms->underscan_vborder_prop_id)
|
|
||||||
{
|
|
||||||
uint64_t value = crtc->current_mode->height * 0.05;
|
|
||||||
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
|
||||||
DRM_MODE_OBJECT_CRTC,
|
|
||||||
crtc_kms->underscan_vborder_prop_id, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
|
||||||
DRM_MODE_OBJECT_CRTC,
|
|
||||||
crtc_kms->underscan_prop_id, (uint64_t) 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
||||||
MetaCRTCInfo **crtcs,
|
MetaCRTCInfo **crtcs,
|
||||||
@@ -912,7 +689,6 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
MetaOutputInfo **outputs,
|
MetaOutputInfo **outputs,
|
||||||
unsigned int n_outputs)
|
unsigned int n_outputs)
|
||||||
{
|
{
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
|
||||||
ClutterBackend *backend;
|
ClutterBackend *backend;
|
||||||
CoglContext *cogl_context;
|
CoglContext *cogl_context;
|
||||||
CoglDisplay *cogl_display;
|
CoglDisplay *cogl_display;
|
||||||
@@ -1058,9 +834,6 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
|
|
||||||
output->is_primary = output_info->is_primary;
|
output->is_primary = output_info->is_primary;
|
||||||
output->is_presentation = output_info->is_presentation;
|
output->is_presentation = output_info->is_presentation;
|
||||||
output->is_underscanning = output_info->is_underscanning;
|
|
||||||
|
|
||||||
set_underscan (manager_kms, output);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable outputs not mentioned in the list */
|
/* Disable outputs not mentioned in the list */
|
||||||
@@ -1120,23 +893,6 @@ meta_monitor_manager_kms_set_crtc_gamma (MetaMonitorManager *manager,
|
|||||||
drmModeCrtcSetGamma (manager_kms->fd, crtc->crtc_id, size, red, green, blue);
|
drmModeCrtcSetGamma (manager_kms->fd, crtc->crtc_id, size, red, green, blue);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
on_uevent (GUdevClient *client,
|
|
||||||
const char *action,
|
|
||||||
GUdevDevice *device,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (user_data);
|
|
||||||
MetaMonitorManager *manager = META_MONITOR_MANAGER (manager_kms);
|
|
||||||
|
|
||||||
if (!g_udev_device_get_property_as_boolean (device, "HOTPLUG"))
|
|
||||||
return;
|
|
||||||
|
|
||||||
meta_monitor_manager_read_current_config (manager);
|
|
||||||
|
|
||||||
meta_monitor_manager_on_hotplug (manager);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_kms_init (MetaMonitorManagerKms *manager_kms)
|
meta_monitor_manager_kms_init (MetaMonitorManagerKms *manager_kms)
|
||||||
{
|
{
|
||||||
@@ -1151,24 +907,6 @@ meta_monitor_manager_kms_init (MetaMonitorManagerKms *manager_kms)
|
|||||||
cogl_renderer = cogl_display_get_renderer (cogl_display);
|
cogl_renderer = cogl_display_get_renderer (cogl_display);
|
||||||
|
|
||||||
manager_kms->fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
manager_kms->fd = cogl_kms_renderer_get_kms_fd (cogl_renderer);
|
||||||
|
|
||||||
const char *subsystems[2] = { "drm", NULL };
|
|
||||||
manager_kms->udev = g_udev_client_new (subsystems);
|
|
||||||
g_signal_connect (manager_kms->udev, "uevent",
|
|
||||||
G_CALLBACK (on_uevent), manager_kms);
|
|
||||||
|
|
||||||
manager_kms->desktop_settings = g_settings_new ("org.gnome.desktop.interface");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_monitor_manager_kms_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (object);
|
|
||||||
|
|
||||||
g_clear_object (&manager_kms->udev);
|
|
||||||
g_clear_object (&manager_kms->desktop_settings);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_monitor_manager_kms_parent_class)->dispose (object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1187,7 +925,6 @@ meta_monitor_manager_kms_class_init (MetaMonitorManagerKmsClass *klass)
|
|||||||
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass);
|
MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass);
|
||||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
|
||||||
object_class->dispose = meta_monitor_manager_kms_dispose;
|
|
||||||
object_class->finalize = meta_monitor_manager_kms_finalize;
|
object_class->finalize = meta_monitor_manager_kms_finalize;
|
||||||
|
|
||||||
manager_class->read_current = meta_monitor_manager_kms_read_current;
|
manager_class->read_current = meta_monitor_manager_kms_read_current;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#ifndef META_MONITOR_MANAGER_KMS_H
|
#ifndef META_MONITOR_MANAGER_KMS_H
|
||||||
#define META_MONITOR_MANAGER_KMS_H
|
#define META_MONITOR_MANAGER_KMS_H
|
||||||
|
|
||||||
#include "meta-monitor-manager-private.h"
|
#include "meta-monitor-manager.h"
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_MANAGER_KMS (meta_monitor_manager_kms_get_type ())
|
#define META_TYPE_MONITOR_MANAGER_KMS (meta_monitor_manager_kms_get_type ())
|
||||||
#define META_MONITOR_MANAGER_KMS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_KMS, MetaMonitorManagerKms))
|
#define META_MONITOR_MANAGER_KMS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_KMS, MetaMonitorManagerKms))
|
||||||
|
|||||||
@@ -45,15 +45,6 @@
|
|||||||
#include <meta/util.h>
|
#include <meta/util.h>
|
||||||
#include "display-private.h"
|
#include "display-private.h"
|
||||||
#include "compositor/compositor-private.h"
|
#include "compositor/compositor-private.h"
|
||||||
#include "compositor/meta-sync-ring.h"
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
/* We're a traditional CM running under the host. */
|
|
||||||
META_BACKEND_X11_MODE_COMPOSITOR,
|
|
||||||
|
|
||||||
/* We're a nested X11 client */
|
|
||||||
META_BACKEND_X11_MODE_NESTED,
|
|
||||||
} MetaBackendX11Mode;
|
|
||||||
|
|
||||||
struct _MetaBackendX11Private
|
struct _MetaBackendX11Private
|
||||||
{
|
{
|
||||||
@@ -62,8 +53,6 @@ struct _MetaBackendX11Private
|
|||||||
xcb_connection_t *xcb;
|
xcb_connection_t *xcb;
|
||||||
GSource *source;
|
GSource *source;
|
||||||
|
|
||||||
MetaBackendX11Mode mode;
|
|
||||||
|
|
||||||
int xsync_event_base;
|
int xsync_event_base;
|
||||||
int xsync_error_base;
|
int xsync_error_base;
|
||||||
|
|
||||||
@@ -76,29 +65,20 @@ struct _MetaBackendX11Private
|
|||||||
uint8_t xkb_error_base;
|
uint8_t xkb_error_base;
|
||||||
|
|
||||||
struct xkb_keymap *keymap;
|
struct xkb_keymap *keymap;
|
||||||
gchar *keymap_layouts;
|
|
||||||
gchar *keymap_variants;
|
|
||||||
gchar *keymap_options;
|
|
||||||
};
|
};
|
||||||
typedef struct _MetaBackendX11Private MetaBackendX11Private;
|
typedef struct _MetaBackendX11Private MetaBackendX11Private;
|
||||||
|
|
||||||
static void apply_keymap (MetaBackendX11 *x11);
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendX11, meta_backend_x11, META_TYPE_BACKEND);
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendX11, meta_backend_x11, META_TYPE_BACKEND);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_alarm_notify (MetaBackend *backend,
|
handle_alarm_notify (MetaBackend *backend,
|
||||||
XEvent *event)
|
XEvent *event)
|
||||||
{
|
{
|
||||||
GHashTableIter iter;
|
int i;
|
||||||
gpointer value;
|
|
||||||
|
|
||||||
g_hash_table_iter_init (&iter, backend->device_monitors);
|
for (i = 0; i <= backend->device_id_max; i++)
|
||||||
while (g_hash_table_iter_next (&iter, NULL, &value))
|
if (backend->device_monitors[i])
|
||||||
{
|
meta_idle_monitor_xsync_handle_xevent (backend->device_monitors[i], (XSyncAlarmNotifyEvent*) event);
|
||||||
MetaIdleMonitor *device_monitor = META_IDLE_MONITOR (value);
|
|
||||||
meta_idle_monitor_xsync_handle_xevent (device_monitor, (XSyncAlarmNotifyEvent*) event);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -113,7 +93,7 @@ translate_device_event (MetaBackendX11 *x11,
|
|||||||
/* This codepath should only ever trigger as an X11 compositor,
|
/* This codepath should only ever trigger as an X11 compositor,
|
||||||
* and never under nested, as under nested all backend events
|
* and never under nested, as under nested all backend events
|
||||||
* should be reported with respect to the stage window. */
|
* should be reported with respect to the stage window. */
|
||||||
g_assert (priv->mode == META_BACKEND_X11_MODE_COMPOSITOR);
|
g_assert (!meta_is_wayland_compositor ());
|
||||||
|
|
||||||
device_event->event = stage_window;
|
device_event->event = stage_window;
|
||||||
|
|
||||||
@@ -140,49 +120,6 @@ translate_device_event (MetaBackendX11 *x11,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
translate_crossing_event (MetaBackendX11 *x11,
|
|
||||||
XIEnterEvent *enter_event)
|
|
||||||
{
|
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
|
||||||
|
|
||||||
/* Throw out weird events generated by grabs. */
|
|
||||||
if (enter_event->mode == XINotifyGrab ||
|
|
||||||
enter_event->mode == XINotifyUngrab)
|
|
||||||
{
|
|
||||||
enter_event->event = None;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Window stage_window = meta_backend_x11_get_xwindow (x11);
|
|
||||||
if (enter_event->event != stage_window)
|
|
||||||
{
|
|
||||||
/* See above for the rationale for this... */
|
|
||||||
g_assert (priv->mode == META_BACKEND_X11_MODE_COMPOSITOR);
|
|
||||||
enter_event->event = meta_backend_x11_get_xwindow (x11);
|
|
||||||
enter_event->event_x = enter_event->root_x;
|
|
||||||
enter_event->event_y = enter_event->root_y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
handle_device_change (MetaBackendX11 *x11,
|
|
||||||
XIEvent *event)
|
|
||||||
{
|
|
||||||
XIDeviceChangedEvent *device_changed;
|
|
||||||
|
|
||||||
if (event->evtype != XI_DeviceChanged)
|
|
||||||
return;
|
|
||||||
|
|
||||||
device_changed = (XIDeviceChangedEvent *) event;
|
|
||||||
|
|
||||||
if (device_changed->reason != XISlaveSwitch)
|
|
||||||
return;
|
|
||||||
|
|
||||||
meta_backend_update_last_device (META_BACKEND (x11),
|
|
||||||
device_changed->sourceid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clutter makes the assumption that there is only one X window
|
/* Clutter makes the assumption that there is only one X window
|
||||||
* per stage, which is a valid assumption to make for a generic
|
* per stage, which is a valid assumption to make for a generic
|
||||||
* application toolkit. As such, it will ignore any events sent
|
* application toolkit. As such, it will ignore any events sent
|
||||||
@@ -194,8 +131,15 @@ handle_device_change (MetaBackendX11 *x11,
|
|||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
maybe_spoof_event_as_stage_event (MetaBackendX11 *x11,
|
maybe_spoof_event_as_stage_event (MetaBackendX11 *x11,
|
||||||
XIEvent *input_event)
|
XEvent *event)
|
||||||
{
|
{
|
||||||
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
|
if (event->type == GenericEvent &&
|
||||||
|
event->xcookie.extension == priv->xinput_opcode)
|
||||||
|
{
|
||||||
|
XIEvent *input_event = (XIEvent *) event->xcookie.data;
|
||||||
|
|
||||||
switch (input_event->evtype)
|
switch (input_event->evtype)
|
||||||
{
|
{
|
||||||
case XI_Motion:
|
case XI_Motion:
|
||||||
@@ -208,30 +152,9 @@ maybe_spoof_event_as_stage_event (MetaBackendX11 *x11,
|
|||||||
case XI_TouchEnd:
|
case XI_TouchEnd:
|
||||||
translate_device_event (x11, (XIDeviceEvent *) input_event);
|
translate_device_event (x11, (XIDeviceEvent *) input_event);
|
||||||
break;
|
break;
|
||||||
case XI_Enter:
|
|
||||||
case XI_Leave:
|
|
||||||
translate_crossing_event (x11, (XIEnterEvent *) input_event);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
handle_input_event (MetaBackendX11 *x11,
|
|
||||||
XEvent *event)
|
|
||||||
{
|
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
|
||||||
|
|
||||||
if (event->type == GenericEvent &&
|
|
||||||
event->xcookie.extension == priv->xinput_opcode)
|
|
||||||
{
|
|
||||||
XIEvent *input_event = (XIEvent *) event->xcookie.data;
|
|
||||||
|
|
||||||
if (input_event->evtype == XI_DeviceChanged)
|
|
||||||
handle_device_change (x11, input_event);
|
|
||||||
else
|
|
||||||
maybe_spoof_event_as_stage_event (x11, input_event);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,8 +191,6 @@ handle_host_xevent (MetaBackend *backend,
|
|||||||
MetaCompositor *compositor = display->compositor;
|
MetaCompositor *compositor = display->compositor;
|
||||||
if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event))
|
if (meta_plugin_manager_xevent_filter (compositor->plugin_mgr, event))
|
||||||
bypass_clutter = TRUE;
|
bypass_clutter = TRUE;
|
||||||
if (compositor->have_x11_sync_object)
|
|
||||||
meta_sync_ring_handle_event (event);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -302,7 +223,7 @@ handle_host_xevent (MetaBackend *backend,
|
|||||||
|
|
||||||
if (!bypass_clutter)
|
if (!bypass_clutter)
|
||||||
{
|
{
|
||||||
handle_input_event (x11, event);
|
maybe_spoof_event_as_stage_event (x11, event);
|
||||||
clutter_x11_handle_event (event);
|
clutter_x11_handle_event (event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,17 +326,6 @@ take_touch_grab (MetaBackend *backend)
|
|||||||
False, &mask, 1, &mods);
|
False, &mask, 1, &mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
on_device_added (ClutterDeviceManager *device_manager,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaBackendX11 *x11 = META_BACKEND_X11 (user_data);
|
|
||||||
|
|
||||||
if (clutter_input_device_get_device_type (device) == CLUTTER_KEYBOARD_DEVICE)
|
|
||||||
apply_keymap (x11);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_backend_x11_post_init (MetaBackend *backend)
|
meta_backend_x11_post_init (MetaBackend *backend)
|
||||||
{
|
{
|
||||||
@@ -453,8 +363,6 @@ meta_backend_x11_post_init (MetaBackend *backend)
|
|||||||
meta_fatal ("X server doesn't have the XInput extension, version 2.2 or newer\n");
|
meta_fatal ("X server doesn't have the XInput extension, version 2.2 or newer\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We only take the passive touch grab if we are a X11 compositor */
|
|
||||||
if (priv->mode == META_BACKEND_X11_MODE_COMPOSITOR)
|
|
||||||
take_touch_grab (backend);
|
take_touch_grab (backend);
|
||||||
|
|
||||||
priv->xcb = XGetXCBConnection (priv->xdisplay);
|
priv->xcb = XGetXCBConnection (priv->xdisplay);
|
||||||
@@ -468,9 +376,6 @@ meta_backend_x11_post_init (MetaBackend *backend)
|
|||||||
meta_fatal ("X server doesn't have the XKB extension, version %d.%d or newer\n",
|
meta_fatal ("X server doesn't have the XKB extension, version %d.%d or newer\n",
|
||||||
XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION);
|
XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION);
|
||||||
|
|
||||||
g_signal_connect_object (clutter_device_manager_get_default (), "device-added",
|
|
||||||
G_CALLBACK (on_device_added), backend, 0);
|
|
||||||
|
|
||||||
META_BACKEND_CLASS (meta_backend_x11_parent_class)->post_init (backend);
|
META_BACKEND_CLASS (meta_backend_x11_parent_class)->post_init (backend);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,18 +391,13 @@ meta_backend_x11_create_idle_monitor (MetaBackend *backend,
|
|||||||
static MetaMonitorManager *
|
static MetaMonitorManager *
|
||||||
meta_backend_x11_create_monitor_manager (MetaBackend *backend)
|
meta_backend_x11_create_monitor_manager (MetaBackend *backend)
|
||||||
{
|
{
|
||||||
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
/* If we're a Wayland compositor using the X11 backend,
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
* we're a nested configuration, so return the dummy
|
||||||
|
* monitor setup. */
|
||||||
switch (priv->mode)
|
if (meta_is_wayland_compositor ())
|
||||||
{
|
|
||||||
case META_BACKEND_X11_MODE_COMPOSITOR:
|
|
||||||
return g_object_new (META_TYPE_MONITOR_MANAGER_XRANDR, NULL);
|
|
||||||
case META_BACKEND_X11_MODE_NESTED:
|
|
||||||
return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
|
return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL);
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
return g_object_new (META_TYPE_MONITOR_MANAGER_XRANDR, NULL);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaCursorRenderer *
|
static MetaCursorRenderer *
|
||||||
@@ -660,22 +560,21 @@ upload_xkb_description (Display *xdisplay,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
apply_keymap (MetaBackendX11 *x11)
|
meta_backend_x11_set_keymap (MetaBackend *backend,
|
||||||
|
const char *layouts,
|
||||||
|
const char *variants,
|
||||||
|
const char *options)
|
||||||
{
|
{
|
||||||
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
XkbRF_RulesRec *xkb_rules;
|
XkbRF_RulesRec *xkb_rules;
|
||||||
XkbRF_VarDefsRec xkb_var_defs = { 0 };
|
XkbRF_VarDefsRec xkb_var_defs = { 0 };
|
||||||
gchar *rules_file_path;
|
gchar *rules_file_path;
|
||||||
|
|
||||||
if (!priv->keymap_layouts ||
|
|
||||||
!priv->keymap_variants ||
|
|
||||||
!priv->keymap_options)
|
|
||||||
return;
|
|
||||||
|
|
||||||
get_xkbrf_var_defs (priv->xdisplay,
|
get_xkbrf_var_defs (priv->xdisplay,
|
||||||
priv->keymap_layouts,
|
layouts,
|
||||||
priv->keymap_variants,
|
variants,
|
||||||
priv->keymap_options,
|
options,
|
||||||
&rules_file_path,
|
&rules_file_path,
|
||||||
&xkb_var_defs);
|
&xkb_var_defs);
|
||||||
|
|
||||||
@@ -699,25 +598,6 @@ apply_keymap (MetaBackendX11 *x11)
|
|||||||
g_free (rules_file_path);
|
g_free (rules_file_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_backend_x11_set_keymap (MetaBackend *backend,
|
|
||||||
const char *layouts,
|
|
||||||
const char *variants,
|
|
||||||
const char *options)
|
|
||||||
{
|
|
||||||
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
|
||||||
|
|
||||||
g_free (priv->keymap_layouts);
|
|
||||||
priv->keymap_layouts = g_strdup (layouts);
|
|
||||||
g_free (priv->keymap_variants);
|
|
||||||
priv->keymap_variants = g_strdup (variants);
|
|
||||||
g_free (priv->keymap_options);
|
|
||||||
priv->keymap_options = g_strdup (options);
|
|
||||||
|
|
||||||
apply_keymap (x11);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct xkb_keymap *
|
static struct xkb_keymap *
|
||||||
meta_backend_x11_get_keymap (MetaBackend *backend)
|
meta_backend_x11_get_keymap (MetaBackend *backend)
|
||||||
{
|
{
|
||||||
@@ -753,21 +633,8 @@ meta_backend_x11_update_screen_size (MetaBackend *backend,
|
|||||||
{
|
{
|
||||||
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
||||||
|
|
||||||
if (priv->mode == META_BACKEND_X11_MODE_NESTED)
|
|
||||||
{
|
|
||||||
/* For a nested wayland session, we want to go through Clutter to update the
|
|
||||||
* toplevel window size, rather than doing it directly.
|
|
||||||
*/
|
|
||||||
META_BACKEND_CLASS (meta_backend_x11_parent_class)->update_screen_size (backend, width, height);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
|
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
|
||||||
Window xwin = meta_backend_x11_get_xwindow (x11);
|
Window xwin = meta_backend_x11_get_xwindow (x11);
|
||||||
XResizeWindow (priv->xdisplay, xwin, width, height);
|
XResizeWindow (priv->xdisplay, xwin, width, height);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -788,21 +655,9 @@ meta_backend_x11_select_stage_events (MetaBackend *backend)
|
|||||||
XISetMask (mask.mask, XI_FocusIn);
|
XISetMask (mask.mask, XI_FocusIn);
|
||||||
XISetMask (mask.mask, XI_FocusOut);
|
XISetMask (mask.mask, XI_FocusOut);
|
||||||
XISetMask (mask.mask, XI_Motion);
|
XISetMask (mask.mask, XI_Motion);
|
||||||
|
XIClearMask (mask.mask, XI_TouchBegin);
|
||||||
if (priv->mode == META_BACKEND_X11_MODE_NESTED)
|
XIClearMask (mask.mask, XI_TouchEnd);
|
||||||
{
|
XIClearMask (mask.mask, XI_TouchUpdate);
|
||||||
/* When we're an X11 compositor, we can't take these events or else
|
|
||||||
* replaying events from our passive root window grab will cause
|
|
||||||
* them to come back to us.
|
|
||||||
*
|
|
||||||
* When we're a nested application, we want to behave like any other
|
|
||||||
* application, so select these events like normal apps do.
|
|
||||||
*/
|
|
||||||
XISetMask (mask.mask, XI_TouchBegin);
|
|
||||||
XISetMask (mask.mask, XI_TouchEnd);
|
|
||||||
XISetMask (mask.mask, XI_TouchUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
XISelectEvents (priv->xdisplay, xwin, &mask, 1);
|
XISelectEvents (priv->xdisplay, xwin, &mask, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -828,15 +683,8 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
|
|||||||
static void
|
static void
|
||||||
meta_backend_x11_init (MetaBackendX11 *x11)
|
meta_backend_x11_init (MetaBackendX11 *x11)
|
||||||
{
|
{
|
||||||
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
|
|
||||||
|
|
||||||
/* We do X11 event retrieval ourselves */
|
/* We do X11 event retrieval ourselves */
|
||||||
clutter_x11_disable_event_retrieval ();
|
clutter_x11_disable_event_retrieval ();
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
priv->mode = META_BACKEND_X11_MODE_NESTED;
|
|
||||||
else
|
|
||||||
priv->mode = META_BACKEND_X11_MODE_COMPOSITOR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Display *
|
Display *
|
||||||
|
|||||||
@@ -1,216 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2014-2015 Red Hat
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Written by:
|
|
||||||
* Jasper St. Pierre <jstpierre@mecheye.net>
|
|
||||||
* Jonas Ådahl <jadahl@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SECTION:barrier-x11
|
|
||||||
* @Title: MetaBarrierImplX11
|
|
||||||
* @Short_Description: Pointer barriers implementation for X11
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#ifdef HAVE_XI23
|
|
||||||
|
|
||||||
#include <glib-object.h>
|
|
||||||
|
|
||||||
#include <X11/extensions/XInput2.h>
|
|
||||||
#include <X11/extensions/Xfixes.h>
|
|
||||||
#include <meta/barrier.h>
|
|
||||||
#include "backends/x11/meta-barrier-x11.h"
|
|
||||||
#include "display-private.h"
|
|
||||||
|
|
||||||
struct _MetaBarrierImplX11Private
|
|
||||||
{
|
|
||||||
MetaBarrier *barrier;
|
|
||||||
PointerBarrier xbarrier;
|
|
||||||
};
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaBarrierImplX11, meta_barrier_impl_x11,
|
|
||||||
META_TYPE_BARRIER_IMPL)
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
_meta_barrier_impl_x11_is_active (MetaBarrierImpl *impl)
|
|
||||||
{
|
|
||||||
MetaBarrierImplX11 *self = META_BARRIER_IMPL_X11 (impl);
|
|
||||||
MetaBarrierImplX11Private *priv =
|
|
||||||
meta_barrier_impl_x11_get_instance_private (self);
|
|
||||||
|
|
||||||
return priv->xbarrier != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_meta_barrier_impl_x11_release (MetaBarrierImpl *impl,
|
|
||||||
MetaBarrierEvent *event)
|
|
||||||
{
|
|
||||||
MetaBarrierImplX11 *self = META_BARRIER_IMPL_X11 (impl);
|
|
||||||
MetaBarrierImplX11Private *priv =
|
|
||||||
meta_barrier_impl_x11_get_instance_private (self);
|
|
||||||
MetaDisplay *display = priv->barrier->priv->display;
|
|
||||||
|
|
||||||
if (META_DISPLAY_HAS_XINPUT_23 (display))
|
|
||||||
{
|
|
||||||
XIBarrierReleasePointer (display->xdisplay,
|
|
||||||
META_VIRTUAL_CORE_POINTER_ID,
|
|
||||||
priv->xbarrier, event->event_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_meta_barrier_impl_x11_destroy (MetaBarrierImpl *impl)
|
|
||||||
{
|
|
||||||
MetaBarrierImplX11 *self = META_BARRIER_IMPL_X11 (impl);
|
|
||||||
MetaBarrierImplX11Private *priv =
|
|
||||||
meta_barrier_impl_x11_get_instance_private (self);
|
|
||||||
MetaDisplay *display = priv->barrier->priv->display;
|
|
||||||
Display *dpy;
|
|
||||||
|
|
||||||
if (display == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
dpy = display->xdisplay;
|
|
||||||
|
|
||||||
if (!meta_barrier_is_active (priv->barrier))
|
|
||||||
return;
|
|
||||||
|
|
||||||
XFixesDestroyPointerBarrier (dpy, priv->xbarrier);
|
|
||||||
g_hash_table_remove (display->xids, &priv->xbarrier);
|
|
||||||
priv->xbarrier = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaBarrierImpl *
|
|
||||||
meta_barrier_impl_x11_new (MetaBarrier *barrier)
|
|
||||||
{
|
|
||||||
MetaBarrierImplX11 *self;
|
|
||||||
MetaBarrierImplX11Private *priv;
|
|
||||||
MetaDisplay *display = barrier->priv->display;
|
|
||||||
Display *dpy;
|
|
||||||
Window root;
|
|
||||||
|
|
||||||
if (display == NULL)
|
|
||||||
{
|
|
||||||
g_warning ("A display must be provided when constructing a barrier.");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
self = g_object_new (META_TYPE_BARRIER_IMPL_X11, NULL);
|
|
||||||
priv = meta_barrier_impl_x11_get_instance_private (self);
|
|
||||||
priv->barrier = barrier;
|
|
||||||
|
|
||||||
dpy = display->xdisplay;
|
|
||||||
root = DefaultRootWindow (dpy);
|
|
||||||
|
|
||||||
priv->xbarrier = XFixesCreatePointerBarrier (dpy, root,
|
|
||||||
barrier->priv->x1,
|
|
||||||
barrier->priv->y1,
|
|
||||||
barrier->priv->x2,
|
|
||||||
barrier->priv->y2,
|
|
||||||
barrier->priv->directions,
|
|
||||||
0, NULL);
|
|
||||||
|
|
||||||
g_hash_table_insert (display->xids, &priv->xbarrier, barrier);
|
|
||||||
|
|
||||||
return META_BARRIER_IMPL (self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_barrier_fire_xevent (MetaBarrier *barrier,
|
|
||||||
XIBarrierEvent *xevent)
|
|
||||||
{
|
|
||||||
MetaBarrierEvent *event = g_slice_new0 (MetaBarrierEvent);
|
|
||||||
|
|
||||||
event->ref_count = 1;
|
|
||||||
event->event_id = xevent->eventid;
|
|
||||||
event->time = xevent->time;
|
|
||||||
event->dt = xevent->dtime;
|
|
||||||
|
|
||||||
event->x = xevent->root_x;
|
|
||||||
event->y = xevent->root_y;
|
|
||||||
event->dx = xevent->dx;
|
|
||||||
event->dy = xevent->dy;
|
|
||||||
|
|
||||||
event->released = (xevent->flags & XIBarrierPointerReleased) != 0;
|
|
||||||
event->grabbed = (xevent->flags & XIBarrierDeviceIsGrabbed) != 0;
|
|
||||||
|
|
||||||
switch (xevent->evtype)
|
|
||||||
{
|
|
||||||
case XI_BarrierHit:
|
|
||||||
_meta_barrier_emit_hit_signal (barrier, event);
|
|
||||||
break;
|
|
||||||
case XI_BarrierLeave:
|
|
||||||
_meta_barrier_emit_left_signal (barrier, event);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_barrier_event_unref (event);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_display_process_barrier_xevent (MetaDisplay *display,
|
|
||||||
XIEvent *event)
|
|
||||||
{
|
|
||||||
MetaBarrier *barrier;
|
|
||||||
XIBarrierEvent *xev;
|
|
||||||
|
|
||||||
if (event == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
switch (event->evtype)
|
|
||||||
{
|
|
||||||
case XI_BarrierHit:
|
|
||||||
case XI_BarrierLeave:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
xev = (XIBarrierEvent *) event;
|
|
||||||
barrier = g_hash_table_lookup (display->xids, &xev->barrier);
|
|
||||||
if (barrier != NULL)
|
|
||||||
{
|
|
||||||
meta_barrier_fire_xevent (barrier, xev);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_barrier_impl_x11_class_init (MetaBarrierImplX11Class *klass)
|
|
||||||
{
|
|
||||||
MetaBarrierImplClass *impl_class = META_BARRIER_IMPL_CLASS (klass);
|
|
||||||
|
|
||||||
impl_class->is_active = _meta_barrier_impl_x11_is_active;
|
|
||||||
impl_class->release = _meta_barrier_impl_x11_release;
|
|
||||||
impl_class->destroy = _meta_barrier_impl_x11_destroy;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_barrier_impl_x11_init (MetaBarrierImplX11 *self)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* HAVE_XI23 */
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2015 Red Hat
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Written by:
|
|
||||||
* Jonas Ådahl <jadahl@gmail.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef META_BARRIER_X11_H
|
|
||||||
#define META_BARRIER_X11_H
|
|
||||||
|
|
||||||
#include "backends/meta-barrier-private.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define META_TYPE_BARRIER_IMPL_X11 (meta_barrier_impl_x11_get_type ())
|
|
||||||
#define META_BARRIER_IMPL_X11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BARRIER_IMPL_X11, MetaBarrierImplX11))
|
|
||||||
#define META_BARRIER_IMPL_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_BARRIER_IMPL_X11, MetaBarrierImplX11Class))
|
|
||||||
#define META_IS_BARRIER_IMPL_X11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BARRIER_IMPL_X11))
|
|
||||||
#define META_IS_BARRIER_IMPL_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_BARRIER_IMPL_X11))
|
|
||||||
#define META_BARRIER_IMPL_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_BARRIER_IMPL_X11, MetaBarrierImplX11Class))
|
|
||||||
|
|
||||||
typedef struct _MetaBarrierImplX11 MetaBarrierImplX11;
|
|
||||||
typedef struct _MetaBarrierImplX11Class MetaBarrierImplX11Class;
|
|
||||||
typedef struct _MetaBarrierImplX11Private MetaBarrierImplX11Private;
|
|
||||||
|
|
||||||
struct _MetaBarrierImplX11
|
|
||||||
{
|
|
||||||
MetaBarrierImpl parent;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaBarrierImplX11Class
|
|
||||||
{
|
|
||||||
MetaBarrierImplClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
GType meta_barrier_impl_x11_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
MetaBarrierImpl *meta_barrier_impl_x11_new (MetaBarrier *barrier);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* META_BARRIER_X11_H1 */
|
|
||||||
@@ -26,8 +26,6 @@
|
|||||||
|
|
||||||
#include "meta-cursor-renderer-x11.h"
|
#include "meta-cursor-renderer-x11.h"
|
||||||
|
|
||||||
#include <X11/extensions/Xfixes.h>
|
|
||||||
|
|
||||||
#include "meta-backend-x11.h"
|
#include "meta-backend-x11.h"
|
||||||
#include "meta-stage.h"
|
#include "meta-stage.h"
|
||||||
|
|
||||||
|
|||||||
@@ -1,333 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2014 Red Hat
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but
|
|
||||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*
|
|
||||||
* Author: Carlos Garnacho <carlosg@gnome.org>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "meta-backend-x11.h"
|
|
||||||
#include "meta-input-settings-x11.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <gdk/gdkx.h>
|
|
||||||
#include <X11/Xatom.h>
|
|
||||||
#include <X11/extensions/XInput2.h>
|
|
||||||
#include <X11/XKBlib.h>
|
|
||||||
|
|
||||||
#include <meta/errors.h>
|
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaInputSettingsX11, meta_input_settings_x11, META_TYPE_INPUT_SETTINGS)
|
|
||||||
|
|
||||||
static void *
|
|
||||||
get_property (ClutterInputDevice *device,
|
|
||||||
const gchar *property,
|
|
||||||
Atom type,
|
|
||||||
int format,
|
|
||||||
gulong nitems)
|
|
||||||
{
|
|
||||||
MetaBackend *backend = meta_get_backend ();
|
|
||||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
||||||
gulong nitems_ret, bytes_after_ret;
|
|
||||||
int rc, device_id, format_ret;
|
|
||||||
Atom property_atom, type_ret;
|
|
||||||
guchar *data_ret = NULL;
|
|
||||||
|
|
||||||
property_atom = XInternAtom (xdisplay, property, True);
|
|
||||||
if (!property_atom)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
device_id = clutter_input_device_get_device_id (device);
|
|
||||||
|
|
||||||
rc = XIGetProperty (xdisplay, device_id, property_atom,
|
|
||||||
0, 10, False, type, &type_ret, &format_ret,
|
|
||||||
&nitems_ret, &bytes_after_ret, &data_ret);
|
|
||||||
if (rc == Success && type_ret == type && format_ret == format && nitems_ret >= nitems)
|
|
||||||
{
|
|
||||||
if (nitems_ret > nitems)
|
|
||||||
g_warning ("Property '%s' for device '%s' returned %lu items, expected %lu",
|
|
||||||
property, clutter_input_device_get_device_name (device), nitems_ret, nitems);
|
|
||||||
return data_ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_XFree (data_ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
change_property (ClutterInputDevice *device,
|
|
||||||
const gchar *property,
|
|
||||||
Atom type,
|
|
||||||
int format,
|
|
||||||
void *data,
|
|
||||||
gulong nitems)
|
|
||||||
{
|
|
||||||
MetaBackend *backend = meta_get_backend ();
|
|
||||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
||||||
int device_id;
|
|
||||||
Atom property_atom;
|
|
||||||
guchar *data_ret;
|
|
||||||
|
|
||||||
property_atom = XInternAtom (xdisplay, property, True);
|
|
||||||
if (!property_atom)
|
|
||||||
return;
|
|
||||||
|
|
||||||
device_id = clutter_input_device_get_device_id (device);
|
|
||||||
|
|
||||||
data_ret = get_property (device, property, type, format, nitems);
|
|
||||||
if (!data_ret)
|
|
||||||
return;
|
|
||||||
|
|
||||||
XIChangeProperty (xdisplay, device_id, property_atom, type,
|
|
||||||
format, XIPropModeReplace, data, nitems);
|
|
||||||
meta_XFree (data_ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
GDesktopDeviceSendEvents mode)
|
|
||||||
{
|
|
||||||
guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */
|
|
||||||
guchar *available;
|
|
||||||
|
|
||||||
available = get_property (device, "libinput Send Events Modes Available",
|
|
||||||
XA_INTEGER, 8, 2);
|
|
||||||
if (!available)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (mode)
|
|
||||||
{
|
|
||||||
case G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED:
|
|
||||||
values[0] = 1;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE:
|
|
||||||
values[1] = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((values[0] && !available[0]) || (values[1] && !available[1]))
|
|
||||||
g_warning ("Device '%s' does not support sendevents mode %d\n",
|
|
||||||
clutter_input_device_get_device_name (device), mode);
|
|
||||||
else
|
|
||||||
change_property (device, "libinput Send Events Mode Enabled",
|
|
||||||
XA_INTEGER, 8, &values, 2);
|
|
||||||
|
|
||||||
meta_XFree (available);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_matrix (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gfloat matrix[6])
|
|
||||||
{
|
|
||||||
MetaBackend *backend = meta_get_backend ();
|
|
||||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
||||||
gfloat full_matrix[9] = { matrix[0], matrix[1], matrix[2],
|
|
||||||
matrix[3], matrix[4], matrix[5],
|
|
||||||
0, 0, 1 };
|
|
||||||
|
|
||||||
change_property (device, "Coordinate Transformation Matrix",
|
|
||||||
XInternAtom (xdisplay, "FLOAT", False),
|
|
||||||
32, &full_matrix, 9);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_speed (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gdouble speed)
|
|
||||||
{
|
|
||||||
MetaBackend *backend = meta_get_backend ();
|
|
||||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
||||||
gfloat value = speed;
|
|
||||||
|
|
||||||
change_property (device, "libinput Accel Speed",
|
|
||||||
XInternAtom (xdisplay, "FLOAT", False),
|
|
||||||
32, &value, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean enabled)
|
|
||||||
{
|
|
||||||
guchar value = (enabled) ? 1 : 0;
|
|
||||||
|
|
||||||
change_property (device, "libinput Left Handed Enabled",
|
|
||||||
XA_INTEGER, 8, &value, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_tap_enabled (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean enabled)
|
|
||||||
{
|
|
||||||
guchar value = (enabled) ? 1 : 0;
|
|
||||||
|
|
||||||
change_property (device, "libinput Tapping Enabled",
|
|
||||||
XA_INTEGER, 8, &value, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
gboolean inverted)
|
|
||||||
{
|
|
||||||
guchar value = (inverted) ? 1 : 0;
|
|
||||||
|
|
||||||
change_property (device, "libinput Natural Scrolling Enabled",
|
|
||||||
XA_INTEGER, 8, &value, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_scroll_method (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
GDesktopTouchpadScrollMethod mode)
|
|
||||||
{
|
|
||||||
guchar values[3] = { 0 }; /* 2fg, edge, button. The last value is unused */
|
|
||||||
guchar *available;
|
|
||||||
|
|
||||||
available = get_property (device, "libinput Scroll Methods Available",
|
|
||||||
XA_INTEGER, 8, 3);
|
|
||||||
if (!available)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (mode)
|
|
||||||
{
|
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_DISABLED:
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_EDGE_SCROLLING:
|
|
||||||
values[1] = 1;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_TWO_FINGER_SCROLLING:
|
|
||||||
values[0] = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((values[0] && !available[0]) || (values[1] && !available[1]))
|
|
||||||
g_warning ("Device '%s' does not support scroll mode %d\n",
|
|
||||||
clutter_input_device_get_device_name (device), mode);
|
|
||||||
else
|
|
||||||
change_property (device, "libinput Scroll Method Enabled",
|
|
||||||
XA_INTEGER, 8, &values, 3);
|
|
||||||
|
|
||||||
meta_XFree (available);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_scroll_button (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
guint button)
|
|
||||||
{
|
|
||||||
change_property (device, "libinput Button Scrolling Button",
|
|
||||||
XA_INTEGER, 32, &button, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_click_method (MetaInputSettings *settings,
|
|
||||||
ClutterInputDevice *device,
|
|
||||||
GDesktopTouchpadClickMethod mode)
|
|
||||||
{
|
|
||||||
guchar values[2] = { 0 }; /* buttonareas, clickfinger */
|
|
||||||
guchar *defaults, *available;
|
|
||||||
|
|
||||||
available = get_property (device, "libinput Click Methods Available",
|
|
||||||
XA_INTEGER, 8, 2);
|
|
||||||
if (!available)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (mode)
|
|
||||||
{
|
|
||||||
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_DEFAULT:
|
|
||||||
defaults = get_property (device, "libinput Click Method Enabled Default",
|
|
||||||
XA_INTEGER, 8, 2);
|
|
||||||
if (!defaults)
|
|
||||||
break;
|
|
||||||
memcpy (values, defaults, 2);
|
|
||||||
meta_XFree (defaults);
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_NONE:
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_AREAS:
|
|
||||||
values[0] = 1;
|
|
||||||
break;
|
|
||||||
case G_DESKTOP_TOUCHPAD_CLICK_METHOD_FINGERS:
|
|
||||||
values[1] = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((values[0] && !available[0]) || (values[1] && !available[1]))
|
|
||||||
g_warning ("Device '%s' does not support click method %d\n",
|
|
||||||
clutter_input_device_get_device_name (device), mode);
|
|
||||||
else
|
|
||||||
change_property (device, "libinput Click Method Enabled",
|
|
||||||
XA_INTEGER, 8, &values, 2);
|
|
||||||
|
|
||||||
meta_XFree(available);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_set_keyboard_repeat (MetaInputSettings *settings,
|
|
||||||
gboolean enabled,
|
|
||||||
guint delay,
|
|
||||||
guint interval)
|
|
||||||
{
|
|
||||||
MetaBackend *backend = meta_get_backend ();
|
|
||||||
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
||||||
|
|
||||||
if (enabled)
|
|
||||||
{
|
|
||||||
XAutoRepeatOn (xdisplay);
|
|
||||||
XkbSetAutoRepeatRate (xdisplay, XkbUseCoreKbd, delay, interval);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XAutoRepeatOff (xdisplay);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
|
|
||||||
{
|
|
||||||
MetaInputSettingsClass *input_settings_class = META_INPUT_SETTINGS_CLASS (klass);
|
|
||||||
|
|
||||||
input_settings_class->set_send_events = meta_input_settings_x11_set_send_events;
|
|
||||||
input_settings_class->set_matrix = meta_input_settings_x11_set_matrix;
|
|
||||||
input_settings_class->set_speed = meta_input_settings_x11_set_speed;
|
|
||||||
input_settings_class->set_left_handed = meta_input_settings_x11_set_left_handed;
|
|
||||||
input_settings_class->set_tap_enabled = meta_input_settings_x11_set_tap_enabled;
|
|
||||||
input_settings_class->set_invert_scroll = meta_input_settings_x11_set_invert_scroll;
|
|
||||||
input_settings_class->set_scroll_method = meta_input_settings_x11_set_scroll_method;
|
|
||||||
input_settings_class->set_scroll_button = meta_input_settings_x11_set_scroll_button;
|
|
||||||
input_settings_class->set_click_method = meta_input_settings_x11_set_click_method;
|
|
||||||
input_settings_class->set_keyboard_repeat = meta_input_settings_x11_set_keyboard_repeat;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_input_settings_x11_init (MetaInputSettingsX11 *settings)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user