Compare commits
	
		
			218 Commits
		
	
	
		
			wip/halfli
			...
			wip/tiling
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | ea901abd61 | ||
|   | 4e5e6aa7f8 | ||
|   | 8e587e2e42 | ||
|   | 93901dc32f | ||
|   | 7173937a7d | ||
|   | f44238a72f | ||
|   | 10a0114856 | ||
|   | aa7bc501d5 | ||
|   | 623eb6eacc | ||
|   | 12a3125132 | ||
|   | 2ca3d30485 | ||
|   | 0559b8fe03 | ||
|   | 0e0915ed79 | ||
|   | 1d56aac156 | ||
|   | f95f3b1ca5 | ||
|   | 3a4ae679ea | ||
|   | 190357c561 | ||
|   | 92c8a51ba6 | ||
|   | 8b1195be1a | ||
|   | e427aa3606 | ||
|   | 7517c91e99 | ||
|   | 7a94fa3be7 | ||
|   | f2ff0b6d42 | ||
|   | 4749bf0420 | ||
|   | 223bfb10a0 | ||
|   | 3d67bfda14 | ||
|   | 51e4491a9f | ||
|   | 82153ff23f | ||
|   | 9b39325244 | ||
|   | 868b3fd01e | ||
|   | 8b801aac77 | ||
|   | c380f2e03f | ||
|   | ca1b4382c0 | ||
|   | f6ba3bdfc2 | ||
|   | 99bba9e56c | ||
|   | 4af908a970 | ||
|   | 417cb2b213 | ||
|   | 9f1d1151b7 | ||
|   | fea1ddcd29 | ||
|   | 3b023ea994 | ||
|   | f8c70491b9 | ||
|   | 9df99d8bac | ||
|   | d4b0c21d06 | ||
|   | 517078d142 | ||
|   | 1c94d0e598 | ||
|   | b04747b174 | ||
|   | 6396974eae | ||
|   | 20908b9c2c | ||
|   | 4abfb299e2 | ||
|   | 62ac9df43d | ||
|   | 0882bce989 | ||
|   | 2d65b485fd | ||
|   | 613cadd19b | ||
|   | 9987185e20 | ||
|   | 2ff61a7d1b | ||
|   | ed686ab60b | ||
|   | a94e640b3f | ||
|   | da28d7a012 | ||
|   | 169f0e7324 | ||
|   | e6eb5c3ebc | ||
|   | 96927b3415 | ||
|   | ceae5dceea | ||
|   | d694244f29 | ||
|   | c52f716115 | ||
|   | 800c0c277e | ||
|   | ae3fad7155 | ||
|   | 1e0abc5279 | ||
|   | 1a3653765c | ||
|   | f0b8dadb7d | ||
|   | d340c3a6dd | ||
|   | 43bd057754 | ||
|   | 66be0387ee | ||
|   | 837836a722 | ||
|   | 2c71a35b4c | ||
|   | d3537c4dc6 | ||
|   | 7c114360d0 | ||
|   | c6aad6e735 | ||
|   | 741dd674f6 | ||
|   | 821d737e2c | ||
|   | 35da6a9078 | ||
|   | 00139755ff | ||
|   | 95dd681d47 | ||
|   | 2e5c8b3f11 | ||
|   | ad7e654a8b | ||
|   | b01926dbfa | ||
|   | 5001aa76d7 | ||
|   | f1730e488d | ||
|   | c22bee19e1 | ||
|   | 7fe2873750 | ||
|   | d6e32a6ac5 | ||
|   | 3f60a2e48a | ||
|   | 3729e592a6 | ||
|   | 56beedf9f2 | ||
|   | bed82427c6 | ||
|   | e097bc8353 | ||
|   | 4e82a751fb | ||
|   | acd50508dc | ||
|   | 9611661154 | ||
|   | a70a2c3744 | ||
|   | bc47b19c3f | ||
|   | bc1dd1cee4 | ||
|   | 495c89401a | ||
|   | e2efc85b08 | ||
|   | 020ae58fe4 | ||
|   | 525644059d | ||
|   | f0f638d2bd | ||
|   | bc8ec2d90d | ||
|   | 5b0eabec51 | ||
|   | 50099c4c10 | ||
|   | 55eef2deb3 | ||
|   | f9db65f47f | ||
|   | a809055470 | ||
|   | 247909e161 | ||
|   | e5ce6192f4 | ||
|   | 7adbb58736 | ||
|   | 0165cb6974 | ||
|   | 3cdcd3e9c1 | ||
|   | 6fc51e3723 | ||
|   | af45a50cb1 | ||
|   | 72d6efc0d5 | ||
|   | e0ffef06dd | ||
|   | d5b69bcd54 | ||
|   | ac8fe2d9b2 | ||
|   | e7a88dc6b2 | ||
|   | bcdda506e1 | ||
|   | 9b26694bbc | ||
|   | f053c09083 | ||
|   | ec9abaf1ef | ||
|   | 6b88420465 | ||
|   | fc0a834abb | ||
|   | e30010b9f0 | ||
|   | 935d76ba04 | ||
|   | cc013e1daa | ||
|   | a7a376ae1f | ||
|   | 5e57af6286 | ||
|   | 42b3a34f7b | ||
|   | 19d814c887 | ||
|   | 46eb682c83 | ||
|   | 3aea8d8ce6 | ||
|   | 40c3c69435 | ||
|   | 8071e5b149 | ||
|   | 8a481b3e10 | ||
|   | 50e3e3b929 | ||
|   | 2c7ef2269f | ||
|   | 8bded7d497 | ||
|   | 9ebe3419c3 | ||
|   | 9385c835b8 | ||
|   | efef0c993b | ||
|   | 3a2cd3389a | ||
|   | 88acfb8e60 | ||
|   | 8e22dce5d7 | ||
|   | e0906a77aa | ||
|   | 053f5088df | ||
|   | 75b992c7d0 | ||
|   | 213f0fa160 | ||
|   | 5054b2a99c | ||
|   | d455de32a0 | ||
|   | e7390cff83 | ||
|   | 49ea6486e2 | ||
|   | 996aeaef41 | ||
|   | a27b2597b9 | ||
|   | 0e8ca1a042 | ||
|   | f5f26c9cff | ||
|   | 91ac69382d | ||
|   | 8cc345fcf5 | ||
|   | 96b5042dda | ||
|   | 428c687b5a | ||
|   | 82bdd1e353 | ||
|   | 4bebc5e5fa | ||
|   | be5643cee7 | ||
|   | 2ee1c5fa61 | ||
|   | c625d2ee9d | ||
|   | 3078f70f90 | ||
|   | 7309b20c25 | ||
|   | c16a5ec1cf | ||
|   | f3e1964362 | ||
|   | 9b9083180f | ||
|   | 7606f79a1e | ||
|   | 99c0b82b15 | ||
|   | ca7c1d5e02 | ||
|   | 4a770907c1 | ||
|   | 049f1556dc | ||
|   | 7b20d151ed | ||
|   | 8ec0c99ff4 | ||
|   | cf3ee327a0 | ||
|   | 3ec3cc248d | ||
|   | 7fb3ecc12c | ||
|   | 4c9af7267d | ||
|   | db4355ba1e | ||
|   | 33150569cd | ||
|   | af2a13ded4 | ||
|   | 8b200de35a | ||
|   | 57ae203aab | ||
|   | bff75b64be | ||
|   | 8899b9da01 | ||
|   | 76e816a14f | ||
|   | 2750db2a89 | ||
|   | 86a913d37a | ||
|   | 2857fdbdb8 | ||
|   | 69a7d5ff02 | ||
|   | a4f763ac3b | ||
|   | f2afa7aa6c | ||
|   | a5d2555196 | ||
|   | dd5a4ecdf9 | ||
|   | 43a1d43f2b | ||
|   | d6d377a447 | ||
|   | ffd95c2ad5 | ||
|   | 72be89dfb9 | ||
|   | 2feeb57dee | ||
|   | 9c81b718f9 | ||
|   | 3a63d58d9e | ||
|   | a95ae4d178 | ||
|   | a692fd3808 | ||
|   | 377ecdb864 | ||
|   | d7f544f42e | ||
|   | 1ab8b854df | ||
|   | ae7aabd5de | ||
|   | b975676c5d | 
							
								
								
									
										17
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -46,6 +46,7 @@ mutter | ||||
| mutter-restart-helper | ||||
| mutter-test-client | ||||
| mutter-test-runner | ||||
| mutter-test-unit-tests | ||||
| mutter-all.test | ||||
| org.gnome.mutter.gschema.valid | ||||
| org.gnome.mutter.gschema.xml | ||||
| @@ -62,14 +63,18 @@ src/stamp-meta-enum-types.h | ||||
| src/meta-dbus-display-config.[ch] | ||||
| src/meta-dbus-idle-monitor.[ch] | ||||
| src/meta-dbus-login1.[ch] | ||||
| src/gtk-primary-selection-protocol.c | ||||
| src/gtk-primary-selection-server-protocol.h | ||||
| src/gtk-shell-protocol.c | ||||
| src/gtk-shell-server-protocol.h | ||||
| src/xdg-shell-protocol.c | ||||
| src/xdg-shell-server-protocol.h | ||||
| src/pointer-gestures-protocol.c | ||||
| src/pointer-gestures-server-protocol.h | ||||
| src/xserver-protocol.c | ||||
| src/xserver-server-protocol.h | ||||
| src/xdg-shell-unstable-v*-protocol.c | ||||
| src/xdg-shell-unstable-v*-server-protocol.h | ||||
| src/pointer-gestures-unstable-v*-protocol.c | ||||
| src/pointer-gestures-unstable-v*-server-protocol.h | ||||
| src/relative-pointer-unstable-v*-protocol.c | ||||
| src/relative-pointer-unstable-v*-server-protocol.h | ||||
| src/pointer-constraints-unstable-v*-protocol.c | ||||
| src/pointer-constraints-unstable-v*-server-protocol.h | ||||
| src/meta/meta-version.h | ||||
| doc/reference/*.args | ||||
| doc/reference/*.bak | ||||
|   | ||||
							
								
								
									
										129
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,3 +1,132 @@ | ||||
| 3.20.0 | ||||
| ====== | ||||
| * Fix crash when using visual bell [Jonas; #763858] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Jasper St. Pierre | ||||
|  | ||||
| Translations: | ||||
|   Milo Casagrande [it], Ask Hjorth Larsen [da] | ||||
|  | ||||
| 3.19.92 | ||||
| ======= | ||||
| * Add system bell support on wayland [Jonas; #763284] | ||||
| * Add gtk_surface.present to gtk-shell [Jonas; #763295] | ||||
| * Handle DND drops on the root window [Carlos; #762104] | ||||
| * Misc. bug fixes [Jonas, Carlos, Rui; #762828, #760745, #763125, #762763, | ||||
|   #762661, #762639, #763159] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Carlos Garnacho, Rui Matos, Florian Müllner | ||||
|  | ||||
| Translations: | ||||
|   Rūdolfs Mazurs [lv], Balázs Úr [hu], Claude Paroz [fr], Matej Urbančič [sl], | ||||
|   Мирослав Николић [sr, sr@latin], Sebastian Rasmussen [sv], Changwoo Ryu [ko], | ||||
|   Gil Forcada [ca], Tom Tryfonidis [el] | ||||
|  | ||||
| 3.19.91 | ||||
| ======= | ||||
| * Add --nested CLI argument to fix nested wayland session [Jonas; #758658] | ||||
| * Fix stack - scene graph stacking synchronization issues [Jonas; #755605] | ||||
| * Rate-limit last-device changes to fix freezes [Carlos; #753527] | ||||
| * Implement primary selection protocol [Carlos; #762560] | ||||
| * Misc. bug fixes [Carlos, Jonas; #762878, #762716] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Carlos Garnacho, Tim Lunn | ||||
|  | ||||
| Translations: | ||||
|   Piotr Drąg [pl], Artur de Aquino Morais [pt_BR], Marek Černocký [cs], | ||||
|   Cédric Valmary [oc], Mario Blättermann [de], Dušan Kazik [sk], | ||||
|   Fran Dieguez [gl], Aurimas Černius [lt], Daniel Mustieles [es], | ||||
|   Stas Solovey [ru], Yosef Or Boczko [he] | ||||
|  | ||||
| 3.19.90 | ||||
| ======= | ||||
| * Release buffer after processing commit [Ray; #761312, #761613] | ||||
| * Implement pointer motion, locks and confinement on wayland [Jonas; #744104] | ||||
| * Add basic startup notification support on wayland [Carlos; #762268] | ||||
| * Misc. bug fixes [Rui, Alberts, Florian; #760670, #761543, #752794, #761557] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, | ||||
|   Alberts Muktupāvels, Florian Müllner, Jasper St. Pierre, Ray Strode | ||||
|  | ||||
| 3.19.4 | ||||
| ====== | ||||
| * Fix updating stacking order when setting transient_for [Jonas; #755606] | ||||
| * Support screen rotation when supported by the driver [Carlos; #745079] | ||||
| * Protect against broken WM_CLASS property implementations [Sebastian; #759658] | ||||
| * Handle wl_pointer v5 events on wayland [Carlos; #760637] | ||||
| * Implement DND actions on wayland [Carlos; #760805] | ||||
| * Misc. bug fixes [Jonas, Rui, Ray, Marek; #754711, #756789, #759297, #758613, | ||||
|   #760330, #760476, #759222, #760670] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Marek Chalupa, Carlos Garnacho, Sebastian Keller, Rui Matos, | ||||
|   Florian Müllner, Jasper St. Pierre, Ray Strode | ||||
|  | ||||
| Translations: | ||||
|   Aurimas Černius [lt] | ||||
|  | ||||
| 3.19.3 | ||||
| ====== | ||||
| * Correct refresh rate units on KMS/Wayland [Daniel; #758653] | ||||
| * Fix crash when initial cursor position is not on a monitor [Marek; #756698] | ||||
| * Fix crash when more CRTs are enabled than outputs connected [Rui; #751638] | ||||
| * Fix touch pointer emulation on wayland [Carlos; #756754] | ||||
| * Allow minimizing windows that don't advertise supporting it [Jasper; #758186] | ||||
| * Force 2-finger scroll by default if available [Bastien; #759304] | ||||
| * Fix crash during XWayland initialization [Marek; #751845] | ||||
| * Ensure to send a ConfigureNotify to just mapped windows [Rui; #759492] | ||||
| * Misc. bug fixes and cleanups [Carlos, Jonas, Lionel; #758239, #758633, | ||||
|   #755503, #759374] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Marek Chalupa, Carlos Garnacho, Lionel Landwerlin, Rui Matos, | ||||
|   Bastien Nocera, Daniel Stone, Jasper St. Pierre | ||||
|  | ||||
| 3.19.2 | ||||
| ====== | ||||
| * Fix crash on monitor unplug [Rui; #756796] | ||||
| * Exit cleanly on initialization errors [Owen; #757311] | ||||
| * Allow to determine backend setting from session type [Ray; #741666] | ||||
| * Fix DRM device detection for non-PCI devices [Alban; #754911] | ||||
| * Don't force placement of windows without buffer on wayland [Marek; #751887] | ||||
| * Fix initialization of bypass compositor hint [Rui; #758544] | ||||
|  | ||||
| Contributors: | ||||
|   Alban Browaeys, Marek Chalupa, Rui Matos, Florian Müllner, Ray Strode, | ||||
|   Owen W. Taylor | ||||
|  | ||||
| 3.19.1 | ||||
| ====== | ||||
| * wayland: Allow to trigger popups through keyboard/touch [Carlos; #756296] | ||||
| * Fix modifiers-only input source switching on Ubuntu [Alberts; #756543] | ||||
| * Misc. bug fixes [Jonas, Rui, Giovanni, Florian; #756675, #756660, #746420, | ||||
|   #756548, #756796, #757101, #757148] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Giovanni Campagna, Carlos Garnacho, Rui Matos, | ||||
|   Alberts Muktupāvels, Florian Müllner | ||||
|  | ||||
| Translations: | ||||
|   Daniel Șerbănescu [ro] | ||||
|  | ||||
| 3.18.1 | ||||
| ====== | ||||
| * Misc. crash fixes [Jonas, Rui, Carlos, Owen, Florian; #755096, #754979, | ||||
|   #755490, #754357, #745785, #756642] | ||||
| * Improve HiDPI support on wayland [Jonas; #755097] | ||||
| * Fix doubly-scaled cursor on XWayland HiDPI [Jonas; #755099] | ||||
| * Stop hiding titlebar buttons in dialogs [Florian; #641630] | ||||
| * Add support for fullscreen/unfullscreen animations [Cosimo; #707248] | ||||
| * Misc. bug fixes [Rui, Colin, Florian; #743339, #752047, #756074, #756649] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Cosimo Cecchi, Carlos Garnacho, Rui Matos, Florian Müllner, | ||||
|   Jasper St. Pierre, Colin Walters, Owen W. Taylor | ||||
|  | ||||
| 3.18.0 | ||||
| ====== | ||||
| * Misc. fixes [Florian, Jonas; #753434] | ||||
|   | ||||
							
								
								
									
										13
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| AC_PREREQ(2.62) | ||||
|  | ||||
| m4_define([mutter_major_version], [3]) | ||||
| m4_define([mutter_minor_version], [18]) | ||||
| m4_define([mutter_minor_version], [20]) | ||||
| m4_define([mutter_micro_version], [0]) | ||||
|  | ||||
| m4_define([mutter_version], | ||||
| @@ -46,6 +46,7 @@ IT_PROG_INTLTOOL([0.41]) | ||||
| AC_PROG_CC | ||||
| AC_PROG_CC_C_O | ||||
| AC_PROG_INSTALL | ||||
| AC_PROG_SED | ||||
| AC_HEADER_STDC | ||||
| PKG_PROG_PKG_CONFIG([0.21]) | ||||
|  | ||||
| @@ -58,12 +59,12 @@ CANBERRA_GTK_VERSION=0.26 | ||||
| CLUTTER_PACKAGE=clutter-1.0 | ||||
|  | ||||
| MUTTER_PC_MODULES=" | ||||
|    gtk+-3.0 >= 3.9.11 | ||||
|    gtk+-3.0 >= 3.19.8 | ||||
|    gio-unix-2.0 >= 2.35.1 | ||||
|    pango >= 1.2.0 | ||||
|    cairo >= 1.10.0 | ||||
|    gsettings-desktop-schemas >= 3.15.92 | ||||
|    $CLUTTER_PACKAGE >= 1.23.4 | ||||
|    gsettings-desktop-schemas >= 3.19.3 | ||||
|    $CLUTTER_PACKAGE >= 1.25.6 | ||||
|    cogl-1.0 >= 1.17.1 | ||||
|    upower-glib >= 0.99.0 | ||||
|    gnome-desktop-3.0 | ||||
| @@ -219,6 +220,10 @@ AS_IF([test "$have_wayland" = "yes"], [ | ||||
|     [AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols])]) | ||||
|   AC_SUBST([WAYLAND_SCANNER]) | ||||
|   AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support]) | ||||
|  | ||||
|   PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.1], | ||||
| 		    [ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`]) | ||||
|   AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir) | ||||
| ]) | ||||
| AM_CONDITIONAL([HAVE_WAYLAND],[test "$have_wayland" = "yes"]) | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| desktopfiles_in_files = \ | ||||
| 	mutter.desktop.in \ | ||||
| 	mutter-wayland.desktop.in | ||||
| 	mutter.desktop.in | ||||
| desktopfilesdir = $(datadir)/applications | ||||
| desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop) | ||||
|  | ||||
|   | ||||
| @@ -1,17 +0,0 @@ | ||||
| [Desktop Entry] | ||||
| Type=Application | ||||
| _Name=Mutter (wayland compositor) | ||||
| Exec=mutter --wayland --display-server | ||||
| NoDisplay=true | ||||
| # name of loadable control center module | ||||
| X-GNOME-WMSettingsModule=metacity | ||||
| # name we put on the WM spec check window | ||||
| X-GNOME-WMName=Mutter | ||||
| # back compat only  | ||||
| X-GnomeWMSettingsLibrary=metacity | ||||
| X-GNOME-Bugzilla-Bugzilla=GNOME | ||||
| X-GNOME-Bugzilla-Product=mutter | ||||
| X-GNOME-Bugzilla-Component=general | ||||
| X-GNOME-Autostart-Phase=WindowManager | ||||
| X-GNOME-Provides=windowmanager | ||||
| X-GNOME-Autostart-Notify=true | ||||
| @@ -29,6 +29,7 @@ eu | ||||
| fa | ||||
| fi | ||||
| fr | ||||
| fur | ||||
| ga | ||||
| gl | ||||
| gu | ||||
|   | ||||
| @@ -1 +1,2 @@ | ||||
| data/mutter-wayland.desktop.in | ||||
| # List of source files that should NOT be translated. | ||||
| # Please keep this file sorted alphabetically. | ||||
|   | ||||
							
								
								
									
										58
									
								
								po/ca.po
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								po/ca.po
									
									
									
									
									
								
							| @@ -6,21 +6,23 @@ | ||||
| # Jordi Mallach <jordi@sindominio.net>, 2003, 2004, 2005, 2006, 2007, 2008. | ||||
| # David Planella <david.planella@gmail.com>, 2008, 2009, 2011, 2012. | ||||
| # Jordi Serratosa <jordis@softcatala.cat>, 2012. | ||||
| # Gil Forcada <gilforcada@guifi.net>, 2012, 2013, 2014. | ||||
| # Gil Forcada <gilforcada@guifi.net>, 2012, 2013, 2014, 2016. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: metacity 2.24\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-03-10 17:33-0400\n" | ||||
| "PO-Revision-Date: 2015-03-10 17:33-0400\n" | ||||
| "Last-Translator: Jordi Mas <jmas@softcatala.org>\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2016-03-13 01:36+0000\n" | ||||
| "PO-Revision-Date: 2016-03-13 14:45+0100\n" | ||||
| "Last-Translator: Gil Forcada <gilforcada@guifi.net>\n" | ||||
| "Language-Team: Catalan <tradgnome@softcatala.org>\n" | ||||
| "Language: ca\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bits\n" | ||||
| "Plural-Forms: nplurals=2; plural=n != 1;\n" | ||||
| "X-Generator: Gtranslator 2.91.6\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -465,22 +467,22 @@ msgstr "Canvia al terminal virtual 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Canvia al terminal virtual 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Pantalla integrada" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Desconeguda" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Pantalla desconeguda" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -496,7 +498,7 @@ msgstr "" | ||||
| "Ja s'està executant un altre gestor de composició a la pantalla %i a la " | ||||
| "visualització «%s»." | ||||
|  | ||||
| #: ../src/core/bell.c:185 | ||||
| #: ../src/core/bell.c:192 | ||||
| msgid "Bell event" | ||||
| msgstr "Esdeveniment de campana" | ||||
|  | ||||
| @@ -525,41 +527,51 @@ msgstr "_Espera" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Força'n la sortida" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "" | ||||
| "S'ha produït un error en obrir la pantalla del sistema de finestres X «%s»\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Inhabilita la connexió al gestor de sessions" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Reemplaça el gestor de finestres en execució" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Especifica l'ID de gestió de sessió" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Visualització X per usar" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inicialitza la sessió des del fitxer desat" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Fes que les crides a l'X siguin síncrones" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Funciona com a compositor de Wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| # Notes: | ||||
| # Afegeix una nota | ||||
| # | ||||
| # Camins: | ||||
| # ../src/core/main.c:223 | ||||
| #: ../src/core/main.c:223 | ||||
| #| msgid "Run as a wayland compositor" | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Funciona com a compositor imbricat" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Funciona com a servidor de pantalla completa, en comptes d'imbricat" | ||||
|  | ||||
| @@ -587,12 +599,12 @@ msgstr "Escriu versió" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Connector del Mutter a utilitzar" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Espai de treball %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -601,12 +613,12 @@ msgstr "" | ||||
| "La pantalla «%s» ja té un gestor de finestres; proveu l'opció --replace per " | ||||
| "reemplaçar el gestor de finestres actual." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "La pantalla %d en la visualització '%s' no és vàlida\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter es va compilar sense compatibilitat per al mode detallat\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										74
									
								
								po/cs.po
									
									
									
									
									
								
							
							
						
						
									
										74
									
								
								po/cs.po
									
									
									
									
									
								
							| @@ -12,7 +12,7 @@ msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-03-24 23:25+0000\n" | ||||
| "POT-Creation-Date: 2016-02-27 13:36+0000\n" | ||||
| "PO-Revision-Date: 2014-09-22 15:01+0200\n" | ||||
| "Last-Translator: Petr Kovar <pknbe@volny.cz>\n" | ||||
| "Language-Team: Czech <gnome-cs-list@gnome.org>\n" | ||||
| @@ -238,8 +238,7 @@ msgstr "Přepnout okno na všechny/jednu pracovní plochu" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:13 | ||||
| msgid "Raise window if covered, otherwise lower it" | ||||
| msgstr "" | ||||
| "Když je okno zakryté vynést jej do popředí, jinak odsunout do pozadí" | ||||
| msgstr "Když je okno zakryté vynést jej do popředí, jinak odsunout do pozadí" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:14 | ||||
| msgid "Raise window above other windows" | ||||
| @@ -457,22 +456,22 @@ msgstr "Přepnout na VT 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Přepnout na VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Vestavěný displej" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Neznámý" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Neznámý displej" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -515,40 +514,44 @@ msgstr "_Počkat" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Vynutit ukončení" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Nelze otevřít displej X Window System „%s“\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Zakáže připojení ke správci sezení" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Nahradí běžícího správce oken" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Určení ID správy sezení" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Displej X, který použije" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Spustí sezení z uloženého souboru" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Provede volání X synchronně" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Spustit jako kompozitní program protokolu Wayland" | ||||
| msgstr "Spustit jako kompozitor protokolu Wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Spustit jako podkladový kompozitor" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Spustit jako plnohodnotný server displeje, nikoliv vnořeně" | ||||
|  | ||||
| @@ -576,12 +579,12 @@ msgstr "Vypíše verzi" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Zásuvný modul Mutter, který se má použít" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Plocha %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -590,12 +593,12 @@ msgstr "" | ||||
| "Displej „%s“ již správce oken má; zkuste prosím nahradit aktuálního správce " | ||||
| "oken pomocí přepínače --replace." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Obrazovka %d na displeji „%s“ je neplatná\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter bylo přeloženo bez podpory podrobného režimu\n" | ||||
|  | ||||
| @@ -1272,32 +1275,3 @@ msgstr "%s (na %s)" | ||||
| #~ msgid "Move to Another _Workspace" | ||||
| #~ msgstr "Přes_unout na jinou plochu" | ||||
|  | ||||
| #~ msgid "Shift" | ||||
| #~ msgstr "Shift" | ||||
|  | ||||
| #~ msgid "Ctrl" | ||||
| #~ msgstr "Ctrl" | ||||
|  | ||||
| #~ msgid "Alt" | ||||
| #~ msgstr "Alt" | ||||
|  | ||||
| #~ msgid "Meta" | ||||
| #~ msgstr "Meta" | ||||
|  | ||||
| #~ msgid "Super" | ||||
| #~ msgstr "Super" | ||||
|  | ||||
| #~ msgid "Hyper" | ||||
| #~ msgstr "Hyper" | ||||
|  | ||||
| #~ msgid "Mod2" | ||||
| #~ msgstr "Mod2" | ||||
|  | ||||
| #~ msgid "Mod3" | ||||
| #~ msgstr "Mod3" | ||||
|  | ||||
| #~ msgid "Mod4" | ||||
| #~ msgstr "Mod4" | ||||
|  | ||||
| #~ msgid "Mod5" | ||||
| #~ msgstr "Mod5" | ||||
|   | ||||
							
								
								
									
										61
									
								
								po/da.po
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								po/da.po
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| # Danish translation of Mutter. | ||||
| # Copyright (C) 2002-2009, 2012-2015. | ||||
| # Copyright (C) 2002-2009, 2012-2016. | ||||
| # This file is distributed under the same license as the metacity package. | ||||
| # Kjartan Maraas <kmaraas@gnome.org>, 2002 | ||||
| # Keld simonsen <keld@dkuug.dk>, 2002 | ||||
| @@ -8,7 +8,7 @@ | ||||
| # Lasse Bang Mikkelsen <lbm@fatalerror.dk>, 2006. | ||||
| # Kenneth Nielsen <k.nielsen81@gmail.com>, 2008. | ||||
| # Joe Hansen <joedalton2@yahoo.dk>, 2011. | ||||
| # Ask Hjorth Larsen <asklarsen@gmail.com>, 2007, 09, 10, 12, 13, 14, 15. | ||||
| # Ask Hjorth Larsen <asklarsen@gmail.com>, 2007, 09, 10, 12, 13, 14, 15, 16. | ||||
| # | ||||
| # Konventioner: | ||||
| # | ||||
| @@ -20,8 +20,8 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-03-21 16:30+0100\n" | ||||
| "PO-Revision-Date: 2015-03-14 17:01+0100\n" | ||||
| "POT-Creation-Date: 2016-03-20 23:17+0100\n" | ||||
| "PO-Revision-Date: 2016-03-20 21:46+0100\n" | ||||
| "Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n" | ||||
| "Language-Team: Danish <dansk@dansk-gruppen.dk>\n" | ||||
| "Language: da\n" | ||||
| @@ -291,7 +291,7 @@ msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:3 | ||||
| msgid "Attach modal dialogs" | ||||
| msgstr "Fastgør modaldialogvinduer" | ||||
| msgstr "Fastgør modaldialoger" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:4 | ||||
| msgid "" | ||||
| @@ -299,9 +299,8 @@ msgid "" | ||||
| "attached to the titlebar of the parent window and are moved together with " | ||||
| "the parent window." | ||||
| msgstr "" | ||||
| "Når sand, vil modaldialogvinduer hænge sammen med titellinjen af " | ||||
| "ophavsvinduet og flyttes sammen med dette, frem for at have uafhængige " | ||||
| "titellinjer." | ||||
| "Når sand, vil modaldialoger hænge sammen med titellinjen af ophavsvinduet og " | ||||
| "flyttes sammen med dette, frem for at have uafhængige titellinjer." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:5 | ||||
| msgid "Enable edge tiling when dropping windows on screen edges" | ||||
| @@ -463,22 +462,22 @@ msgstr "Skift til VT 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Skift til VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Indbygget skærm" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Ukendt" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Ukendt skærm" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -493,7 +492,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "En anden komposithåndtering kører allerede på skærm %i på terminal \"%s\"." | ||||
|  | ||||
| #: ../src/core/bell.c:185 | ||||
| #: ../src/core/bell.c:192 | ||||
| msgid "Bell event" | ||||
| msgstr "Bip-hændelse" | ||||
|  | ||||
| @@ -522,40 +521,44 @@ msgstr "_Vent" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Tving til at afslutte" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Kunne ikke åbne X Window System-terminalen \"%s\"\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Deaktivér forbindelse til sessionshåndtering" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Erstat den kørende vindueshåndtering" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Angiv sessionhåndterings-id" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "X-skærm som bruges" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Initialisér session fra gemt fil" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Gør kald til X synkrone" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Kør som en wayland-kompositor" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Kør som en indlejret kompositor" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Kør som fuld displayserver, frem for indlejret" | ||||
|  | ||||
| @@ -582,12 +585,12 @@ msgstr "Vis version" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Mutter-udvidelsesmodul der skal bruges" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Arbejdsområde %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -596,12 +599,12 @@ msgstr "" | ||||
| "Terminalen \"%s\" har allerede en vindueshåndtering; prøv tilvalget --" | ||||
| "replace for at erstatte den aktuelle vindueshåndtering." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Skærm %d på terminal \"%s\" er ugyldig\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter blev kompileret uden understøttelse for uddybende tilstand\n" | ||||
|  | ||||
| @@ -1336,9 +1339,6 @@ msgstr "%s (på %s)" | ||||
| #~ msgid "_Dialog" | ||||
| #~ msgstr "_Dialog" | ||||
|  | ||||
| #~ msgid "_Modal dialog" | ||||
| #~ msgstr "_Modaldialogvindue" | ||||
|  | ||||
| #~ msgid "_Utility" | ||||
| #~ msgstr "_Værktøj" | ||||
|  | ||||
| @@ -1402,9 +1402,6 @@ msgstr "%s (på %s)" | ||||
| #~ msgid "Border" | ||||
| #~ msgstr "Ramme" | ||||
|  | ||||
| #~ msgid "Attached Modal Dialog" | ||||
| #~ msgstr "Fastgjort modaldialogvindue" | ||||
|  | ||||
| #~ msgid "Button layout test %d" | ||||
| #~ msgstr "Knaplayouttest %d" | ||||
|  | ||||
|   | ||||
							
								
								
									
										48
									
								
								po/de.po
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								po/de.po
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ | ||||
| # Matthias Warkus <mawarkus@gnome.org>, 2002. | ||||
| # Christian Neumair <chris@gnome-de.org>, 2002-2004. | ||||
| # Hendrik Richter <hendrikr@gnome.org>, 2005, 2006, 2007, 2008. | ||||
| # Mario Blättermann <mario.blaettermann@gmail.com>, 2010-2013. | ||||
| # Mario Blättermann <mario.blaettermann@gmail.com>, 2010-2013, 2016. | ||||
| # Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009, 2011, 2012. | ||||
| # Wolfgang Stöggl <c72578@yahoo.de> 2011. | ||||
| # Tobias Endrigkeit <tobiasendrigkeit@googlemail.com>, 2012. | ||||
| @@ -13,16 +13,16 @@ msgstr "" | ||||
| "Project-Id-Version: mutter master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-06-20 08:08+0000\n" | ||||
| "PO-Revision-Date: 2015-06-18 20:59+0100\n" | ||||
| "Last-Translator: Bernd Homuth <dev@hmt.im>\n" | ||||
| "POT-Creation-Date: 2016-02-28 13:37+0000\n" | ||||
| "PO-Revision-Date: 2016-02-28 19:15+0100\n" | ||||
| "Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n" | ||||
| "Language-Team: Deutsch <gnome-de@gnome.org>\n" | ||||
| "Language: de\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
| "X-Generator: Poedit 1.8.1\n" | ||||
| "X-Generator: Poedit 1.8.7\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -463,22 +463,22 @@ msgstr "Zum virtuellen Terminal 11 wechseln" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Zum virtuellen Terminal 12 wechseln" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Eingebaute Anzeige" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Unbekannt" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Unbekannte Anzeige" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -523,40 +523,44 @@ msgstr "_Warten" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Beenden erzwingen" | ||||
|  | ||||
| #: ../src/core/display.c:563 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "X-Window-Systemanzeige »%s« konnte nicht geöffnet werden\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Verbindung zur Sitzungsverwaltung deaktivieren" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Den aktuellen Fensterverwalter ersetzen" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Kennung der Sitzungsverwaltung angeben" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Zu verwendende X-Anzeige" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Sitzung anhand gespeicherter Datei starten" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "X-Aufrufe abgleichen" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Als Wayland-Compositor ausführen" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Als eingebetteten Compositor ausführen" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Als vollwertigen Display-Server verwenden (nicht eingebettet)" | ||||
|  | ||||
| @@ -586,12 +590,12 @@ msgstr "Version ausgeben" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Zu benutzendes Mutter-Plugin" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Arbeitsfläche %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -600,12 +604,12 @@ msgstr "" | ||||
| "Bildschirm »%s« hat bereits einen Fensterverwalter. Versuchen Sie die Option " | ||||
| "»--replace«, um den aktuellen Fensterverwalter zu ersetzen." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Bildschirm %d auf Anzeige »%s« ist ungültig\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter wurde ohne Unterstützung für den redseligen Modus kompiliert\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										58
									
								
								po/el.po
									
									
									
									
									
								
							
							
						
						
									
										58
									
								
								po/el.po
									
									
									
									
									
								
							| @@ -20,16 +20,16 @@ msgstr "" | ||||
| "Project-Id-Version: metacity.gnome-2-26\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-02-21 11:31+0000\n" | ||||
| "PO-Revision-Date: 2015-02-21 15:43+0200\n" | ||||
| "Last-Translator: Efstathios Iosifidis <iosifidis@opensuse.org>\n" | ||||
| "POT-Creation-Date: 2016-03-12 01:36+0000\n" | ||||
| "PO-Revision-Date: 2016-03-14 23:05+0200\n" | ||||
| "Last-Translator: Tom Tryfonidis <tomtryf@gmail.com>\n" | ||||
| "Language-Team: Greek, Modern (1453-) <opensuse-translation-el@opensuse.org>\n" | ||||
| "Language: el\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
| "X-Generator: Gtranslator 2.91.6\n" | ||||
| "X-Generator: Poedit 1.8.7\n" | ||||
| "X-Project-Style: gnome\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| @@ -453,46 +453,41 @@ msgid "Switch to VT 7" | ||||
| msgstr "Εναλλαγή στο VT 7" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 8" | ||||
| msgstr "Εναλλαγή στο VT 8" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 9" | ||||
| msgstr "Εναλλαγή στο VT 9" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 10" | ||||
| msgstr "Εναλλαγή στο VT 10" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 11" | ||||
| msgstr "Εναλλαγή στο VT 11" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Εναλλαγή στο VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Ενσωματωμένη οθόνη" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Άγνωστη" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Άγνωστη οθόνη" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -507,7 +502,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Εκτελείται ένας άλλος διαχειριστής παραθύρων στην οθόνη %i προβολή \"%s\"." | ||||
|  | ||||
| #: ../src/core/bell.c:185 | ||||
| #: ../src/core/bell.c:192 | ||||
| msgid "Bell event" | ||||
| msgstr "Ηχητικό συμβάν κουδουνιού" | ||||
|  | ||||
| @@ -537,40 +532,44 @@ msgid "_Force Quit" | ||||
| msgstr "_Εξαναγκασμός σε τερματισμό" | ||||
|  | ||||
| # gconf/gconf-internals.c:2416 | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Αποτυχία ανοίγματος οθόνης του συστήματος παραθύρων Χ '%s'\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Απενεργοποίηση σύνδεσης στο διαχειριστή συνεδρίας" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Αντικατάσταση του τρέχοντος διαχειριστή παραθύρων" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Καθορισμός αναγνωριστικού διαχείρισης συνεδρίας" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Εμφάνιση Χ για χρήση" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Εκκίνηση συνεδρίας από savefile" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Να καταστούν σύγχρονες οι κλήσεις του X" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Εκτέλεση ως συνθετητής wayland" | ||||
| msgstr "Εκτέλεση ως wayland compositor" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Εκτέλεση ως ενσωματωμένος compositor" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Εκτέλεση ως διακομιστής πλήρους οθόνης, αντί ενσωματωμένης" | ||||
|  | ||||
| @@ -598,16 +597,13 @@ msgstr "Εμφάνιση έκδοσης" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Πρόσθετα του Mutter για χρήση" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Χώρος εργασίας %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, 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" | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
| @@ -616,12 +612,12 @@ msgstr "" | ||||
| "χρησιμοποιήσετε την επιλογή --replace για να αντικαταστήσετε τον τρέχων " | ||||
| "διαχειριστή παραθύρων." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Η οθόνη %d στην προβολή '%s' δεν είναι έγκυρη\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "" | ||||
| "Το Mutter έχει μεταγλωττιστεί χωρίς υποστήριξη για λειτουργία εμφάνισης " | ||||
|   | ||||
							
								
								
									
										50
									
								
								po/es.po
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								po/es.po
									
									
									
									
									
								
							| @@ -7,15 +7,15 @@ | ||||
| # Pablo Gonzalo del Campo <pablodc@bigfoot.com>,2002,2003. | ||||
| # Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2004, 2005, 2006. | ||||
| # Jorge González <jorgegonz@svn.gnome.org>, 2007, 2008, 2009, 2010, 2011. | ||||
| # Daniel Mustieles <daniel.mustieles@gmail.com>, 2011, 2012, 2013, 2014, 2015. | ||||
| # Daniel Mustieles <daniel.mustieles@gmail.com>, 2011, 2012, 2013, 2014, 2015, 2016. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter.master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-02-23 11:10+0000\n" | ||||
| "PO-Revision-Date: 2015-02-23 19:07+0100\n" | ||||
| "POT-Creation-Date: 2016-02-28 13:37+0000\n" | ||||
| "PO-Revision-Date: 2016-02-29 16:02+0100\n" | ||||
| "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" | ||||
| "Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n" | ||||
| "Language: \n" | ||||
| @@ -445,46 +445,41 @@ msgid "Switch to VT 7" | ||||
| msgstr "Cambiar al VT 7" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 8" | ||||
| msgstr "Cambiar al VT 8" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 9" | ||||
| msgstr "Cambiar al VT 9" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 10" | ||||
| msgstr "Cambiar al VT 10" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 11" | ||||
| msgstr "Cambiar al VT 11" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Cambiar al VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Pantalla integrada" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Desconocida" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Pantalla desconocida" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -529,40 +524,45 @@ msgstr "_Esperar" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Forzar la salida" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Ocurrió un error al abrir la pantalla de X Window System «%s»\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Desactivar conexión al gestor de sesión" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Reemplazar el gestor de ventanas en ejecución" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Especificar el ID se gestión de sesión" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Pantalla X que usar" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inicializar sesión desde el archivo de salvaguarda" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Hacer que las llamadas a las X sean síncronas" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Ejecutar como compositor Wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| #| msgid "Run as a wayland compositor" | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Ejecutar como compositor anidado" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Ejecutar como servidor completo, en lugar de anidado" | ||||
|  | ||||
| @@ -589,12 +589,12 @@ msgstr "Imprimir versión" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Complemento de mutter que usar" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Área de trabajo %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -603,12 +603,12 @@ msgstr "" | ||||
| "La pantalla «%s» ya tiene un gestor de ventanas; pruebe a usar la opción «--" | ||||
| "replace» para reemplazar el gestor de ventanas activo." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "La ventana %d en la pantalla «%s» no es válida\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter fue compilado sin soporte para modo prolijo\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										63
									
								
								po/eu.po
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								po/eu.po
									
									
									
									
									
								
							| @@ -2,24 +2,23 @@ | ||||
| # This file is distributed under the same license as the PACKAGE package. | ||||
| # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. | ||||
| # | ||||
| # | ||||
| # Hizkuntza Politikarako Sailburuordetza <hizpol@ej-gv.es>, 2004. | ||||
| # Iñaki Larrañaga Murgoitio <dooteo@zundan.com>, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011. | ||||
| # Iñaki Larrañaga Murgoitio <dooteo@zundan.com>, 2012, 2013, 2014, 2015. | ||||
| # | ||||
| # Iñaki Larrañaga Murgoitio <dooteo@zundan.com>, 2012, 2013, 2014, 2015, 2016. | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-03-21 15:50+0100\n" | ||||
| "PO-Revision-Date: 2015-03-21 15:51+0100\n" | ||||
| "Last-Translator: Iñaki Larrañaga Murgoitio <dooteo@zundan.com>\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2016-03-23 17:05+0100\n" | ||||
| "PO-Revision-Date: 2016-03-23 17:06+0100\n" | ||||
| "Last-Translator: dooteo <dooteo@zundan.com>\n" | ||||
| "Language-Team: Basque <librezale@librezale.org>\n" | ||||
| "Language: eu\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "X-Generator: Lokalize 1.4\n" | ||||
| "X-Generator: Lokalize 2.0\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| @@ -455,22 +454,22 @@ msgstr "Aldatu 11. TBra" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Aldatu 12. TBra" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Bertako pantaila" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Ezezaguna" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Pantaila ezezaguna" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -486,7 +485,7 @@ msgstr "" | ||||
| "Dagoeneko beste konposatze-kudeatzailea ari da exekutatzen \"%2$s\" " | ||||
| "pantailako %1$i. monitorean \"." | ||||
|  | ||||
| #: ../src/core/bell.c:185 | ||||
| #: ../src/core/bell.c:194 | ||||
| msgid "Bell event" | ||||
| msgstr "Soinuaren gertaera" | ||||
|  | ||||
| @@ -515,40 +514,44 @@ msgstr "_Itxaron" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Behartu ixtera" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Huts egin du X Window sistemaren '%s' pantaila irekitzean\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Desgaitu saio-kudeatzailearen konexioa" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Ordeztu exekutatzen dagoen leiho-kudeatzailea" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Zehaztu saio-kudeatzailearen IDa" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "X pantaila erabiltzeko" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Hasieratu saioa babes-fitxategitik" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Egin X deiak sinkronoak izatea" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Exekutatu wayland konposatzaile gisa" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Exekutatu habiaratutako konposatzaile gisa" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Exekutatu pantaila-zerbitzari oso bezala, habiaratuta baino" | ||||
|  | ||||
| @@ -575,12 +578,12 @@ msgstr "Erakutsi bertsioa" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Mutter-en osagaia erabiltzeko" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "%d. laneko area" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -589,12 +592,12 @@ msgstr "" | ||||
| "'%s' pantailak badu leiho-kudeatzailea; erabili --replace aukera uneko leiho-" | ||||
| "kudeatzailea ordezteko." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "'%2$s' bistaratzeko %1$d pantaila ez da baliozkoa\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter modu xehatuaren euskarririk gabe konpilatu da\n" | ||||
|  | ||||
| @@ -676,11 +679,11 @@ msgstr "%s (%s)" | ||||
| #~ "\" ez dator bat formatuarekin" | ||||
|  | ||||
| #~ msgid "" | ||||
| #~ "GTK color specification must have the state in brackets, e.g. gtk:fg" | ||||
| #~ "[NORMAL] where NORMAL is the state; could not parse \"%s\"" | ||||
| #~ "GTK color specification must have the state in brackets, e.g. gtk:" | ||||
| #~ "fg[NORMAL] where NORMAL is the state; could not parse \"%s\"" | ||||
| #~ msgstr "" | ||||
| #~ "GTK kolore-zehaztapenak egoera kortxete artean izan behar du, adib. gtk:fg" | ||||
| #~ "[NORMAL], NORMAL egoera izanik; \"%s\" ezin da analizatu" | ||||
| #~ "GTK kolore-zehaztapenak egoera kortxete artean izan behar du, adib. gtk:" | ||||
| #~ "fg[NORMAL], NORMAL egoera izanik; \"%s\" ezin da analizatu" | ||||
|  | ||||
| #~ msgid "" | ||||
| #~ "GTK color specification must have a close bracket after the state, e.g. " | ||||
|   | ||||
							
								
								
									
										46
									
								
								po/fr.po
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								po/fr.po
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | ||||
| # French translation of mutter. | ||||
| # Copyright (C) 2002-2015 Free Software Foundation, Inc. | ||||
| # Copyright (C) 2002-2016 Free Software Foundation, Inc. | ||||
| # This file is distributed under the same license as the metacity package. | ||||
| # | ||||
| # Christophe Fergeau <teuf@users.sourceforge.net>, 2002. | ||||
| @@ -11,7 +11,7 @@ | ||||
| # Cyprien Le Pannérer <cyplp@free.fr>, 2006. | ||||
| # Robert-André Mauchin <zebob.m@gmail.com>, 2007.  | ||||
| # Stéphane Raimbault <stephane.raimbault@gmail.com>, 2007. | ||||
| # Claude Paroz <claude@2xlibre.net>, 2008-2015. | ||||
| # Claude Paroz <claude@2xlibre.net>, 2008-2016. | ||||
| # Bruno Brouard <annoa.b@gmail.com>, 2011-12. | ||||
| # | ||||
| msgid "" | ||||
| @@ -19,8 +19,8 @@ msgstr "" | ||||
| "Project-Id-Version: mutter master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-02-23 23:11+0000\n" | ||||
| "PO-Revision-Date: 2015-02-24 10:08+0100\n" | ||||
| "POT-Creation-Date: 2016-03-05 13:41+0000\n" | ||||
| "PO-Revision-Date: 2016-03-05 17:57+0100\n" | ||||
| "Last-Translator: Claude Paroz <claude@2xlibre.net>\n" | ||||
| "Language-Team: GNOME French Team <gnomefr@traduc.org>\n" | ||||
| "Language: fr\n" | ||||
| @@ -468,22 +468,22 @@ msgstr "Passer à l'émulateur de terminal 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Passer à l'émulateur de terminal 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Affichage intégré" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Inconnu" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Affichage inconnu" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -528,40 +528,44 @@ msgstr "_Attendre" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Forcer à quitter" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Impossible d'ouvrir l'affichage « %s » du système X Window\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Désactiver la connexion au gestionnaire de sessions" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Remplacer le gestionnaire de fenêtres en cours de fonctionnement" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Indiquer l'ID de gestion de sessions" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Affichage X à utiliser" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Initialiser la session depuis le fichier de sauvegarde" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Rendre synchrones les appels à X" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Lancer comme un compositeur wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Lancer comme un compositeur imbriqué" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Lancer comme un serveur d'affichage complet, plutôt qu'imbriqué" | ||||
|  | ||||
| @@ -589,12 +593,12 @@ msgstr "Afficher la version" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Greffon de Mutter à utiliser" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Espace de travail %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -603,12 +607,12 @@ 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 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "L'écran %d sur l'affichage « %s » n'est pas valide\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter a été compilé sans la prise en charge du mode bavard\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										583
									
								
								po/fur.po
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										583
									
								
								po/fur.po
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,583 @@ | ||||
| # Friulian translation for mutter. | ||||
| # Copyright (C) 2016 mutter's COPYRIGHT HOLDER | ||||
| # This file is distributed under the same license as the mutter package. | ||||
| # Fabio Tomat <f.t.public@gmail.com>, 2016. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2016-03-25 01:58+0000\n" | ||||
| "PO-Revision-Date: 2016-03-25 17:54+0100\n" | ||||
| "Language-Team: Friulian <fur@li.org>\n" | ||||
| "Language: fur\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Last-Translator: Fabio Tomat <f.t.public@gmail.com>\n" | ||||
| "X-Generator: Poedit 1.8.5\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| msgstr "Navigazion" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:2 | ||||
| msgid "Move window to workspace 1" | ||||
| msgstr "Sposte barcon tal spazi di lavôr 1" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:3 | ||||
| msgid "Move window to workspace 2" | ||||
| msgstr "Sposte barcon tal spazi di lavôr 2" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:4 | ||||
| msgid "Move window to workspace 3" | ||||
| msgstr "Sposte barcon tal spazi di lavôr 3" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:5 | ||||
| msgid "Move window to workspace 4" | ||||
| msgstr "Sposte barcon tal spazi di lavôr 4" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:6 | ||||
| msgid "Move window to last workspace" | ||||
| msgstr "Sposte barcon tal ultin spazi di lavôr" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:7 | ||||
| msgid "Move window one workspace to the left" | ||||
| msgstr "Sposte barcon tal spazi di lavôr a çampe" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:8 | ||||
| msgid "Move window one workspace to the right" | ||||
| msgstr "Sposte barcon tal spazi di lavôr a drete" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:9 | ||||
| msgid "Move window one workspace up" | ||||
| msgstr "Sposte barcon tal spazi di lavôr parsore" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:10 | ||||
| msgid "Move window one workspace down" | ||||
| msgstr "Sposte barcon tal spazi di lavôr sot" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:11 | ||||
| msgid "Move window one monitor to the left" | ||||
| msgstr "Sposte barcon tal visôr a çampe" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:12 | ||||
| msgid "Move window one monitor to the right" | ||||
| msgstr "Sposte barcon tal visôr a drete" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:13 | ||||
| msgid "Move window one monitor up" | ||||
| msgstr "Sposte barcon tal visôr parsore" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:14 | ||||
| msgid "Move window one monitor down" | ||||
| msgstr "Sposte barcon tal visôr sot" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:15 | ||||
| msgid "Switch applications" | ||||
| msgstr "Passâ di une aplicazion in chê altre" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:16 | ||||
| msgid "Switch to previous application" | ||||
| msgstr "Passe ae aplicazion prime" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:17 | ||||
| msgid "Switch windows" | ||||
| msgstr "Passâ di un barcon in chel altri" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:18 | ||||
| msgid "Switch to previous window" | ||||
| msgstr "Passe al barcon prime" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:19 | ||||
| msgid "Switch windows of an application" | ||||
| msgstr "Passâ di un barcon in chel altri di une aplicazion" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:20 | ||||
| msgid "Switch to previous window of an application" | ||||
| msgstr "Passe al barcon prime di une aplicazion" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:21 | ||||
| msgid "Switch system controls" | ||||
| msgstr "Passâ di un control di sisteme in chel altri" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:22 | ||||
| msgid "Switch to previous system control" | ||||
| msgstr "Passe al control di sisteme precedent" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:23 | ||||
| msgid "Switch windows directly" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:24 | ||||
| msgid "Switch directly to previous window" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:25 | ||||
| msgid "Switch windows of an app directly" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:26 | ||||
| msgid "Switch directly to previous window of an app" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:27 | ||||
| msgid "Switch system controls directly" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:28 | ||||
| msgid "Switch directly to previous system control" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:29 | ||||
| msgid "Hide all normal windows" | ||||
| msgstr "Plate ducj i barcons normâi" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:30 | ||||
| msgid "Switch to workspace 1" | ||||
| msgstr "Passe al spazi di lavôr 1" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:31 | ||||
| msgid "Switch to workspace 2" | ||||
| msgstr "Passe al spazi di lavôr 2" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:32 | ||||
| msgid "Switch to workspace 3" | ||||
| msgstr "Passe al spazi di lavôr 3" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:33 | ||||
| msgid "Switch to workspace 4" | ||||
| msgstr "Passe al spazi di lavôr 4" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:34 | ||||
| msgid "Switch to last workspace" | ||||
| msgstr "Passe al ultin spazi di lavôr" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:35 | ||||
| msgid "Move to workspace left" | ||||
| msgstr "Sposte il spazi di lavôr a çampe" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:36 | ||||
| msgid "Move to workspace right" | ||||
| msgstr "Sposte il spazi di lavôr a drete" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:37 | ||||
| msgid "Move to workspace above" | ||||
| msgstr "Sposte il spazi di lavôr parsore" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:38 | ||||
| msgid "Move to workspace below" | ||||
| msgstr "Sposte il spazi di lavôr sot" | ||||
|  | ||||
| #: ../data/50-mutter-system.xml.in.h:1 | ||||
| msgid "System" | ||||
| msgstr "Sisteme" | ||||
|  | ||||
| #: ../data/50-mutter-system.xml.in.h:2 | ||||
| msgid "Show the run command prompt" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/50-mutter-system.xml.in.h:3 | ||||
| msgid "Show the activities overview" | ||||
| msgstr "Mostre la panoramiche ativitâts" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:1 | ||||
| msgid "Windows" | ||||
| msgstr "Barcons" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:2 | ||||
| msgid "Activate the window menu" | ||||
| msgstr "Ative il menù dal barcon" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:3 | ||||
| msgid "Toggle fullscreen mode" | ||||
| msgstr "Ative/Disative modalitât plen visôr" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:4 | ||||
| msgid "Toggle maximization state" | ||||
| msgstr "Ative/Disative il stât slargjât" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:5 | ||||
| msgid "Maximize window" | ||||
| msgstr "Slargje il barcon" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:6 | ||||
| msgid "Restore window" | ||||
| msgstr "Ripristine barcon" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:7 | ||||
| msgid "Toggle shaded state" | ||||
| msgstr "Ative/Disative stât inrodolât" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:8 | ||||
| msgid "Close window" | ||||
| msgstr "Siere il barcon" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:9 | ||||
| msgid "Hide window" | ||||
| msgstr "Plate il barcon" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:10 | ||||
| msgid "Move window" | ||||
| msgstr "Sposte il barcon" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:11 | ||||
| msgid "Resize window" | ||||
| msgstr "Ridimensione barcon" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:12 | ||||
| msgid "Toggle window on all workspaces or one" | ||||
| msgstr "Ative/Disative barcon su ducj i spazis di lavôr o nome un" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:13 | ||||
| msgid "Raise window if covered, otherwise lower it" | ||||
| msgstr "Tire sù il barcon se al è cuviert, se no sbassilu" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:14 | ||||
| msgid "Raise window above other windows" | ||||
| msgstr "Met il barcon parsore di chei altris" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:15 | ||||
| msgid "Lower window below other windows" | ||||
| msgstr "Bute il barcon sot di chei altris" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:16 | ||||
| msgid "Maximize window vertically" | ||||
| msgstr "Slargje il barcon par verticâl" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:17 | ||||
| msgid "Maximize window horizontally" | ||||
| msgstr "Slargje il barcon par orizontâl" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:18 | ||||
| msgid "View split on left" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:19 | ||||
| msgid "View split on right" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/mutter.desktop.in.h:1 | ||||
| msgid "Mutter" | ||||
| msgstr "Mutter" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:1 | ||||
| msgid "Modifier to use for extended window management operations" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:2 | ||||
| msgid "" | ||||
| "This key will initiate the \"overlay\", which is a combination window " | ||||
| "overview and application launching system. The default is intended to be the " | ||||
| "\"Windows key\" on PC hardware. It's expected that this binding either the " | ||||
| "default or set to the empty string." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:3 | ||||
| msgid "Attach modal dialogs" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:4 | ||||
| msgid "" | ||||
| "When true, instead of having independent titlebars, modal dialogs appear " | ||||
| "attached to the titlebar of the parent window and are moved together with " | ||||
| "the parent window." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:5 | ||||
| msgid "Enable edge tiling when dropping windows on screen edges" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:6 | ||||
| msgid "" | ||||
| "If enabled, dropping windows on vertical screen edges maximizes them " | ||||
| "vertically and resizes them horizontally to cover half of the available " | ||||
| "area. Dropping windows on the top screen edge maximizes them completely." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:7 | ||||
| msgid "Workspaces are managed dynamically" | ||||
| msgstr "I spazis di vore a son ministrât in maniere dinamiche" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:8 | ||||
| msgid "" | ||||
| "Determines whether workspaces are managed dynamically or whether there's a " | ||||
| "static number of workspaces (determined by the num-workspaces key in org." | ||||
| "gnome.desktop.wm.preferences)." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:9 | ||||
| msgid "Workspaces only on primary" | ||||
| msgstr "Spazis di vore nome tal visôr primari" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:10 | ||||
| msgid "" | ||||
| "Determines whether workspace switching should happen for windows on all " | ||||
| "monitors or only for windows on the primary monitor." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:11 | ||||
| msgid "No tab popup" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:12 | ||||
| msgid "" | ||||
| "Determines whether the use of popup and highlight frame should be disabled " | ||||
| "for window cycling." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:13 | ||||
| msgid "Delay focus changes until the pointer stops moving" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:14 | ||||
| msgid "" | ||||
| "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then " | ||||
| "the focus will not be changed immediately when entering a window, but only " | ||||
| "after the pointer stops moving." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:15 | ||||
| msgid "Draggable border width" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:16 | ||||
| msgid "" | ||||
| "The amount of total draggable borders. If the theme's visible borders are " | ||||
| "not enough, invisible borders will be added to meet this value." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:17 | ||||
| msgid "Auto maximize nearly monitor sized windows" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:18 | ||||
| msgid "" | ||||
| "If enabled, new windows that are initially the size of the monitor " | ||||
| "automatically get maximized." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:19 | ||||
| msgid "Place new windows in the center" | ||||
| msgstr "Place i gnûfs barcons tal mieç" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:20 | ||||
| msgid "" | ||||
| "When true, the new windows will always be put in the center of the active " | ||||
| "screen of the monitor." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:21 | ||||
| msgid "Select window from tab popup" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:22 | ||||
| msgid "Cancel tab popup" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1 | ||||
| msgid "Switch to VT 1" | ||||
| msgstr "Passe al VT 1" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2 | ||||
| msgid "Switch to VT 2" | ||||
| msgstr "Passe al VT 2" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3 | ||||
| msgid "Switch to VT 3" | ||||
| msgstr "Passe al VT 3" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4 | ||||
| msgid "Switch to VT 4" | ||||
| msgstr "Passe al VT 4" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5 | ||||
| msgid "Switch to VT 5" | ||||
| msgstr "Passe al VT 5" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6 | ||||
| msgid "Switch to VT 6" | ||||
| msgstr "Passe al VT 6" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7 | ||||
| msgid "Switch to VT 7" | ||||
| msgstr "Passe al VT 7" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 | ||||
| msgid "Switch to VT 8" | ||||
| msgstr "Passe al VT 8" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 | ||||
| msgid "Switch to VT 9" | ||||
| msgstr "Passe al VT 9" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 | ||||
| msgid "Switch to VT 10" | ||||
| msgstr "Passe al VT 10" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 | ||||
| msgid "Switch to VT 11" | ||||
| msgstr "Passe al VT 11" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Passe al VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Display integrât" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "No cognossût" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Display no cognossût" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
|  | ||||
| #. This probably means that a non-WM compositor like xcompmgr is running; | ||||
| #. * we have no way to get it to exit | ||||
| #: ../src/compositor/compositor.c:456 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Another compositing manager is already running on screen %i on display \"%s" | ||||
| "\"." | ||||
| msgstr "" | ||||
| "Un altri compositing manager al è za in esecuzion sul schermi %i sul display " | ||||
| "\"%s\"." | ||||
|  | ||||
| #: ../src/core/bell.c:194 | ||||
| msgid "Bell event" | ||||
| msgstr "Event cjampane" | ||||
|  | ||||
| #: ../src/core/delete.c:127 | ||||
| #, c-format | ||||
| msgid "“%s” is not responding." | ||||
| msgstr "“%s” nol rispuint." | ||||
|  | ||||
| #: ../src/core/delete.c:129 | ||||
| msgid "Application is not responding." | ||||
| msgstr "La aplicazion no rispuint." | ||||
|  | ||||
| #: ../src/core/delete.c:134 | ||||
| msgid "" | ||||
| "You may choose to wait a short while for it to continue or force the " | ||||
| "application to quit entirely." | ||||
| msgstr "" | ||||
|  | ||||
| #: ../src/core/delete.c:141 | ||||
| msgid "_Wait" | ||||
| msgstr "_Spiete" | ||||
|  | ||||
| #: ../src/core/delete.c:141 | ||||
| msgid "_Force Quit" | ||||
| msgstr "Sfuarce _Jessude" | ||||
|  | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Impussibil vierzi il display '%s' di X Window System\n" | ||||
|  | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Rimplace il window manager in vore" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "" | ||||
|  | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Display X di doprâ" | ||||
|  | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inizialize session da file salvât" | ||||
|  | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Fâs lis clamadis X sincronis" | ||||
|  | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Eseguìs come compositor wayland" | ||||
|  | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Eseguìs come compositor nidiât" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Eseguìs come servidôr display complet, invezit che nidiât" | ||||
|  | ||||
| #: ../src/core/mutter.c:39 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "mutter %s\n" | ||||
| "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" | ||||
| "This is free software; see the source for copying conditions.\n" | ||||
| "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A " | ||||
| "PARTICULAR PURPOSE.\n" | ||||
| msgstr "" | ||||
| "mutter %s\n" | ||||
| "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., e altris\n" | ||||
| "Chest al è software libar; viodi i sorzints pes condizions di copie.\n" | ||||
| "No je NISSUNE garanzie; nancje di COMERCIABILITÂT o IDONEITÂT A UNE " | ||||
| "FINALITÂT PARTICOLÂR.\n" | ||||
|  | ||||
| #: ../src/core/mutter.c:53 | ||||
| msgid "Print version" | ||||
| msgstr "Stampe version" | ||||
|  | ||||
| #: ../src/core/mutter.c:59 | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Plugin Mutter di doprâ" | ||||
|  | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Spazi di lavôr %d" | ||||
|  | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
| msgstr "" | ||||
| "Il display \"%s\" al à za un window manager; prove dopre la opzion --replace " | ||||
| "par rimplaçâ chel atuâl." | ||||
|  | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Schermi %d su display '%s' no valit\n" | ||||
|  | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter al è stât compilât cence supuart pe modalitât fetose\n" | ||||
|  | ||||
| #: ../src/x11/session.c:1815 | ||||
| msgid "" | ||||
| "These windows do not support "save current setup" and will have to " | ||||
| "be restarted manually next time you log in." | ||||
| msgstr "" | ||||
| "Chescj barcons no supuartin la funzion "salve impostazions atuâi" " | ||||
| "e si scugnarà tornâ a inviâlis a man tal prossim acès." | ||||
|  | ||||
| #: ../src/x11/window-props.c:549 | ||||
| #, c-format | ||||
| msgid "%s (on %s)" | ||||
| msgstr "%s (su %s)" | ||||
							
								
								
									
										49
									
								
								po/gl.po
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								po/gl.po
									
									
									
									
									
								
							| @@ -9,22 +9,21 @@ | ||||
| # Mancomún - Centro de Referencia e Servizos de Software Libre <g11n@mancomun.org>, 2009. | ||||
| # Fran Diéguez <frandieguez@gnome.org>, 2009, 2010, 2011, 2012. | ||||
| # Leandro Regueiro <leandro.regueiro@gmail.com>, 2012. | ||||
| # Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015. | ||||
| # | ||||
| # Fran Dieguez <frandieguez@gnome.org>, 2012, 2013, 2014, 2015, 2016. | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: gl\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-02-28 22:43+0100\n" | ||||
| "PO-Revision-Date: 2015-02-28 22:42+0100\n" | ||||
| "POT-Creation-Date: 2016-03-02 09:49+0100\n" | ||||
| "PO-Revision-Date: 2016-03-02 09:49+0200\n" | ||||
| "Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n" | ||||
| "Language-Team: Galician <>\n" | ||||
| "Language-Team: gnome-l10n-gl@gnome.org\n" | ||||
| "Language: gl\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
| "X-Generator: Gtranslator 2.91.6\n" | ||||
| "X-Generator: Virtaal 0.7.1\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -461,22 +460,22 @@ msgstr "Cambiar á VT 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Cambiar á VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Pantalla embebida" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Descoñecido" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Pantalla descoñecida" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -521,40 +520,44 @@ msgstr "Espe_rar" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Forzar a saída" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Produciuse un erro ao abrir a visualización do X Window System «%s»\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Desactivar a conexión ao xestor de sesión" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Substituír o xestor de xanelas en execución" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Especificar o ID de xestión de sesión" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Pantalla X que se vai usar" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inicializar sesión desde o ficheiro de salvagarda" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Facer que as chamadas a X sexan sincrónicas" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Executar como compositor de wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Executar como compositor anidado" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Executar como un servidor de pantalla completo, fronte a un aniñado" | ||||
|  | ||||
| @@ -581,12 +584,12 @@ msgstr "Imprimir versión" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Engadido de mutter que usar" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Espazo de traballo %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -595,12 +598,12 @@ msgstr "" | ||||
| "A pantalla «%s» ten xa un xestor de xanelas, tente usar a opción --replace " | ||||
| "para substituír o xestor de xanelas." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "A pantalla %d na visualización «%s» non é válida\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter foi compilado sen compatibilidade para o modo detallado\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										42
									
								
								po/he.po
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								po/he.po
									
									
									
									
									
								
							| @@ -10,8 +10,8 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: metacity.HEAD.he\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-02-24 19:33+0200\n" | ||||
| "PO-Revision-Date: 2015-02-24 19:34+0200\n" | ||||
| "POT-Creation-Date: 2016-03-03 14:39+0200\n" | ||||
| "PO-Revision-Date: 2016-03-03 14:40+0200\n" | ||||
| "Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n" | ||||
| "Language-Team: עברית <>\n" | ||||
| "Language: he\n" | ||||
| @@ -453,22 +453,22 @@ msgstr "מעבר ל־VT 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "מעבר ל־VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "תצוגה מובנית" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "לא ידוע" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "תצוגה לא ידועה" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -510,40 +510,44 @@ msgstr "ה_מתנה" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_אילוץ סגירה" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Failed to open X Window System display '%s'\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Disable connection to session manager" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Replace the running window manager" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Specify session management ID" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "X Display to use" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Initialize session from savefile" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Make X calls synchronous" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Run as a wayland compositor" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Run as a nested compositor" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Run as a full display server, rather than nested" | ||||
|  | ||||
| @@ -569,12 +573,12 @@ msgstr "Print version" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "תוסף ה־mutter לשימוש" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "מרחב עבודה %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -583,12 +587,12 @@ msgstr "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Screen %d on display '%s' is invalid\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter הודר ללא תמיכה במצב פירוט\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										52
									
								
								po/hu.po
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								po/hu.po
									
									
									
									
									
								
							| @@ -1,4 +1,4 @@ | ||||
| # Hungarian translation of mutter | ||||
| # Hungarian translation of mutter. | ||||
| # Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. | ||||
| # This file is distributed under the same license as the mutter package. | ||||
| # | ||||
| @@ -6,14 +6,14 @@ | ||||
| # Gabor Sari <saga at externet dot hu>, 2003. | ||||
| # Laszlo Dvornik <dvornik at gnome dot hu>, 2004. | ||||
| # Gabor Kelemen <kelemeng at gnome dot hu>, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013. | ||||
| # Balázs Úr <urbalazs at gmail dot com>, 2013, 2014, 2015. | ||||
| # Balázs Úr <urbalazs at gmail dot com>, 2013, 2014, 2015, 2016. | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-02-22 11:10+0000\n" | ||||
| "PO-Revision-Date: 2015-02-22 20:52+0100\n" | ||||
| "POT-Creation-Date: 2016-03-04 13:42+0000\n" | ||||
| "PO-Revision-Date: 2016-03-04 20:43+0100\n" | ||||
| "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n" | ||||
| "Language-Team: Hungarian <gnome-hu-list at gnome dot org>\n" | ||||
| "Language: hu\n" | ||||
| @@ -436,46 +436,41 @@ msgid "Switch to VT 7" | ||||
| msgstr "Váltás a 7. VT-re" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 8" | ||||
| msgstr "Váltás a 8. VT-re" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 9" | ||||
| msgstr "Váltás a 9. VT-re" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 10" | ||||
| msgstr "Váltás a 10. VT-re" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 11" | ||||
| msgstr "Váltás a 11. VT-re" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Váltás a 12. VT-re" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Beépített kijelző" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Ismeretlen" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Ismeretlen kijelző" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -519,40 +514,45 @@ msgstr "Vá_rakozás" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Erőltetett kilépés" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Nem sikerült megnyitni a(z) „%s” X Window rendszer képernyőt\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "A munkamenet-kezelőhöz való csatlakozás tiltása" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "A futó ablakkezelő helyettesítése" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "A munkamenet-kezelő azonosítójának megadása" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "A használandó X megjelenítő" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "A munkamenet előkészítése a mentési fájlból" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Az X-hívások szinkronná tétele" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Futtatás wayland betűszedőként" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| #| msgid "Run as a wayland compositor" | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Futtatás beágyazott betűszedőként" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "" | ||||
| "Futtatás teljes megjelenítő kiszolgálóként az egymásba ágyazott helyett" | ||||
| @@ -580,12 +580,12 @@ msgstr "Verzió kinyomtatása" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Használandó Mutter bővítmény" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "%d. munkaterület" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -594,12 +594,12 @@ msgstr "" | ||||
| "A(z) „%s” kijelző már rendelkezik ablakkezelővel; próbálja a --replace " | ||||
| "kapcsolóval helyettesíteni a jelenlegi ablakkezelőt." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "A(z) %d képernyő a(z) „%s” megjelenítőn érvénytelen\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "A Mutter ablakkezelőt a részletes mód támogatása nélkül fordították\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										48
									
								
								po/it.po
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								po/it.po
									
									
									
									
									
								
							| @@ -5,15 +5,15 @@ | ||||
| # Pier Luigi Fiorini <plfiorini@libero.it>, 2002. | ||||
| # Lapo Calamandrei <lapo.calamandrei@virgilio.it>, 2003. | ||||
| # Luca Ferretti <lferrett@gnome.org>, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. | ||||
| # Milo Casagrande <milo@milo.name>, 2012, 2013, 2014, 2015. | ||||
| # Milo Casagrande <milo@milo.name>, 2012, 2013, 2014, 2015, 2016. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-03-04 23:11+0000\n" | ||||
| "PO-Revision-Date: 2015-03-05 09:16+0100\n" | ||||
| "POT-Creation-Date: 2016-03-17 13:44+0000\n" | ||||
| "PO-Revision-Date: 2016-03-17 21:24+0100\n" | ||||
| "Last-Translator: Milo Casagrande <milo@milo.name>\n" | ||||
| "Language-Team: Italian <tp@lists.linux.it>\n" | ||||
| "Language: it\n" | ||||
| @@ -21,7 +21,7 @@ msgstr "" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n!=1);\n" | ||||
| "X-Generator: Poedit 1.7.4\n" | ||||
| "X-Generator: Poedit 1.8.7\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -466,22 +466,22 @@ msgstr "Passa al VT 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Passa al VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Display integrato" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Sconosciuto" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Display sconosciuto" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -497,7 +497,7 @@ msgstr "" | ||||
| "Un altro compositing manager è già in esecuzione sullo schermo %i sul " | ||||
| "display «%s»." | ||||
|  | ||||
| #: ../src/core/bell.c:185 | ||||
| #: ../src/core/bell.c:192 | ||||
| msgid "Bell event" | ||||
| msgstr "Evento campanella" | ||||
|  | ||||
| @@ -526,40 +526,44 @@ msgstr "_Attendi" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Forza uscita" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Apertura del display «%s» di X Window System non riuscita\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Disabilita la connessione al gestore di sessione" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Sostituisce il window manager in esecuzione" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Specifica l'ID di gestione sessione" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Display X da usare" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inizializza la sessione da file salvato" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Rende le chiamate X sincrone" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Esegui come compositor Wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Esegui come compositor annidato" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Esegui come display server invece che annidato" | ||||
|  | ||||
| @@ -586,12 +590,12 @@ msgstr "Stampa la versione" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Plugin Mutter da usare" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Spazio di lavoro %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -600,12 +604,12 @@ msgstr "" | ||||
| "Il display «%s» ha già un window manager; provare a utilizzare l'opzione --" | ||||
| "replace per sostituirlo." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Lo schermo %d nel display «%s» non è valido\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "" | ||||
| "Mutter è stato compilato escludendo il supporto per la modalità prolissa\n" | ||||
|   | ||||
							
								
								
									
										50
									
								
								po/ko.po
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								po/ko.po
									
									
									
									
									
								
							| @@ -6,7 +6,7 @@ | ||||
| # Changwoo Ryu <cwryu@debian.org>, 2003, 2004, 2005, 2006, 2007, 2008, 2009. | ||||
| # | ||||
| # Updated in mutter: | ||||
| # Changwoo Ryu <cwryu@debian.org>, 2011-2015. | ||||
| # Changwoo Ryu <cwryu@debian.org>, 2011-2016. | ||||
| # | ||||
| # | ||||
| # 주의: | ||||
| @@ -18,8 +18,8 @@ msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-03-07 11:12+0000\n" | ||||
| "PO-Revision-Date: 2015-03-08 03:44+0900\n" | ||||
| "POT-Creation-Date: 2016-03-12 13:40+0000\n" | ||||
| "PO-Revision-Date: 2016-03-13 04:38+0900\n" | ||||
| "Last-Translator: Changwoo Ryu <cwryu@debian.org>\n" | ||||
| "Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n" | ||||
| "Language: Korean\n" | ||||
| @@ -453,22 +453,22 @@ msgstr "가상 터미널 11로 이동" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "가상 터미널 12로 이동" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "내장 디스플레이" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "알 수 없음" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "알 수 없는 디스플레이" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -484,7 +484,7 @@ msgstr "" | ||||
| "다른 창 구성 관리 프로그램이 이미 디스플레이 \"%2$s\" 화면 %1$i번에서 실행 중" | ||||
| "입니다." | ||||
|  | ||||
| #: ../src/core/bell.c:185 | ||||
| #: ../src/core/bell.c:192 | ||||
| msgid "Bell event" | ||||
| msgstr "삑소리 이벤트" | ||||
|  | ||||
| @@ -511,40 +511,44 @@ msgstr "기다리기(_W)" | ||||
| msgid "_Force Quit" | ||||
| msgstr "강제로 끝내기(_F)" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "X 윈도 시스템 디스플레이 '%s'을(를) 여는데 실패하였습니다\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "세션 관리자와 연결 하지 않습니다" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "실행 중인 창 관리자를 바꿉니다" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "세션 관리 ID를 지정합니다" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "사용할 X 디스플레이" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "저장 파일에서 세션을 초기화 합니다" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "동기 X 호출을 합니다" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "웨일랜드 컴포지터로 실행합니다" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "내장 컴포지터로 실행합니다" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "전체 디스플레이 서버로 실행, 내장 프로그램 아님" | ||||
|  | ||||
| @@ -571,24 +575,26 @@ msgstr "버전을 출력합니다" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "사용할 머터 플러그인" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "작업 공간 %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
| msgstr "디스플레이 \"%s\"에 이미 창 관리자가 있습니다. 현재 창 관리자를 바꾸려면 --replace 옵션을 써보십시오." | ||||
| msgstr "" | ||||
| "디스플레이 \"%s\"에 이미 창 관리자가 있습니다. 현재 창 관리자를 바꾸려면 --" | ||||
| "replace 옵션을 써보십시오." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "디스플레이 '%2$s'의 화면 %1$d은(는) 잘못되었습니다\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "머터가 자세한 모드 지원 없이 컴파일 되었습니다\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										124
									
								
								po/lt.po
									
									
									
									
									
								
							
							
						
						
									
										124
									
								
								po/lt.po
									
									
									
									
									
								
							| @@ -13,8 +13,8 @@ msgstr "" | ||||
| "Project-Id-Version: lt\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-02-28 11:14+0000\n" | ||||
| "PO-Revision-Date: 2015-02-28 21:34+0200\n" | ||||
| "POT-Creation-Date: 2016-02-26 09:54+0000\n" | ||||
| "PO-Revision-Date: 2016-02-25 15:18+0200\n" | ||||
| "Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n" | ||||
| "Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n" | ||||
| "Language: lt\n" | ||||
| @@ -23,7 +23,7 @@ msgstr "" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" | ||||
| "%100<10 || n%100>=20) ? 1 : 2);\n" | ||||
| "X-Generator: Gtranslator 2.91.6\n" | ||||
| "X-Generator: Poedit 1.8.7\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -31,39 +31,39 @@ msgstr "Navigacija" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:2 | ||||
| msgid "Move window to workspace 1" | ||||
| msgstr "Perkelti langą į darbalaukį Nr.1" | ||||
| msgstr "Perkelti langą į darbo sritį Nr.1" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:3 | ||||
| msgid "Move window to workspace 2" | ||||
| msgstr "Perkelti langą į darbalaukį Nr.2" | ||||
| msgstr "Perkelti langą į darbo sritį Nr.2" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:4 | ||||
| msgid "Move window to workspace 3" | ||||
| msgstr "Perkelti langą į darbalaukį Nr.3" | ||||
| msgstr "Perkelti langą į darbo sritį Nr.3" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:5 | ||||
| msgid "Move window to workspace 4" | ||||
| msgstr "Perkelti langą į darbalaukį Nr.4" | ||||
| msgstr "Perkelti langą į darbo sritį Nr.4" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:6 | ||||
| msgid "Move window to last workspace" | ||||
| msgstr "Perkelti langą į pastarąjį darbalaukį" | ||||
| msgstr "Perkelti langą į pastarąją darbo sritį" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:7 | ||||
| msgid "Move window one workspace to the left" | ||||
| msgstr "Perkelti langą į kairiau esantį darbalaukį" | ||||
| msgstr "Perkelti langą į kairiau esančią darbo sritį" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:8 | ||||
| msgid "Move window one workspace to the right" | ||||
| msgstr "Perkelti langą į dešiniau esantį darbalaukį" | ||||
| msgstr "Perkelti langą į dešiniau esančią darbo sritį" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:9 | ||||
| msgid "Move window one workspace up" | ||||
| msgstr "Perkelti langą į aukščiau esantį darbalaukį" | ||||
| msgstr "Perkelti langą į aukščiau esančią darbo sritį" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:10 | ||||
| msgid "Move window one workspace down" | ||||
| msgstr "Perkelti langą į žemiau esantį darbalaukį" | ||||
| msgstr "Perkelti langą į žemiau esančią darbo sritį" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:11 | ||||
| msgid "Move window one monitor to the left" | ||||
| @@ -143,39 +143,39 @@ msgstr "Paslėpti visus įprastinius langus" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:30 | ||||
| msgid "Switch to workspace 1" | ||||
| msgstr "Persijungti į darbalaukį Nr.1" | ||||
| msgstr "Persijungti į darbo sritį Nr.1" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:31 | ||||
| msgid "Switch to workspace 2" | ||||
| msgstr "Persijungti į darbalaukį Nr.2" | ||||
| msgstr "Persijungti į darbo sritį Nr.2" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:32 | ||||
| msgid "Switch to workspace 3" | ||||
| msgstr "Persijungti į darbalaukį Nr.3" | ||||
| msgstr "Persijungti į darbo sritį Nr.3" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:33 | ||||
| msgid "Switch to workspace 4" | ||||
| msgstr "Persijungti į darbalaukį Nr.4" | ||||
| msgstr "Persijungti į darbo sritį Nr.4" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:34 | ||||
| msgid "Switch to last workspace" | ||||
| msgstr "Persijungti į pastarąjį darbalaukį" | ||||
| msgstr "Persijungti į pastarąją darbo sritį" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:35 | ||||
| msgid "Move to workspace left" | ||||
| msgstr "Perkelti į darbalaukį kairėje" | ||||
| msgstr "Perkelti į darbo sritį kairėje" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:36 | ||||
| msgid "Move to workspace right" | ||||
| msgstr "Perkelti į darbalaukį dešinėje" | ||||
| msgstr "Perkelti į darbo sritį dešinėje" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:37 | ||||
| msgid "Move to workspace above" | ||||
| msgstr "Perkelti į darbalaukį viršuje" | ||||
| msgstr "Perkelti į darbo sritį viršuje" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:38 | ||||
| msgid "Move to workspace below" | ||||
| msgstr "Perkelti į darbalaukį apačioje" | ||||
| msgstr "Perkelti į darbo sritį apačioje" | ||||
|  | ||||
| #: ../data/50-mutter-system.xml.in.h:1 | ||||
| msgid "System" | ||||
| @@ -235,7 +235,7 @@ msgstr "Keisti lango dydį" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:12 | ||||
| msgid "Toggle window on all workspaces or one" | ||||
| msgstr "Perjungti lango buvimo visuose darbalaukiuose būseną" | ||||
| msgstr "Perjungti lango buvimo visose darbo srityse būseną" | ||||
|  | ||||
| #: ../data/50-mutter-windows.xml.in.h:13 | ||||
| msgid "Raise window if covered, otherwise lower it" | ||||
| @@ -272,7 +272,7 @@ msgstr "Mutter" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:1 | ||||
| msgid "Modifier to use for extended window management operations" | ||||
| msgstr "Klavišas, naudojamas kartu su specialiais lango valdymo veiksmais" | ||||
| msgstr "Klavišas, naudojamas kartu su specialiomis lango tvarkymo operacijomis" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:2 | ||||
| msgid "" | ||||
| @@ -315,7 +315,7 @@ msgstr "" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:7 | ||||
| msgid "Workspaces are managed dynamically" | ||||
| msgstr "Darbalaukiai valdomi dinamiškai" | ||||
| msgstr "Darbo sritys tvarkomos dinamiškai" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:8 | ||||
| msgid "" | ||||
| @@ -323,21 +323,21 @@ msgid "" | ||||
| "static number of workspaces (determined by the num-workspaces key in org." | ||||
| "gnome.desktop.wm.preferences)." | ||||
| msgstr "" | ||||
| "Nusako, ar darbastaliai yra valdomi dinamiškai, ar yra pastovus darbalaukių " | ||||
| "skaičius (nusakomas raktu num-workspaces schemoje org.gnome.desktop.wm." | ||||
| "preferences)." | ||||
| "Nusako, ar darbo sritys yra tvarkomos dinamiškai, ar yra pastovus darbo " | ||||
| "sričių skaičius (nusakomas raktu num-workspaces schemoje org.gnome.desktop." | ||||
| "wm.preferences)." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:9 | ||||
| msgid "Workspaces only on primary" | ||||
| msgstr "Darbalaukiai tik pagrindiniame" | ||||
| msgstr "Darbo sritys tik pagrindiniame" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:10 | ||||
| msgid "" | ||||
| "Determines whether workspace switching should happen for windows on all " | ||||
| "monitors or only for windows on the primary monitor." | ||||
| msgstr "" | ||||
| "Nusako, ar darbalaukių perjungimas turi įvykti langams viusose monitoriuose, " | ||||
| "ar tik langams pagrindiniame monitoriuje." | ||||
| "Nusako, ar darbo sričių perjungimas turi įvykti langams visuose " | ||||
| "monitoriuose, ar tik langams pagrindiniame monitoriuje." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:11 | ||||
| msgid "No tab popup" | ||||
| @@ -438,46 +438,41 @@ msgid "Switch to VT 7" | ||||
| msgstr "Persijungti į VT 7" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 8" | ||||
| msgstr "Persijungti į VT 8" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 9" | ||||
| msgstr "Persijungti į VT 9" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 10" | ||||
| msgstr "Persijungti į VT 10" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 11" | ||||
| msgstr "Persijungti į VT 11" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Persijungti į VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Integruotas vaizduoklis" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Nežinomas" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Nežinomas vaizduoklis" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -489,7 +484,7 @@ msgstr "%s %s" | ||||
| msgid "" | ||||
| "Another compositing manager is already running on screen %i on display \"%s" | ||||
| "\"." | ||||
| msgstr "Kita kompozicijos valdyklė jau veikia ekrane %i vaizduoklyje „%s“." | ||||
| msgstr "Kita kompozicijos tvarkytuvė jau veikia ekrane %i vaizduoklyje „%s“." | ||||
|  | ||||
| #: ../src/core/bell.c:185 | ||||
| msgid "Bell event" | ||||
| @@ -518,42 +513,46 @@ msgstr "_Laukti" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Priverstinai išeiti" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Nepavyko atverti X Window sistemos ekrano „%s“\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Išjungti susijungimą su sesijos valdykle" | ||||
| msgstr "Išjungti susijungimą su sesijos tvarkytuve" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Pakeisti veikiančią langų valdyklę" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Nurodyti sesijos valdymo ID" | ||||
| msgstr "Pakeisti veikiančią langų tvarkytuvę" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Nurodyti sesijos tvarkymo ID" | ||||
|  | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Naudotinas X ekranas" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inicializuoti sesiją iš išsaugojimo failo" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Sinchronizuoti X iškvietimus" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Vykdyti kaip wayland kompozitorių" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Vykdyti kaip įdėtinį kompozitorių" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Vykdyti kaip visą vaizduoklio serverį, o ne vidinį" | ||||
| msgstr "Vykdyti kaip visą vaizduoklio serverį, o ne įdėtinį" | ||||
|  | ||||
| #: ../src/core/mutter.c:39 | ||||
| #, c-format | ||||
| @@ -580,29 +579,26 @@ msgstr "Parodyti versiją" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Naudojamas Mutter įskiepis" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Darbalaukis %d" | ||||
| msgstr "Darbo sritis %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, 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" | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
| msgstr "" | ||||
| "Vaizduoklis „%s“ jau turi langų valdyklę; pabandykite pakeisti esamą langų " | ||||
| "valdyklę naudodami parametrą --replace." | ||||
| "Vaizduoklis „%s“ jau turi langų tvarkytuvę; pabandykite pakeisti esamą langų " | ||||
| "tvarkytuvę, naudodami parametrą --replace." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Ekranas %d vaizduoklyje „%s“ netinkamas\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter buvo sukompiliuota be išsamaus veikimo veiksenos\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										64
									
								
								po/lv.po
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								po/lv.po
									
									
									
									
									
								
							| @@ -7,14 +7,14 @@ | ||||
| # Raivis Dejus <orvils@gmail.com>, 2006, 2007, 2009. | ||||
| # Rudolfs <rudolfs.mazurs@gmail.com>, 2011. | ||||
| # Rūdofls Mazurs <rudolfs.mazurs@gmail.com>, 2011, 2012. | ||||
| # Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2012, 2013, 2014, 2015. | ||||
| # Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>, 2012, 2013, 2014, 2015, 2016. | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: lv\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-09-20 11:14+0000\n" | ||||
| "PO-Revision-Date: 2015-09-20 18:51+0300\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&" | ||||
| "keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2016-03-03 13:37+0000\n" | ||||
| "PO-Revision-Date: 2016-03-03 22:19+0200\n" | ||||
| "Last-Translator: Rūdolfs Mazurs <rudolfs.mazurs@gmail.com>\n" | ||||
| "Language-Team: Latvian <lata-l10n@googlegroups.com>\n" | ||||
| "Language: lv\n" | ||||
| @@ -23,7 +23,7 @@ msgstr "" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " | ||||
| "2);\n" | ||||
| "X-Generator: Lokalize 1.5\n" | ||||
| "X-Generator: Lokalize 2.0\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -437,46 +437,41 @@ msgid "Switch to VT 7" | ||||
| msgstr "Pārslēgties uz VT 7" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 8" | ||||
| msgstr "Pārslēgties uz VT 8" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 9" | ||||
| msgstr "Pārslēgties uz VT 9" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 10" | ||||
| msgstr "Pārslēgties uz VT 10" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 11" | ||||
| msgstr "Pārslēgties uz VT 11" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Pārslēgties uz VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:500 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Iebūvēts displejs" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:526 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Nezināms" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:528 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Nezināms displejs" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:536 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -519,40 +514,45 @@ msgstr "_Gaidīt" | ||||
| msgid "_Force Quit" | ||||
| msgstr "Aizvērt _piespiedu kārtā" | ||||
|  | ||||
| #: ../src/core/display.c:563 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Neizdevās atvērt X logu sistēmas displeju “%s”\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Deaktivēt savienojumu ar sesiju pārvaldnieku" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Aizvietot darbojošos logu pārvaldnieku" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Norādiet sesiju pārvaldības ID" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Lietojamais X displejs" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inicializēt sesiju no saglabātās datnes" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Padarīt X izsaukumus sinhronus" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Palaist kā wayland kompozitoru" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| #| msgid "Run as a wayland compositor" | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Palaist kā ligzdotu kompozitoru" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Palaist kā pilnu attēlošanas serveri, nevis iegultu" | ||||
|  | ||||
| @@ -579,29 +579,26 @@ msgstr "Parādīt versiju" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Izmantojamais mutter spraudnis" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Darbvieta %d" | ||||
|  | ||||
| #: ../src/core/screen.c:526 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, 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" | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
| msgstr "" | ||||
| "Displejam “%s” jau ir logu pārvaldnieks; mēģiniet lietot --replace " | ||||
| "iespēju, lai aizvietotu pašreizējo logu pārvaldnieku." | ||||
| "Displejam “%s” jau ir logu pārvaldnieks; mēģiniet lietot --replace iespēju, " | ||||
| "lai aizvietotu pašreizējo logu pārvaldnieku." | ||||
|  | ||||
| #: ../src/core/screen.c:608 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Ekrāna %d displejs “%s“ nav derīgs\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter tika kompilēts bez detalizētas izvades režīma atbalsta\n" | ||||
|  | ||||
| @@ -617,3 +614,4 @@ msgstr "" | ||||
| #, c-format | ||||
| msgid "%s (on %s)" | ||||
| msgstr "%s (uz %s)" | ||||
|  | ||||
|   | ||||
							
								
								
									
										68
									
								
								po/pl.po
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								po/pl.po
									
									
									
									
									
								
							| @@ -9,14 +9,14 @@ | ||||
| # Marek Stępień <marcoos@aviary.pl>, 2007. | ||||
| # Wadim Dziedzic <wdziedzic@aviary.pl>, 2007. | ||||
| # Tomasz Dominikowski <dominikowski@gmail.com>, 2008-2009. | ||||
| # Piotr Drąg <piotrdrag@gmail.com>, 2010-2015. | ||||
| # Aviary.pl <gnomepl@aviary.pl>, 2007-2015. | ||||
| # Piotr Drąg <piotrdrag@gmail.com>, 2010-2016. | ||||
| # Aviary.pl <gnomepl@aviary.pl>, 2007-2016. | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2015-08-26 18:49+0200\n" | ||||
| "PO-Revision-Date: 2015-08-26 18:50+0200\n" | ||||
| "POT-Creation-Date: 2016-02-25 17:29+0100\n" | ||||
| "PO-Revision-Date: 2016-02-25 17:30+0100\n" | ||||
| "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" | ||||
| "Language-Team: Polish <gnomepl@aviary.pl>\n" | ||||
| "Language: pl\n" | ||||
| @@ -285,10 +285,10 @@ msgid "" | ||||
| "\"Windows key\" on PC hardware. It's expected that this binding either the " | ||||
| "default or set to the empty string." | ||||
| msgstr "" | ||||
| "Ten klawisz inicjuje tryb „overlay”, który jest połączeniem podglądu okien i " | ||||
| "systemu uruchamiania programów. Domyślnie jest przeznaczony do powiązania z " | ||||
| "klawiszem „Windows” na komputerach typu PC. Ustawienie tego powiązania " | ||||
| "powinno być domyślne lub puste." | ||||
| "Ten klawisz inicjuje tryb „overlay” (nakładki), który jest połączeniem " | ||||
| "podglądu okien i systemu uruchamiania programów. Domyślnie jest przeznaczony " | ||||
| "do powiązania z klawiszem „Windows” na komputerach typu PC. Ustawienie tego " | ||||
| "powiązania powinno być domyślne lub puste." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:3 | ||||
| msgid "Attach modal dialogs" | ||||
| @@ -332,8 +332,8 @@ msgid "" | ||||
| "gnome.desktop.wm.preferences)." | ||||
| msgstr "" | ||||
| "Określa, czy obszary robocze są zarządzane dynamicznie, czy istnieje " | ||||
| "statyczna liczba obszarów (określona przez klucz „num-workspaces” w org." | ||||
| "gnome.desktop.wm.preferences)." | ||||
| "statyczna liczba obszarów (określona przez klucz „num-workspaces” w „org." | ||||
| "gnome.desktop.wm.preferences”)." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:9 | ||||
| msgid "Workspaces only on primary" | ||||
| @@ -468,22 +468,22 @@ msgstr "Przełączenie na 11. konsolę wirtualną" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Przełączenie na 12. konsolę wirtualną" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:500 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Wbudowany ekran" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:526 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Nieznany" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:528 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Nieznany ekran" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:536 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -525,42 +525,46 @@ msgstr "_Czekaj" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Zakończ" | ||||
|  | ||||
| #: ../src/core/display.c:563 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Otwarcie połączenia z ekranem „%s” systemu X Window się nie powiodło\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Rozłącza połączenie z menedżerem sesji" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Zastępuje uruchomionego menedżera okien" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Podaje identyfikator zarządzania sesją" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Używany ekran X" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inicjuje sesję z zapisanego pliku" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Synchroniczne wywołania X" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Uruchamia jako menedżer składania Wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Uruchamia jako osadzony menedżer składania" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Uruchamia pełny serwer wyświetlania zamiast osadzonego" | ||||
| msgstr "Uruchamia jako pełny serwer wyświetlania zamiast osadzonego" | ||||
|  | ||||
| #: ../src/core/mutter.c:39 | ||||
| #, c-format | ||||
| @@ -572,7 +576,7 @@ msgid "" | ||||
| "PARTICULAR PURPOSE.\n" | ||||
| msgstr "" | ||||
| "mutter %s\n" | ||||
| "Copyright (C) 2001—%d Havoc Pennington, Red Hat, Inc., oraz inni\n" | ||||
| "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., oraz inni\n" | ||||
| "Niniejszy program jest wolnym oprogramowaniem, aby poznać warunki, pod\n" | ||||
| "jakimi dopuszczalne jest kopiowanie programu, zajrzyj do jego źródeł.\n" | ||||
| "Na program nie udziela się ŻADNYCH GWARANCJI, nawet domyślnej gwarancji\n" | ||||
| @@ -584,23 +588,23 @@ msgstr "Wyświetla wersję" | ||||
|  | ||||
| #: ../src/core/mutter.c:59 | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Używana wtyczka programu Mutter" | ||||
| msgstr "Używana wtyczka menedżera Mutter" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Obszar roboczy %d" | ||||
| msgstr "%d. obszar roboczy" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
| msgstr "" | ||||
| "Na ekranie „%s” działa już menedżer okien. Aby zastąpić działającego " | ||||
| "menedżera okien, proszę spróbować użyć opcji --replace." | ||||
| "menedżera okien, należy użyć opcji „--replace”." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Podekran %d ekranu „%s” jest nieprawidłowy\n" | ||||
| @@ -608,7 +612,7 @@ msgstr "Podekran %d ekranu „%s” jest nieprawidłowy\n" | ||||
| #: ../src/core/util.c:118 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "" | ||||
| "Program Mutter został skompilowany bez obsługi trybu z obszerną informacją\n" | ||||
| "Menedżer Mutter został skompilowany bez obsługi trybu z obszerną informacją\n" | ||||
|  | ||||
| #: ../src/x11/session.c:1815 | ||||
| msgid "" | ||||
|   | ||||
							
								
								
									
										45
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								po/pt_BR.po
									
									
									
									
									
								
							| @@ -15,22 +15,23 @@ | ||||
| # Rodrigo Padula de Oliveira <contato@rodrigopadula.com>, 2011. | ||||
| # Rafael Ferreira <rafael.f.f1@gmail.com>, 2013, 2014. | ||||
| # Enrico Nicoletto <liverig@gmail.com>, 2012, 2014. | ||||
| # Artur de Aquino Morais <artur.morais93@outlook.com>, 2016. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-02-26 11:24+0000\n" | ||||
| "PO-Revision-Date: 2015-02-26 17:36-0300\n" | ||||
| "Last-Translator: Rafael Ferreira <rafael.f.f1@gmail.com>\n" | ||||
| "POT-Creation-Date: 2016-02-25 13:40+0000\n" | ||||
| "PO-Revision-Date: 2016-02-25 13:41-0300\n" | ||||
| "Last-Translator: Artur de Aquino Morais <artur.morais93@outlook.com>\n" | ||||
| "Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n" | ||||
| "Language: pt_BR\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=2; plural=(n > 1);\n" | ||||
| "X-Generator: Poedit 1.7.4\n" | ||||
| "X-Generator: Poedit 1.8.4\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -472,22 +473,22 @@ msgstr "Trocar para o VT 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Trocar para o VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Tela embutida" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Desconhecido" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Monitor desconhecido" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s de %s" | ||||
| @@ -531,40 +532,44 @@ msgstr "_Esperar" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Forçar sair" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Falha ao abrir a exibição \"%s\" do sistema de janelas X\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Desabilitar a conexão com o gerenciador de sessões" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Substituir o gerenciador de janelas em execução" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Especificar o ID do gerenciador de sessões" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Exibição do X a ser utilizada" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inicializar a sessão a partir do arquivo salvo" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Fazer X chamadas síncronas" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Executar como um compositor wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Executar como um compositor aninhado" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Executar como um servidor de tela cheia, ao invés de aninhado" | ||||
|  | ||||
| @@ -592,12 +597,12 @@ msgstr "Versão impressa" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Plug-in do Mutter para usar" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Espaço de trabalho %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -606,7 +611,7 @@ msgstr "" | ||||
| "A exibição \"%s\" já possui um gerenciador de janelas; tente usar a opção --" | ||||
| "replace para substituir o gerenciador de janelas atual." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "A tela %d na exibição \"%s\" é inválida\n" | ||||
|   | ||||
							
								
								
									
										53
									
								
								po/ru.po
									
									
									
									
									
								
							
							
						
						
									
										53
									
								
								po/ru.po
									
									
									
									
									
								
							| @@ -9,15 +9,16 @@ | ||||
| # Yuri Kozlov <yuray@komyakino.ru>, 2011. | ||||
| # Yuri Myasoedov <ymyasoedov@yandex.ru>, 2012-2014, 2015. | ||||
| # Ivan Komaritsyn <vantu5z@mail.ru>, 2015. | ||||
| # Stas Solovey <whats_up@tut.by>, 2016. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: metacity ru\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-02-19 23:11+0000\n" | ||||
| "PO-Revision-Date: 2015-02-20 13:59+0300\n" | ||||
| "Last-Translator: Ivan Komaritsyn <vantu5z@mail.ru>\n" | ||||
| "POT-Creation-Date: 2016-03-03 01:44+0000\n" | ||||
| "PO-Revision-Date: 2016-03-03 13:51+0300\n" | ||||
| "Last-Translator: Stas Solovey <whats_up@tut.by>\n" | ||||
| "Language-Team: Русский <gnome-cyr@gnome.org>\n" | ||||
| "Language: ru\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| @@ -25,7 +26,7 @@ msgstr "" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" | ||||
| "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" | ||||
| "X-Generator: Gtranslator 2.91.6\n" | ||||
| "X-Generator: Gtranslator 2.91.7\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -441,46 +442,41 @@ msgid "Switch to VT 7" | ||||
| msgstr "Переключиться на виртуальный терминал 7" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 8" | ||||
| msgstr "Переключиться на виртуальный терминал 8" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 9" | ||||
| msgstr "Переключиться на виртуальный терминал 9" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 10" | ||||
| msgstr "Переключиться на виртуальный терминал 10" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 11" | ||||
| msgstr "Переключиться на виртуальный терминал 11" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Переключиться на виртуальный терминал 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Встроенный дисплей" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Неизвестный" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Неизвестный дисплей" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -521,40 +517,45 @@ msgstr "_Подождать" | ||||
| msgid "_Force Quit" | ||||
| msgstr "Завер_шить" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Не удалось открыть дисплей «%s» системы X Window\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Запретить подключение к менеджеру сеансов" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Заменить запущенный оконный менеджер" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Указать идентификатор управления сеансом" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Используемый дисплей X" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Инициализировать сеанс из сохранённого файла" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Сделать X-вызовы синхронными" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Запустить в качестве композитора wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| #| msgid "Run as a wayland compositor" | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Запустить в качестве встроенного композитора" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Запустить в качестве полноэкранного сервера вместо встроенного" | ||||
|  | ||||
| @@ -583,12 +584,12 @@ msgstr "Вывести версию" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Использовать модуль mutter" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Рабочее место %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -597,12 +598,12 @@ msgstr "" | ||||
| "Дисплей «%s» уже использует менеджер окон; попробуйте использовать параметр " | ||||
| "--replace, чтобы заменить текущий менеджер окон." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Недопустимый экран %d дисплея «%s»\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter собран без поддержки режима подробных сообщений\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										45
									
								
								po/sk.po
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								po/sk.po
									
									
									
									
									
								
							| @@ -14,8 +14,8 @@ msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-02-21 23:27+0000\n" | ||||
| "PO-Revision-Date: 2015-02-22 11:11+0100\n" | ||||
| "POT-Creation-Date: 2016-03-01 13:42+0000\n" | ||||
| "PO-Revision-Date: 2016-03-01 20:40+0100\n" | ||||
| "Last-Translator: Dušan Kazik <prescott66@gmail.com>\n" | ||||
| "Language-Team: Slovak <gnome-sk-list@gnome.org>\n" | ||||
| "Language: sk\n" | ||||
| @@ -23,7 +23,7 @@ msgstr "" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" | ||||
| "X-Generator: Poedit 1.7.4\n" | ||||
| "X-Generator: Poedit 1.8.7\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -542,22 +542,22 @@ msgstr "Prepnúť na VT č. 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Prepnúť na VT č. 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Vstavaný displej" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Neznámy" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Neznámy displej" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -602,46 +602,51 @@ msgid "_Force Quit" | ||||
| msgstr "_Vynútiť ukončenie" | ||||
|  | ||||
| # X window system preloz, napr. system na spravu okien X | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Zlyhalo otvorenie displeja systému na správu okien X „%s“\n" | ||||
|  | ||||
| # cmd desc | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Zakáže pripojenia k správcovi relácií" | ||||
|  | ||||
| # cmd desc | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Nahradí bežiaceho správcu okien" | ||||
|  | ||||
| # cmd desc | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Zadá identifikátor správy relácií" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "X displej, ktorý bude použitý" | ||||
|  | ||||
| # cmd desc | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Inicializuje reláciu z uloženého súboru" | ||||
|  | ||||
| # cmd desc | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Použije synchrónne volania X" | ||||
|  | ||||
| # cmd desc | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Spustí ako kompozitor protokolu wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| # cmd desc | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Spustí ako kompozitor s vnoreným režimom" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Spustí ako plnohodnotný zobrazovací server, namiesto vnoreného režimu" | ||||
|  | ||||
| @@ -670,12 +675,12 @@ msgstr "Zobrazí verziu" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Použije zásuvný modul Mutter" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Pracovný priestor č. %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -684,12 +689,12 @@ msgstr "" | ||||
| "Displej „%s“ už má správcu okien. Skúste použiť prepínač --replace, aby sa " | ||||
| "aktuálny správca nahradil." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Obrazovka č. %d na displeji „%s“ nie je platná\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter bol skompilovaný bez výpisu podrobností pri behu\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										46
									
								
								po/sl.po
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								po/sl.po
									
									
									
									
									
								
							| @@ -4,15 +4,15 @@ | ||||
| # | ||||
| # Andraž Tori <andraz.tori1@guest.arnes.si>, 2000. | ||||
| # Matjaž Horvat <m@owca.info>, 2006. | ||||
| # Matej Urbančič <mateju@svn.gnome.org>, 2007-2015. | ||||
| # Matej Urbančič <mateju@svn.gnome.org>, 2007-2016. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-03-15 11:07+0000\n" | ||||
| "PO-Revision-Date: 2015-03-15 14:36+0100\n" | ||||
| "POT-Creation-Date: 2016-03-05 21:12+0100\n" | ||||
| "PO-Revision-Date: 2016-03-05 21:12+0100\n" | ||||
| "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" | ||||
| "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" | ||||
| "Language: sl_SI\n" | ||||
| @@ -22,7 +22,7 @@ msgstr "" | ||||
| "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" | ||||
| "%100==4 ? 3 : 0);\n" | ||||
| "X-Poedit-SourceCharset: utf-8\n" | ||||
| "X-Generator: Poedit 1.5.4\n" | ||||
| "X-Generator: Poedit 1.8.4\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -455,22 +455,22 @@ msgstr "Preklopi na VT 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Preklopi na VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Vgrajen zaslon" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Neznano" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Neznan zaslon" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -514,40 +514,44 @@ msgstr "_Počakaj" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Vsili konec" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Ni mogoče odpreti zaslona '%s' okenskega sistema X\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Onemogoči povezavo z upravljalnikom sej" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Zamenjaj trenutni upravljalnik oken" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Navedite ID upravljanja seje" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Zaslon X za uporabo" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Začni sejo iz shranjene datoteke" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Uskladi klice X" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Zaženi izbirnik wayland" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Zaženi kot gnezden vpisovalnik" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Zaženi kot polni strežnik zaslona in ne vstavljeno" | ||||
|  | ||||
| @@ -575,12 +579,12 @@ msgid "Mutter plugin to use" | ||||
| msgstr "Vstavek Mutter za uporabo" | ||||
|  | ||||
| # G:1 K:0 O:0 | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Delovna površina %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -589,12 +593,12 @@ msgstr "" | ||||
| "Zaslon \"%s\" že ima določen upravljalnik oken; poskušajte uporabiti možnost " | ||||
| "--replace za zamenjavo trenutnega upravljalnika zaslona." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Zaslon %d na prikazu '%s' ni veljaven\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "" | ||||
| "Program Mutter je kodno preveden brez podpore za podrobni način izpisovanja\n" | ||||
|   | ||||
							
								
								
									
										67
									
								
								po/sr.po
									
									
									
									
									
								
							
							
						
						
									
										67
									
								
								po/sr.po
									
									
									
									
									
								
							| @@ -1,19 +1,21 @@ | ||||
| # Serbian translation of mutter. | ||||
| # Courtesy of Prevod.org team (http://prevod.org/) -- 2003—2015. | ||||
| # Courtesy of Prevod.org team (http://prevod.org/) -- 2003—2016. | ||||
| # This file is distributed under the same license as the mutter package. | ||||
| # | ||||
| # Translators:  | ||||
| # Горан Ракић <grakic@devbase.net> | ||||
| # Данило Шеган <danilo@prevod.org>, 2005. | ||||
| # Милош Поповић <gpopac@gmail.com>, 2010. | ||||
| # Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011—2015. | ||||
| # Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011—2016. | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&" | ||||
| "keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-03-04 11:14+0000\n" | ||||
| "PO-Revision-Date: 2015-03-04 19:46+0200\n" | ||||
| "POT-Creation-Date: 2016-03-09 01:41+0000\n" | ||||
| "PO-Revision-Date: 2016-03-09 09:52+0200\n" | ||||
| "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n" | ||||
| "Language-Team: Serbian <gnom@prevod.org>\n" | ||||
| "Language-Team: Serbian <(nothing)>\n" | ||||
| "Language: sr\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -436,46 +438,41 @@ msgid "Switch to VT 7" | ||||
| msgstr "Прелазак на ВТ 7" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 8" | ||||
| msgstr "Прелазак на ВТ 8" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 9" | ||||
| msgstr "Прелазак на ВТ 9" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 10" | ||||
| msgstr "Прелазак на ВТ 10" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 11" | ||||
| msgstr "Прелазак на ВТ 11" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Прелазак на ВТ 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Уграђени дисплеј" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Непознато" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Непознат дисплеј" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -519,40 +516,45 @@ msgstr "_Сачекај" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Приморај излаз" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Нисам успео да отворим екран „%s“ Икс система прозора\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Искључује везу са управником сесије" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Мења текућег управника прозорима" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Наводи ИБ управника сесије" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Икс екран који ће бити коришћен" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Покреће сесију из датотеке чувања" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Чини Икс позиве усклађеним" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Ради као вајландов саставник" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| #| msgid "Run as a wayland compositor" | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Ради као угнеждени саставник" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Ради као пуни сервер приказа, уместо као угнеждени" | ||||
|  | ||||
| @@ -566,8 +568,8 @@ msgid "" | ||||
| "PARTICULAR PURPOSE.\n" | ||||
| msgstr "" | ||||
| "матер %s\n" | ||||
| "Сва права задржана (C) 2001–%d Havoc Pennington, Red Hat, Inc., и остали\n" | ||||
| "Ово је слободан програм; погледајте изворни код за услове коришћења.\n" | ||||
| "Сва права задржана © 2001–%d Хевок Пенингтон, Ред Хет, Инк., и остали\n" | ||||
| "Ово је слободан програм; погледајте изворни кôд за услове коришћења.\n" | ||||
| "НЕ постоји никаква гаранција; чак ни гаранција о ТРЖИШНОЈ ВРЕДНОСТИ или " | ||||
| "ПРИЛАГОЂЕНОСТИ ОДРЕЂЕНОЈ НАМЕНИ.\n" | ||||
|  | ||||
| @@ -579,29 +581,26 @@ msgstr "Исписује издање" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Прикључци Матера за коришћење" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "%d. радни простор" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, 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" | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
| msgstr "" | ||||
| "Приказ „%s“ већ има управника прозора; пробајте да користите опцију " | ||||
| "„--replace“ да замените тренутног управника прозора." | ||||
| "Приказ „%s“ већ има управника прозора; пробајте да користите опцију „--" | ||||
| "replace“ да замените тренутног управника прозора." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Приказ „%d“ на екрану „%s“ није исправан\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Матер је преведен без подршке за опширан режим\n" | ||||
|  | ||||
|   | ||||
| @@ -1,19 +1,21 @@ | ||||
| # Serbian translation of mutter. | ||||
| # Courtesy of Prevod.org team (http://prevod.org/) -- 2003—2015. | ||||
| # Courtesy of Prevod.org team (http://prevod.org/) -- 2003—2016. | ||||
| # This file is distributed under the same license as the mutter package. | ||||
| # | ||||
| # Translators:  | ||||
| # Goran Rakić <grakic@devbase.net> | ||||
| # Danilo Šegan <danilo@prevod.org>, 2005. | ||||
| # Miloš Popović <gpopac@gmail.com>, 2010. | ||||
| # Miroslav Nikolić <miroslavnikolic@rocketmail.com>, 2011—2015. | ||||
| # Miroslav Nikolić <miroslavnikolic@rocketmail.com>, 2011—2016. | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&" | ||||
| "keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-03-04 11:14+0000\n" | ||||
| "PO-Revision-Date: 2015-03-04 19:46+0200\n" | ||||
| "POT-Creation-Date: 2016-03-09 01:41+0000\n" | ||||
| "PO-Revision-Date: 2016-03-09 09:52+0200\n" | ||||
| "Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n" | ||||
| "Language-Team: Serbian <gnom@prevod.org>\n" | ||||
| "Language-Team: Serbian <(nothing)>\n" | ||||
| "Language: sr\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| @@ -436,46 +438,41 @@ msgid "Switch to VT 7" | ||||
| msgstr "Prelazak na VT 7" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 8" | ||||
| msgstr "Prelazak na VT 8" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 9" | ||||
| msgstr "Prelazak na VT 9" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 10" | ||||
| msgstr "Prelazak na VT 10" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 11" | ||||
| msgstr "Prelazak na VT 11" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12 | ||||
| #| msgid "Switch to VT 1" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Prelazak na VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Ugrađeni displej" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Nepoznato" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Nepoznat displej" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -519,40 +516,45 @@ msgstr "_Sačekaj" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Primoraj izlaz" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Nisam uspeo da otvorim ekran „%s“ Iks sistema prozora\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Isključuje vezu sa upravnikom sesije" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Menja tekućeg upravnika prozorima" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Navodi IB upravnika sesije" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Iks ekran koji će biti korišćen" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Pokreće sesiju iz datoteke čuvanja" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Čini Iks pozive usklađenim" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Radi kao vajlandov sastavnik" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| #| msgid "Run as a wayland compositor" | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Radi kao ugneždeni sastavnik" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Radi kao puni server prikaza, umesto kao ugneždeni" | ||||
|  | ||||
| @@ -566,8 +568,8 @@ msgid "" | ||||
| "PARTICULAR PURPOSE.\n" | ||||
| msgstr "" | ||||
| "mater %s\n" | ||||
| "Sva prava zadržana (C) 2001–%d Havoc Pennington, Red Hat, Inc., i ostali\n" | ||||
| "Ovo je slobodan program; pogledajte izvorni kod za uslove korišćenja.\n" | ||||
| "Sva prava zadržana © 2001–%d Hevok Penington, Red Het, Ink., i ostali\n" | ||||
| "Ovo je slobodan program; pogledajte izvorni kôd za uslove korišćenja.\n" | ||||
| "NE postoji nikakva garancija; čak ni garancija o TRŽIŠNOJ VREDNOSTI ili " | ||||
| "PRILAGOĐENOSTI ODREĐENOJ NAMENI.\n" | ||||
|  | ||||
| @@ -579,29 +581,26 @@ msgstr "Ispisuje izdanje" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Priključci Matera za korišćenje" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "%d. radni prostor" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, 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" | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
| msgstr "" | ||||
| "Prikaz „%s“ već ima upravnika prozora; probajte da koristite opciju " | ||||
| "„--replace“ da zamenite trenutnog upravnika prozora." | ||||
| "Prikaz „%s“ već ima upravnika prozora; probajte da koristite opciju „--" | ||||
| "replace“ da zamenite trenutnog upravnika prozora." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Prikaz „%d“ na ekranu „%s“ nije ispravan\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mater je preveden bez podrške za opširan režim\n" | ||||
|  | ||||
|   | ||||
							
								
								
									
										162
									
								
								po/sv.po
									
									
									
									
									
								
							
							
						
						
									
										162
									
								
								po/sv.po
									
									
									
									
									
								
							| @@ -1,24 +1,25 @@ | ||||
| # Swedish messages for mutter. | ||||
| # Copyright © 2001-2015 Free Software Foundation, Inc. | ||||
| # Copyright © 2001-2016 Free Software Foundation, Inc. | ||||
| # Christian Rose <menthos@menthos.com>, 2001, 2002, 2003, 2004, 2005. | ||||
| # Daniel Nylander <po@danielnylander.se>, 2006, 2007, 2008, 2009, 2010, 2011, 2012. | ||||
| # Mattias Eriksson <snaggen@gmail.com>, 2014. | ||||
| # Anders Jonsson <anders.jonsson@norsjovallen.se>, 2015. | ||||
| # Sebastian Rasmussen <sebras@gmail.com>, 2016. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: mutter\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-02-19 21:45+0000\n" | ||||
| "PO-Revision-Date: 2015-02-24 17:54+0100\n" | ||||
| "Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n" | ||||
| "POT-Creation-Date: 2016-03-05 13:41+0000\n" | ||||
| "PO-Revision-Date: 2016-03-06 13:47+0100\n" | ||||
| "Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n" | ||||
| "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" | ||||
| "Language: sv\n" | ||||
| "MIME-Version: 1.0\n" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "X-Generator: Poedit 1.7.3\n" | ||||
| "X-Generator: Poedit 1.8.7.1\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| @@ -270,15 +271,15 @@ msgstr "Modifierare att använda för utökade fönsterhanteringsåtgärder" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:2 | ||||
| msgid "" | ||||
| "This key will initiate the \"overlay\", which is a combination window overview " | ||||
| "and application launching system. The default is intended to be the \"Windows key" | ||||
| "\" on PC hardware. It's expected that this binding either the default or set to " | ||||
| "the empty string." | ||||
| "This key will initiate the \"overlay\", which is a combination window " | ||||
| "overview and application launching system. The default is intended to be the " | ||||
| "\"Windows key\" on PC hardware. It's expected that this binding either the " | ||||
| "default or set to the empty string." | ||||
| msgstr "" | ||||
| "Denna nyckel kommer att initiera \"overlay\", som är en kombinerad " | ||||
| "fönsteröversikt och programstartare. Standard är tänkt att vara \"Windows-" | ||||
| "tangenten\" på PC-maskinvara. Det är förväntat att denna bindning antingen är " | ||||
| "standard eller inställd till en tom sträng." | ||||
| "tangenten\" på PC-maskinvara. Det är förväntat att denna bindning antingen " | ||||
| "är standard eller inställd till en tom sträng." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:3 | ||||
| msgid "Attach modal dialogs" | ||||
| @@ -287,12 +288,12 @@ msgstr "Bifoga modala dialogfönster" | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:4 | ||||
| msgid "" | ||||
| "When true, instead of having independent titlebars, modal dialogs appear " | ||||
| "attached to the titlebar of the parent window and are moved together with the " | ||||
| "parent window." | ||||
| "attached to the titlebar of the parent window and are moved together with " | ||||
| "the parent window." | ||||
| msgstr "" | ||||
| "När true kommer, istället för att ha oberoende namnlister, modala dialogfönster " | ||||
| "att visas anslutna till namnlisten i föräldrafönstret och flyttas tillsammans " | ||||
| "med föräldrafönstret." | ||||
| "När true kommer, istället för att ha oberoende namnlister, modala " | ||||
| "dialogfönster att visas anslutna till namnlisten i föräldrafönstret och " | ||||
| "flyttas tillsammans med föräldrafönstret." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:5 | ||||
| msgid "Enable edge tiling when dropping windows on screen edges" | ||||
| @@ -300,13 +301,13 @@ msgstr "Aktivera kantframhävning när fönster släpps på skärmkanter" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:6 | ||||
| msgid "" | ||||
| "If enabled, dropping windows on vertical screen edges maximizes them vertically " | ||||
| "and resizes them horizontally to cover half of the available area. Dropping " | ||||
| "windows on the top screen edge maximizes them completely." | ||||
| "If enabled, dropping windows on vertical screen edges maximizes them " | ||||
| "vertically and resizes them horizontally to cover half of the available " | ||||
| "area. Dropping windows on the top screen edge maximizes them completely." | ||||
| msgstr "" | ||||
| "Om aktiverad, släppa fönster på vertikala skärmkanter kommer att maximera dem " | ||||
| "vertikalt och storleksändra dem horisontellt till att täcka hälften av den " | ||||
| "tillgängliga ytan. Släppa fönster på övre skärmkanten maximerar dem helt." | ||||
| "Om aktiverad, släppa fönster på vertikala skärmkanter kommer att maximera " | ||||
| "dem vertikalt och storleksändra dem horisontellt till att täcka hälften av " | ||||
| "den tillgängliga ytan. Släppa fönster på övre skärmkanten maximerar dem helt." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:7 | ||||
| msgid "Workspaces are managed dynamically" | ||||
| @@ -315,12 +316,12 @@ msgstr "Arbetsytor hanteras dynamiskt" | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:8 | ||||
| msgid "" | ||||
| "Determines whether workspaces are managed dynamically or whether there's a " | ||||
| "static number of workspaces (determined by the num-workspaces key in org.gnome." | ||||
| "desktop.wm.preferences)." | ||||
| "static number of workspaces (determined by the num-workspaces key in org." | ||||
| "gnome.desktop.wm.preferences)." | ||||
| msgstr "" | ||||
| "Bestämmer huruvida arbetsytor hanteras dynamiskt eller huruvida det finns ett " | ||||
| "fast antal arbetsytor (bestäms av nyckeln num-workspaces i org.gnome.desktop.wm." | ||||
| "preferences)." | ||||
| "Bestämmer huruvida arbetsytor hanteras dynamiskt eller huruvida det finns " | ||||
| "ett fast antal arbetsytor (bestäms av nyckeln num-workspaces i org.gnome." | ||||
| "desktop.wm.preferences)." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:9 | ||||
| msgid "Workspaces only on primary" | ||||
| @@ -328,11 +329,11 @@ msgstr "Arbetsytor endast på primär" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:10 | ||||
| msgid "" | ||||
| "Determines whether workspace switching should happen for windows on all monitors " | ||||
| "or only for windows on the primary monitor." | ||||
| "Determines whether workspace switching should happen for windows on all " | ||||
| "monitors or only for windows on the primary monitor." | ||||
| msgstr "" | ||||
| "Bestämmer huruvida arbetsyteväxling ska hända för alla fönster på alla skärmar " | ||||
| "eller endast för fönster på den primära skärmen." | ||||
| "Bestämmer huruvida arbetsyteväxling ska hända för alla fönster på alla " | ||||
| "skärmar eller endast för fönster på den primära skärmen." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:11 | ||||
| msgid "No tab popup" | ||||
| @@ -340,11 +341,11 @@ msgstr "Ingen flik-popup" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:12 | ||||
| msgid "" | ||||
| "Determines whether the use of popup and highlight frame should be disabled for " | ||||
| "window cycling." | ||||
| "Determines whether the use of popup and highlight frame should be disabled " | ||||
| "for window cycling." | ||||
| msgstr "" | ||||
| "Bestämmer huruvida användning av popup och framhävning av kontur ska inaktiveras " | ||||
| "vid fönsterväxling." | ||||
| "Bestämmer huruvida användning av popup och framhävning av kontur ska " | ||||
| "inaktiveras vid fönsterväxling." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:13 | ||||
| msgid "Delay focus changes until the pointer stops moving" | ||||
| @@ -352,13 +353,13 @@ msgstr "Fördröj fokusändringar till muspekaren hålls still" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:14 | ||||
| msgid "" | ||||
| "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then the " | ||||
| "focus will not be changed immediately when entering a window, but only after the " | ||||
| "pointer stops moving." | ||||
| "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then " | ||||
| "the focus will not be changed immediately when entering a window, but only " | ||||
| "after the pointer stops moving." | ||||
| msgstr "" | ||||
| "Om satt till \"true\", och fokusläget är antingen \"sloppy\" eller \"mouse\" " | ||||
| "kommer fokus inte att ändras omedelbart när muspekaren går in över ett fönster, " | ||||
| "utan först efter att muspekaren slutar röra sig." | ||||
| "kommer fokus inte att ändras omedelbart när muspekaren går in över ett " | ||||
| "fönster, utan först efter att muspekaren slutar röra sig." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:15 | ||||
| msgid "Draggable border width" | ||||
| @@ -366,8 +367,8 @@ msgstr "Dragbar rambredd" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:16 | ||||
| msgid "" | ||||
| "The amount of total draggable borders. If the theme's visible borders are not " | ||||
| "enough, invisible borders will be added to meet this value." | ||||
| "The amount of total draggable borders. If the theme's visible borders are " | ||||
| "not enough, invisible borders will be added to meet this value." | ||||
| msgstr "" | ||||
| "Mängd av totalt dragbara ramar. Om temats synliga ramar inte är tillräckliga " | ||||
| "kommer osynliga ramar att läggas till för att möta detta värde." | ||||
| @@ -378,8 +379,8 @@ msgstr "Automatiskt maximera fönster vars storlek ligger nära skärmens storle | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:18 | ||||
| msgid "" | ||||
| "If enabled, new windows that are initially the size of the monitor automatically " | ||||
| "get maximized." | ||||
| "If enabled, new windows that are initially the size of the monitor " | ||||
| "automatically get maximized." | ||||
| msgstr "" | ||||
| "Om aktiverad kommer nya fönster med nästan samma storlek som skärmen att bli " | ||||
| "automatiskt maximerade." | ||||
| @@ -390,11 +391,11 @@ msgstr "Placera nya fönster centrerat" | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:20 | ||||
| msgid "" | ||||
| "When true, the new windows will always be put in the center of the active screen " | ||||
| "of the monitor." | ||||
| "When true, the new windows will always be put in the center of the active " | ||||
| "screen of the monitor." | ||||
| msgstr "" | ||||
| "När satt till \"true\", kommer nya fönster alltid att placeras centrerat på den " | ||||
| "aktiva skärmen." | ||||
| "När satt till \"true\", kommer nya fönster alltid att placeras centrerat på " | ||||
| "den aktiva skärmen." | ||||
|  | ||||
| #: ../data/org.gnome.mutter.gschema.xml.in.h:21 | ||||
| msgid "Select window from tab popup" | ||||
| @@ -452,22 +453,22 @@ msgstr "Växla till VT 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Växla till VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Inbyggd display" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Okänd" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Okänd display" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -477,8 +478,9 @@ msgstr "%s %s" | ||||
| #: ../src/compositor/compositor.c:456 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Another compositing manager is already running on screen %i on display \"%s\"." | ||||
| msgstr "En annan compositing-hanterare körs redan på skärm %i på display \"%s\"." | ||||
| "Another compositing manager is already running on screen %i on display \"%s" | ||||
| "\"." | ||||
| msgstr "En annan kompositionshanterare körs redan på skärm %i på display ”%s”." | ||||
|  | ||||
| #: ../src/core/bell.c:185 | ||||
| msgid "Bell event" | ||||
| @@ -495,8 +497,8 @@ msgstr "Programmet svarar inte." | ||||
|  | ||||
| #: ../src/core/delete.c:134 | ||||
| msgid "" | ||||
| "You may choose to wait a short while for it to continue or force the application " | ||||
| "to quit entirely." | ||||
| "You may choose to wait a short while for it to continue or force the " | ||||
| "application to quit entirely." | ||||
| msgstr "" | ||||
| "Du kan välja att vänta en kort stund på det för att fortsätta eller tvinga " | ||||
| "programmet att helt avslutas." | ||||
| @@ -509,40 +511,44 @@ msgstr "_Vänta" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Tvinga avslut" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Misslyckades med att öppna X Window System-displayen ”%s”\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Inaktivera anslutning till sessionshanteraren" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Ersätt körande fönsterhanteraren" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Ange sessionshanteringsid" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "X-display att använda" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Initiera session från sparandefil" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Gör X-anrop synkrona" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Kör som en wayland-compositor" | ||||
| msgstr "Kör som en wayland-kompositionshanterare" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Kör som en nästlad kompositionshanterare" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Kör som en full display-tjänst, i stället för nästlad" | ||||
|  | ||||
| @@ -552,8 +558,8 @@ msgid "" | ||||
| "mutter %s\n" | ||||
| "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" | ||||
| "This is free software; see the source for copying conditions.\n" | ||||
| "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR " | ||||
| "PURPOSE.\n" | ||||
| "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A " | ||||
| "PARTICULAR PURPOSE.\n" | ||||
| msgstr "" | ||||
| "mutter %s\n" | ||||
| "Copyright © 2001-%d Havoc Pennington, Red Hat, Inc. och andra\n" | ||||
| @@ -569,33 +575,33 @@ msgstr "Skriv ut version" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Mutter-insticksmodul att använda" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Arbetsyta %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option to " | ||||
| "replace the current window manager." | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| "to replace the current window manager." | ||||
| msgstr "" | ||||
| "Display ”%s” har redan en fönsterhanterare; försök med flaggan --replace för att " | ||||
| "ersätta den aktuella fönsterhanteraren." | ||||
| "Display ”%s” har redan en fönsterhanterare; försök med flaggan --replace för " | ||||
| "att ersätta den aktuella fönsterhanteraren." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Skärm %d på display ”%s” är ogiltig\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter kompilerades utan stöd för utförligt läge\n" | ||||
|  | ||||
| #: ../src/x11/session.c:1815 | ||||
| msgid "" | ||||
| "These windows do not support "save current setup" and will have to be " | ||||
| "restarted manually next time you log in." | ||||
| "These windows do not support "save current setup" and will have to " | ||||
| "be restarted manually next time you log in." | ||||
| msgstr "" | ||||
| "Dessa fönster saknar stöd för "spara nuvarande inställningar" och " | ||||
| "kommer att behöva startas om manuellt nästa gång du loggar in." | ||||
|   | ||||
							
								
								
									
										52
									
								
								po/vi.po
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								po/vi.po
									
									
									
									
									
								
							| @@ -1,17 +1,17 @@ | ||||
| # Vietnamese translation for Metacity. | ||||
| # Copyright © 2015 GNOME i18n Project for Vietnamese. | ||||
| # Copyright © 2016 GNOME i18n Project for Vietnamese. | ||||
| # This file is distributed under the same license as the Metacity package. | ||||
| # Nguyễn Thái Ngọc Duy <pclouds@gmail.com>, 2002-2004, 2007, 2008, 2011-2013. | ||||
| # Clytie Siddall <clytie@riverland.net.au>, 2005-2009. | ||||
| # Trần Ngọc Quân <vnwildman@gmail.com>, 2014, 2015. | ||||
| # Trần Ngọc Quân <vnwildman@gmail.com>, 2014, 2015, 2016. | ||||
| # | ||||
| msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: metacity master\n" | ||||
| "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?" | ||||
| "product=mutter&keywords=I18N+L10N&component=general\n" | ||||
| "POT-Creation-Date: 2015-03-09 23:13+0000\n" | ||||
| "PO-Revision-Date: 2015-03-10 13:28+0700\n" | ||||
| "POT-Creation-Date: 2016-03-26 14:03+0000\n" | ||||
| "PO-Revision-Date: 2016-03-27 07:22+0700\n" | ||||
| "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n" | ||||
| "Language-Team: Vietnamese <gnome-vi-list@gnome.org>\n" | ||||
| "Language: vi\n" | ||||
| @@ -19,11 +19,11 @@ msgstr "" | ||||
| "Content-Type: text/plain; charset=UTF-8\n" | ||||
| "Content-Transfer-Encoding: 8bit\n" | ||||
| "Plural-Forms: nplurals=1; plural=0;\n" | ||||
| "X-Generator: LocFactoryEditor 1.8\n" | ||||
| "X-Generator: Gtranslator 2.91.7\n" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:1 | ||||
| msgid "Navigation" | ||||
| msgstr "Di chuyển" | ||||
| msgstr "Điều hướng" | ||||
|  | ||||
| #: ../data/50-mutter-navigation.xml.in.h:2 | ||||
| msgid "Move window to workspace 1" | ||||
| @@ -447,22 +447,22 @@ msgstr "Chuyển sang VT 11" | ||||
| msgid "Switch to VT 12" | ||||
| msgstr "Chuyển sang VT 12" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:364 | ||||
| #: ../src/backends/meta-monitor-manager.c:518 | ||||
| msgid "Built-in display" | ||||
| msgstr "Màn hình tích hợp" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:391 | ||||
| #: ../src/backends/meta-monitor-manager.c:544 | ||||
| msgid "Unknown" | ||||
| msgstr "Không rõ" | ||||
|  | ||||
| #: ../src/backends/meta-monitor-manager.c:393 | ||||
| #: ../src/backends/meta-monitor-manager.c:546 | ||||
| msgid "Unknown Display" | ||||
| msgstr "Không hiểu màn hình" | ||||
|  | ||||
| #. TRANSLATORS: this is a monitor vendor name, followed by a | ||||
| #. * size in inches, like 'Dell 15"' | ||||
| #. | ||||
| #: ../src/backends/meta-monitor-manager.c:401 | ||||
| #: ../src/backends/meta-monitor-manager.c:554 | ||||
| #, c-format | ||||
| msgid "%s %s" | ||||
| msgstr "%s %s" | ||||
| @@ -477,7 +477,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Bộ quản lý cửa sổ đã đang chạy trên Màn hình %i trên bộ trình bày \"%s\"." | ||||
|  | ||||
| #: ../src/core/bell.c:185 | ||||
| #: ../src/core/bell.c:194 | ||||
| msgid "Bell event" | ||||
| msgstr "Sự kiện chuông" | ||||
|  | ||||
| @@ -506,40 +506,44 @@ msgstr "_Chờ" | ||||
| msgid "_Force Quit" | ||||
| msgstr "_Buộc thoát" | ||||
|  | ||||
| #: ../src/core/display.c:562 | ||||
| #: ../src/core/display.c:555 | ||||
| #, c-format | ||||
| msgid "Failed to open X Window System display '%s'\n" | ||||
| msgstr "Gặp lỗi khi mở bộ trình bày Hệ thống Cửa sổ X \"%s\".\n" | ||||
|  | ||||
| #: ../src/core/main.c:176 | ||||
| #: ../src/core/main.c:181 | ||||
| msgid "Disable connection to session manager" | ||||
| msgstr "Vô hiệu hóa kết nối với bộ quản lý phiên làm việc" | ||||
|  | ||||
| #: ../src/core/main.c:182 | ||||
| #: ../src/core/main.c:187 | ||||
| msgid "Replace the running window manager" | ||||
| msgstr "Thay thế bộ quản lý cửa sổ đang chạy" | ||||
|  | ||||
| #: ../src/core/main.c:188 | ||||
| #: ../src/core/main.c:193 | ||||
| msgid "Specify session management ID" | ||||
| msgstr "Ghi rõ mã số quản lý phiên làm việc" | ||||
|  | ||||
| #: ../src/core/main.c:193 | ||||
| #: ../src/core/main.c:198 | ||||
| msgid "X Display to use" | ||||
| msgstr "Bộ trình bày X cần dùng" | ||||
|  | ||||
| #: ../src/core/main.c:199 | ||||
| #: ../src/core/main.c:204 | ||||
| msgid "Initialize session from savefile" | ||||
| msgstr "Khởi động phiên làm việc từ tập tin lưu" | ||||
|  | ||||
| #: ../src/core/main.c:205 | ||||
| #: ../src/core/main.c:210 | ||||
| msgid "Make X calls synchronous" | ||||
| msgstr "Khiến các lời gọi X đồng bộ với nhau" | ||||
|  | ||||
| #: ../src/core/main.c:212 | ||||
| #: ../src/core/main.c:217 | ||||
| msgid "Run as a wayland compositor" | ||||
| msgstr "Chạy như là một “wayland compositor”" | ||||
|  | ||||
| #: ../src/core/main.c:220 | ||||
| #: ../src/core/main.c:223 | ||||
| msgid "Run as a nested compositor" | ||||
| msgstr "Chạy như là một “nested compositor”" | ||||
|  | ||||
| #: ../src/core/main.c:231 | ||||
| msgid "Run as a full display server, rather than nested" | ||||
| msgstr "Chạy như là một dịch vụ hiển thị đầy đủ, thay cho lồng nhau" | ||||
|  | ||||
| @@ -567,12 +571,12 @@ msgstr "Hiển thị phiên bản" | ||||
| msgid "Mutter plugin to use" | ||||
| msgstr "Phần bổ sung Mutter cần dùng" | ||||
|  | ||||
| #: ../src/core/prefs.c:2004 | ||||
| #: ../src/core/prefs.c:1997 | ||||
| #, c-format | ||||
| msgid "Workspace %d" | ||||
| msgstr "Vùng làm việc %d" | ||||
|  | ||||
| #: ../src/core/screen.c:525 | ||||
| #: ../src/core/screen.c:521 | ||||
| #, c-format | ||||
| msgid "" | ||||
| "Display \"%s\" already has a window manager; try using the --replace option " | ||||
| @@ -581,12 +585,12 @@ msgstr "" | ||||
| "Màn hình \"%s\" đã có bộ quản lý cửa sổ rồi; hãy thử dùng tùy chọn “--" | ||||
| "replace” để thay thế bộ quản lý cửa sổ đang dùng." | ||||
|  | ||||
| #: ../src/core/screen.c:607 | ||||
| #: ../src/core/screen.c:603 | ||||
| #, c-format | ||||
| msgid "Screen %d on display '%s' is invalid\n" | ||||
| msgstr "Màn hình %d trên bộ trình bày \"%s\" không hợp lệ.\n" | ||||
|  | ||||
| #: ../src/core/util.c:118 | ||||
| #: ../src/core/util.c:121 | ||||
| msgid "Mutter was compiled without support for verbose mode\n" | ||||
| msgstr "Mutter đã được biên dịch không hỗ trợ chế độ chi tiết\n" | ||||
|  | ||||
|   | ||||
| @@ -9,6 +9,7 @@ dist_stacking_DATA =				\ | ||||
| 	tests/stacking/basic-wayland.metatest	\ | ||||
| 	tests/stacking/minimized.metatest   	\ | ||||
| 	tests/stacking/mixed-windows.metatest   \ | ||||
| 	tests/stacking/set-parent.metatest	\ | ||||
| 	tests/stacking/override-redirect.metatest | ||||
|  | ||||
| mutter-all.test: tests/mutter-all.test.in | ||||
| @@ -18,9 +19,9 @@ installedtestsdir = $(datadir)/installed-tests/mutter | ||||
| installedtests_DATA = mutter-all.test | ||||
|  | ||||
| installedtestsbindir = $(libexecdir)/installed-tests/mutter | ||||
| installedtestsbin_PROGRAMS = mutter-test-client mutter-test-runner | ||||
| installedtestsbin_PROGRAMS = mutter-test-client mutter-test-runner mutter-test-unit-tests | ||||
| else | ||||
| noinst_PROGRAMS += mutter-test-client mutter-test-runner | ||||
| noinst_PROGRAMS += mutter-test-client mutter-test-runner mutter-test-unit-tests | ||||
| endif | ||||
|  | ||||
| EXTRA_DIST += tests/mutter-all.test.in | ||||
| @@ -31,11 +32,19 @@ 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 | ||||
| mutter_test_unit_tests_SOURCES = tests/unit-tests.c | ||||
| mutter_test_unit_tests_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
|  | ||||
| run-tests: mutter-test-client mutter-test-runner | ||||
| .PHONY: run-tests run-test-runner-tests run-unit-tests | ||||
|  | ||||
| run-test-runner-tests: mutter-test-client mutter-test-runner | ||||
| 	./mutter-test-runner $(dist_stacking_DATA) | ||||
|  | ||||
| run-unit-tests: mutter-test-unit-tests | ||||
| 	./mutter-test-unit-tests | ||||
|  | ||||
| run-tests: run-test-runner-tests run-unit-tests | ||||
|  | ||||
| endif | ||||
|  | ||||
| # Some random test programs for bits of the code | ||||
|   | ||||
| @@ -45,19 +45,24 @@ mutter_built_sources = \ | ||||
|  | ||||
| if HAVE_WAYLAND | ||||
| mutter_built_sources += \ | ||||
| 	pointer-gestures-protocol.c		\ | ||||
| 	pointer-gestures-server-protocol.h	\ | ||||
| 	pointer-gestures-unstable-v1-protocol.c				\ | ||||
| 	pointer-gestures-unstable-v1-server-protocol.h			\ | ||||
| 	gtk-shell-protocol.c			\ | ||||
| 	gtk-shell-server-protocol.h		\ | ||||
| 	xdg-shell-protocol.c			\ | ||||
| 	xdg-shell-server-protocol.h		\ | ||||
| 	gtk-primary-selection-protocol.c				\ | ||||
| 	gtk-primary-selection-server-protocol.h				\ | ||||
| 	xdg-shell-unstable-v5-protocol.c				\ | ||||
| 	xdg-shell-unstable-v5-server-protocol.h				\ | ||||
| 	relative-pointer-unstable-v1-protocol.c				\ | ||||
| 	relative-pointer-unstable-v1-server-protocol.h			\ | ||||
| 	pointer-constraints-unstable-v1-protocol.c			\ | ||||
| 	pointer-constraints-unstable-v1-server-protocol.h		\ | ||||
| 	$(NULL) | ||||
| endif | ||||
|  | ||||
| wayland_protocols =				\ | ||||
| 	wayland/protocol/pointer-gestures.xml	\ | ||||
| 	wayland/protocol/gtk-shell.xml		\ | ||||
| 	wayland/protocol/xdg-shell.xml		\ | ||||
| 	wayland/protocol/gtk-primary-selection.xml	\ | ||||
| 	$(NULL) | ||||
|  | ||||
| libmutter_la_SOURCES =				\ | ||||
| @@ -86,6 +91,8 @@ libmutter_la_SOURCES =				\ | ||||
| 	backends/meta-monitor-manager-private.h	\ | ||||
| 	backends/meta-monitor-manager-dummy.c	\ | ||||
| 	backends/meta-monitor-manager-dummy.h	\ | ||||
| 	backends/meta-pointer-constraint.c	\ | ||||
| 	backends/meta-pointer-constraint.h	\ | ||||
| 	backends/meta-stage.h			\ | ||||
| 	backends/meta-stage.c			\ | ||||
| 	backends/edid-parse.c			\ | ||||
| @@ -112,6 +119,8 @@ libmutter_la_SOURCES =				\ | ||||
| 	core/boxes.c				\ | ||||
| 	core/boxes-private.h			\ | ||||
| 	meta/boxes.h				\ | ||||
| 	core/meta-border.c			\ | ||||
| 	core/meta-border.h			\ | ||||
| 	compositor/clutter-utils.c		\ | ||||
| 	compositor/clutter-utils.h		\ | ||||
| 	compositor/cogl-utils.c			\ | ||||
| @@ -192,6 +201,8 @@ libmutter_la_SOURCES =				\ | ||||
| 	core/screen.c				\ | ||||
| 	core/screen-private.h			\ | ||||
| 	meta/screen.h				\ | ||||
| 	core/startup-notification.c		\ | ||||
| 	core/startup-notification-private.h	\ | ||||
| 	meta/types.h				\ | ||||
| 	core/restart.c				\ | ||||
| 	core/stack.c				\ | ||||
| @@ -266,6 +277,12 @@ libmutter_la_SOURCES +=				\ | ||||
| 	wayland/meta-wayland-keyboard.h		\ | ||||
| 	wayland/meta-wayland-pointer.c		\ | ||||
| 	wayland/meta-wayland-pointer.h		\ | ||||
| 	wayland/meta-wayland-pointer-constraints.c	\ | ||||
| 	wayland/meta-wayland-pointer-constraints.h	\ | ||||
| 	wayland/meta-pointer-lock-wayland.c		\ | ||||
| 	wayland/meta-pointer-lock-wayland.h		\ | ||||
| 	wayland/meta-pointer-confinement-wayland.c	\ | ||||
| 	wayland/meta-pointer-confinement-wayland.h	\ | ||||
| 	wayland/meta-wayland-popup.c		\ | ||||
| 	wayland/meta-wayland-popup.h		\ | ||||
| 	wayland/meta-wayland-seat.c		\ | ||||
| @@ -481,6 +498,20 @@ $(dbus_login1_built_sources) : Makefile.am org.freedesktop.login1.xml | ||||
| 		--generate-c-code meta-dbus-login1					\ | ||||
| 		$(srcdir)/org.freedesktop.login1.xml | ||||
|  | ||||
| .SECONDEXPANSION: | ||||
|  | ||||
| define protostability | ||||
| $(shell echo $1 | sed 's/.*\(\<unstable\>\|\<stable\>\).*/\1/') | ||||
| endef | ||||
|  | ||||
| define protoname | ||||
| $(shell echo $1 | sed 's/\([a-z\-]\+\)-[a-z]\+-v[0-9]\+/\1/') | ||||
| endef | ||||
|  | ||||
| %-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml | ||||
| 	$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@ | ||||
| %-server-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml | ||||
| 	$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@ | ||||
| %-protocol.c : $(srcdir)/wayland/protocol/%.xml | ||||
| 	$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@ | ||||
| %-server-protocol.h : $(srcdir)/wayland/protocol/%.xml | ||||
|   | ||||
| @@ -34,6 +34,7 @@ | ||||
| #include <meta/meta-idle-monitor.h> | ||||
| #include "meta-cursor-renderer.h" | ||||
| #include "meta-monitor-manager-private.h" | ||||
| #include "backends/meta-pointer-constraint.h" | ||||
|  | ||||
| #define DEFAULT_XKB_RULES_FILE "evdev" | ||||
| #define DEFAULT_XKB_MODEL "pc105+inet" | ||||
| @@ -51,6 +52,8 @@ struct _MetaBackend | ||||
|  | ||||
|   GHashTable *device_monitors; | ||||
|   gint current_device_id; | ||||
|  | ||||
|   MetaPointerConstraint *client_pointer_constraint; | ||||
| }; | ||||
|  | ||||
| struct _MetaBackendClass | ||||
| @@ -87,6 +90,13 @@ struct _MetaBackendClass | ||||
|  | ||||
|   void (* update_screen_size) (MetaBackend *backend, int width, int height); | ||||
|   void (* select_stage_events) (MetaBackend *backend); | ||||
|  | ||||
|   gboolean (* get_relative_motion_deltas) (MetaBackend *backend, | ||||
|                                            const        ClutterEvent *event, | ||||
|                                            double       *dx, | ||||
|                                            double       *dy, | ||||
|                                            double       *dx_unaccel, | ||||
|                                            double       *dy_unaccel); | ||||
| }; | ||||
|  | ||||
| MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend, | ||||
| @@ -110,4 +120,14 @@ struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend); | ||||
| void meta_backend_update_last_device (MetaBackend *backend, | ||||
|                                       int          device_id); | ||||
|  | ||||
| gboolean meta_backend_get_relative_motion_deltas (MetaBackend *backend, | ||||
|                                                   const        ClutterEvent *event, | ||||
|                                                   double       *dx, | ||||
|                                                   double       *dy, | ||||
|                                                   double       *dx_unaccel, | ||||
|                                                   double       *dy_unaccel); | ||||
|  | ||||
| void meta_backend_set_client_pointer_constraint (MetaBackend *backend, | ||||
|                                                  MetaPointerConstraint *constraint); | ||||
|  | ||||
| #endif /* META_BACKEND_PRIVATE_H */ | ||||
|   | ||||
| @@ -24,6 +24,8 @@ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include <meta/meta-backend.h> | ||||
| #include "meta-backend-private.h" | ||||
| #include "meta-input-settings-private.h" | ||||
| @@ -62,6 +64,8 @@ struct _MetaBackendPrivate | ||||
|   MetaInputSettings *input_settings; | ||||
|  | ||||
|   ClutterActor *stage; | ||||
|  | ||||
|   guint device_update_idle_id; | ||||
| }; | ||||
| typedef struct _MetaBackendPrivate MetaBackendPrivate; | ||||
|  | ||||
| @@ -76,6 +80,9 @@ meta_backend_finalize (GObject *object) | ||||
|   g_clear_object (&priv->monitor_manager); | ||||
|   g_clear_object (&priv->input_settings); | ||||
|  | ||||
|   if (priv->device_update_idle_id) | ||||
|     g_source_remove (priv->device_update_idle_id); | ||||
|  | ||||
|   g_hash_table_destroy (backend->device_monitors); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object); | ||||
| @@ -351,6 +358,17 @@ meta_backend_real_select_stage_events (MetaBackend *backend) | ||||
|   /* Do nothing */ | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| meta_backend_real_get_relative_motion_deltas (MetaBackend *backend, | ||||
|                                              const         ClutterEvent *event, | ||||
|                                              double        *dx, | ||||
|                                              double        *dy, | ||||
|                                              double        *dx_unaccel, | ||||
|                                              double        *dy_unaccel) | ||||
| { | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_class_init (MetaBackendClass *klass) | ||||
| { | ||||
| @@ -364,6 +382,7 @@ meta_backend_class_init (MetaBackendClass *klass) | ||||
|   klass->ungrab_device = meta_backend_real_ungrab_device; | ||||
|   klass->update_screen_size = meta_backend_real_update_screen_size; | ||||
|   klass->select_stage_events = meta_backend_real_select_stage_events; | ||||
|   klass->get_relative_motion_deltas = meta_backend_real_get_relative_motion_deltas; | ||||
|  | ||||
|   g_signal_new ("keymap-changed", | ||||
|                 G_TYPE_FROM_CLASS (object_class), | ||||
| @@ -503,12 +522,44 @@ meta_backend_get_stage (MetaBackend *backend) | ||||
|   return priv->stage; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| update_last_device (MetaBackend *backend) | ||||
| { | ||||
|   MetaCursorTracker *cursor_tracker = meta_cursor_tracker_get_for_screen (NULL); | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|   ClutterInputDeviceType device_type; | ||||
|   ClutterDeviceManager *manager; | ||||
|   ClutterInputDevice *device; | ||||
|  | ||||
|   priv->device_update_idle_id = 0; | ||||
|   manager = clutter_device_manager_get_default (); | ||||
|   device = clutter_device_manager_get_device (manager, | ||||
|                                               backend->current_device_id); | ||||
|   device_type = clutter_input_device_get_device_type (device); | ||||
|  | ||||
|   g_signal_emit_by_name (backend, "last-device-changed", | ||||
|                          backend->current_device_id); | ||||
|  | ||||
|   switch (device_type) | ||||
|     { | ||||
|     case CLUTTER_KEYBOARD_DEVICE: | ||||
|       break; | ||||
|     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; | ||||
|     } | ||||
|  | ||||
|   return G_SOURCE_REMOVE; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_backend_update_last_device (MetaBackend *backend, | ||||
|                                  int          device_id) | ||||
| { | ||||
|   ClutterInputDeviceType device_type; | ||||
|   MetaCursorTracker *cursor_tracker; | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|   ClutterDeviceManager *manager; | ||||
|   ClutterInputDevice *device; | ||||
|  | ||||
| @@ -522,26 +573,43 @@ meta_backend_update_last_device (MetaBackend *backend, | ||||
|       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) | ||||
|   if (priv->device_update_idle_id == 0) | ||||
|     { | ||||
|     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; | ||||
|       priv->device_update_idle_id = | ||||
|         g_idle_add ((GSourceFunc) update_last_device, backend); | ||||
|       g_source_set_name_by_id (priv->device_update_idle_id, | ||||
|                                "[mutter] update_last_device"); | ||||
|     } | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_backend_get_relative_motion_deltas (MetaBackend *backend, | ||||
|                                          const        ClutterEvent *event, | ||||
|                                          double       *dx, | ||||
|                                          double       *dy, | ||||
|                                          double       *dx_unaccel, | ||||
|                                          double       *dy_unaccel) | ||||
| { | ||||
|   MetaBackendClass *klass = META_BACKEND_GET_CLASS (backend); | ||||
|   return klass->get_relative_motion_deltas (backend, | ||||
|                                             event, | ||||
|                                             dx, dy, | ||||
|                                             dx_unaccel, dy_unaccel); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_backend_set_client_pointer_constraint (MetaBackend           *backend, | ||||
|                                             MetaPointerConstraint *constraint) | ||||
| { | ||||
|   g_assert (!constraint || (constraint && !backend->client_pointer_constraint)); | ||||
|  | ||||
|   g_clear_object (&backend->client_pointer_constraint); | ||||
|   if (constraint) | ||||
|     backend->client_pointer_constraint = g_object_ref (constraint); | ||||
| } | ||||
|  | ||||
| static GType | ||||
| get_backend_type (void) | ||||
| { | ||||
| @@ -626,7 +694,10 @@ meta_clutter_init (void) | ||||
|   meta_create_backend (); | ||||
|  | ||||
|   if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS) | ||||
|     g_error ("Unable to initialize Clutter.\n"); | ||||
|     { | ||||
|       g_warning ("Unable to initialize Clutter.\n"); | ||||
|       exit (1); | ||||
|     } | ||||
|  | ||||
|   /* | ||||
|    * XXX: We cannot handle high dpi scaling yet, so fix the scale to 1 | ||||
|   | ||||
| @@ -26,6 +26,8 @@ | ||||
| #ifndef META_BARRIER_PRIVATE_H | ||||
| #define META_BARRIER_PRIVATE_H | ||||
|  | ||||
| #include "core/meta-border.h" | ||||
|  | ||||
| G_BEGIN_DECLS | ||||
|  | ||||
| #define META_TYPE_BARRIER_IMPL            (meta_barrier_impl_get_type ()) | ||||
| @@ -67,14 +69,7 @@ G_END_DECLS | ||||
| struct _MetaBarrierPrivate | ||||
| { | ||||
|   MetaDisplay *display; | ||||
|  | ||||
|   int x1; | ||||
|   int y1; | ||||
|   int x2; | ||||
|   int y2; | ||||
|  | ||||
|   MetaBarrierDirection directions; | ||||
|  | ||||
|   MetaBorder border; | ||||
|   MetaBarrierImpl *impl; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -61,19 +61,20 @@ meta_barrier_get_property (GObject    *object, | ||||
|       g_value_set_object (value, priv->display); | ||||
|       break; | ||||
|     case PROP_X1: | ||||
|       g_value_set_int (value, priv->x1); | ||||
|       g_value_set_int (value, priv->border.line.a.x); | ||||
|       break; | ||||
|     case PROP_Y1: | ||||
|       g_value_set_int (value, priv->y1); | ||||
|       g_value_set_int (value, priv->border.line.a.y); | ||||
|       break; | ||||
|     case PROP_X2: | ||||
|       g_value_set_int (value, priv->x2); | ||||
|       g_value_set_int (value, priv->border.line.b.x); | ||||
|       break; | ||||
|     case PROP_Y2: | ||||
|       g_value_set_int (value, priv->y2); | ||||
|       g_value_set_int (value, priv->border.line.b.y); | ||||
|       break; | ||||
|     case PROP_DIRECTIONS: | ||||
|       g_value_set_flags (value, priv->directions); | ||||
|       g_value_set_flags (value, | ||||
|                          meta_border_get_allows_directions (&priv->border)); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
| @@ -95,19 +96,20 @@ meta_barrier_set_property (GObject      *object, | ||||
|       priv->display = g_value_get_object (value); | ||||
|       break; | ||||
|     case PROP_X1: | ||||
|       priv->x1 = g_value_get_int (value); | ||||
|       priv->border.line.a.x = g_value_get_int (value); | ||||
|       break; | ||||
|     case PROP_Y1: | ||||
|       priv->y1 = g_value_get_int (value); | ||||
|       priv->border.line.a.y = g_value_get_int (value); | ||||
|       break; | ||||
|     case PROP_X2: | ||||
|       priv->x2 = g_value_get_int (value); | ||||
|       priv->border.line.b.x = g_value_get_int (value); | ||||
|       break; | ||||
|     case PROP_Y2: | ||||
|       priv->y2 = g_value_get_int (value); | ||||
|       priv->border.line.b.y = g_value_get_int (value); | ||||
|       break; | ||||
|     case PROP_DIRECTIONS: | ||||
|       priv->directions = g_value_get_flags (value); | ||||
|       meta_border_set_allows_directions (&priv->border, | ||||
|                                          g_value_get_flags (value)); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
| @@ -166,7 +168,8 @@ meta_barrier_constructed (GObject *object) | ||||
|   MetaBarrier *barrier = META_BARRIER (object); | ||||
|   MetaBarrierPrivate *priv = barrier->priv; | ||||
|  | ||||
|   g_return_if_fail (priv->x1 == priv->x2 || priv->y1 == priv->y2); | ||||
|   g_return_if_fail (priv->border.line.a.x == priv->border.line.b.x || | ||||
|                     priv->border.line.a.y == priv->border.line.b.y); | ||||
|  | ||||
| #if defined(HAVE_NATIVE_BACKEND) | ||||
|   if (META_IS_BACKEND_NATIVE (meta_get_backend ())) | ||||
|   | ||||
| @@ -361,12 +361,12 @@ get_pointer_position_gdk (int         *x, | ||||
|                           int         *y, | ||||
|                           int         *mods) | ||||
| { | ||||
|   GdkDeviceManager *gmanager; | ||||
|   GdkSeat *gseat; | ||||
|   GdkDevice *gdevice; | ||||
|   GdkScreen *gscreen; | ||||
|  | ||||
|   gmanager = gdk_display_get_device_manager (gdk_display_get_default ()); | ||||
|   gdevice = gdk_x11_device_manager_lookup (gmanager, META_VIRTUAL_CORE_POINTER_ID); | ||||
|   gseat = gdk_display_get_default_seat (gdk_display_get_default ()); | ||||
|   gdevice = gdk_seat_get_pointer (gseat); | ||||
|  | ||||
|   gdk_device_get_position (gdevice, &gscreen, x, y); | ||||
|   if (mods) | ||||
|   | ||||
| @@ -63,9 +63,9 @@ struct _MetaInputSettingsClass | ||||
|   void (* set_invert_scroll) (MetaInputSettings  *settings, | ||||
|                               ClutterInputDevice *device, | ||||
|                               gboolean            inverted); | ||||
|   void (* set_scroll_method) (MetaInputSettings            *settings, | ||||
|                               ClutterInputDevice           *device, | ||||
|                               GDesktopTouchpadScrollMethod  mode); | ||||
|   void (* set_edge_scroll)   (MetaInputSettings  *settings, | ||||
|                               ClutterInputDevice *device, | ||||
|                               gboolean            enabled); | ||||
|   void (* set_scroll_button) (MetaInputSettings  *settings, | ||||
|                               ClutterInputDevice *device, | ||||
|                               guint               button); | ||||
|   | ||||
| @@ -395,11 +395,11 @@ update_touchpad_tap_enabled (MetaInputSettings  *input_settings, | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_touchpad_scroll_method (MetaInputSettings *input_settings, | ||||
|                                ClutterInputDevice *device) | ||||
| update_touchpad_edge_scroll (MetaInputSettings *input_settings, | ||||
|                              ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   GDesktopTouchpadScrollMethod method; | ||||
|   gboolean edge_scroll_enabled; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|  | ||||
|   if (device && | ||||
| @@ -408,19 +408,19 @@ update_touchpad_scroll_method (MetaInputSettings *input_settings, | ||||
|  | ||||
|   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"); | ||||
|   edge_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "edge-scrolling-enabled"); | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       settings_device_set_uint_setting (input_settings, device, | ||||
|                                         input_settings_class->set_scroll_method, | ||||
|                                         method); | ||||
|       settings_device_set_bool_setting (input_settings, device, | ||||
|                                         input_settings_class->set_edge_scroll, | ||||
|                                         edge_scroll_enabled); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, | ||||
|                                  (ConfigUintFunc) input_settings_class->set_scroll_method, | ||||
|                                  method); | ||||
|       settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, | ||||
|                                  (ConfigBoolFunc) input_settings_class->set_edge_scroll, | ||||
|                                  edge_scroll_enabled); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -429,7 +429,7 @@ update_touchpad_click_method (MetaInputSettings *input_settings, | ||||
|                               ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   GDesktopTouchpadScrollMethod method; | ||||
|   GDesktopTouchpadClickMethod method; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|  | ||||
|   if (device && | ||||
| @@ -645,8 +645,8 @@ meta_input_settings_changed_cb (GSettings  *settings, | ||||
|         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, "edge-scrolling-enabled") == 0) | ||||
|         update_touchpad_edge_scroll (input_settings, NULL); | ||||
|       else if (strcmp (key, "click-method") == 0) | ||||
|         update_touchpad_click_method (input_settings, NULL); | ||||
|     } | ||||
| @@ -771,7 +771,7 @@ apply_device_settings (MetaInputSettings  *input_settings, | ||||
|   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_edge_scroll (input_settings, device); | ||||
|   update_touchpad_click_method (input_settings, device); | ||||
|  | ||||
|   update_trackball_scroll_button (input_settings, device); | ||||
|   | ||||
| @@ -414,6 +414,10 @@ gint               meta_monitor_manager_get_monitor_at_point (MetaMonitorManager | ||||
|                                                               gfloat              x, | ||||
|                                                               gfloat              y); | ||||
|  | ||||
| void meta_monitor_manager_clear_output (MetaOutput *output); | ||||
| void meta_monitor_manager_clear_mode (MetaMonitorMode *mode); | ||||
| void meta_monitor_manager_clear_crtc (MetaCRTC *crtc); | ||||
|  | ||||
| /* Returns true if transform causes width and height to be inverted | ||||
|    This is true for the odd transforms in the enum */ | ||||
| static inline gboolean | ||||
|   | ||||
| @@ -178,7 +178,7 @@ make_logical_config (MetaMonitorManager *manager) | ||||
|   unsigned int i, j; | ||||
|  | ||||
|   monitor_infos = g_array_sized_new (FALSE, TRUE, sizeof (MetaMonitorInfo), | ||||
|                                      manager->n_outputs); | ||||
|                                      manager->n_crtcs); | ||||
|  | ||||
|   /* Walk the list of MetaCRTCs, and build a MetaMonitorInfo | ||||
|      for each of them, unless they reference a rectangle that | ||||
| @@ -346,6 +346,23 @@ meta_monitor_manager_constructed (GObject *object) | ||||
|   manager->in_init = FALSE; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_monitor_manager_clear_output (MetaOutput *output) | ||||
| { | ||||
|   g_free (output->name); | ||||
|   g_free (output->vendor); | ||||
|   g_free (output->product); | ||||
|   g_free (output->serial); | ||||
|   g_free (output->modes); | ||||
|   g_free (output->possible_crtcs); | ||||
|   g_free (output->possible_clones); | ||||
|  | ||||
|   if (output->driver_notify) | ||||
|     output->driver_notify (output); | ||||
|  | ||||
|   memset (output, 0, sizeof (*output)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_free_output_array (MetaOutput *old_outputs, | ||||
|                                         int         n_old_outputs) | ||||
| @@ -353,22 +370,22 @@ meta_monitor_manager_free_output_array (MetaOutput *old_outputs, | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < n_old_outputs; i++) | ||||
|     { | ||||
|       g_free (old_outputs[i].name); | ||||
|       g_free (old_outputs[i].vendor); | ||||
|       g_free (old_outputs[i].product); | ||||
|       g_free (old_outputs[i].serial); | ||||
|       g_free (old_outputs[i].modes); | ||||
|       g_free (old_outputs[i].possible_crtcs); | ||||
|       g_free (old_outputs[i].possible_clones); | ||||
|  | ||||
|       if (old_outputs[i].driver_notify) | ||||
|         old_outputs[i].driver_notify (&old_outputs[i]); | ||||
|     } | ||||
|     meta_monitor_manager_clear_output (&old_outputs[i]); | ||||
|  | ||||
|   g_free (old_outputs); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_monitor_manager_clear_mode (MetaMonitorMode *mode) | ||||
| { | ||||
|   g_free (mode->name); | ||||
|  | ||||
|   if (mode->driver_notify) | ||||
|     mode->driver_notify (mode); | ||||
|  | ||||
|   memset (mode, 0, sizeof (*mode)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes, | ||||
|                                       int              n_old_modes) | ||||
| @@ -376,16 +393,20 @@ meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes, | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < n_old_modes; i++) | ||||
|     { | ||||
|       g_free (old_modes[i].name); | ||||
|  | ||||
|       if (old_modes[i].driver_notify) | ||||
|         old_modes[i].driver_notify (&old_modes[i]); | ||||
|     } | ||||
|     meta_monitor_manager_clear_mode (&old_modes[i]); | ||||
|  | ||||
|   g_free (old_modes); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_monitor_manager_clear_crtc (MetaCRTC *crtc) | ||||
| { | ||||
|   if (crtc->driver_notify) | ||||
|     crtc->driver_notify (crtc); | ||||
|  | ||||
|   memset (crtc, 0, sizeof (*crtc)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_free_crtc_array (MetaCRTC *old_crtcs, | ||||
|                                       int       n_old_crtcs) | ||||
| @@ -393,10 +414,7 @@ meta_monitor_manager_free_crtc_array (MetaCRTC *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]); | ||||
|     } | ||||
|     meta_monitor_manager_clear_crtc (&old_crtcs[i]); | ||||
|  | ||||
|   g_free (old_crtcs); | ||||
| } | ||||
|   | ||||
							
								
								
									
										57
									
								
								src/backends/meta-pointer-constraint.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/backends/meta-pointer-constraint.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| /* -*- 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> | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include "backends/meta-pointer-constraint.h" | ||||
|  | ||||
| #include <glib-object.h> | ||||
|  | ||||
| G_DEFINE_TYPE (MetaPointerConstraint, meta_pointer_constraint, G_TYPE_OBJECT); | ||||
|  | ||||
| static void | ||||
| meta_pointer_constraint_init (MetaPointerConstraint *constraint) | ||||
| { | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_pointer_constraint_class_init (MetaPointerConstraintClass *klass) | ||||
| { | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_pointer_constraint_constrain (MetaPointerConstraint *constraint, | ||||
|                                    ClutterInputDevice    *device, | ||||
|                                    guint32                time, | ||||
|                                    float                  prev_x, | ||||
|                                    float                  prev_y, | ||||
|                                    float                  *x, | ||||
|                                    float                  *y) | ||||
| { | ||||
|   META_POINTER_CONSTRAINT_GET_CLASS (constraint)->constrain (constraint, | ||||
|                                                              device, | ||||
|                                                              time, | ||||
|                                                              prev_x, prev_y, | ||||
|                                                              x, y); | ||||
| } | ||||
							
								
								
									
										60
									
								
								src/backends/meta-pointer-constraint.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/backends/meta-pointer-constraint.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /* -*- 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_POINTER_CONSTRAINT_H | ||||
| #define META_POINTER_CONSTRAINT_H | ||||
|  | ||||
| #include <glib-object.h> | ||||
| #include <clutter/clutter.h> | ||||
|  | ||||
| G_BEGIN_DECLS | ||||
|  | ||||
| #define META_TYPE_POINTER_CONSTRAINT (meta_pointer_constraint_get_type ()) | ||||
| G_DECLARE_DERIVABLE_TYPE (MetaPointerConstraint, meta_pointer_constraint, | ||||
|                           META, POINTER_CONSTRAINT, GObject); | ||||
|  | ||||
| struct _MetaPointerConstraintClass | ||||
| { | ||||
|   GObjectClass parent_class; | ||||
|  | ||||
|   void (*constrain) (MetaPointerConstraint *constraint, | ||||
|                      ClutterInputDevice *device, | ||||
|                      guint32 time, | ||||
|                      float prev_x, | ||||
|                      float prev_y, | ||||
|                      float *x, | ||||
|                      float *y); | ||||
| }; | ||||
|  | ||||
| void meta_pointer_constraint_constrain (MetaPointerConstraint *constraint, | ||||
|                                         ClutterInputDevice    *device, | ||||
|                                         guint32                time, | ||||
|                                         float                  prev_x, | ||||
|                                         float                  prev_y, | ||||
|                                         float                 *x, | ||||
|                                         float                 *y); | ||||
|  | ||||
| G_END_DECLS | ||||
|  | ||||
| #endif /* META_POINTER_CONSTRAINT_H */ | ||||
| @@ -36,6 +36,10 @@ | ||||
| #include "meta-monitor-manager-kms.h" | ||||
| #include "meta-cursor-renderer-native.h" | ||||
| #include "meta-launcher.h" | ||||
| #include "backends/meta-cursor-tracker-private.h" | ||||
| #include "backends/meta-pointer-constraint.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| struct _MetaBackendNativePrivate | ||||
| { | ||||
| @@ -137,6 +141,24 @@ constrain_to_barriers (ClutterInputDevice *device, | ||||
|                                        new_x, new_y); | ||||
| } | ||||
|  | ||||
| static void | ||||
| constrain_to_client_constraint (ClutterInputDevice *device, | ||||
|                                 guint32             time, | ||||
|                                 float               prev_x, | ||||
|                                 float               prev_y, | ||||
|                                 float              *x, | ||||
|                                 float              *y) | ||||
| { | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|   MetaPointerConstraint *constraint = backend->client_pointer_constraint; | ||||
|  | ||||
|   if (!constraint) | ||||
|     return; | ||||
|  | ||||
|   meta_pointer_constraint_constrain (constraint, device, | ||||
|                                      time, prev_x, prev_y, x, y); | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * The pointer constrain code is mostly a rip-off of the XRandR code from Xorg. | ||||
|  * (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder) | ||||
| @@ -191,10 +213,12 @@ constrain_all_screen_monitors (ClutterInputDevice *device, | ||||
|  | ||||
| static void | ||||
| pointer_constrain_callback (ClutterInputDevice *device, | ||||
| 			    guint32             time, | ||||
| 			    float              *new_x, | ||||
| 			    float              *new_y, | ||||
| 			    gpointer            user_data) | ||||
|                             guint32             time, | ||||
|                             float               prev_x, | ||||
|                             float               prev_y, | ||||
|                             float              *new_x, | ||||
|                             float              *new_y, | ||||
|                             gpointer            user_data) | ||||
| { | ||||
|   MetaMonitorManager *monitor_manager; | ||||
|   MetaMonitorInfo *monitors; | ||||
| @@ -203,6 +227,9 @@ pointer_constrain_callback (ClutterInputDevice *device, | ||||
|   /* Constrain to barriers */ | ||||
|   constrain_to_barriers (device, time, new_x, new_y); | ||||
|  | ||||
|   /* Constrain to pointer lock */ | ||||
|   constrain_to_client_constraint (device, time, prev_x, prev_y, new_x, new_y); | ||||
|  | ||||
|   monitor_manager = meta_monitor_manager_get (); | ||||
|   monitors = meta_monitor_manager_get_monitor_infos (monitor_manager, &n_monitors); | ||||
|  | ||||
| @@ -253,11 +280,16 @@ meta_backend_native_warp_pointer (MetaBackend *backend, | ||||
| { | ||||
|   ClutterDeviceManager *manager = clutter_device_manager_get_default (); | ||||
|   ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE); | ||||
|   MetaCursorTracker *tracker = meta_cursor_tracker_get_for_screen (NULL); | ||||
|  | ||||
|   /* XXX */ | ||||
|   guint32 time_ = 0; | ||||
|  | ||||
|   /* Warp the input device pointer state. */ | ||||
|   clutter_evdev_warp_pointer (device, time_, x, y); | ||||
|  | ||||
|   /* Warp displayed pointer cursor. */ | ||||
|   meta_cursor_tracker_update_position (tracker, x, y); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -304,6 +336,19 @@ meta_backend_native_lock_layout_group (MetaBackend *backend, | ||||
|   g_signal_emit_by_name (backend, "keymap-layout-group-changed", idx, 0); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| meta_backend_native_get_relative_motion_deltas (MetaBackend *backend, | ||||
|                                                 const        ClutterEvent *event, | ||||
|                                                 double       *dx, | ||||
|                                                 double       *dy, | ||||
|                                                 double       *dx_unaccel, | ||||
|                                                 double       *dy_unaccel) | ||||
| { | ||||
|   return clutter_evdev_event_get_relative_motion (event, | ||||
|                                                   dx, dy, | ||||
|                                                   dx_unaccel, dy_unaccel); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_native_class_init (MetaBackendNativeClass *klass) | ||||
| { | ||||
| @@ -321,14 +366,22 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass) | ||||
|   backend_class->set_keymap = meta_backend_native_set_keymap; | ||||
|   backend_class->get_keymap = meta_backend_native_get_keymap; | ||||
|   backend_class->lock_layout_group = meta_backend_native_lock_layout_group; | ||||
|   backend_class->get_relative_motion_deltas = meta_backend_native_get_relative_motion_deltas; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_native_init (MetaBackendNative *native) | ||||
| { | ||||
|   MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native); | ||||
|   GError *error = NULL; | ||||
|  | ||||
|   priv->launcher = meta_launcher_new (&error); | ||||
|   if (priv->launcher == NULL) | ||||
|     { | ||||
|       g_warning ("Can't initialize KMS backend: %s\n", error->message); | ||||
|       exit (1); | ||||
|     } | ||||
|  | ||||
|   priv->launcher = meta_launcher_new (); | ||||
|   priv->barrier_manager = meta_barrier_manager_native_new (); | ||||
|  | ||||
|   priv->up_client = up_client_new (); | ||||
|   | ||||
| @@ -93,126 +93,18 @@ next_serial (void) | ||||
|   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; | ||||
|   return meta_border_is_horizontal (&barrier->priv->border); | ||||
| } | ||||
|  | ||||
| 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; | ||||
|   return meta_border_is_blocking_directions (&barrier->priv->border, | ||||
|                                              directions); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -224,31 +116,16 @@ dismiss_pointer (MetaBarrierImplNative *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 | ||||
| static MetaLine2 | ||||
| calculate_barrier_hit_box (MetaBarrier *barrier) | ||||
| { | ||||
|   Line2 hit_box = barrier_to_line (barrier); | ||||
|   MetaLine2 hit_box = barrier->priv->border.line; | ||||
|  | ||||
|   if (is_barrier_horizontal (barrier)) | ||||
|     { | ||||
| @@ -273,7 +150,8 @@ calculate_barrier_hit_box (MetaBarrier *barrier) | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| is_within_box (Line2 box, Vector2 point) | ||||
| is_within_box (MetaLine2   box, | ||||
|                MetaVector2 point) | ||||
| { | ||||
|   return (point.x >= box.a.x && point.x < box.b.x && | ||||
|           point.y >= box.a.y && point.y < box.b.y); | ||||
| @@ -288,8 +166,8 @@ maybe_release_barrier (gpointer key, | ||||
|   MetaBarrierImplNativePrivate *priv = | ||||
|     meta_barrier_impl_native_get_instance_private (self); | ||||
|   MetaBarrier *barrier = priv->barrier; | ||||
|   Line2 *motion = user_data; | ||||
|   Line2 hit_box; | ||||
|   MetaLine2 *motion = user_data; | ||||
|   MetaLine2 hit_box; | ||||
|  | ||||
|   if (priv->state != META_BARRIER_STATE_HELD) | ||||
|     return; | ||||
| @@ -297,8 +175,10 @@ maybe_release_barrier (gpointer key, | ||||
|   /* 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)) | ||||
|       if (motion->b.x > MAX (barrier->priv->border.line.a.x, | ||||
|                              barrier->priv->border.line.b.x) || | ||||
|           motion->b.x < MIN (barrier->priv->border.line.a.x, | ||||
|                              barrier->priv->border.line.b.x)) | ||||
|         { | ||||
|           dismiss_pointer (self); | ||||
|           return; | ||||
| @@ -306,8 +186,10 @@ maybe_release_barrier (gpointer key, | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       if (motion->b.y > MAX (barrier->priv->y1, barrier->priv->y2) || | ||||
|           motion->b.y < MIN (barrier->priv->y1, barrier->priv->y2)) | ||||
|       if (motion->b.y > MAX (barrier->priv->border.line.a.y, | ||||
|                              barrier->priv->border.line.b.y) || | ||||
|           motion->b.y < MIN (barrier->priv->border.line.a.y, | ||||
|                              barrier->priv->border.line.b.y)) | ||||
|         { | ||||
|           dismiss_pointer (self); | ||||
|           return; | ||||
| @@ -330,7 +212,7 @@ maybe_release_barriers (MetaBarrierManagerNative *manager, | ||||
|                         float                     x, | ||||
|                         float                     y) | ||||
| { | ||||
|   Line2 motion = { | ||||
|   MetaLine2 motion = { | ||||
|     .a = { | ||||
|       .x = prev_x, | ||||
|       .y = prev_y, | ||||
| @@ -350,7 +232,7 @@ typedef struct _MetaClosestBarrierData | ||||
| { | ||||
|   struct | ||||
|   { | ||||
|     Line2                       motion; | ||||
|     MetaLine2                   motion; | ||||
|     MetaBarrierDirection        directions; | ||||
|   } in; | ||||
|  | ||||
| @@ -371,8 +253,7 @@ update_closest_barrier (gpointer key, | ||||
|     meta_barrier_impl_native_get_instance_private (self); | ||||
|   MetaBarrier *barrier = priv->barrier; | ||||
|   MetaClosestBarrierData *data = user_data; | ||||
|   Line2 barrier_line; | ||||
|   Vector2 intersection; | ||||
|   MetaVector2 intersection; | ||||
|   float dx, dy; | ||||
|   float distance_2; | ||||
|  | ||||
| @@ -391,17 +272,9 @@ update_closest_barrier (gpointer key, | ||||
|  | ||||
|   /* 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)) | ||||
|   if (!meta_line2_intersects_with (&barrier->priv->border.line, | ||||
|                                    &data->in.motion, | ||||
|                                    &intersection)) | ||||
|     return; | ||||
|  | ||||
|   /* Calculate the distance to the barrier and keep track of the closest | ||||
| @@ -570,9 +443,9 @@ clamp_to_barrier (MetaBarrierImplNative *self, | ||||
|   if (is_barrier_horizontal (barrier)) | ||||
|     { | ||||
|       if (*motion_dir & META_BARRIER_DIRECTION_POSITIVE_Y) | ||||
|         *y = barrier->priv->y1; | ||||
|         *y = barrier->priv->border.line.a.y; | ||||
|       else if (*motion_dir & META_BARRIER_DIRECTION_NEGATIVE_Y) | ||||
|         *y = barrier->priv->y1; | ||||
|         *y = barrier->priv->border.line.a.y; | ||||
|  | ||||
|       priv->blocked_dir = *motion_dir & (META_BARRIER_DIRECTION_POSITIVE_Y | | ||||
|                                          META_BARRIER_DIRECTION_NEGATIVE_Y); | ||||
| @@ -582,9 +455,9 @@ clamp_to_barrier (MetaBarrierImplNative *self, | ||||
|   else | ||||
|     { | ||||
|       if (*motion_dir & META_BARRIER_DIRECTION_POSITIVE_X) | ||||
|         *x = barrier->priv->x1; | ||||
|         *x = barrier->priv->border.line.a.x; | ||||
|       else if (*motion_dir & META_BARRIER_DIRECTION_NEGATIVE_X) | ||||
|         *x = barrier->priv->x1; | ||||
|         *x = barrier->priv->border.line.a.x; | ||||
|  | ||||
|       priv->blocked_dir = *motion_dir & (META_BARRIER_DIRECTION_POSITIVE_X | | ||||
|                                          META_BARRIER_DIRECTION_NEGATIVE_X); | ||||
|   | ||||
| @@ -102,9 +102,6 @@ meta_cursor_renderer_native_finalize (GObject *object) | ||||
|   if (priv->animation_timeout_id) | ||||
|     g_source_remove (priv->animation_timeout_id); | ||||
|  | ||||
|   if (priv->gbm) | ||||
|     gbm_device_destroy (priv->gbm); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_cursor_renderer_native_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
| @@ -258,6 +255,9 @@ has_valid_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite) | ||||
|   MetaCursorNativePrivate *cursor_priv = | ||||
|     g_object_get_qdata (G_OBJECT (cursor_sprite), quark_cursor_sprite); | ||||
|  | ||||
|   if (!cursor_priv) | ||||
|     return FALSE; | ||||
|  | ||||
|   switch (cursor_priv->pending_bo_state) | ||||
|     { | ||||
|     case META_CURSOR_GBM_BO_STATE_NONE: | ||||
| @@ -273,6 +273,32 @@ has_valid_cursor_sprite_gbm_bo (MetaCursorSprite *cursor_sprite) | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| cursor_over_transformed_crtc (MetaCursorRenderer *renderer, | ||||
|                               MetaCursorSprite   *cursor_sprite) | ||||
| { | ||||
|   MetaMonitorManager *monitors; | ||||
|   MetaCRTC *crtcs; | ||||
|   unsigned int i, n_crtcs; | ||||
|   MetaRectangle rect; | ||||
|  | ||||
|   monitors = meta_monitor_manager_get (); | ||||
|   meta_monitor_manager_get_resources (monitors, NULL, NULL, | ||||
|                                       &crtcs, &n_crtcs, NULL, NULL); | ||||
|   rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite); | ||||
|  | ||||
|   for (i = 0; i < n_crtcs; i++) | ||||
|     { | ||||
|       if (!meta_rectangle_overlap (&rect, &crtcs[i].rect)) | ||||
|         continue; | ||||
|  | ||||
|       if (crtcs[i].transform != META_MONITOR_TRANSFORM_NORMAL) | ||||
|         return TRUE; | ||||
|     } | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| should_have_hw_cursor (MetaCursorRenderer *renderer, | ||||
|                        MetaCursorSprite   *cursor_sprite) | ||||
| @@ -282,6 +308,9 @@ should_have_hw_cursor (MetaCursorRenderer *renderer, | ||||
|   if (!cursor_sprite) | ||||
|     return FALSE; | ||||
|  | ||||
|   if (cursor_over_transformed_crtc (renderer, cursor_sprite)) | ||||
|     return FALSE; | ||||
|  | ||||
|   texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite); | ||||
|   if (!texture) | ||||
|     return FALSE; | ||||
| @@ -640,7 +669,7 @@ meta_cursor_renderer_native_init (MetaCursorRendererNative *native) | ||||
|     { | ||||
|       CoglRenderer *cogl_renderer = cogl_display_get_renderer (cogl_context_get_display (ctx)); | ||||
|       priv->drm_fd = cogl_kms_renderer_get_kms_fd (cogl_renderer); | ||||
|       priv->gbm = gbm_create_device (priv->drm_fd); | ||||
|       priv->gbm = cogl_kms_renderer_get_gbm (cogl_renderer); | ||||
|  | ||||
|       uint64_t width, height; | ||||
|       if (drmGetCap (priv->drm_fd, DRM_CAP_CURSOR_WIDTH, &width) == 0 && | ||||
|   | ||||
| @@ -164,56 +164,36 @@ meta_idle_monitor_native_init (MetaIdleMonitorNative *monitor_native) | ||||
|   monitor->watches = g_hash_table_new_full (NULL, NULL, NULL, free_watch); | ||||
| } | ||||
|  | ||||
| typedef struct { | ||||
|   MetaIdleMonitorNative *monitor_native; | ||||
|   GList *fired_watches; | ||||
| } CheckNativeClosure; | ||||
|  | ||||
| static gboolean | ||||
| check_native_watch (gpointer key, | ||||
|                     gpointer value, | ||||
|                     gpointer user_data) | ||||
| { | ||||
|   MetaIdleMonitorWatchNative *watch_native = value; | ||||
|   MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) watch_native; | ||||
|   CheckNativeClosure *closure = user_data; | ||||
|   gboolean steal; | ||||
|  | ||||
|   if (watch->timeout_msec == 0) | ||||
|     { | ||||
|       closure->fired_watches = g_list_prepend (closure->fired_watches, watch); | ||||
|       steal = TRUE; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       g_source_set_ready_time (watch_native->timeout_source, | ||||
|                                closure->monitor_native->last_event_time + | ||||
|                                watch->timeout_msec * 1000); | ||||
|       steal = FALSE; | ||||
|     } | ||||
|  | ||||
|   return steal; | ||||
| } | ||||
|  | ||||
| static void | ||||
| fire_native_watch (gpointer watch, | ||||
|                    gpointer data) | ||||
| { | ||||
|   _meta_idle_monitor_watch_fire (watch); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_idle_monitor_native_reset_idletime (MetaIdleMonitor *monitor) | ||||
| { | ||||
|   MetaIdleMonitorNative *monitor_native = META_IDLE_MONITOR_NATIVE (monitor); | ||||
|   CheckNativeClosure closure; | ||||
|   GList *node, *watch_ids; | ||||
|  | ||||
|   monitor_native->last_event_time = g_get_monotonic_time (); | ||||
|  | ||||
|   closure.monitor_native = monitor_native; | ||||
|   closure.fired_watches = NULL; | ||||
|   g_hash_table_foreach_steal (monitor->watches, check_native_watch, &closure); | ||||
|   watch_ids = g_hash_table_get_keys (monitor->watches); | ||||
|  | ||||
|   g_list_foreach (closure.fired_watches, fire_native_watch, NULL); | ||||
|   g_list_free (closure.fired_watches); | ||||
|   for (node = watch_ids; node != NULL; node = node->next) | ||||
|     { | ||||
|       guint watch_id = GPOINTER_TO_UINT (node->data); | ||||
|       MetaIdleMonitorWatchNative *watch; | ||||
|  | ||||
|       watch = g_hash_table_lookup (monitor->watches, GUINT_TO_POINTER (watch_id)); | ||||
|       if (!watch) | ||||
|         continue; | ||||
|  | ||||
|       if (watch->base.timeout_msec == 0) | ||||
|         { | ||||
|           _meta_idle_monitor_watch_fire ((MetaIdleMonitorWatch *) watch); | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           g_source_set_ready_time (watch->timeout_source, | ||||
|                                    monitor_native->last_event_time + | ||||
|                                    watch->base.timeout_msec * 1000); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   g_list_free (watch_ids); | ||||
| } | ||||
|   | ||||
| @@ -154,30 +154,30 @@ device_set_click_method (struct libinput_device            *libinput_device, | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_input_settings_native_set_scroll_method (MetaInputSettings            *settings, | ||||
|                                               ClutterInputDevice           *device, | ||||
|                                               GDesktopTouchpadScrollMethod  mode) | ||||
| meta_input_settings_native_set_edge_scroll (MetaInputSettings            *settings, | ||||
|                                             ClutterInputDevice           *device, | ||||
|                                             gboolean                      edge_scrolling_enabled) | ||||
| { | ||||
|   enum libinput_config_scroll_method scroll_method = 0; | ||||
|   struct libinput_device *libinput_device; | ||||
|   enum libinput_config_scroll_method supported; | ||||
|  | ||||
|   libinput_device = clutter_evdev_input_device_get_libinput_device (device); | ||||
|   supported = libinput_device_config_scroll_get_methods (libinput_device); | ||||
|  | ||||
|   switch (mode) | ||||
|   if (supported & LIBINPUT_CONFIG_SCROLL_2FG) | ||||
|     { | ||||
|     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; | ||||
|   } | ||||
|     } | ||||
|   else if (supported & LIBINPUT_CONFIG_SCROLL_EDGE && | ||||
|            edge_scrolling_enabled) | ||||
|     { | ||||
|       scroll_method = LIBINPUT_CONFIG_SCROLL_EDGE; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       scroll_method = LIBINPUT_CONFIG_SCROLL_NO_SCROLL; | ||||
|     } | ||||
|  | ||||
|   device_set_scroll_method (libinput_device, scroll_method); | ||||
| } | ||||
| @@ -252,7 +252,7 @@ meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass) | ||||
|   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_edge_scroll = meta_input_settings_native_set_edge_scroll; | ||||
|   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; | ||||
|   | ||||
| @@ -46,6 +46,12 @@ | ||||
| #include "meta-cursor-renderer-native.h" | ||||
| #include "meta-idle-monitor-native.h" | ||||
|  | ||||
| G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevDevice, g_object_unref) | ||||
| G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevClient, g_object_unref) | ||||
| G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevEnumerator, g_object_unref) | ||||
| G_DEFINE_AUTOPTR_CLEANUP_FUNC(Login1Session, g_object_unref) | ||||
| G_DEFINE_AUTOPTR_CLEANUP_FUNC(Login1Seat, g_object_unref) | ||||
|  | ||||
| struct _MetaLauncher | ||||
| { | ||||
|   Login1Session *session_proxy; | ||||
| @@ -54,30 +60,22 @@ struct _MetaLauncher | ||||
|   gboolean session_active; | ||||
| }; | ||||
|  | ||||
| static void | ||||
| report_error_and_die (const char *prefix, | ||||
|                       GError *error) | ||||
| { | ||||
|   /* if a function returns due to g_return_val_if_fail, | ||||
|    * then the error may not be set */ | ||||
|   if (error) | ||||
|     g_error ("%s: %s", prefix, error->message); | ||||
|   else | ||||
|     g_error ("%s", prefix); | ||||
|  | ||||
|   /* the error is not freed, but it is ok as g_error aborts the process */ | ||||
| } | ||||
|  | ||||
| static Login1Session * | ||||
| get_session_proxy (GCancellable *cancellable) | ||||
| get_session_proxy (GCancellable *cancellable, | ||||
|                    GError      **error) | ||||
| { | ||||
|   char *proxy_path; | ||||
|   char *session_id; | ||||
|   g_autofree char *proxy_path = NULL; | ||||
|   g_autofree char *session_id = NULL; | ||||
|   Login1Session *session_proxy; | ||||
|   GError *error = NULL; | ||||
|  | ||||
|   if (sd_pid_get_session (getpid (), &session_id) < 0) | ||||
|     return NULL; | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "Could not get session ID: %m"); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   proxy_path = get_escaped_dbus_path ("/org/freedesktop/login1/session", session_id); | ||||
|  | ||||
| @@ -85,26 +83,24 @@ get_session_proxy (GCancellable *cancellable) | ||||
|                                                          G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, | ||||
|                                                          "org.freedesktop.login1", | ||||
|                                                          proxy_path, | ||||
|                                                          cancellable, &error); | ||||
|                                                          cancellable, error); | ||||
|   if (!session_proxy) | ||||
|     report_error_and_die ("Failed getting session proxy", error); | ||||
|  | ||||
|   free (proxy_path); | ||||
|     g_prefix_error(error, "Could not get session proxy: "); | ||||
|  | ||||
|   return session_proxy; | ||||
| } | ||||
|  | ||||
| static Login1Seat * | ||||
| get_seat_proxy (GCancellable *cancellable) | ||||
| get_seat_proxy (GCancellable *cancellable, | ||||
|                 GError      **error) | ||||
| { | ||||
|   GError *error = NULL; | ||||
|   Login1Seat *seat = login1_seat_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, | ||||
|                                                          G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, | ||||
|                                                          "org.freedesktop.login1", | ||||
|                                                          "/org/freedesktop/login1/seat/self", | ||||
|                                                          cancellable, &error); | ||||
|                                                          cancellable, error); | ||||
|   if (!seat) | ||||
|     report_error_and_die ("Could not get seat proxy", error); | ||||
|     g_prefix_error(error, "Could not get seat proxy: "); | ||||
|  | ||||
|   return seat; | ||||
| } | ||||
| @@ -293,8 +289,8 @@ get_primary_gpu_path (const gchar *seat_name) | ||||
|   gchar *path = NULL; | ||||
|   GList *devices, *tmp; | ||||
|  | ||||
|   GUdevClient *gudev_client = g_udev_client_new (subsystems); | ||||
|   GUdevEnumerator *enumerator = g_udev_enumerator_new (gudev_client); | ||||
|   g_autoptr (GUdevClient) gudev_client = g_udev_client_new (subsystems); | ||||
|   g_autoptr (GUdevEnumerator) enumerator = g_udev_enumerator_new (gudev_client); | ||||
|  | ||||
|   g_udev_enumerator_add_match_name (enumerator, "card*"); | ||||
|   g_udev_enumerator_add_match_tag (enumerator, "seat"); | ||||
| @@ -305,7 +301,8 @@ get_primary_gpu_path (const gchar *seat_name) | ||||
|  | ||||
|   for (tmp = devices; tmp != NULL; tmp = tmp->next) | ||||
|     { | ||||
|       GUdevDevice *pci_device; | ||||
|       g_autoptr (GUdevDevice) platform_device = NULL; | ||||
|       g_autoptr (GUdevDevice) pci_device = NULL; | ||||
|       GUdevDevice *dev = tmp->data; | ||||
|       gint boot_vga; | ||||
|       const gchar *device_seat; | ||||
| @@ -332,94 +329,138 @@ get_primary_gpu_path (const gchar *seat_name) | ||||
|       if (g_strcmp0 (seat_name, device_seat)) | ||||
|         continue; | ||||
|  | ||||
|       pci_device = g_udev_device_get_parent_with_subsystem (dev, "pci", NULL); | ||||
|       if (!pci_device) | ||||
|           continue; | ||||
|  | ||||
|       /* get value of boot_vga attribute or 0 if the device has no boot_vga */ | ||||
|       boot_vga = g_udev_device_get_sysfs_attr_as_int (pci_device, "boot_vga"); | ||||
|       g_object_unref (pci_device); | ||||
|  | ||||
|       if (boot_vga == 1) | ||||
|       platform_device = g_udev_device_get_parent_with_subsystem (dev, "platform", NULL); | ||||
|       if (platform_device != NULL) | ||||
|         { | ||||
|           /* found the boot_vga device */ | ||||
|           path = g_strdup (g_udev_device_get_device_file (dev)); | ||||
|           break; | ||||
|         } | ||||
|  | ||||
|       pci_device = g_udev_device_get_parent_with_subsystem (dev, "pci", NULL); | ||||
|       if (pci_device != NULL) | ||||
|         { | ||||
|           /* get value of boot_vga attribute or 0 if the device has no boot_vga */ | ||||
|           boot_vga = g_udev_device_get_sysfs_attr_as_int (pci_device, "boot_vga"); | ||||
|           if (boot_vga == 1) | ||||
|             { | ||||
|               /* found the boot_vga device */ | ||||
|               path = g_strdup (g_udev_device_get_device_file (dev)); | ||||
|               break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   g_list_free_full (devices, g_object_unref); | ||||
|  | ||||
| out: | ||||
|   g_object_unref (enumerator); | ||||
|   g_object_unref (gudev_client); | ||||
|  | ||||
|   return path; | ||||
| } | ||||
|  | ||||
| static void | ||||
| static gboolean | ||||
| get_kms_fd (Login1Session *session_proxy, | ||||
|             const gchar *seat_id, | ||||
|             int *fd_out) | ||||
|             const gchar   *seat_id, | ||||
|             int           *fd_out, | ||||
|             GError       **error) | ||||
| { | ||||
|   int major, minor; | ||||
|   int fd; | ||||
|   gchar *path; | ||||
|   GError *error = NULL; | ||||
|  | ||||
|   path = get_primary_gpu_path (seat_id); | ||||
|   g_autofree gchar *path = get_primary_gpu_path (seat_id); | ||||
|   if (!path) | ||||
|     g_error ("could not find drm kms device"); | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "could not find drm kms device"); | ||||
|       return FALSE; | ||||
|     } | ||||
|  | ||||
|   if (!get_device_info_from_path (path, &major, &minor)) | ||||
|     g_error ("Could not stat %s: %m", path); | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "Could not get device info for path %s: %m", path); | ||||
|       return FALSE; | ||||
|     } | ||||
|  | ||||
|   g_free (path); | ||||
|  | ||||
|   if (!take_device (session_proxy, major, minor, &fd, NULL, &error)) | ||||
|     report_error_and_die ("Could not open DRM device", error); | ||||
|   if (!take_device (session_proxy, major, minor, &fd, NULL, error)) | ||||
|     { | ||||
|       g_prefix_error (error, "Could not open DRM device: "); | ||||
|       return FALSE; | ||||
|     } | ||||
|  | ||||
|   *fd_out = fd; | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static gchar * | ||||
| get_seat_id (void) | ||||
| get_seat_id (GError **error) | ||||
| { | ||||
|   char *session_id, *seat_id = NULL; | ||||
|   g_autofree char *session_id = NULL; | ||||
|   char *seat_id = NULL; | ||||
|   int r; | ||||
|  | ||||
|   if (sd_pid_get_session (0, &session_id) < 0) | ||||
|     return NULL; | ||||
|   r = sd_pid_get_session (0, &session_id); | ||||
|   if (r < 0) | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "Could not get session for PID: %s", g_strerror (-r)); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   /* on error the seat_id will remain NULL */ | ||||
|   sd_session_get_seat (session_id, &seat_id); | ||||
|   free (session_id); | ||||
|   r = sd_session_get_seat (session_id, &seat_id); | ||||
|   if (r < 0) | ||||
|     { | ||||
|       g_set_error (error, | ||||
|                    G_IO_ERROR, | ||||
|                    G_IO_ERROR_NOT_FOUND, | ||||
|                    "Could not get seat for session: %s", g_strerror (-r)); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   return seat_id; | ||||
| } | ||||
|  | ||||
| MetaLauncher * | ||||
| meta_launcher_new (void) | ||||
| meta_launcher_new (GError **error) | ||||
| { | ||||
|   MetaLauncher *self = NULL; | ||||
|   Login1Session *session_proxy; | ||||
|   char *seat_id; | ||||
|   GError *error = NULL; | ||||
|   g_autoptr (Login1Session) session_proxy = NULL; | ||||
|   g_autoptr (Login1Seat) seat_proxy = NULL; | ||||
|   g_autofree char *seat_id = NULL; | ||||
|   gboolean have_control = FALSE; | ||||
|   int kms_fd; | ||||
|  | ||||
|   session_proxy = get_session_proxy (NULL); | ||||
|   if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, &error)) | ||||
|     report_error_and_die ("Could not take control", error); | ||||
|   session_proxy = get_session_proxy (NULL, error); | ||||
|   if (!session_proxy) | ||||
|     goto fail; | ||||
|  | ||||
|   seat_id = get_seat_id (); | ||||
|   if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, error)) | ||||
|     { | ||||
|       g_prefix_error (error, "Could not take control: "); | ||||
|       goto fail; | ||||
|     } | ||||
|  | ||||
|   have_control = TRUE; | ||||
|  | ||||
|   seat_id = get_seat_id (error); | ||||
|   if (!seat_id) | ||||
|     g_error ("Failed getting seat id"); | ||||
|     goto fail; | ||||
|  | ||||
|   get_kms_fd (session_proxy, seat_id, &kms_fd); | ||||
|   free (seat_id); | ||||
|   seat_proxy = get_seat_proxy (NULL, error); | ||||
|   if (!seat_proxy) | ||||
|     goto fail; | ||||
|  | ||||
|   if (!get_kms_fd (session_proxy, seat_id, &kms_fd, error)) | ||||
|     goto fail; | ||||
|  | ||||
|   self = g_slice_new0 (MetaLauncher); | ||||
|   self->session_proxy = session_proxy; | ||||
|   self->seat_proxy = get_seat_proxy (NULL); | ||||
|   self->session_proxy = g_object_ref (session_proxy); | ||||
|   self->seat_proxy = g_object_ref (seat_proxy); | ||||
|  | ||||
|   self->session_active = TRUE; | ||||
|  | ||||
| @@ -429,8 +470,12 @@ meta_launcher_new (void) | ||||
|                                       self); | ||||
|  | ||||
|   g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self); | ||||
|  | ||||
|   return self; | ||||
|  | ||||
|  fail: | ||||
|   if (have_control) | ||||
|     login1_session_call_release_control_sync (session_proxy, NULL, NULL); | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| void | ||||
|   | ||||
| @@ -24,7 +24,7 @@ | ||||
|  | ||||
| typedef struct _MetaLauncher MetaLauncher; | ||||
|  | ||||
| MetaLauncher     *meta_launcher_new                     (void); | ||||
| MetaLauncher     *meta_launcher_new                     (GError       **error); | ||||
| void              meta_launcher_free                    (MetaLauncher  *self); | ||||
|  | ||||
| gboolean          meta_launcher_activate_session        (MetaLauncher  *self, | ||||
|   | ||||
| @@ -42,6 +42,8 @@ | ||||
|  | ||||
| #include <gudev/gudev.h> | ||||
|  | ||||
| #define ALL_TRANSFORMS (META_MONITOR_TRANSFORM_FLIPPED_270 + 1) | ||||
|  | ||||
| typedef struct { | ||||
|   drmModeConnector *connector; | ||||
|  | ||||
| @@ -66,6 +68,9 @@ typedef struct { | ||||
|   uint32_t underscan_prop_id; | ||||
|   uint32_t underscan_hborder_prop_id; | ||||
|   uint32_t underscan_vborder_prop_id; | ||||
|   uint32_t primary_plane_id; | ||||
|   uint32_t rotation_prop_id; | ||||
|   uint32_t rotation_map[ALL_TRANSFORMS]; | ||||
| } MetaCRTCKms; | ||||
|  | ||||
| struct _MetaMonitorManagerKms | ||||
| @@ -429,6 +434,137 @@ get_output_scale (MetaMonitorManager *manager, | ||||
|     return compute_scale (output); | ||||
| } | ||||
|  | ||||
| static int | ||||
| find_property_index (MetaMonitorManager         *manager, | ||||
|                      drmModeObjectPropertiesPtr  props, | ||||
|                      const gchar                *prop_name, | ||||
|                      drmModePropertyPtr         *found) | ||||
| { | ||||
|   MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager); | ||||
|   unsigned int i; | ||||
|  | ||||
|   for (i = 0; i < props->count_props; i++) | ||||
|     { | ||||
|       drmModePropertyPtr prop; | ||||
|  | ||||
|       prop = drmModeGetProperty (manager_kms->fd, props->props[i]); | ||||
|       if (!prop) | ||||
|         continue; | ||||
|  | ||||
|       if (strcmp (prop->name, prop_name) == 0) | ||||
|         { | ||||
|           *found = prop; | ||||
|           return i; | ||||
|         } | ||||
|  | ||||
|       drmModeFreeProperty (prop); | ||||
|     } | ||||
|  | ||||
|   return -1; | ||||
| } | ||||
|  | ||||
| static void | ||||
| parse_transforms (MetaMonitorManager *manager, | ||||
|                   drmModePropertyPtr  prop, | ||||
|                   MetaCRTC           *crtc) | ||||
| { | ||||
|   MetaCRTCKms *crtc_kms = crtc->driver_private; | ||||
|   int i; | ||||
|  | ||||
|   for (i = 0; i < prop->count_enums; i++) | ||||
|     { | ||||
|       int cur = -1; | ||||
|  | ||||
|       if (strcmp (prop->enums[i].name, "rotate-0") == 0) | ||||
|         cur = META_MONITOR_TRANSFORM_NORMAL; | ||||
|       else if (strcmp (prop->enums[i].name, "rotate-90") == 0) | ||||
|         cur = META_MONITOR_TRANSFORM_90; | ||||
|       else if (strcmp (prop->enums[i].name, "rotate-180") == 0) | ||||
|         cur = META_MONITOR_TRANSFORM_180; | ||||
|       else if (strcmp (prop->enums[i].name, "rotate-270") == 0) | ||||
|         cur = META_MONITOR_TRANSFORM_270; | ||||
|  | ||||
|       if (cur != -1) | ||||
|         { | ||||
|           crtc->all_transforms |= 1 << cur; | ||||
|           crtc_kms->rotation_map[cur] = 1 << prop->enums[i].value; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| is_primary_plane (MetaMonitorManager         *manager, | ||||
|                   drmModeObjectPropertiesPtr  props) | ||||
| { | ||||
|   drmModePropertyPtr prop; | ||||
|   int idx; | ||||
|  | ||||
|   idx = find_property_index (manager, props, "type", &prop); | ||||
|   if (idx < 0) | ||||
|     return FALSE; | ||||
|  | ||||
|   drmModeFreeProperty (prop); | ||||
|   return props->prop_values[idx] == DRM_PLANE_TYPE_PRIMARY; | ||||
| } | ||||
|  | ||||
| static void | ||||
| init_crtc_rotations (MetaMonitorManager *manager, | ||||
|                      MetaCRTC           *crtc, | ||||
|                      unsigned int        idx) | ||||
| { | ||||
|   MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager); | ||||
|   drmModeObjectPropertiesPtr props; | ||||
|   drmModePlaneRes *planes; | ||||
|   drmModePlane *drm_plane; | ||||
|   MetaCRTCKms *crtc_kms; | ||||
|   unsigned int i; | ||||
|  | ||||
|   crtc_kms = crtc->driver_private; | ||||
|  | ||||
|   planes = drmModeGetPlaneResources(manager_kms->fd); | ||||
|   if (planes == NULL) | ||||
|     return; | ||||
|  | ||||
|   for (i = 0; i < planes->count_planes; i++) | ||||
|     { | ||||
|       drmModePropertyPtr prop; | ||||
|  | ||||
|       drm_plane = drmModeGetPlane (manager_kms->fd, planes->planes[i]); | ||||
|  | ||||
|       if (!drm_plane) | ||||
|         continue; | ||||
|  | ||||
|       if ((drm_plane->possible_crtcs & (1 << idx))) | ||||
|         { | ||||
|           props = drmModeObjectGetProperties (manager_kms->fd, | ||||
|                                               drm_plane->plane_id, | ||||
|                                               DRM_MODE_OBJECT_PLANE); | ||||
|  | ||||
|           if (props && is_primary_plane (manager, props)) | ||||
|             { | ||||
|               int rotation_idx; | ||||
|  | ||||
|               crtc_kms->primary_plane_id = drm_plane->plane_id; | ||||
|               rotation_idx = find_property_index (manager, props, "rotation", &prop); | ||||
|  | ||||
|               if (rotation_idx >= 0) | ||||
|                 { | ||||
|                   crtc_kms->rotation_prop_id = props->props[rotation_idx]; | ||||
|                   parse_transforms (manager, prop, crtc); | ||||
|                   drmModeFreeProperty (prop); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|           if (props) | ||||
|             drmModeFreeObjectProperties (props); | ||||
|         } | ||||
|  | ||||
|       drmModeFreePlane (drm_plane); | ||||
|     } | ||||
|  | ||||
|   drmModeFreePlaneResources (planes); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_kms_read_current (MetaMonitorManager *manager) | ||||
| { | ||||
| @@ -496,8 +632,18 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager) | ||||
|       meta_mode->name = g_strndup (mode->name, DRM_DISPLAY_MODE_LEN); | ||||
|       meta_mode->width = mode->hdisplay; | ||||
|       meta_mode->height = mode->vdisplay; | ||||
|       meta_mode->refresh_rate = (1000 * mode->clock / | ||||
|                                  ((float)mode->htotal * mode->vtotal)); | ||||
|  | ||||
|       /* Calculate refresh rate in milliHz first for extra precision. */ | ||||
|       meta_mode->refresh_rate = (mode->clock * 1000000LL) / mode->htotal; | ||||
|       meta_mode->refresh_rate += (mode->vtotal / 2); | ||||
|       meta_mode->refresh_rate /= mode->vtotal; | ||||
|       if (mode->flags & DRM_MODE_FLAG_INTERLACE) | ||||
| 	meta_mode->refresh_rate *= 2; | ||||
|       if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||||
|         meta_mode->refresh_rate /= 2; | ||||
|       if (mode->vscan > 1) | ||||
|         meta_mode->refresh_rate /= mode->vscan; | ||||
|       meta_mode->refresh_rate /= 1000.0; | ||||
|  | ||||
|       meta_mode->driver_private = g_slice_dup (drmModeModeInfo, mode); | ||||
|       meta_mode->driver_notify = (GDestroyNotify)meta_monitor_mode_destroy_notify; | ||||
| @@ -546,6 +692,7 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager) | ||||
|       meta_crtc->driver_private = g_new0 (MetaCRTCKms, 1); | ||||
|       meta_crtc->driver_notify = (GDestroyNotify) meta_crtc_destroy_notify; | ||||
|       find_crtc_properties (manager_kms, meta_crtc); | ||||
|       init_crtc_rotations (manager, meta_crtc, i); | ||||
|  | ||||
|       drmModeFreeCrtc (crtc); | ||||
|     } | ||||
| @@ -928,6 +1075,7 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager, | ||||
|     { | ||||
|       MetaCRTCInfo *crtc_info = crtcs[i]; | ||||
|       MetaCRTC *crtc = crtc_info->crtc; | ||||
|       MetaCRTCKms *crtc_kms = crtc->driver_private; | ||||
|       CoglKmsCrtc *cogl_crtc; | ||||
|  | ||||
|       crtc->is_dirty = TRUE; | ||||
| @@ -1000,6 +1148,13 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager, | ||||
|           crtc->current_mode = mode; | ||||
|           crtc->transform = crtc_info->transform; | ||||
|         } | ||||
|  | ||||
|       if (crtc->all_transforms & (1 << crtc->transform)) | ||||
|         drmModeObjectSetProperty (manager_kms->fd, | ||||
|                                   crtc_kms->primary_plane_id, | ||||
|                                   DRM_MODE_OBJECT_PLANE, | ||||
|                                   crtc_kms->rotation_prop_id, | ||||
|                                   crtc_kms->rotation_map[crtc->transform]); | ||||
|     } | ||||
|  | ||||
|   /* Disable CRTCs not mentioned in the list (they have is_dirty == FALSE, | ||||
| @@ -1152,6 +1307,8 @@ meta_monitor_manager_kms_init (MetaMonitorManagerKms *manager_kms) | ||||
|  | ||||
|   manager_kms->fd = cogl_kms_renderer_get_kms_fd (cogl_renderer); | ||||
|  | ||||
|   drmSetClientCap (manager_kms->fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1); | ||||
|  | ||||
|   const char *subsystems[2] = { "drm", NULL }; | ||||
|   manager_kms->udev = g_udev_client_new (subsystems); | ||||
|   g_signal_connect (manager_kms->udev, "uevent", | ||||
|   | ||||
| @@ -82,6 +82,7 @@ struct _MetaBackendX11Private | ||||
|   gchar *keymap_layouts; | ||||
|   gchar *keymap_variants; | ||||
|   gchar *keymap_options; | ||||
|   int locked_group; | ||||
| }; | ||||
| typedef struct _MetaBackendX11Private MetaBackendX11Private; | ||||
|  | ||||
| @@ -297,15 +298,23 @@ handle_host_xevent (MetaBackend *backend, | ||||
|  | ||||
|   if (event->type == priv->xkb_event_base) | ||||
|     { | ||||
|       XkbAnyEvent *xkb_ev = (XkbAnyEvent *) event; | ||||
|       XkbEvent *xkb_ev = (XkbEvent *) event; | ||||
|  | ||||
|       if (xkb_ev->device == META_VIRTUAL_CORE_KEYBOARD_ID) | ||||
|       if (xkb_ev->any.device == META_VIRTUAL_CORE_KEYBOARD_ID) | ||||
|         { | ||||
|           switch (xkb_ev->xkb_type) | ||||
|           switch (xkb_ev->any.xkb_type) | ||||
|             { | ||||
|             case XkbNewKeyboardNotify: | ||||
|             case XkbMapNotify: | ||||
|               keymap_changed (backend); | ||||
|               break; | ||||
|             case XkbStateNotify: | ||||
|               if (xkb_ev->state.changed & XkbGroupLockMask) | ||||
|                 { | ||||
|                   if (priv->locked_group != xkb_ev->state.locked_group) | ||||
|                     XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, priv->locked_group); | ||||
|                 } | ||||
|               break; | ||||
|             default: | ||||
|               break; | ||||
|             } | ||||
| @@ -776,6 +785,7 @@ meta_backend_x11_lock_layout_group (MetaBackend *backend, | ||||
|   MetaBackendX11 *x11 = META_BACKEND_X11 (backend); | ||||
|   MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); | ||||
|  | ||||
|   priv->locked_group = idx; | ||||
|   XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, idx); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -107,6 +107,7 @@ meta_barrier_impl_x11_new (MetaBarrier *barrier) | ||||
|   MetaDisplay *display = barrier->priv->display; | ||||
|   Display *dpy; | ||||
|   Window root; | ||||
|   unsigned int allowed_motion_dirs; | ||||
|  | ||||
|   if (display == NULL) | ||||
|     { | ||||
| @@ -121,12 +122,14 @@ meta_barrier_impl_x11_new (MetaBarrier *barrier) | ||||
|   dpy = display->xdisplay; | ||||
|   root = DefaultRootWindow (dpy); | ||||
|  | ||||
|   allowed_motion_dirs = | ||||
|     meta_border_get_allows_directions (&barrier->priv->border); | ||||
|   priv->xbarrier = XFixesCreatePointerBarrier (dpy, root, | ||||
|                                                barrier->priv->x1, | ||||
|                                                barrier->priv->y1, | ||||
|                                                barrier->priv->x2, | ||||
|                                                barrier->priv->y2, | ||||
|                                                barrier->priv->directions, | ||||
|                                                barrier->priv->border.line.a.x, | ||||
|                                                barrier->priv->border.line.a.y, | ||||
|                                                barrier->priv->border.line.b.x, | ||||
|                                                barrier->priv->border.line.b.y, | ||||
|                                                allowed_motion_dirs, | ||||
|                                                0, NULL); | ||||
|  | ||||
|   g_hash_table_insert (display->xids, &priv->xbarrier, barrier); | ||||
|   | ||||
| @@ -107,20 +107,6 @@ set_alarm_enabled (Display    *dpy, | ||||
|   XSyncChangeAlarm (dpy, alarm, XSyncCAEvents, &attr); | ||||
| } | ||||
|  | ||||
| static void | ||||
| check_x11_watch (gpointer data, | ||||
|                  gpointer user_data) | ||||
| { | ||||
|   MetaIdleMonitorWatchXSync *watch_xsync = data; | ||||
|   MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) watch_xsync; | ||||
|   XSyncAlarm alarm = (XSyncAlarm) user_data; | ||||
|  | ||||
|   if (watch_xsync->xalarm != alarm) | ||||
|     return; | ||||
|  | ||||
|   _meta_idle_monitor_watch_fire (watch); | ||||
| } | ||||
|  | ||||
| static char * | ||||
| counter_name_for_device (int device_id) | ||||
| { | ||||
| @@ -327,13 +313,38 @@ meta_idle_monitor_xsync_init (MetaIdleMonitorXSync *monitor_xsync) | ||||
|   monitor_xsync->alarms = g_hash_table_new (NULL, NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| check_x11_watches (MetaIdleMonitor *monitor, | ||||
|                    XSyncAlarm       alarm) | ||||
| { | ||||
|   GList *node, *watch_ids; | ||||
|  | ||||
|   /* we get the keys and do explicit look ups in case | ||||
|    * an early iteration of the loop ends up leading | ||||
|    * to watches from later iterations getting invalidated | ||||
|    */ | ||||
|   watch_ids = g_hash_table_get_keys (monitor->watches); | ||||
|  | ||||
|   for (node = watch_ids; node != NULL; node = node->next) | ||||
|     { | ||||
|       guint watch_id = GPOINTER_TO_UINT (node->data); | ||||
|       MetaIdleMonitorWatchXSync *watch; | ||||
|  | ||||
|       watch = g_hash_table_lookup (monitor->watches, GUINT_TO_POINTER (watch_id)); | ||||
|  | ||||
|       if (watch && watch->xalarm == alarm) | ||||
|         _meta_idle_monitor_watch_fire ((MetaIdleMonitorWatch *) watch); | ||||
|     } | ||||
|  | ||||
|   g_list_free (watch_ids); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_idle_monitor_xsync_handle_xevent (MetaIdleMonitor       *monitor, | ||||
|                                        XSyncAlarmNotifyEvent *alarm_event) | ||||
| { | ||||
|   MetaIdleMonitorXSync *monitor_xsync = META_IDLE_MONITOR_XSYNC (monitor); | ||||
|   XSyncAlarm alarm; | ||||
|   GList *watches; | ||||
|   gboolean has_alarm; | ||||
|  | ||||
|   if (alarm_event->state != XSyncAlarmActive) | ||||
| @@ -358,10 +369,5 @@ meta_idle_monitor_xsync_handle_xevent (MetaIdleMonitor       *monitor, | ||||
|     } | ||||
|  | ||||
|   if (has_alarm) | ||||
|     { | ||||
|       watches = g_hash_table_get_values (monitor->watches); | ||||
|  | ||||
|       g_list_foreach (watches, check_x11_watch, (gpointer) alarm); | ||||
|       g_list_free (watches); | ||||
|     } | ||||
|     check_x11_watches (monitor, alarm); | ||||
| } | ||||
|   | ||||
| @@ -199,9 +199,9 @@ meta_input_settings_x11_set_invert_scroll (MetaInputSettings  *settings, | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_input_settings_x11_set_scroll_method (MetaInputSettings            *settings, | ||||
|                                            ClutterInputDevice           *device, | ||||
|                                            GDesktopTouchpadScrollMethod  mode) | ||||
| meta_input_settings_x11_set_edge_scroll (MetaInputSettings            *settings, | ||||
|                                          ClutterInputDevice           *device, | ||||
|                                          gboolean                      edge_scroll_enabled) | ||||
| { | ||||
|   guchar values[3] = { 0 }; /* 2fg, edge, button. The last value is unused */ | ||||
|   guchar *available; | ||||
| @@ -211,26 +211,21 @@ meta_input_settings_x11_set_scroll_method (MetaInputSettings            *setting | ||||
|   if (!available) | ||||
|     return; | ||||
|  | ||||
|   switch (mode) | ||||
|   if (available[0]) | ||||
|     { | ||||
|     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 (); | ||||
|     } | ||||
|   else if (available[1] && edge_scroll_enabled) | ||||
|     { | ||||
|       values[1] = 1; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       /* Disabled */ | ||||
|     } | ||||
|  | ||||
|   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); | ||||
|   change_property (device, "libinput Scroll Method Enabled", | ||||
|                    XA_INTEGER, 8, &values, 3); | ||||
|  | ||||
|   meta_XFree (available); | ||||
| } | ||||
| @@ -321,7 +316,7 @@ meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass) | ||||
|   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_edge_scroll = meta_input_settings_x11_set_edge_scroll; | ||||
|   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; | ||||
|   | ||||
| @@ -419,12 +419,6 @@ read_output_edid (MetaMonitorManagerXrandr *manager_xrandr, | ||||
|       result = get_edid_property (manager_xrandr->xdisplay, winsys_id, edid_atom, &len); | ||||
|     } | ||||
|  | ||||
|   if (!result) | ||||
|     { | ||||
|       edid_atom = XInternAtom (manager_xrandr->xdisplay, "XFree86_DDC_EDID1_RAWDATA", FALSE); | ||||
|       result = get_edid_property (manager_xrandr->xdisplay, winsys_id, edid_atom, &len); | ||||
|     } | ||||
|  | ||||
|   if (result) | ||||
|     { | ||||
|       if (len > 0 && len % 128 == 0) | ||||
| @@ -637,6 +631,70 @@ output_get_connector_type (MetaMonitorManagerXrandr *manager_xrandr, | ||||
|   return META_CONNECTOR_TYPE_Unknown; | ||||
| } | ||||
|  | ||||
| static void | ||||
| output_get_modes (MetaMonitorManager *manager, | ||||
|                   MetaOutput         *meta_output, | ||||
|                   XRROutputInfo      *output) | ||||
| { | ||||
|   guint j, k; | ||||
|   guint n_actual_modes; | ||||
|  | ||||
|   meta_output->modes = g_new0 (MetaMonitorMode *, output->nmode); | ||||
|  | ||||
|   n_actual_modes = 0; | ||||
|   for (j = 0; j < (guint)output->nmode; j++) | ||||
|     { | ||||
|       for (k = 0; k < manager->n_modes; k++) | ||||
|         { | ||||
|           if (output->modes[j] == (XID)manager->modes[k].mode_id) | ||||
|             { | ||||
|               meta_output->modes[n_actual_modes] = &manager->modes[k]; | ||||
|               n_actual_modes += 1; | ||||
|               break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   meta_output->n_modes = n_actual_modes; | ||||
|   if (n_actual_modes > 0) | ||||
|     meta_output->preferred_mode = meta_output->modes[0]; | ||||
| } | ||||
|  | ||||
| static void | ||||
| output_get_crtcs (MetaMonitorManager *manager, | ||||
|                   MetaOutput         *meta_output, | ||||
|                   XRROutputInfo      *output) | ||||
| { | ||||
|   guint j, k; | ||||
|   guint n_actual_crtcs; | ||||
|  | ||||
|   meta_output->possible_crtcs = g_new0 (MetaCRTC *, output->ncrtc); | ||||
|  | ||||
|   n_actual_crtcs = 0; | ||||
|   for (j = 0; j < (unsigned)output->ncrtc; j++) | ||||
|     { | ||||
|       for (k = 0; k < manager->n_crtcs; k++) | ||||
|         { | ||||
|           if ((XID)manager->crtcs[k].crtc_id == output->crtcs[j]) | ||||
|             { | ||||
|               meta_output->possible_crtcs[n_actual_crtcs] = &manager->crtcs[k]; | ||||
|               n_actual_crtcs += 1; | ||||
|               break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|   meta_output->n_possible_crtcs = n_actual_crtcs; | ||||
|  | ||||
|   meta_output->crtc = NULL; | ||||
|   for (j = 0; j < manager->n_crtcs; j++) | ||||
|     { | ||||
|       if ((XID)manager->crtcs[j].crtc_id == output->crtc) | ||||
|         { | ||||
|           meta_output->crtc = &manager->crtcs[j]; | ||||
|           break; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static char * | ||||
| get_xmode_name (XRRModeInfo *xmode) | ||||
| { | ||||
| @@ -773,6 +831,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) | ||||
|       MetaOutput *meta_output; | ||||
|  | ||||
|       output = XRRGetOutputInfo (manager_xrandr->xdisplay, resources, resources->outputs[i]); | ||||
|       if (!output) | ||||
|         continue; | ||||
|  | ||||
|       meta_output = &manager->outputs[n_actual_outputs]; | ||||
|  | ||||
| @@ -796,44 +856,8 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) | ||||
|           meta_output->connector_type = output_get_connector_type (manager_xrandr, meta_output); | ||||
|  | ||||
| 	  output_get_tile_info (manager_xrandr, meta_output); | ||||
| 	  meta_output->n_modes = output->nmode; | ||||
| 	  meta_output->modes = g_new0 (MetaMonitorMode *, meta_output->n_modes); | ||||
| 	  for (j = 0; j < meta_output->n_modes; j++) | ||||
| 	    { | ||||
| 	      for (k = 0; k < manager->n_modes; k++) | ||||
| 		{ | ||||
| 		  if (output->modes[j] == (XID)manager->modes[k].mode_id) | ||||
| 		    { | ||||
| 		      meta_output->modes[j] = &manager->modes[k]; | ||||
| 		      break; | ||||
| 		    } | ||||
| 		} | ||||
| 	    } | ||||
| 	  meta_output->preferred_mode = meta_output->modes[0]; | ||||
|  | ||||
| 	  meta_output->n_possible_crtcs = output->ncrtc; | ||||
| 	  meta_output->possible_crtcs = g_new0 (MetaCRTC *, meta_output->n_possible_crtcs); | ||||
| 	  for (j = 0; j < (unsigned)output->ncrtc; j++) | ||||
| 	    { | ||||
| 	      for (k = 0; k < manager->n_crtcs; k++) | ||||
| 		{ | ||||
| 		  if ((XID)manager->crtcs[k].crtc_id == output->crtcs[j]) | ||||
| 		    { | ||||
| 		      meta_output->possible_crtcs[j] = &manager->crtcs[k]; | ||||
| 		      break; | ||||
| 		    } | ||||
| 		} | ||||
| 	    } | ||||
|  | ||||
| 	  meta_output->crtc = NULL; | ||||
| 	  for (j = 0; j < manager->n_crtcs; j++) | ||||
| 	    { | ||||
| 	      if ((XID)manager->crtcs[j].crtc_id == output->crtc) | ||||
| 		{ | ||||
| 		  meta_output->crtc = &manager->crtcs[j]; | ||||
| 		  break; | ||||
| 		} | ||||
| 	    } | ||||
| 	  output_get_modes (manager, meta_output, output); | ||||
|           output_get_crtcs (manager, meta_output, output); | ||||
|  | ||||
| 	  meta_output->n_possible_clones = output->nclone; | ||||
| 	  meta_output->possible_clones = g_new0 (MetaOutput *, meta_output->n_possible_clones); | ||||
| @@ -857,7 +881,10 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager) | ||||
| 	  else | ||||
| 	    meta_output->backlight = -1; | ||||
|  | ||||
| 	  n_actual_outputs++; | ||||
|           if (meta_output->n_modes == 0 || meta_output->n_possible_crtcs == 0) | ||||
|             meta_monitor_manager_clear_output (meta_output); | ||||
|           else | ||||
|             n_actual_outputs++; | ||||
| 	} | ||||
|  | ||||
|       XRRFreeOutputInfo (output); | ||||
|   | ||||
| @@ -60,4 +60,7 @@ void     meta_end_modal_for_plugin   (MetaCompositor   *compositor, | ||||
| gint64 meta_compositor_monotonic_time_to_server_time (MetaDisplay *display, | ||||
|                                                       gint64       monotonic_time); | ||||
|  | ||||
| void meta_compositor_flash_window (MetaCompositor *compositor, | ||||
|                                    MetaWindow     *window); | ||||
|  | ||||
| #endif /* META_COMPOSITOR_PRIVATE_H */ | ||||
|   | ||||
| @@ -779,7 +779,7 @@ meta_compositor_size_change_window (MetaCompositor    *compositor, | ||||
|                                     MetaRectangle     *old_buffer_rect) | ||||
| { | ||||
|   MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window)); | ||||
|   meta_window_actor_size_change (window_actor, META_SIZE_CHANGE_MAXIMIZE, old_frame_rect, old_buffer_rect); | ||||
|   meta_window_actor_size_change (window_actor, which_change, old_frame_rect, old_buffer_rect); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -1249,6 +1249,48 @@ meta_compositor_flash_screen (MetaCompositor *compositor, | ||||
|   clutter_actor_restore_easing_state (flash); | ||||
| } | ||||
|  | ||||
| static void | ||||
| window_flash_out_completed (ClutterTimeline *timeline, | ||||
|                             gboolean         is_finished, | ||||
|                             gpointer         user_data) | ||||
| { | ||||
|   ClutterActor *flash = CLUTTER_ACTOR (user_data); | ||||
|   clutter_actor_destroy (flash); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_compositor_flash_window (MetaCompositor *compositor, | ||||
|                               MetaWindow     *window) | ||||
| { | ||||
|   ClutterActor *window_actor = | ||||
|     CLUTTER_ACTOR (meta_window_get_compositor_private (window)); | ||||
|   ClutterActor *flash; | ||||
|   ClutterTransition *transition; | ||||
|  | ||||
|   flash = clutter_actor_new (); | ||||
|   clutter_actor_set_background_color (flash, CLUTTER_COLOR_Black); | ||||
|   clutter_actor_set_size (flash, window->rect.width, window->rect.height); | ||||
|   clutter_actor_set_position (flash, | ||||
|                               window->custom_frame_extents.left, | ||||
|                               window->custom_frame_extents.top); | ||||
|   clutter_actor_set_opacity (flash, 0); | ||||
|   clutter_actor_add_child (window_actor, flash); | ||||
|  | ||||
|   clutter_actor_save_easing_state (flash); | ||||
|   clutter_actor_set_easing_mode (flash, CLUTTER_EASE_IN_QUAD); | ||||
|   clutter_actor_set_easing_duration (flash, FLASH_TIME_MS); | ||||
|   clutter_actor_set_opacity (flash, 192); | ||||
|  | ||||
|   transition = clutter_actor_get_transition (flash, "opacity"); | ||||
|   clutter_timeline_set_auto_reverse (CLUTTER_TIMELINE (transition), TRUE); | ||||
|   clutter_timeline_set_repeat_count (CLUTTER_TIMELINE (transition), 2); | ||||
|  | ||||
|   g_signal_connect (transition, "stopped", | ||||
|                     G_CALLBACK (window_flash_out_completed), flash); | ||||
|  | ||||
|   clutter_actor_restore_easing_state (flash); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_compositor_monotonic_time_to_server_time: | ||||
|  * @display: a #MetaDisplay | ||||
|   | ||||
| @@ -36,5 +36,6 @@ void meta_shaped_texture_set_fallback_size (MetaShapedTexture *stex, | ||||
|                                             guint              fallback_width, | ||||
|                                             guint              fallback_height); | ||||
| gboolean meta_shaped_texture_is_obscured (MetaShapedTexture *self); | ||||
| cairo_region_t * meta_shaped_texture_get_opaque_region (MetaShapedTexture *stex); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -303,6 +303,7 @@ set_cogl_texture (MetaShapedTexture *stex, | ||||
|     { | ||||
|       priv->tex_width = width; | ||||
|       priv->tex_height = height; | ||||
|       meta_shaped_texture_set_mask_texture (stex, NULL); | ||||
|       clutter_actor_queue_relayout (CLUTTER_ACTOR (stex)); | ||||
|       g_signal_emit (stex, signals[SIZE_CHANGED], 0); | ||||
|     } | ||||
| @@ -789,6 +790,13 @@ meta_shaped_texture_set_opaque_region (MetaShapedTexture *stex, | ||||
|     priv->opaque_region = NULL; | ||||
| } | ||||
|  | ||||
| cairo_region_t * | ||||
| meta_shaped_texture_get_opaque_region (MetaShapedTexture *stex) | ||||
| { | ||||
|   MetaShapedTexturePrivate *priv = stex->priv; | ||||
|   return priv->opaque_region; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_shaped_texture_get_image: | ||||
|  * @stex: A #MetaShapedTexture | ||||
|   | ||||
| @@ -36,6 +36,14 @@ | ||||
|  | ||||
| #include "compositor/region-utils.h" | ||||
|  | ||||
| enum { | ||||
|   PAINTING, | ||||
|  | ||||
|   LAST_SIGNAL | ||||
| }; | ||||
|  | ||||
| static guint signals[LAST_SIGNAL]; | ||||
|  | ||||
| struct _MetaSurfaceActorWaylandPrivate | ||||
| { | ||||
|   MetaWaylandSurface *surface; | ||||
| @@ -128,7 +136,8 @@ meta_surface_actor_wayland_get_subsurface_rect (MetaSurfaceActorWayland *self, | ||||
|                                                 MetaRectangle           *rect) | ||||
| { | ||||
|   MetaWaylandSurface *surface = meta_surface_actor_wayland_get_surface (self); | ||||
|   CoglTexture *texture = surface->buffer->texture; | ||||
|   MetaWaylandBuffer *buffer = meta_wayland_surface_get_buffer (surface); | ||||
|   CoglTexture *texture = buffer->texture; | ||||
|   MetaWindow *toplevel_window; | ||||
|   int monitor_scale; | ||||
|   float x, y; | ||||
| @@ -347,12 +356,13 @@ meta_surface_actor_wayland_paint (ClutterActor *actor) | ||||
|   if (priv->surface) | ||||
|     { | ||||
|       MetaWaylandCompositor *compositor = priv->surface->compositor; | ||||
|       meta_wayland_surface_update_outputs (priv->surface); | ||||
|  | ||||
|       wl_list_insert_list (&compositor->frame_callbacks, &priv->frame_callback_list); | ||||
|       wl_list_init (&priv->frame_callback_list); | ||||
|     } | ||||
|  | ||||
|   g_signal_emit (actor, signals[PAINTING], 0); | ||||
|  | ||||
|   CLUTTER_ACTOR_CLASS (meta_surface_actor_wayland_parent_class)->paint (actor); | ||||
| } | ||||
|  | ||||
| @@ -388,6 +398,13 @@ meta_surface_actor_wayland_class_init (MetaSurfaceActorWaylandClass *klass) | ||||
|   surface_actor_class->get_window = meta_surface_actor_wayland_get_window; | ||||
|  | ||||
|   object_class->dispose = meta_surface_actor_wayland_dispose; | ||||
|  | ||||
|   signals[PAINTING] = g_signal_new ("painting", | ||||
|                                     G_TYPE_FROM_CLASS (object_class), | ||||
|                                     G_SIGNAL_RUN_LAST, | ||||
|                                     0, | ||||
|                                     NULL, NULL, NULL, | ||||
|                                     G_TYPE_NONE, 0); | ||||
| } | ||||
|  | ||||
| static void | ||||
|   | ||||
| @@ -238,6 +238,33 @@ meta_surface_actor_x11_is_visible (MetaSurfaceActor *actor) | ||||
|   return is_visible (self); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| meta_surface_actor_x11_is_opaque (MetaSurfaceActor *actor) | ||||
| { | ||||
|   MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor); | ||||
|   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self); | ||||
|  | ||||
|   /* If we're not ARGB32, then we're opaque. */ | ||||
|   if (!meta_surface_actor_is_argb32 (actor)) | ||||
|     return TRUE; | ||||
|  | ||||
|   cairo_region_t *opaque_region = meta_surface_actor_get_opaque_region (actor); | ||||
|  | ||||
|   /* If we have no opaque region, then no pixels are opaque. */ | ||||
|   if (!opaque_region) | ||||
|     return FALSE; | ||||
|  | ||||
|   MetaWindow *window = priv->window; | ||||
|   cairo_rectangle_int_t client_area; | ||||
|   meta_window_get_client_area_rect (window, &client_area); | ||||
|  | ||||
|   /* Otherwise, check if our opaque region covers our entire surface. */ | ||||
|   if (cairo_region_contains_rectangle (opaque_region, &client_area) == CAIRO_REGION_OVERLAP_IN) | ||||
|     return TRUE; | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| meta_surface_actor_x11_should_unredirect (MetaSurfaceActor *actor) | ||||
| { | ||||
| @@ -255,15 +282,15 @@ meta_surface_actor_x11_should_unredirect (MetaSurfaceActor *actor) | ||||
|   if (window->shape_region != NULL) | ||||
|     return FALSE; | ||||
|  | ||||
|   if (meta_surface_actor_is_argb32 (actor) && !meta_window_requested_bypass_compositor (window)) | ||||
|     return FALSE; | ||||
|  | ||||
|   if (!meta_window_is_monitor_sized (window)) | ||||
|     return FALSE; | ||||
|  | ||||
|   if (meta_window_requested_bypass_compositor (window)) | ||||
|     return TRUE; | ||||
|  | ||||
|   if (!meta_surface_actor_x11_is_opaque (actor)) | ||||
|     return FALSE; | ||||
|  | ||||
|   if (meta_window_is_override_redirect (window)) | ||||
|     return TRUE; | ||||
|  | ||||
|   | ||||
| @@ -235,6 +235,13 @@ meta_surface_actor_set_opaque_region (MetaSurfaceActor *self, | ||||
|   meta_shaped_texture_set_opaque_region (priv->texture, region); | ||||
| } | ||||
|  | ||||
| cairo_region_t * | ||||
| meta_surface_actor_get_opaque_region (MetaSurfaceActor *actor) | ||||
| { | ||||
|   MetaSurfaceActorPrivate *priv = actor->priv; | ||||
|   return meta_shaped_texture_get_opaque_region (priv->texture); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| is_frozen (MetaSurfaceActor *self) | ||||
| { | ||||
|   | ||||
| @@ -60,6 +60,7 @@ void meta_surface_actor_set_input_region (MetaSurfaceActor *self, | ||||
|                                           cairo_region_t   *region); | ||||
| void meta_surface_actor_set_opaque_region (MetaSurfaceActor *self, | ||||
|                                            cairo_region_t   *region); | ||||
| cairo_region_t * meta_surface_actor_get_opaque_region (MetaSurfaceActor *self); | ||||
|  | ||||
| void meta_surface_actor_process_damage (MetaSurfaceActor *actor, | ||||
|                                         int x, int y, int width, int height); | ||||
|   | ||||
| @@ -817,13 +817,6 @@ meta_window_actor_has_shadow (MetaWindowActor *self) | ||||
|       meta_window_is_fullscreen (priv->window)) | ||||
|     return FALSE; | ||||
|  | ||||
|   /* | ||||
|    * If we have two snap-tiled windows, we don't want the shadow to obstruct | ||||
|    * the other window. | ||||
|    */ | ||||
|   if (meta_window_get_tile_match (priv->window)) | ||||
|     return FALSE; | ||||
|  | ||||
|   /* | ||||
|    * Always put a shadow around windows with a frame - This should override | ||||
|    * the restriction about not putting a shadow around ARGB windows. | ||||
| @@ -832,21 +825,23 @@ meta_window_actor_has_shadow (MetaWindowActor *self) | ||||
|     return TRUE; | ||||
|  | ||||
|   /* | ||||
|    * Do not add shadows to non-opaque windows; eventually we should generate | ||||
|    * a shadow from the input shape for such windows. | ||||
|    * Do not add shadows to non-opaque (ARGB32) windows, as we can't easily | ||||
|    * generate shadows for them. | ||||
|    */ | ||||
|   if (is_non_opaque (self)) | ||||
|     return FALSE; | ||||
|  | ||||
|   /* | ||||
|    * Add shadows to override redirect windows on X11 unless the toolkit | ||||
|    * indicates that it is handling shadows itself (e.g., Gtk menus). | ||||
|    * If a window specifies that it has custom frame extents, that likely | ||||
|    * means that it is drawing a shadow itself. Don't draw our own. | ||||
|    */ | ||||
|   if (priv->window->override_redirect && | ||||
|       !priv->window->has_custom_frame_extents) | ||||
|     return TRUE; | ||||
|   if (priv->window->has_custom_frame_extents) | ||||
|     return FALSE; | ||||
|  | ||||
|   return FALSE; | ||||
|   /* | ||||
|    * Generate shadows for all other windows. | ||||
|    */ | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -255,6 +255,31 @@ get_actor_private (MetaWindowActor *actor) | ||||
|   return priv; | ||||
| } | ||||
|  | ||||
| static ClutterTimeline * | ||||
| actor_animate (ClutterActor         *actor, | ||||
|                ClutterAnimationMode  mode, | ||||
|                guint                 duration, | ||||
|                const gchar          *first_property, | ||||
|                ...) | ||||
| { | ||||
|   va_list args; | ||||
|   ClutterTransition *transition; | ||||
|  | ||||
|   clutter_actor_save_easing_state (actor); | ||||
|   clutter_actor_set_easing_mode (actor, mode); | ||||
|   clutter_actor_set_easing_duration (actor, duration); | ||||
|  | ||||
|   va_start (args, first_property); | ||||
|   g_object_set_valist (G_OBJECT (actor), first_property, args); | ||||
|   va_end (args); | ||||
|  | ||||
|   transition = clutter_actor_get_transition (actor, first_property); | ||||
|  | ||||
|   clutter_actor_restore_easing_state (actor); | ||||
|  | ||||
|   return CLUTTER_TIMELINE (transition); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data) | ||||
| { | ||||
| @@ -271,7 +296,10 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data) | ||||
|  | ||||
|       if (apriv->orig_parent) | ||||
|         { | ||||
|           clutter_actor_reparent (a, apriv->orig_parent); | ||||
|           g_object_ref (a); | ||||
|           clutter_actor_remove_child (clutter_actor_get_parent (a), a); | ||||
|           clutter_actor_add_child (apriv->orig_parent, a); | ||||
|           g_object_unref (a); | ||||
|           apriv->orig_parent = NULL; | ||||
|         } | ||||
|  | ||||
| @@ -360,11 +388,10 @@ switch_workspace (MetaPlugin *plugin, | ||||
|   MetaScreen *screen; | ||||
|   MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv; | ||||
|   GList        *l; | ||||
|   ClutterActor *workspace0  = clutter_group_new (); | ||||
|   ClutterActor *workspace1  = clutter_group_new (); | ||||
|   ClutterActor *workspace0  = clutter_actor_new (); | ||||
|   ClutterActor *workspace1  = clutter_actor_new (); | ||||
|   ClutterActor *stage; | ||||
|   int           screen_width, screen_height; | ||||
|   ClutterAnimation *animation; | ||||
|  | ||||
|   screen = meta_plugin_get_screen (plugin); | ||||
|   stage = meta_get_stage_for_screen (screen); | ||||
| @@ -373,17 +400,15 @@ switch_workspace (MetaPlugin *plugin, | ||||
|                         &screen_width, | ||||
|                         &screen_height); | ||||
|  | ||||
|   clutter_actor_set_anchor_point (workspace1, | ||||
|                                   screen_width, | ||||
|                                   screen_height); | ||||
|   clutter_actor_set_pivot_point (workspace1, 1.0, 1.0); | ||||
|   clutter_actor_set_position (workspace1, | ||||
|                               screen_width, | ||||
|                               screen_height); | ||||
|  | ||||
|   clutter_actor_set_scale (workspace1, 0.0, 0.0); | ||||
|  | ||||
|   clutter_container_add_actor (CLUTTER_CONTAINER (stage), workspace1); | ||||
|   clutter_container_add_actor (CLUTTER_CONTAINER (stage), workspace0); | ||||
|   clutter_actor_add_child (stage, workspace1); | ||||
|   clutter_actor_add_child (stage, workspace0); | ||||
|  | ||||
|   if (from == to) | ||||
|     { | ||||
| @@ -406,12 +431,15 @@ switch_workspace (MetaPlugin *plugin, | ||||
|  | ||||
|       if (win_workspace == to || win_workspace == from) | ||||
|         { | ||||
|           ClutterActor *parent = win_workspace == to ? workspace1 : workspace0; | ||||
|           apriv->orig_parent = clutter_actor_get_parent (actor); | ||||
|  | ||||
|           clutter_actor_reparent (actor, | ||||
| 				  win_workspace == to ? workspace1 : workspace0); | ||||
|           clutter_actor_show_all (actor); | ||||
|           clutter_actor_raise_top (actor); | ||||
|           g_object_ref (actor); | ||||
|           clutter_actor_remove_child (clutter_actor_get_parent (actor), actor); | ||||
|           clutter_actor_add_child (parent, actor); | ||||
|           clutter_actor_show (actor); | ||||
|           clutter_actor_set_child_below_sibling (parent, actor, NULL); | ||||
|           g_object_unref (actor); | ||||
|         } | ||||
|       else if (win_workspace < 0) | ||||
|         { | ||||
| @@ -431,23 +459,21 @@ switch_workspace (MetaPlugin *plugin, | ||||
|   priv->desktop1 = workspace0; | ||||
|   priv->desktop2 = workspace1; | ||||
|  | ||||
|   animation = clutter_actor_animate (workspace0, CLUTTER_EASE_IN_SINE, | ||||
|                                      SWITCH_TIMEOUT, | ||||
|                                      "scale-x", 1.0, | ||||
|                                      "scale-y", 1.0, | ||||
|                                      NULL); | ||||
|   priv->tml_switch_workspace1 = clutter_animation_get_timeline (animation); | ||||
|   priv->tml_switch_workspace1 = actor_animate (workspace0, CLUTTER_EASE_IN_SINE, | ||||
|                                                SWITCH_TIMEOUT, | ||||
|                                                "scale-x", 1.0, | ||||
|                                                "scale-y", 1.0, | ||||
|                                                NULL); | ||||
|   g_signal_connect (priv->tml_switch_workspace1, | ||||
|                     "completed", | ||||
|                     G_CALLBACK (on_switch_workspace_effect_complete), | ||||
|                     plugin); | ||||
|  | ||||
|   animation = clutter_actor_animate (workspace1, CLUTTER_EASE_IN_SINE, | ||||
|                                      SWITCH_TIMEOUT, | ||||
|                                      "scale-x", 0.0, | ||||
|                                      "scale-y", 0.0, | ||||
|                                      NULL); | ||||
|   priv->tml_switch_workspace2 = clutter_animation_get_timeline (animation); | ||||
|   priv->tml_switch_workspace2 = actor_animate (workspace1, CLUTTER_EASE_IN_SINE, | ||||
|                                                SWITCH_TIMEOUT, | ||||
|                                                "scale-x", 0.0, | ||||
|                                                "scale-y", 0.0, | ||||
|                                                NULL); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -504,19 +530,17 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor) | ||||
|  | ||||
|   if (type == META_WINDOW_NORMAL) | ||||
|     { | ||||
|       ClutterAnimation *animation; | ||||
|       EffectCompleteData *data = g_new0 (EffectCompleteData, 1); | ||||
|       ActorPrivate *apriv = get_actor_private (window_actor); | ||||
|  | ||||
|       animation = clutter_actor_animate (actor, | ||||
|                                          CLUTTER_EASE_IN_SINE, | ||||
|                                          MINIMIZE_TIMEOUT, | ||||
|                                          "scale-x", 0.0, | ||||
|                                          "scale-y", 0.0, | ||||
|                                          "x", (double)icon_geometry.x, | ||||
|                                          "y", (double)icon_geometry.y, | ||||
|                                          NULL); | ||||
|       apriv->tml_minimize = clutter_animation_get_timeline (animation); | ||||
|       apriv->tml_minimize = actor_animate (actor, | ||||
|                                            CLUTTER_EASE_IN_SINE, | ||||
|                                            MINIMIZE_TIMEOUT, | ||||
|                                            "scale-x", 0.0, | ||||
|                                            "scale-y", 0.0, | ||||
|                                            "x", (double)icon_geometry.x, | ||||
|                                            "y", (double)icon_geometry.y, | ||||
|                                            NULL); | ||||
|       data->plugin = plugin; | ||||
|       data->actor = actor; | ||||
|       g_signal_connect (apriv->tml_minimize, "completed", | ||||
| @@ -561,7 +585,6 @@ map (MetaPlugin *plugin, MetaWindowActor *window_actor) | ||||
|  | ||||
|   if (type == META_WINDOW_NORMAL) | ||||
|     { | ||||
|       ClutterAnimation *animation; | ||||
|       EffectCompleteData *data = g_new0 (EffectCompleteData, 1); | ||||
|       ActorPrivate *apriv = get_actor_private (window_actor); | ||||
|  | ||||
| @@ -570,14 +593,13 @@ map (MetaPlugin *plugin, MetaWindowActor *window_actor) | ||||
|       clutter_actor_set_scale (actor, 0.5, 0.5); | ||||
|       clutter_actor_show (actor); | ||||
|  | ||||
|       animation = clutter_actor_animate (actor, | ||||
|                                          CLUTTER_EASE_OUT_QUAD, | ||||
|                                          MAP_TIMEOUT, | ||||
|                                          "opacity", 255, | ||||
|                                          "scale-x", 1.0, | ||||
|                                          "scale-y", 1.0, | ||||
|                                          NULL); | ||||
|       apriv->tml_map = clutter_animation_get_timeline (animation); | ||||
|       apriv->tml_map = actor_animate (actor, | ||||
|                                       CLUTTER_EASE_OUT_QUAD, | ||||
|                                       MAP_TIMEOUT, | ||||
|                                       "opacity", 255, | ||||
|                                       "scale-x", 1.0, | ||||
|                                       "scale-y", 1.0, | ||||
|                                       NULL); | ||||
|       data->actor = actor; | ||||
|       data->plugin = plugin; | ||||
|       g_signal_connect (apriv->tml_map, "completed", | ||||
| @@ -618,18 +640,16 @@ destroy (MetaPlugin *plugin, MetaWindowActor *window_actor) | ||||
|  | ||||
|   if (type == META_WINDOW_NORMAL) | ||||
|     { | ||||
|       ClutterAnimation *animation; | ||||
|       EffectCompleteData *data = g_new0 (EffectCompleteData, 1); | ||||
|       ActorPrivate *apriv = get_actor_private (window_actor); | ||||
|  | ||||
|       animation = clutter_actor_animate (actor, | ||||
|                                          CLUTTER_EASE_OUT_QUAD, | ||||
|                                          DESTROY_TIMEOUT, | ||||
|                                          "opacity", 0, | ||||
|                                          "scale-x", 0.8, | ||||
|                                          "scale-y", 0.8, | ||||
|                                          NULL); | ||||
|       apriv->tml_destroy = clutter_animation_get_timeline (animation); | ||||
|       apriv->tml_destroy = actor_animate (actor, | ||||
|                                           CLUTTER_EASE_OUT_QUAD, | ||||
|                                           DESTROY_TIMEOUT, | ||||
|                                           "opacity", 0, | ||||
|                                           "scale-x", 0.8, | ||||
|                                           "scale-y", 0.8, | ||||
|                                           NULL); | ||||
|       data->plugin = plugin; | ||||
|       data->actor = actor; | ||||
|       g_signal_connect (apriv->tml_destroy, "completed", | ||||
| @@ -702,7 +722,9 @@ show_tile_preview (MetaPlugin    *plugin, | ||||
|   clutter_actor_show (preview->actor); | ||||
|  | ||||
|   window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window)); | ||||
|   clutter_actor_lower (preview->actor, window_actor); | ||||
|   clutter_actor_set_child_below_sibling (clutter_actor_get_parent (preview->actor), | ||||
|                                          preview->actor, | ||||
|                                          window_actor); | ||||
|  | ||||
|   preview->tile_rect = *tile_rect; | ||||
| } | ||||
|   | ||||
| @@ -52,6 +52,7 @@ | ||||
| #include "screen-private.h" | ||||
| #include "window-private.h" | ||||
| #include "util-private.h" | ||||
| #include "compositor/compositor-private.h" | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/compositor.h> | ||||
| #ifdef HAVE_LIBCANBERRA | ||||
| @@ -131,6 +132,12 @@ bell_flash_window_frame (MetaWindow *window) | ||||
|   g_source_set_name_by_id (id, "[mutter] bell_unflash_frame"); | ||||
| } | ||||
|  | ||||
| static void | ||||
| bell_flash_window (MetaWindow *window) | ||||
| { | ||||
|   meta_compositor_flash_window (window->display->compositor, window); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * bell_flash_frame: | ||||
|  * @display:  The display the bell event came in on | ||||
| @@ -145,6 +152,8 @@ bell_flash_frame (MetaDisplay *display, | ||||
| { | ||||
|   if (window && window->frame) | ||||
|     bell_flash_window_frame (window); | ||||
|   else if (window) | ||||
|     bell_flash_window (window); | ||||
|   else | ||||
|     bell_flash_fullscreen (display); | ||||
| } | ||||
| @@ -203,33 +212,18 @@ bell_audible_notify (MetaDisplay *display, | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| void | ||||
| gboolean | ||||
| meta_bell_notify (MetaDisplay *display, | ||||
| 		  XkbAnyEvent *xkb_ev) | ||||
|                   MetaWindow  *window) | ||||
| { | ||||
|   MetaWindow *window; | ||||
|   XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent*) xkb_ev; | ||||
|  | ||||
|   window = meta_display_lookup_x_window (display, xkb_bell_event->window); | ||||
|   if (!window && display->focus_window && display->focus_window->frame) | ||||
|     window = display->focus_window; | ||||
|  | ||||
|   /* flash something */ | ||||
|   if (meta_prefs_get_visual_bell ()) | ||||
|     bell_visual_notify (display, window); | ||||
|  | ||||
|   if (meta_prefs_bell_is_audible ()) | ||||
|     { | ||||
|       if (!bell_audible_notify (display, window)) | ||||
|         { | ||||
|           /* Force a classic bell if the libcanberra bell failed. */ | ||||
|           XkbForceDeviceBell (display->xdisplay, | ||||
|                               xkb_bell_event->device, | ||||
|                               xkb_bell_event->bell_class, | ||||
|                               xkb_bell_event->bell_id, | ||||
|                               xkb_bell_event->percent); | ||||
|         } | ||||
|     } | ||||
|     return bell_audible_notify (display, window); | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| void | ||||
|   | ||||
| @@ -25,15 +25,14 @@ | ||||
| /** | ||||
|  * meta_bell_notify: | ||||
|  * @display: The display the bell event came in on | ||||
|  * @xkb_ev: The bell event we just received | ||||
|  * @window: The window the bell event was received on | ||||
|  * | ||||
|  * Gives the user some kind of visual bell; in fact, this is our response | ||||
|  * to any kind of bell request, but we set it up so that we only get | ||||
|  * notified about visual bells, and X deals with audible ones. | ||||
|  * | ||||
|  * If the configure script found we had no XKB, this does not exist. | ||||
|  * Gives the user some kind of aural or visual feedback, such as a bell sound | ||||
|  * or flash. What type of feedback is invoked depends on the configuration. | ||||
|  * If the aural feedback could not be invoked, FALSE is returned. | ||||
|  */ | ||||
| void meta_bell_notify (MetaDisplay *display, XkbAnyEvent *xkb_ev); | ||||
| gboolean meta_bell_notify (MetaDisplay *display, | ||||
|                            MetaWindow  *window); | ||||
|  | ||||
| /** | ||||
|  * meta_bell_set_audible: | ||||
|   | ||||
| @@ -97,7 +97,7 @@ typedef enum | ||||
|   PRIORITY_ENTIRELY_VISIBLE_ON_WORKAREA = 1, | ||||
|   PRIORITY_SIZE_HINTS_INCREMENTS = 1, | ||||
|   PRIORITY_MAXIMIZATION = 2, | ||||
|   PRIORITY_TILING = 2, | ||||
|   PRIORITY_CONSTRAINED_EDGES = 2, | ||||
|   PRIORITY_FULLSCREEN = 2, | ||||
|   PRIORITY_SIZE_HINTS_LIMITS = 3, | ||||
|   PRIORITY_TITLEBAR_VISIBLE = 4, | ||||
| @@ -152,7 +152,7 @@ static gboolean constrain_maximization       (MetaWindow         *window, | ||||
|                                               ConstraintInfo     *info, | ||||
|                                               ConstraintPriority  priority, | ||||
|                                               gboolean            check_only); | ||||
| static gboolean constrain_tiling             (MetaWindow         *window, | ||||
| static gboolean constrain_constrained_edges  (MetaWindow         *window, | ||||
|                                               ConstraintInfo     *info, | ||||
|                                               ConstraintPriority  priority, | ||||
|                                               gboolean            check_only); | ||||
| @@ -213,7 +213,7 @@ typedef struct { | ||||
| static const Constraint all_constraints[] = { | ||||
|   {constrain_modal_dialog,       "constrain_modal_dialog"}, | ||||
|   {constrain_maximization,       "constrain_maximization"}, | ||||
|   {constrain_tiling,             "constrain_tiling"}, | ||||
|   {constrain_constrained_edges,  "constrain_constrained_edges"}, | ||||
|   {constrain_fullscreen,         "constrain_fullscreen"}, | ||||
|   {constrain_size_increments,    "constrain_size_increments"}, | ||||
|   {constrain_size_limits,        "constrain_size_limits"}, | ||||
| @@ -701,16 +701,11 @@ constrain_maximization (MetaWindow         *window, | ||||
|     return TRUE; | ||||
|  | ||||
|   /* Determine whether constraint applies; exit if it doesn't */ | ||||
|   if ((!window->maximized_horizontally && !window->maximized_vertically) || | ||||
|       META_WINDOW_TILED_SIDE_BY_SIDE (window)) | ||||
|   if (!window->maximized_horizontally && !window->maximized_vertically) | ||||
|     return TRUE; | ||||
|  | ||||
|   /* Calculate target_size = maximized size of (window + frame) */ | ||||
|   if (META_WINDOW_TILED_MAXIMIZED (window)) | ||||
|     { | ||||
|       meta_window_get_current_tile_area (window, &target_size); | ||||
|     } | ||||
|   else if (META_WINDOW_MAXIMIZED (window)) | ||||
|   if (META_WINDOW_MAXIMIZED (window)) | ||||
|     { | ||||
|       target_size = info->work_area_monitor; | ||||
|     } | ||||
| @@ -773,58 +768,6 @@ constrain_maximization (MetaWindow         *window, | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| constrain_tiling (MetaWindow         *window, | ||||
|                   ConstraintInfo     *info, | ||||
|                   ConstraintPriority  priority, | ||||
|                   gboolean            check_only) | ||||
| { | ||||
|   MetaRectangle target_size; | ||||
|   MetaRectangle min_size, max_size; | ||||
|   gboolean hminbad, vminbad; | ||||
|   gboolean horiz_equal, vert_equal; | ||||
|   gboolean constraint_already_satisfied; | ||||
|  | ||||
|   if (priority > PRIORITY_TILING) | ||||
|     return TRUE; | ||||
|  | ||||
|   /* Determine whether constraint applies; exit if it doesn't */ | ||||
|   if (!META_WINDOW_TILED_SIDE_BY_SIDE (window)) | ||||
|     return TRUE; | ||||
|  | ||||
|   /* Calculate target_size - as the tile previews need this as well, we | ||||
|    * use an external function for the actual calculation | ||||
|    */ | ||||
|   meta_window_get_current_tile_area (window, &target_size); | ||||
|  | ||||
|   /* Check min size constraints; max size constraints are ignored as for | ||||
|    * maximized windows. | ||||
|    */ | ||||
|   get_size_limits (window, &min_size, &max_size); | ||||
|   hminbad = target_size.width < min_size.width; | ||||
|   vminbad = target_size.height < min_size.height; | ||||
|   if (hminbad || vminbad) | ||||
|     return TRUE; | ||||
|  | ||||
|   /* Determine whether constraint is already satisfied; exit if it is */ | ||||
|   horiz_equal = target_size.x      == info->current.x && | ||||
|                 target_size.width  == info->current.width; | ||||
|   vert_equal  = target_size.y      == info->current.y && | ||||
|                 target_size.height == info->current.height; | ||||
|   constraint_already_satisfied = horiz_equal && vert_equal; | ||||
|   if (check_only || constraint_already_satisfied) | ||||
|     return constraint_already_satisfied; | ||||
|  | ||||
|   /*** Enforce constraint ***/ | ||||
|   info->current.x      = target_size.x; | ||||
|   info->current.width  = target_size.width; | ||||
|   info->current.y      = target_size.y; | ||||
|   info->current.height = target_size.height; | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
|  | ||||
| static gboolean | ||||
| constrain_fullscreen (MetaWindow         *window, | ||||
|                       ConstraintInfo     *info, | ||||
| @@ -860,6 +803,45 @@ constrain_fullscreen (MetaWindow         *window, | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| constrain_constrained_edges (MetaWindow         *window, | ||||
|                              ConstraintInfo     *info, | ||||
|                              ConstraintPriority  priority, | ||||
|                              gboolean            check_only) | ||||
| { | ||||
|   MetaRectangle monitor, new_rectangle; | ||||
|   gboolean constraint_already_satisfied; | ||||
|  | ||||
|   if (priority > PRIORITY_CONSTRAINED_EDGES) | ||||
|     return TRUE; | ||||
|  | ||||
|   /* Determine whether constraint applies; exit if it doesn't */ | ||||
|   if (!window->constrained_edges) | ||||
|     return TRUE; | ||||
|  | ||||
|   new_rectangle = info->current; | ||||
|   monitor = info->work_area_monitor; | ||||
|  | ||||
|   if (window->constrained_edges & META_DIRECTION_LEFT) | ||||
|     new_rectangle.x = monitor.x; | ||||
|   if (window->constrained_edges & META_DIRECTION_RIGHT) | ||||
|     new_rectangle.x = monitor.x + monitor.width - new_rectangle.width; | ||||
|   if (window->constrained_edges & META_DIRECTION_TOP) | ||||
|     new_rectangle.y = monitor.y; | ||||
|   if (window->constrained_edges & META_DIRECTION_BOTTOM) | ||||
|     new_rectangle.y = monitor.y + monitor.height - new_rectangle.height; | ||||
|  | ||||
|   constraint_already_satisfied = | ||||
|     meta_rectangle_equal (&info->current, &new_rectangle); | ||||
|  | ||||
|   if (check_only || constraint_already_satisfied) | ||||
|     return constraint_already_satisfied; | ||||
|  | ||||
|   /*** Enforce constraint ***/ | ||||
|   info->current = new_rectangle; | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| constrain_size_increments (MetaWindow         *window, | ||||
|                            ConstraintInfo     *info, | ||||
| @@ -877,7 +859,6 @@ constrain_size_increments (MetaWindow         *window, | ||||
|  | ||||
|   /* Determine whether constraint applies; exit if it doesn't */ | ||||
|   if (META_WINDOW_MAXIMIZED (window) || window->fullscreen || | ||||
|       META_WINDOW_TILED_SIDE_BY_SIDE (window) || | ||||
|       info->action_type == ACTION_MOVE) | ||||
|     return TRUE; | ||||
|  | ||||
| @@ -1020,7 +1001,6 @@ constrain_aspect_ratio (MetaWindow         *window, | ||||
|   constraints_are_inconsistent = minr > maxr; | ||||
|   if (constraints_are_inconsistent || | ||||
|       META_WINDOW_MAXIMIZED (window) || window->fullscreen || | ||||
|       META_WINDOW_TILED_SIDE_BY_SIDE (window) || | ||||
|       info->action_type == ACTION_MOVE) | ||||
|     return TRUE; | ||||
|  | ||||
|   | ||||
| @@ -35,6 +35,7 @@ | ||||
| #include <meta/boxes.h> | ||||
| #include <meta/display.h> | ||||
| #include "keybindings-private.h" | ||||
| #include "startup-notification-private.h" | ||||
| #include "meta-gesture-tracker-private.h" | ||||
| #include <meta/prefs.h> | ||||
| #include <meta/barrier.h> | ||||
| @@ -73,13 +74,6 @@ typedef enum { | ||||
|  */ | ||||
| #define N_IGNORED_CROSSING_SERIALS  10 | ||||
|  | ||||
| typedef enum { | ||||
|   META_TILE_NONE, | ||||
|   META_TILE_LEFT, | ||||
|   META_TILE_RIGHT, | ||||
|   META_TILE_MAXIMIZED | ||||
| } MetaTileMode; | ||||
|  | ||||
| typedef enum { | ||||
|   /* Normal interaction where you're interacting with windows. | ||||
|    * Events go to windows normally. */ | ||||
| @@ -210,8 +204,6 @@ struct _MetaDisplay | ||||
|   int         grab_anchor_root_x; | ||||
|   int         grab_anchor_root_y; | ||||
|   MetaRectangle grab_anchor_window_pos; | ||||
|   MetaTileMode  grab_tile_mode; | ||||
|   int           grab_tile_monitor_number; | ||||
|   int         grab_latest_motion_x; | ||||
|   int         grab_latest_motion_y; | ||||
|   guint       grab_have_pointer : 1; | ||||
| @@ -276,9 +268,8 @@ struct _MetaDisplay | ||||
|   int xinput_event_base; | ||||
|   int xinput_opcode; | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   SnDisplay *sn_display; | ||||
| #endif | ||||
|   MetaStartupNotification *startup_notification; | ||||
|  | ||||
|   int xsync_event_base; | ||||
|   int xsync_error_base; | ||||
|   int shape_event_base; | ||||
|   | ||||
| @@ -400,28 +400,6 @@ meta_display_remove_pending_pings_for_window (MetaDisplay *display, | ||||
| } | ||||
|  | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
| static void | ||||
| sn_error_trap_push (SnDisplay *sn_display, | ||||
|                     Display   *xdisplay) | ||||
| { | ||||
|   MetaDisplay *display; | ||||
|   display = meta_display_for_x_display (xdisplay); | ||||
|   if (display != NULL) | ||||
|     meta_error_trap_push (display); | ||||
| } | ||||
|  | ||||
| static void | ||||
| sn_error_trap_pop (SnDisplay *sn_display, | ||||
|                    Display   *xdisplay) | ||||
| { | ||||
|   MetaDisplay *display; | ||||
|   display = meta_display_for_x_display (xdisplay); | ||||
|   if (display != NULL) | ||||
|     meta_error_trap_pop (display); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static void | ||||
| enable_compositor (MetaDisplay *display) | ||||
| { | ||||
| @@ -527,6 +505,20 @@ gesture_tracker_state_changed (MetaGestureTracker   *tracker, | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_startup_notification_changed (MetaStartupNotification *sn, | ||||
|                                  gpointer                 sequence, | ||||
|                                  MetaDisplay             *display) | ||||
| { | ||||
|   if (!display->screen) | ||||
|     return; | ||||
|  | ||||
|   g_slist_free (display->screen->startup_sequences); | ||||
|   display->screen->startup_sequences = | ||||
|     meta_startup_notification_get_sequences (display->startup_notification); | ||||
|   g_signal_emit_by_name (display->screen, "startup-sequence-changed", sequence); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_display_open: | ||||
|  * | ||||
| @@ -630,12 +622,6 @@ meta_display_open (void) | ||||
|  | ||||
|   display->screen = NULL; | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   display->sn_display = sn_display_new (display->xdisplay, | ||||
|                                         sn_error_trap_push, | ||||
|                                         sn_error_trap_pop); | ||||
| #endif | ||||
|  | ||||
|   /* Get events */ | ||||
|   meta_display_init_events (display); | ||||
|   meta_display_init_events_x11 (display); | ||||
| @@ -663,8 +649,6 @@ meta_display_open (void) | ||||
|  | ||||
|   display->grab_op = META_GRAB_OP_NONE; | ||||
|   display->grab_window = NULL; | ||||
|   display->grab_tile_mode = META_TILE_NONE; | ||||
|   display->grab_tile_monitor_number = -1; | ||||
|  | ||||
|   display->grab_edge_resistance_data = NULL; | ||||
|  | ||||
| @@ -916,6 +900,10 @@ meta_display_open (void) | ||||
|  | ||||
|   display->screen = screen; | ||||
|  | ||||
|   display->startup_notification = meta_startup_notification_get (display); | ||||
|   g_signal_connect (display->startup_notification, "changed", | ||||
|                     G_CALLBACK (on_startup_notification_changed), display); | ||||
|  | ||||
|   meta_screen_init_workspaces (screen); | ||||
|  | ||||
|   enable_compositor (display); | ||||
| @@ -1100,6 +1088,7 @@ meta_display_close (MetaDisplay *display, | ||||
|  | ||||
|   meta_display_remove_autoraise_callback (display); | ||||
|  | ||||
|   g_clear_object (&display->startup_notification); | ||||
|   g_clear_object (&display->gesture_tracker); | ||||
|  | ||||
|   if (display->focus_timeout_id) | ||||
| @@ -1112,14 +1101,6 @@ meta_display_close (MetaDisplay *display, | ||||
|  | ||||
|   meta_screen_free (display->screen, timestamp); | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   if (display->sn_display) | ||||
|     { | ||||
|       sn_display_unref (display->sn_display); | ||||
|       display->sn_display = NULL; | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|   /* Must be after all calls to meta_window_unmanage() since they | ||||
|    * unregister windows | ||||
|    */ | ||||
| @@ -1229,7 +1210,7 @@ meta_grab_op_is_moving (MetaGrabOp op) | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_grab_op_windows_are_interactable: | ||||
|  * meta_display_windows_are_interactable: | ||||
|  * @op: A #MetaGrabOp | ||||
|  * | ||||
|  * Whether windows can be interacted with. | ||||
| @@ -1911,8 +1892,6 @@ meta_display_begin_grab_op (MetaDisplay *display, | ||||
|   display->grab_op = op; | ||||
|   display->grab_window = grab_window; | ||||
|   display->grab_button = button; | ||||
|   display->grab_tile_mode = grab_window->tile_mode; | ||||
|   display->grab_tile_monitor_number = grab_window->tile_monitor_number; | ||||
|   display->grab_anchor_root_x = root_x; | ||||
|   display->grab_anchor_root_y = root_y; | ||||
|   display->grab_latest_motion_x = root_x; | ||||
| @@ -1963,9 +1942,12 @@ meta_display_end_grab_op (MetaDisplay *display, | ||||
|   meta_topic (META_DEBUG_WINDOW_OPS, | ||||
|               "Ending grab op %u at time %u\n", grab_op, timestamp); | ||||
|  | ||||
|   if (display->event_route == META_EVENT_ROUTE_NORMAL) | ||||
|   if (display->event_route == META_EVENT_ROUTE_NORMAL || | ||||
|       display->event_route == META_EVENT_ROUTE_COMPOSITOR_GRAB) | ||||
|     return; | ||||
|  | ||||
|   g_assert (grab_window != NULL); | ||||
|  | ||||
|   g_signal_emit (display, display_signals[GRAB_OP_END], 0, | ||||
|                  display->screen, grab_window, grab_op); | ||||
|  | ||||
| @@ -2007,8 +1989,6 @@ meta_display_end_grab_op (MetaDisplay *display, | ||||
|  | ||||
|   display->event_route = META_EVENT_ROUTE_NORMAL; | ||||
|   display->grab_window = NULL; | ||||
|   display->grab_tile_mode = META_TILE_NONE; | ||||
|   display->grab_tile_monitor_number = -1; | ||||
|  | ||||
|   meta_display_update_cursor (display); | ||||
|  | ||||
|   | ||||
| @@ -182,10 +182,25 @@ meta_display_handle_event (MetaDisplay        *display, | ||||
|   sequence = clutter_event_get_event_sequence (event); | ||||
|  | ||||
|   /* Set the pointer emulating sequence on touch begin, if eligible */ | ||||
|   if (event->type == CLUTTER_TOUCH_BEGIN && | ||||
|       !display->pointer_emulating_sequence && | ||||
|       sequence_is_pointer_emulated (display, event)) | ||||
|     display->pointer_emulating_sequence = sequence; | ||||
|   if (event->type == CLUTTER_TOUCH_BEGIN) | ||||
|     { | ||||
|       if (sequence_is_pointer_emulated (display, event)) | ||||
|         { | ||||
|           /* This is the new pointer emulating sequence */ | ||||
|           display->pointer_emulating_sequence = sequence; | ||||
|         } | ||||
|       else if (display->pointer_emulating_sequence == sequence) | ||||
|         { | ||||
|           /* This sequence was "pointer emulating" in a prior incarnation, | ||||
|            * but now it isn't. We unset the pointer emulating sequence at | ||||
|            * this point so the current sequence is not mistaken as pointer | ||||
|            * emulating, while we've ensured that it's been deemed | ||||
|            * "pointer emulating" throughout all of the event processing | ||||
|            * of the previous incarnation. | ||||
|            */ | ||||
|           display->pointer_emulating_sequence = NULL; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
|   MetaWaylandCompositor *compositor = NULL; | ||||
| @@ -335,11 +350,6 @@ meta_display_handle_event (MetaDisplay        *display, | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|   /* Unset the pointer emulating sequence after its end event is processed */ | ||||
|   if (event->type == CLUTTER_TOUCH_END && | ||||
|       display->pointer_emulating_sequence == sequence) | ||||
|     display->pointer_emulating_sequence = NULL; | ||||
|  | ||||
|   display->current_time = CurrentTime; | ||||
|   return bypass_clutter; | ||||
| } | ||||
|   | ||||
| @@ -274,12 +274,6 @@ meta_frame_get_flags (MetaFrame *frame) | ||||
|   if (META_WINDOW_MAXIMIZED (frame->window)) | ||||
|     flags |= META_FRAME_MAXIMIZED; | ||||
|  | ||||
|   if (META_WINDOW_TILED_LEFT (frame->window)) | ||||
|     flags |= META_FRAME_TILED_LEFT; | ||||
|  | ||||
|   if (META_WINDOW_TILED_RIGHT (frame->window)) | ||||
|     flags |= META_FRAME_TILED_RIGHT; | ||||
|  | ||||
|   if (frame->window->fullscreen) | ||||
|     flags |= META_FRAME_FULLSCREEN; | ||||
|  | ||||
| @@ -289,6 +283,18 @@ meta_frame_get_flags (MetaFrame *frame) | ||||
|   if (frame->window->wm_state_above) | ||||
|     flags |= META_FRAME_ABOVE; | ||||
|  | ||||
|   if (frame->window->constrained_edges & META_DIRECTION_LEFT) | ||||
|     flags |= META_FRAME_CONSTRAINED_LEFT_EDGE; | ||||
|  | ||||
|   if (frame->window->constrained_edges & META_DIRECTION_RIGHT) | ||||
|     flags |= META_FRAME_CONSTRAINED_RIGHT_EDGE; | ||||
|  | ||||
|   if (frame->window->constrained_edges & META_DIRECTION_TOP) | ||||
|     flags |= META_FRAME_CONSTRAINED_TOP_EDGE; | ||||
|  | ||||
|   if (frame->window->constrained_edges & META_DIRECTION_BOTTOM) | ||||
|     flags |= META_FRAME_CONSTRAINED_BOTTOM_EDGE; | ||||
|  | ||||
|   return flags; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -2001,23 +2001,13 @@ process_mouse_move_resize_grab (MetaDisplay     *display, | ||||
|  | ||||
|   if (event->keyval == CLUTTER_KEY_Escape) | ||||
|     { | ||||
|       /* Hide the tiling preview if necessary */ | ||||
|       if (window->tile_mode != META_TILE_NONE) | ||||
|         meta_screen_hide_tile_preview (screen); | ||||
|  | ||||
|       /* Restore the original tile mode */ | ||||
|       window->tile_mode = display->grab_tile_mode; | ||||
|       window->tile_monitor_number = display->grab_tile_monitor_number; | ||||
|  | ||||
|       /* End move or resize and restore to original state.  If the | ||||
|        * window was a maximized window that had been "shaken loose" we | ||||
|        * need to remaximize it.  In normal cases, we need to do a | ||||
|        * moveresize now to get the position back to the original. | ||||
|        */ | ||||
|       if (window->shaken_loose || window->tile_mode == META_TILE_MAXIMIZED) | ||||
|       if (window->shaken_loose) | ||||
|         meta_window_maximize (window, META_MAXIMIZE_BOTH); | ||||
|       else if (window->tile_mode != META_TILE_NONE) | ||||
|         meta_window_tile (window); | ||||
|       else | ||||
|         meta_window_move_resize_frame (display->grab_window, | ||||
|                                        TRUE, | ||||
| @@ -2939,41 +2929,25 @@ handle_toggle_above       (MetaDisplay     *display, | ||||
| } | ||||
|  | ||||
| static void | ||||
| handle_toggle_tiled (MetaDisplay     *display, | ||||
|                      MetaScreen      *screen, | ||||
|                      MetaWindow      *window, | ||||
|                      ClutterKeyEvent *event, | ||||
|                      MetaKeyBinding  *binding, | ||||
|                      gpointer         dummy) | ||||
| handle_toggle_tiled_left (MetaDisplay     *display, | ||||
|                           MetaScreen      *screen, | ||||
|                           MetaWindow      *window, | ||||
|                           ClutterKeyEvent *event, | ||||
|                           MetaKeyBinding  *binding, | ||||
|                           gpointer         dummy) | ||||
| { | ||||
|   MetaTileMode mode = binding->handler->data; | ||||
|   meta_window_toggle_tile (window, META_TILE_ZONE_W); | ||||
| } | ||||
|  | ||||
|   if ((META_WINDOW_TILED_LEFT (window) && mode == META_TILE_LEFT) || | ||||
|       (META_WINDOW_TILED_RIGHT (window) && mode == META_TILE_RIGHT)) | ||||
|     { | ||||
|       window->tile_monitor_number = window->saved_maximize ? window->monitor->number | ||||
|         : -1; | ||||
|       window->tile_mode = window->saved_maximize ? META_TILE_MAXIMIZED | ||||
|         : META_TILE_NONE; | ||||
|  | ||||
|       if (window->saved_maximize) | ||||
|         meta_window_maximize (window, META_MAXIMIZE_BOTH); | ||||
|       else | ||||
|         meta_window_unmaximize (window, META_MAXIMIZE_BOTH); | ||||
|     } | ||||
|   else if (meta_window_can_tile_side_by_side (window)) | ||||
|     { | ||||
|       window->tile_monitor_number = window->monitor->number; | ||||
|       window->tile_mode = mode; | ||||
|       /* Maximization constraints beat tiling constraints, so if the window | ||||
|        * is maximized, tiling won't have any effect unless we unmaximize it | ||||
|        * horizontally first; rather than calling meta_window_unmaximize(), | ||||
|        * we just set the flag and rely on meta_window_tile() syncing it to | ||||
|        * save an additional roundtrip. | ||||
|        */ | ||||
|       window->maximized_horizontally = FALSE; | ||||
|       meta_window_tile (window); | ||||
|     } | ||||
| static void | ||||
| handle_toggle_tiled_right (MetaDisplay     *display, | ||||
|                            MetaScreen      *screen, | ||||
|                            MetaWindow      *window, | ||||
|                            ClutterKeyEvent *event, | ||||
|                            MetaKeyBinding  *binding, | ||||
|                            gpointer         dummy) | ||||
| { | ||||
|   meta_window_toggle_tile (window, META_TILE_ZONE_E); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -3706,14 +3680,14 @@ init_builtin_key_bindings (MetaDisplay *display) | ||||
|                           mutter_keybindings, | ||||
|                           META_KEY_BINDING_PER_WINDOW, | ||||
|                           META_KEYBINDING_ACTION_TOGGLE_TILED_LEFT, | ||||
|                           handle_toggle_tiled, META_TILE_LEFT); | ||||
|                           handle_toggle_tiled_left, 0); | ||||
|  | ||||
|   add_builtin_keybinding (display, | ||||
|                           "toggle-tiled-right", | ||||
|                           mutter_keybindings, | ||||
|                           META_KEY_BINDING_PER_WINDOW, | ||||
|                           META_KEYBINDING_ACTION_TOGGLE_TILED_RIGHT, | ||||
|                           handle_toggle_tiled, META_TILE_RIGHT); | ||||
|                           handle_toggle_tiled_right, 0); | ||||
|  | ||||
|   add_builtin_keybinding (display, | ||||
|                           "toggle-above", | ||||
|   | ||||
							
								
								
									
										120
									
								
								src/core/main.c
									
									
									
									
									
								
							
							
						
						
									
										120
									
								
								src/core/main.c
									
									
									
									
									
								
							| @@ -80,6 +80,10 @@ | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
| #include "wayland/meta-wayland.h" | ||||
| # endif | ||||
|  | ||||
| #if defined(HAVE_NATIVE_BACKEND) && defined(HAVE_WAYLAND) | ||||
| #include <systemd/sd-login.h> | ||||
| #endif | ||||
|  | ||||
| /* | ||||
| @@ -164,6 +168,7 @@ static gboolean  opt_disable_sm; | ||||
| static gboolean  opt_sync; | ||||
| #ifdef HAVE_WAYLAND | ||||
| static gboolean  opt_wayland; | ||||
| static gboolean  opt_nested; | ||||
| #endif | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
| static gboolean  opt_display_server; | ||||
| @@ -212,6 +217,12 @@ static GOptionEntry meta_options[] = { | ||||
|     N_("Run as a wayland compositor"), | ||||
|     NULL | ||||
|   }, | ||||
|   { | ||||
|     "nested", 0, 0, G_OPTION_ARG_NONE, | ||||
|     &opt_nested, | ||||
|     N_("Run as a nested compositor"), | ||||
|     NULL | ||||
|   }, | ||||
| #endif | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
|   { | ||||
| @@ -291,6 +302,104 @@ on_sigterm (gpointer user_data) | ||||
|   return G_SOURCE_REMOVE; | ||||
| } | ||||
|  | ||||
| #if defined(HAVE_WAYLAND) && defined(HAVE_NATIVE_BACKEND) | ||||
| static char * | ||||
| find_logind_session_type (void) | ||||
| { | ||||
|   char **sessions; | ||||
|   char *session_id; | ||||
|   char *session_type; | ||||
|   int ret, i; | ||||
|  | ||||
|   ret = sd_pid_get_session (0, &session_id); | ||||
|  | ||||
|   if (ret == 0 && session_id != NULL) | ||||
|     { | ||||
|       ret = sd_session_get_type (session_id, &session_type); | ||||
|       free (session_id); | ||||
|  | ||||
|       if (ret < 0) | ||||
|         session_type = NULL; | ||||
|  | ||||
|       goto out; | ||||
|     } | ||||
|   session_type = NULL; | ||||
|  | ||||
|   ret = sd_uid_get_sessions (getuid (), TRUE, &sessions); | ||||
|  | ||||
|   if (ret < 0 || sessions == NULL) | ||||
|     goto out; | ||||
|  | ||||
|   for (i = 0; sessions[i] != NULL; i++) | ||||
|     { | ||||
|       ret = sd_session_get_type (sessions[i], &session_type); | ||||
|  | ||||
|       if (ret < 0) | ||||
|         continue; | ||||
|  | ||||
|       if (g_strcmp0 (session_type, "x11") == 0|| | ||||
|           g_strcmp0 (session_type, "wayland") == 0) | ||||
|         break; | ||||
|  | ||||
|       g_clear_pointer (&session_type, (GDestroyNotify) free); | ||||
|     } | ||||
|  | ||||
|   for (i = 0; sessions[i] != NULL; i++) | ||||
|     free (sessions[i]); | ||||
|   free (sessions); | ||||
|  | ||||
| out: | ||||
|   return session_type; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| check_for_wayland_session_type (void) | ||||
| { | ||||
|   char *session_type = NULL; | ||||
|   gboolean is_wayland = FALSE; | ||||
|  | ||||
|   session_type = find_logind_session_type (); | ||||
|  | ||||
|   if (session_type != NULL) | ||||
|     { | ||||
|       is_wayland = g_strcmp0 (session_type, "wayland") == 0; | ||||
|       free (session_type); | ||||
|     } | ||||
|  | ||||
|   return is_wayland; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static void | ||||
| init_backend (void) | ||||
| { | ||||
| #ifdef HAVE_WAYLAND | ||||
|   gboolean run_as_wayland_compositor = opt_wayland; | ||||
|  | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
|   if (opt_nested && opt_display_server) | ||||
|     { | ||||
|       meta_warning ("Can't run both as nested and as a display server\n"); | ||||
|       meta_exit (META_EXIT_ERROR); | ||||
|     } | ||||
|  | ||||
|   if (!run_as_wayland_compositor) | ||||
|     run_as_wayland_compositor = check_for_wayland_session_type (); | ||||
|  | ||||
| #ifdef CLUTTER_WINDOWING_EGL | ||||
|   if (opt_display_server || (run_as_wayland_compositor && !opt_nested)) | ||||
|     clutter_set_windowing_backend (CLUTTER_WINDOWING_EGL); | ||||
|   else | ||||
| #endif | ||||
| #endif | ||||
| #endif | ||||
|     clutter_set_windowing_backend (CLUTTER_WINDOWING_X11); | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
|   meta_set_is_wayland_compositor (run_as_wayland_compositor); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_init: (skip) | ||||
|  * | ||||
| @@ -323,16 +432,7 @@ meta_init (void) | ||||
|   if (g_getenv ("MUTTER_DEBUG")) | ||||
|     meta_set_debugging (TRUE); | ||||
|  | ||||
| #if defined(CLUTTER_WINDOWING_EGL) && defined(HAVE_NATIVE_BACKEND) | ||||
|   if (opt_display_server) | ||||
|     clutter_set_windowing_backend (CLUTTER_WINDOWING_EGL); | ||||
|   else | ||||
| #endif | ||||
|     clutter_set_windowing_backend (CLUTTER_WINDOWING_X11); | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
|   meta_set_is_wayland_compositor (opt_wayland); | ||||
| #endif | ||||
|   init_backend (); | ||||
|  | ||||
|   if (g_get_home_dir ()) | ||||
|     if (chdir (g_get_home_dir ()) < 0) | ||||
|   | ||||
							
								
								
									
										154
									
								
								src/core/meta-border.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								src/core/meta-border.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,154 @@ | ||||
| /* -*- 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> | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include "core/meta-border.h" | ||||
|  | ||||
| #include <math.h> | ||||
|  | ||||
| static inline float | ||||
| meta_vector2_cross_product (const MetaVector2 a, | ||||
|                             const MetaVector2 b) | ||||
| { | ||||
|   return a.x * b.y - a.y * b.x; | ||||
| } | ||||
|  | ||||
| static inline MetaVector2 | ||||
| meta_vector2_add (const MetaVector2 a, | ||||
|                   const MetaVector2 b) | ||||
| { | ||||
|   return (MetaVector2) { | ||||
|     .x = a.x + b.x, | ||||
|     .y = a.y + b.y, | ||||
|   }; | ||||
| } | ||||
|  | ||||
| static inline MetaVector2 | ||||
| meta_vector2_multiply_constant (const float       c, | ||||
|                                 const MetaVector2 a) | ||||
| { | ||||
|   return (MetaVector2) { | ||||
|     .x = c * a.x, | ||||
|     .y = c * a.y, | ||||
|   }; | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_line2_intersects_with (const MetaLine2 *line1, | ||||
|                             const MetaLine2 *line2, | ||||
|                             MetaVector2     *intersection) | ||||
| { | ||||
|   MetaVector2 p = line1->a; | ||||
|   MetaVector2 r = meta_vector2_subtract (line1->b, line1->a); | ||||
|   MetaVector2 q = line2->a; | ||||
|   MetaVector2 s = meta_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 = meta_vector2_cross_product (r, s); | ||||
|   sxr = meta_vector2_cross_product (s, r); | ||||
|  | ||||
|   /* If r × s = 0 then the lines are either parallel or collinear. */ | ||||
|   if (fabsf (rxs) < FLT_MIN) | ||||
|     return FALSE; | ||||
|  | ||||
|   t = meta_vector2_cross_product (meta_vector2_subtract (q, p), s) / rxs; | ||||
|   u = meta_vector2_cross_product (meta_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 = meta_vector2_add (p, meta_vector2_multiply_constant (t, r)); | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_border_is_horizontal (MetaBorder *border) | ||||
| { | ||||
|   return border->line.a.y == border->line.b.y; | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_border_is_blocking_directions (MetaBorder               *border, | ||||
|                                     MetaBorderMotionDirection directions) | ||||
| { | ||||
|   if (meta_border_is_horizontal (border)) | ||||
|     { | ||||
|       if ((directions & (META_BORDER_MOTION_DIRECTION_POSITIVE_Y | | ||||
|                          META_BORDER_MOTION_DIRECTION_NEGATIVE_Y)) == 0) | ||||
|         return FALSE; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       if ((directions & (META_BORDER_MOTION_DIRECTION_POSITIVE_X | | ||||
|                          META_BORDER_MOTION_DIRECTION_NEGATIVE_X)) == 0) | ||||
|         return FALSE; | ||||
|     } | ||||
|  | ||||
|   return (~border->blocking_directions & directions) != directions; | ||||
| } | ||||
|  | ||||
| unsigned int | ||||
| meta_border_get_allows_directions (MetaBorder *border) | ||||
| { | ||||
|   return ~border->blocking_directions & | ||||
|     (META_BORDER_MOTION_DIRECTION_POSITIVE_X | | ||||
|      META_BORDER_MOTION_DIRECTION_POSITIVE_Y | | ||||
|      META_BORDER_MOTION_DIRECTION_NEGATIVE_X | | ||||
|      META_BORDER_MOTION_DIRECTION_NEGATIVE_Y); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_border_set_allows_directions (MetaBorder *border, unsigned int directions) | ||||
| { | ||||
|   border->blocking_directions = | ||||
|     ~directions & (META_BORDER_MOTION_DIRECTION_POSITIVE_X | | ||||
|                    META_BORDER_MOTION_DIRECTION_POSITIVE_Y | | ||||
|                    META_BORDER_MOTION_DIRECTION_NEGATIVE_X | | ||||
|                    META_BORDER_MOTION_DIRECTION_NEGATIVE_Y); | ||||
| } | ||||
							
								
								
									
										84
									
								
								src/core/meta-border.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/core/meta-border.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,84 @@ | ||||
| /* -*- 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_BORDER_H | ||||
| #define META_BORDER_H | ||||
|  | ||||
| #include <glib.h> | ||||
|  | ||||
| typedef enum | ||||
| { | ||||
|   META_BORDER_MOTION_DIRECTION_POSITIVE_X = 1 << 0, | ||||
|   META_BORDER_MOTION_DIRECTION_POSITIVE_Y = 1 << 1, | ||||
|   META_BORDER_MOTION_DIRECTION_NEGATIVE_X = 1 << 2, | ||||
|   META_BORDER_MOTION_DIRECTION_NEGATIVE_Y = 1 << 3, | ||||
| } MetaBorderMotionDirection; | ||||
|  | ||||
| typedef struct _MetaVector2 | ||||
| { | ||||
|   float x; | ||||
|   float y; | ||||
| } MetaVector2; | ||||
|  | ||||
| typedef struct _MetaLine2 | ||||
| { | ||||
|   MetaVector2 a; | ||||
|   MetaVector2 b; | ||||
| } MetaLine2; | ||||
|  | ||||
| typedef struct _MetaBorder | ||||
| { | ||||
|   MetaLine2 line; | ||||
|   MetaBorderMotionDirection blocking_directions; | ||||
| } MetaBorder; | ||||
|  | ||||
| static inline MetaVector2 | ||||
| meta_vector2_subtract (const MetaVector2 a, | ||||
|                        const MetaVector2 b) | ||||
| { | ||||
|   return (MetaVector2) { | ||||
|     .x = a.x - b.x, | ||||
|     .y = a.y - b.y, | ||||
|   }; | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_line2_intersects_with (const MetaLine2 *line1, | ||||
|                             const MetaLine2 *line2, | ||||
|                             MetaVector2     *intersection); | ||||
|  | ||||
| gboolean | ||||
| meta_border_is_horizontal (MetaBorder *border); | ||||
|  | ||||
| gboolean | ||||
| meta_border_is_blocking_directions (MetaBorder               *border, | ||||
|                                     MetaBorderMotionDirection directions); | ||||
|  | ||||
| unsigned int | ||||
| meta_border_get_allows_directions (MetaBorder *border); | ||||
|  | ||||
| void | ||||
| meta_border_set_allows_directions (MetaBorder *border, unsigned int directions); | ||||
|  | ||||
| #endif /* META_BORDER_H */ | ||||
| @@ -1477,42 +1477,11 @@ button_function_from_string (const char *str) | ||||
|     return META_BUTTON_FUNCTION_MAXIMIZE; | ||||
|   else if (strcmp (str, "close") == 0) | ||||
|     return META_BUTTON_FUNCTION_CLOSE; | ||||
|   else if (strcmp (str, "shade") == 0) | ||||
|     return META_BUTTON_FUNCTION_SHADE; | ||||
|   else if (strcmp (str, "above") == 0) | ||||
|     return META_BUTTON_FUNCTION_ABOVE; | ||||
|   else if (strcmp (str, "stick") == 0) | ||||
|     return META_BUTTON_FUNCTION_STICK; | ||||
|   else | ||||
|     /* don't know; give up */ | ||||
|     return META_BUTTON_FUNCTION_LAST; | ||||
| } | ||||
|  | ||||
| static MetaButtonFunction | ||||
| button_opposite_function (MetaButtonFunction ofwhat) | ||||
| { | ||||
|   switch (ofwhat) | ||||
|     { | ||||
|     case META_BUTTON_FUNCTION_SHADE: | ||||
|       return META_BUTTON_FUNCTION_UNSHADE; | ||||
|     case META_BUTTON_FUNCTION_UNSHADE: | ||||
|       return META_BUTTON_FUNCTION_SHADE; | ||||
|  | ||||
|     case META_BUTTON_FUNCTION_ABOVE: | ||||
|       return META_BUTTON_FUNCTION_UNABOVE; | ||||
|     case META_BUTTON_FUNCTION_UNABOVE: | ||||
|       return META_BUTTON_FUNCTION_ABOVE; | ||||
|  | ||||
|     case META_BUTTON_FUNCTION_STICK: | ||||
|       return META_BUTTON_FUNCTION_UNSTICK; | ||||
|     case META_BUTTON_FUNCTION_UNSTICK: | ||||
|       return META_BUTTON_FUNCTION_STICK; | ||||
|  | ||||
|     default: | ||||
|       return META_BUTTON_FUNCTION_LAST; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| button_layout_handler (GVariant *value, | ||||
|                        gpointer *result, | ||||
| @@ -1556,12 +1525,6 @@ button_layout_handler (GVariant *value, | ||||
|           if (i > 0 && strcmp("spacer", buttons[b]) == 0) | ||||
|             { | ||||
|               new_layout.left_buttons_has_spacer[i-1] = TRUE; | ||||
|               f = button_opposite_function (f); | ||||
|  | ||||
|               if (f != META_BUTTON_FUNCTION_LAST) | ||||
|                 { | ||||
|                   new_layout.left_buttons_has_spacer[i-2] = TRUE; | ||||
|                 } | ||||
|             } | ||||
|           else | ||||
|             { | ||||
| @@ -1570,11 +1533,6 @@ button_layout_handler (GVariant *value, | ||||
|                   new_layout.left_buttons[i] = f; | ||||
|                   used[f] = TRUE; | ||||
|                   ++i; | ||||
|  | ||||
|                   f = button_opposite_function (f); | ||||
|  | ||||
|                   if (f != META_BUTTON_FUNCTION_LAST) | ||||
|                       new_layout.left_buttons[i++] = f; | ||||
|                 } | ||||
|               else | ||||
|                 { | ||||
| @@ -1618,11 +1576,6 @@ button_layout_handler (GVariant *value, | ||||
|           if (i > 0 && strcmp("spacer", buttons[b]) == 0) | ||||
|             { | ||||
|               new_layout.right_buttons_has_spacer[i-1] = TRUE; | ||||
|               f = button_opposite_function (f); | ||||
|               if (f != META_BUTTON_FUNCTION_LAST) | ||||
|                 { | ||||
|                   new_layout.right_buttons_has_spacer[i-2] = TRUE; | ||||
|                 } | ||||
|             } | ||||
|           else | ||||
|             { | ||||
| @@ -1631,12 +1584,6 @@ button_layout_handler (GVariant *value, | ||||
|                   new_layout.right_buttons[i] = f; | ||||
|                   used[f] = TRUE; | ||||
|                   ++i; | ||||
|  | ||||
|                   f = button_opposite_function (f); | ||||
|  | ||||
|                   if (f != META_BUTTON_FUNCTION_LAST) | ||||
|                       new_layout.right_buttons[i++] = f; | ||||
|  | ||||
|                 } | ||||
|               else | ||||
|                 { | ||||
|   | ||||
| @@ -57,7 +57,13 @@ struct _MetaScreen | ||||
|   MetaRectangle rect;  /* Size of screen; rect.x & rect.y are always 0 */ | ||||
|   MetaUI *ui; | ||||
|  | ||||
|   guint tile_preview_timeout_id; | ||||
|   struct { | ||||
|     gboolean exists; | ||||
|     guint timeout_id; | ||||
|     MetaWindow *window; | ||||
|     MetaRectangle area; | ||||
|     int monitor; | ||||
|   } tile_preview; | ||||
|  | ||||
|   MetaWorkspace *active_workspace; | ||||
|  | ||||
| @@ -85,11 +91,7 @@ struct _MetaScreen | ||||
|   /* Cache the current monitor */ | ||||
|   int last_monitor_index; | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   SnMonitorContext *sn_context; | ||||
|   GSList *startup_sequences; | ||||
|   guint startup_sequence_timeout; | ||||
| #endif | ||||
|  | ||||
|   Window wm_cm_selection_window; | ||||
|   guint work_area_later; | ||||
| @@ -136,9 +138,12 @@ void          meta_screen_foreach_window      (MetaScreen                 *scree | ||||
|  | ||||
| void          meta_screen_update_cursor       (MetaScreen                 *screen); | ||||
|  | ||||
| void          meta_screen_update_tile_preview          (MetaScreen    *screen, | ||||
|                                                         gboolean       delay); | ||||
| void          meta_screen_hide_tile_preview            (MetaScreen    *screen); | ||||
| void          meta_screen_update_tile_preview (MetaScreen    *screen, | ||||
|                                                MetaWindow    *window, | ||||
|                                                MetaRectangle  area, | ||||
|                                                int            monitor, | ||||
|                                                gboolean       delay); | ||||
| void          meta_screen_hide_tile_preview   (MetaScreen *screen); | ||||
|  | ||||
| MetaWindow*   meta_screen_get_mouse_window     (MetaScreen                 *screen, | ||||
|                                                 MetaWindow                 *not_this_one); | ||||
|   | ||||
| @@ -71,11 +71,6 @@ static void prefs_changed_callback (MetaPreference pref, | ||||
| static void set_desktop_geometry_hint (MetaScreen *screen); | ||||
| static void set_desktop_viewport_hint (MetaScreen *screen); | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
| static void meta_screen_sn_event   (SnMonitorEvent *event, | ||||
|                                     void           *user_data); | ||||
| #endif | ||||
|  | ||||
| static void on_monitors_changed (MetaMonitorManager *manager, | ||||
|                                  MetaScreen         *screen); | ||||
|  | ||||
| @@ -723,24 +718,11 @@ meta_screen_new (MetaDisplay *display, | ||||
|   screen->ui = meta_ui_new (screen->display->xdisplay, | ||||
|                             screen->xscreen); | ||||
|  | ||||
|   screen->tile_preview_timeout_id = 0; | ||||
|  | ||||
|   screen->stack = meta_stack_new (screen); | ||||
|   screen->stack_tracker = meta_stack_tracker_new (screen); | ||||
|  | ||||
|   meta_prefs_add_listener (prefs_changed_callback, screen); | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   screen->sn_context = | ||||
|     sn_monitor_context_new (screen->display->sn_display, | ||||
|                             screen->number, | ||||
|                             meta_screen_sn_event, | ||||
|                             screen, | ||||
|                             NULL); | ||||
|   screen->startup_sequences = NULL; | ||||
|   screen->startup_sequence_timeout = 0; | ||||
| #endif | ||||
|  | ||||
|   meta_verbose ("Added screen %d ('%s') root 0x%lx\n", | ||||
|                 screen->number, screen->screen_name, screen->xroot); | ||||
|  | ||||
| @@ -800,24 +782,6 @@ meta_screen_free (MetaScreen *screen, | ||||
|  | ||||
|   meta_screen_ungrab_keys (screen); | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   g_slist_foreach (screen->startup_sequences, | ||||
|                    (GFunc) sn_startup_sequence_unref, NULL); | ||||
|   g_slist_free (screen->startup_sequences); | ||||
|   screen->startup_sequences = NULL; | ||||
|  | ||||
|   if (screen->startup_sequence_timeout != 0) | ||||
|     { | ||||
|       g_source_remove (screen->startup_sequence_timeout); | ||||
|       screen->startup_sequence_timeout = 0; | ||||
|     } | ||||
|   if (screen->sn_context) | ||||
|     { | ||||
|       sn_monitor_context_unref (screen->sn_context); | ||||
|       screen->sn_context = NULL; | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|   meta_ui_free (screen->ui); | ||||
|  | ||||
|   meta_stack_free (screen->stack); | ||||
| @@ -841,8 +805,8 @@ meta_screen_free (MetaScreen *screen, | ||||
|  | ||||
|   g_free (screen->monitor_infos); | ||||
|  | ||||
|   if (screen->tile_preview_timeout_id) | ||||
|     g_source_remove (screen->tile_preview_timeout_id); | ||||
|   if (screen->tile_preview.timeout_id) | ||||
|     g_source_remove (screen->tile_preview.timeout_id); | ||||
|  | ||||
|   g_free (screen->screen_name); | ||||
|  | ||||
| @@ -1267,7 +1231,8 @@ root_cursor_prepare_at (MetaCursorSprite *cursor_sprite, | ||||
|   monitor = meta_screen_get_monitor_for_point (screen, x, y); | ||||
|  | ||||
|   /* Reload the cursor texture if the scale has changed. */ | ||||
|   meta_cursor_sprite_set_theme_scale (cursor_sprite, monitor->scale); | ||||
|   if (monitor) | ||||
|     meta_cursor_sprite_set_theme_scale (cursor_sprite, monitor->scale); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -1321,44 +1286,20 @@ static gboolean | ||||
| meta_screen_update_tile_preview_timeout (gpointer data) | ||||
| { | ||||
|   MetaScreen *screen = data; | ||||
|   MetaWindow *window = screen->display->grab_window; | ||||
|   gboolean needs_preview = FALSE; | ||||
|  | ||||
|   screen->tile_preview_timeout_id = 0; | ||||
|   screen->tile_preview.timeout_id = 0; | ||||
|  | ||||
|   if (window) | ||||
|   if (screen->tile_preview.exists) | ||||
|     { | ||||
|       switch (window->tile_mode) | ||||
|         { | ||||
|           case META_TILE_LEFT: | ||||
|           case META_TILE_RIGHT: | ||||
|               if (!META_WINDOW_TILED_SIDE_BY_SIDE (window)) | ||||
|                 needs_preview = TRUE; | ||||
|               break; | ||||
|  | ||||
|           case META_TILE_MAXIMIZED: | ||||
|               if (!META_WINDOW_MAXIMIZED (window)) | ||||
|                 needs_preview = TRUE; | ||||
|               break; | ||||
|  | ||||
|           default: | ||||
|               needs_preview = FALSE; | ||||
|               break; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   if (needs_preview) | ||||
|     { | ||||
|       MetaRectangle tile_rect; | ||||
|       int monitor; | ||||
|  | ||||
|       monitor = meta_window_get_current_tile_monitor_number (window); | ||||
|       meta_window_get_current_tile_area (window, &tile_rect); | ||||
|       meta_compositor_show_tile_preview (screen->display->compositor, | ||||
|                                          window, &tile_rect, monitor); | ||||
|                                          screen->tile_preview.window, | ||||
|                                          &screen->tile_preview.area, | ||||
|                                          screen->tile_preview.monitor); | ||||
|     } | ||||
|   else | ||||
|     meta_compositor_hide_tile_preview (screen->display->compositor); | ||||
|     { | ||||
|       meta_compositor_hide_tile_preview (screen->display->compositor); | ||||
|     } | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
| @@ -1366,37 +1307,47 @@ meta_screen_update_tile_preview_timeout (gpointer data) | ||||
| #define TILE_PREVIEW_TIMEOUT_MS 200 | ||||
|  | ||||
| void | ||||
| meta_screen_update_tile_preview (MetaScreen *screen, | ||||
|                                  gboolean    delay) | ||||
| meta_screen_update_tile_preview (MetaScreen    *screen, | ||||
|                                  MetaWindow    *window, | ||||
|                                  MetaRectangle  area, | ||||
|                                  int            monitor, | ||||
|                                  gboolean       delay) | ||||
| { | ||||
|   screen->tile_preview.exists = TRUE; | ||||
|   screen->tile_preview.window = window; | ||||
|   screen->tile_preview.area = area; | ||||
|   screen->tile_preview.monitor = monitor; | ||||
|  | ||||
|   if (delay) | ||||
|     { | ||||
|       if (screen->tile_preview_timeout_id > 0) | ||||
|       if (screen->tile_preview.timeout_id > 0) | ||||
|         return; | ||||
|  | ||||
|       screen->tile_preview_timeout_id = | ||||
|       screen->tile_preview.timeout_id = | ||||
|         g_timeout_add (TILE_PREVIEW_TIMEOUT_MS, | ||||
|                        meta_screen_update_tile_preview_timeout, | ||||
|                        screen); | ||||
|       g_source_set_name_by_id (screen->tile_preview_timeout_id, | ||||
|       g_source_set_name_by_id (screen->tile_preview.timeout_id, | ||||
|                                "[mutter] meta_screen_update_tile_preview_timeout"); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       if (screen->tile_preview_timeout_id > 0) | ||||
|         g_source_remove (screen->tile_preview_timeout_id); | ||||
|       if (screen->tile_preview.timeout_id > 0) | ||||
|         g_source_remove (screen->tile_preview.timeout_id); | ||||
|  | ||||
|       meta_screen_update_tile_preview_timeout ((gpointer)screen); | ||||
|       meta_screen_update_tile_preview_timeout ((gpointer) screen); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_screen_hide_tile_preview (MetaScreen *screen) | ||||
| { | ||||
|   if (screen->tile_preview_timeout_id > 0) | ||||
|     g_source_remove (screen->tile_preview_timeout_id); | ||||
|   screen->tile_preview.exists = FALSE; | ||||
|  | ||||
|   meta_compositor_hide_tile_preview (screen->display->compositor); | ||||
|   if (screen->tile_preview.timeout_id > 0) | ||||
|     g_source_remove (screen->tile_preview.timeout_id); | ||||
|  | ||||
|   meta_screen_update_tile_preview_timeout ((gpointer) screen); | ||||
| } | ||||
|  | ||||
| MetaWindow* | ||||
| @@ -2538,208 +2489,6 @@ meta_screen_unshow_desktop (MetaScreen *screen) | ||||
|   meta_screen_update_showing_desktop_hint (screen); | ||||
| } | ||||
|  | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
| static gboolean startup_sequence_timeout (void *data); | ||||
|  | ||||
| static void | ||||
| update_startup_feedback (MetaScreen *screen) | ||||
| { | ||||
|   if (screen->startup_sequences != NULL) | ||||
|     { | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Setting busy cursor\n"); | ||||
|       meta_screen_set_cursor (screen, META_CURSOR_BUSY); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Setting default cursor\n"); | ||||
|       meta_screen_set_cursor (screen, META_CURSOR_DEFAULT); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| add_sequence (MetaScreen        *screen, | ||||
|               SnStartupSequence *sequence) | ||||
| { | ||||
|   meta_topic (META_DEBUG_STARTUP, | ||||
|               "Adding sequence %s\n", | ||||
|               sn_startup_sequence_get_id (sequence)); | ||||
|   sn_startup_sequence_ref (sequence); | ||||
|   screen->startup_sequences = g_slist_prepend (screen->startup_sequences, | ||||
|                                                sequence); | ||||
|  | ||||
|   /* our timeout just polls every second, instead of bothering | ||||
|    * to compute exactly when we may next time out | ||||
|    */ | ||||
|   if (screen->startup_sequence_timeout == 0) | ||||
|     { | ||||
|       screen->startup_sequence_timeout = g_timeout_add_seconds (1, | ||||
|                                                                 startup_sequence_timeout, | ||||
|                                                                 screen); | ||||
|       g_source_set_name_by_id (screen->startup_sequence_timeout, | ||||
|                                "[mutter] startup_sequence_timeout"); | ||||
|     } | ||||
|  | ||||
|   update_startup_feedback (screen); | ||||
| } | ||||
|  | ||||
| static void | ||||
| remove_sequence (MetaScreen        *screen, | ||||
|                  SnStartupSequence *sequence) | ||||
| { | ||||
|   meta_topic (META_DEBUG_STARTUP, | ||||
|               "Removing sequence %s\n", | ||||
|               sn_startup_sequence_get_id (sequence)); | ||||
|  | ||||
|   screen->startup_sequences = g_slist_remove (screen->startup_sequences, | ||||
|                                               sequence); | ||||
|  | ||||
|   if (screen->startup_sequences == NULL && | ||||
|       screen->startup_sequence_timeout != 0) | ||||
|     { | ||||
|       g_source_remove (screen->startup_sequence_timeout); | ||||
|       screen->startup_sequence_timeout = 0; | ||||
|     } | ||||
|  | ||||
|   update_startup_feedback (screen); | ||||
|  | ||||
|   sn_startup_sequence_unref (sequence); | ||||
| } | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   GSList *list; | ||||
|   GTimeVal now; | ||||
| } CollectTimedOutData; | ||||
|  | ||||
| /* This should be fairly long, as it should never be required unless | ||||
|  * apps or .desktop files are buggy, and it's confusing if | ||||
|  * OpenOffice or whatever seems to stop launching - people | ||||
|  * might decide they need to launch it again. | ||||
|  */ | ||||
| #define STARTUP_TIMEOUT 15000 | ||||
|  | ||||
| static void | ||||
| collect_timed_out_foreach (void *element, | ||||
|                            void *data) | ||||
| { | ||||
|   CollectTimedOutData *ctod = data; | ||||
|   SnStartupSequence *sequence = element; | ||||
|   long tv_sec, tv_usec; | ||||
|   double elapsed; | ||||
|  | ||||
|   sn_startup_sequence_get_last_active_time (sequence, &tv_sec, &tv_usec); | ||||
|  | ||||
|   elapsed = | ||||
|     ((((double)ctod->now.tv_sec - tv_sec) * G_USEC_PER_SEC + | ||||
|       (ctod->now.tv_usec - tv_usec))) / 1000.0; | ||||
|  | ||||
|   meta_topic (META_DEBUG_STARTUP, | ||||
|               "Sequence used %g seconds vs. %g max: %s\n", | ||||
|               elapsed, (double) STARTUP_TIMEOUT, | ||||
|               sn_startup_sequence_get_id (sequence)); | ||||
|  | ||||
|   if (elapsed > STARTUP_TIMEOUT) | ||||
|     ctod->list = g_slist_prepend (ctod->list, sequence); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| startup_sequence_timeout (void *data) | ||||
| { | ||||
|   MetaScreen *screen = data; | ||||
|   CollectTimedOutData ctod; | ||||
|   GSList *l; | ||||
|  | ||||
|   ctod.list = NULL; | ||||
|   g_get_current_time (&ctod.now); | ||||
|   g_slist_foreach (screen->startup_sequences, | ||||
|                    collect_timed_out_foreach, | ||||
|                    &ctod); | ||||
|  | ||||
|   for (l = ctod.list; l != NULL; l = l->next) | ||||
|     { | ||||
|       SnStartupSequence *sequence = l->data; | ||||
|  | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Timed out sequence %s\n", | ||||
|                   sn_startup_sequence_get_id (sequence)); | ||||
|  | ||||
|       sn_startup_sequence_complete (sequence); | ||||
|     } | ||||
|  | ||||
|   g_slist_free (ctod.list); | ||||
|  | ||||
|   if (screen->startup_sequences != NULL) | ||||
|     { | ||||
|       return TRUE; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       /* remove */ | ||||
|       screen->startup_sequence_timeout = 0; | ||||
|       return FALSE; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_screen_sn_event (SnMonitorEvent *event, | ||||
|                       void           *user_data) | ||||
| { | ||||
|   MetaScreen *screen; | ||||
|   SnStartupSequence *sequence; | ||||
|  | ||||
|   screen = user_data; | ||||
|  | ||||
|   sequence = sn_monitor_event_get_startup_sequence (event); | ||||
|  | ||||
|   sn_startup_sequence_ref (sequence); | ||||
|  | ||||
|   switch (sn_monitor_event_get_type (event)) | ||||
|     { | ||||
|     case SN_MONITOR_EVENT_INITIATED: | ||||
|       { | ||||
|         const char *wmclass; | ||||
|  | ||||
|         wmclass = sn_startup_sequence_get_wmclass (sequence); | ||||
|  | ||||
|         meta_topic (META_DEBUG_STARTUP, | ||||
|                     "Received startup initiated for %s wmclass %s\n", | ||||
|                     sn_startup_sequence_get_id (sequence), | ||||
|                     wmclass ? wmclass : "(unset)"); | ||||
|         add_sequence (screen, sequence); | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case SN_MONITOR_EVENT_COMPLETED: | ||||
|       { | ||||
|         meta_topic (META_DEBUG_STARTUP, | ||||
|                     "Received startup completed for %s\n", | ||||
|                     sn_startup_sequence_get_id (sequence)); | ||||
|         remove_sequence (screen, | ||||
|                          sn_monitor_event_get_startup_sequence (event)); | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case SN_MONITOR_EVENT_CHANGED: | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Received startup changed for %s\n", | ||||
|                   sn_startup_sequence_get_id (sequence)); | ||||
|       break; | ||||
|  | ||||
|     case SN_MONITOR_EVENT_CANCELED: | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Received startup canceled for %s\n", | ||||
|                   sn_startup_sequence_get_id (sequence)); | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|   g_signal_emit (G_OBJECT (screen), screen_signals[STARTUP_SEQUENCE_CHANGED], 0, sequence); | ||||
|  | ||||
|   sn_startup_sequence_unref (sequence); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_screen_get_startup_sequences: (skip) | ||||
|  * @screen: | ||||
| @@ -2751,7 +2500,6 @@ meta_screen_get_startup_sequences (MetaScreen *screen) | ||||
| { | ||||
|   return screen->startup_sequences; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /* Sets the initial_timestamp and initial_workspace properties | ||||
|  * of a window according to information given us by the | ||||
|   | ||||
| @@ -117,7 +117,6 @@ meta_stack_add (MetaStack  *stack, | ||||
|               window->desc, window->stack_position); | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -153,7 +152,6 @@ meta_stack_remove (MetaStack  *stack, | ||||
|                                      GUINT_TO_POINTER (window->frame->xwindow)); | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -163,7 +161,6 @@ meta_stack_update_layer (MetaStack  *stack, | ||||
|   stack->need_relayer = TRUE; | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -173,7 +170,6 @@ meta_stack_update_transient (MetaStack  *stack, | ||||
|   stack->need_constrain = TRUE; | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
| } | ||||
|  | ||||
| /* raise/lower within a layer */ | ||||
| @@ -202,7 +198,6 @@ meta_stack_raise (MetaStack  *stack, | ||||
|   meta_window_set_stack_position_no_sync (window, max_stack_position); | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -230,7 +225,6 @@ meta_stack_lower (MetaStack  *stack, | ||||
|   meta_window_set_stack_position_no_sync (window, min_stack_position); | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, window->screen->active_workspace); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -246,27 +240,6 @@ meta_stack_thaw (MetaStack *stack) | ||||
|  | ||||
|   stack->freeze_count -= 1; | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_stack_update_window_tile_matches (MetaStack     *stack, | ||||
|                                        MetaWorkspace *workspace) | ||||
| { | ||||
|   GList *windows, *tmp; | ||||
|  | ||||
|   if (stack->freeze_count > 0) | ||||
|     return; | ||||
|  | ||||
|   windows = meta_stack_list_windows (stack, workspace); | ||||
|   tmp = windows; | ||||
|   while (tmp) | ||||
|     { | ||||
|       meta_window_compute_tile_match ((MetaWindow *) tmp->data); | ||||
|       tmp = tmp->next; | ||||
|     } | ||||
|  | ||||
|   g_list_free (windows); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| @@ -1055,7 +1028,7 @@ stack_sync_to_xserver (MetaStack *stack) | ||||
|   all_root_children_stacked = g_array_new (FALSE, FALSE, sizeof (guint64)); | ||||
|   x11_hidden_stack_ids = g_array_new (FALSE, FALSE, sizeof (guint64)); | ||||
|  | ||||
|   meta_topic (META_DEBUG_STACK, "Top to bottom: "); | ||||
|   meta_topic (META_DEBUG_STACK, "Bottom to top: "); | ||||
|   meta_push_no_msg_prefix (); | ||||
|  | ||||
|   for (tmp = g_list_last(stack->sorted); tmp != NULL; tmp = tmp->prev) | ||||
| @@ -1448,7 +1421,6 @@ meta_stack_set_positions (MetaStack *stack, | ||||
|               "Reset the stack positions of (nearly) all windows\n"); | ||||
|  | ||||
|   stack_sync_to_xserver (stack); | ||||
|   meta_stack_update_window_tile_matches (stack, NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| @@ -1511,6 +1483,4 @@ meta_window_set_stack_position (MetaWindow *window, | ||||
| { | ||||
|   meta_window_set_stack_position_no_sync (window, position); | ||||
|   stack_sync_to_xserver (window->screen->stack); | ||||
|   meta_stack_update_window_tile_matches (window->screen->stack, | ||||
|                                          window->screen->active_workspace); | ||||
| } | ||||
|   | ||||
| @@ -413,6 +413,4 @@ GList* meta_stack_get_positions (MetaStack *stack); | ||||
| void   meta_stack_set_positions (MetaStack *stack, | ||||
|                                  GList     *windows); | ||||
|  | ||||
| void meta_stack_update_window_tile_matches (MetaStack     *stack, | ||||
|                                             MetaWorkspace *workspace); | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										48
									
								
								src/core/startup-notification-private.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/core/startup-notification-private.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001, 2002 Havoc Pennington | ||||
|  * Copyright (C) 2002, 2003 Red Hat Inc. | ||||
|  * Some ICCCM manager selection code derived from fvwm2, | ||||
|  * Copyright (C) 2001 Dominik Vogt, Matthias Clasen, and fvwm2 team | ||||
|  * Copyright (C) 2003 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * | ||||
|  * 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/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef META_STARTUP_NOTIFICATION_PRIVATE_H | ||||
| #define META_STARTUP_NOTIFICATION_PRIVATE_H | ||||
|  | ||||
| #include "display-private.h" | ||||
|  | ||||
| #define META_TYPE_STARTUP_NOTIFICATION (meta_startup_notification_get_type ()) | ||||
|  | ||||
| G_DECLARE_FINAL_TYPE (MetaStartupNotification, | ||||
|                       meta_startup_notification, | ||||
|                       META, STARTUP_NOTIFICATION, | ||||
|                       GObject) | ||||
|  | ||||
| MetaStartupNotification * | ||||
|          meta_startup_notification_get             (MetaDisplay             *display); | ||||
|  | ||||
| gboolean meta_startup_notification_handle_xevent   (MetaStartupNotification *sn, | ||||
|                                                     XEvent                  *xevent); | ||||
|  | ||||
| void     meta_startup_notification_remove_sequence (MetaStartupNotification *sn, | ||||
|                                                     const gchar             *id); | ||||
|  | ||||
| GSList * meta_startup_notification_get_sequences   (MetaStartupNotification *sn); | ||||
|  | ||||
| #endif /* META_STARTUP_NOTIFICATION_PRIVATE_H */ | ||||
							
								
								
									
										770
									
								
								src/core/startup-notification.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										770
									
								
								src/core/startup-notification.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,770 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001, 2002 Havoc Pennington | ||||
|  * Copyright (C) 2002, 2003 Red Hat Inc. | ||||
|  * Some ICCCM manager selection code derived from fvwm2, | ||||
|  * Copyright (C) 2001 Dominik Vogt, Matthias Clasen, and fvwm2 team | ||||
|  * Copyright (C) 2003 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * | ||||
|  * 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/>. | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
|  | ||||
| #include <glib-object.h> | ||||
|  | ||||
| #include <meta/errors.h> | ||||
| #include "display-private.h" | ||||
| #include "screen-private.h" | ||||
| #include "startup-notification-private.h" | ||||
|  | ||||
| /* This should be fairly long, as it should never be required unless | ||||
|  * apps or .desktop files are buggy, and it's confusing if | ||||
|  * OpenOffice or whatever seems to stop launching - people | ||||
|  * might decide they need to launch it again. | ||||
|  */ | ||||
| #define STARTUP_TIMEOUT 15000000 | ||||
|  | ||||
| typedef struct _MetaStartupNotificationSequence MetaStartupNotificationSequence; | ||||
| typedef struct _MetaStartupNotificationSequenceClass MetaStartupNotificationSequenceClass; | ||||
|  | ||||
| enum { | ||||
|   PROP_SN_0, | ||||
|   PROP_SN_DISPLAY, | ||||
|   N_SN_PROPS | ||||
| }; | ||||
|  | ||||
| enum { | ||||
|   PROP_SEQ_0, | ||||
|   PROP_SEQ_ID, | ||||
|   PROP_SEQ_TIMESTAMP, | ||||
|   N_SEQ_PROPS | ||||
| }; | ||||
|  | ||||
| enum { | ||||
|   SN_CHANGED, | ||||
|   N_SN_SIGNALS | ||||
| }; | ||||
|  | ||||
| static guint sn_signals[N_SN_SIGNALS]; | ||||
| static GParamSpec *sn_props[N_SN_PROPS]; | ||||
| static GParamSpec *seq_props[N_SEQ_PROPS]; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   GSList *list; | ||||
|   gint64 now; | ||||
| } CollectTimedOutData; | ||||
|  | ||||
| struct _MetaStartupNotification | ||||
| { | ||||
|   GObject parent_instance; | ||||
|   MetaDisplay *display; | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   SnDisplay *sn_display; | ||||
|   SnMonitorContext *sn_context; | ||||
| #endif | ||||
|  | ||||
|   GSList *startup_sequences; | ||||
|   guint startup_sequence_timeout; | ||||
| }; | ||||
|  | ||||
| #define META_TYPE_STARTUP_NOTIFICATION_SEQUENCE \ | ||||
|   (meta_startup_notification_sequence_get_type ()) | ||||
|  | ||||
| G_DECLARE_DERIVABLE_TYPE (MetaStartupNotificationSequence, | ||||
|                           meta_startup_notification_sequence, | ||||
|                           META, STARTUP_NOTIFICATION_SEQUENCE, | ||||
|                           GObject) | ||||
|  | ||||
| typedef struct { | ||||
|   gchar *id; | ||||
|   gint64 timestamp; | ||||
| } MetaStartupNotificationSequencePrivate; | ||||
|  | ||||
| struct _MetaStartupNotificationSequenceClass { | ||||
|   GObjectClass parent_class; | ||||
|  | ||||
|   void (* complete) (MetaStartupNotificationSequence *sequence); | ||||
| }; | ||||
|  | ||||
| G_DEFINE_TYPE (MetaStartupNotification, | ||||
|                meta_startup_notification, | ||||
|                G_TYPE_OBJECT) | ||||
| G_DEFINE_TYPE_WITH_PRIVATE (MetaStartupNotificationSequence, | ||||
|                             meta_startup_notification_sequence, | ||||
|                             G_TYPE_OBJECT) | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|  | ||||
| enum { | ||||
|   PROP_SEQ_X11_0, | ||||
|   PROP_SEQ_X11_SEQ, | ||||
|   N_SEQ_X11_PROPS | ||||
| }; | ||||
|  | ||||
| struct _MetaStartupNotificationSequenceX11 { | ||||
|   MetaStartupNotificationSequence parent_instance; | ||||
|   SnStartupSequence *seq; | ||||
| }; | ||||
|  | ||||
| static GParamSpec *seq_x11_props[N_SEQ_X11_PROPS]; | ||||
|  | ||||
| #define META_TYPE_STARTUP_NOTIFICATION_SEQUENCE_X11 \ | ||||
|   (meta_startup_notification_sequence_x11_get_type ()) | ||||
|  | ||||
| G_DECLARE_FINAL_TYPE (MetaStartupNotificationSequenceX11, | ||||
|                       meta_startup_notification_sequence_x11, | ||||
|                       META, STARTUP_NOTIFICATION_SEQUENCE_X11, | ||||
|                       MetaStartupNotificationSequence) | ||||
|  | ||||
| G_DEFINE_TYPE (MetaStartupNotificationSequenceX11, | ||||
|                meta_startup_notification_sequence_x11, | ||||
|                META_TYPE_STARTUP_NOTIFICATION_SEQUENCE) | ||||
|  | ||||
| static void meta_startup_notification_ensure_timeout  (MetaStartupNotification *sn); | ||||
|  | ||||
| #endif | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_update_feedback (MetaStartupNotification *sn) | ||||
| { | ||||
|   MetaScreen *screen = sn->display->screen; | ||||
|  | ||||
|   if (sn->startup_sequences != NULL) | ||||
|     { | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Setting busy cursor\n"); | ||||
|       meta_screen_set_cursor (screen, META_CURSOR_BUSY); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Setting default cursor\n"); | ||||
|       meta_screen_set_cursor (screen, META_CURSOR_DEFAULT); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_init (MetaStartupNotificationSequence *seq) | ||||
| { | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_finalize (GObject *object) | ||||
| { | ||||
|   MetaStartupNotificationSequence *seq; | ||||
|   MetaStartupNotificationSequencePrivate *priv; | ||||
|  | ||||
|   seq = META_STARTUP_NOTIFICATION_SEQUENCE (object); | ||||
|   priv = meta_startup_notification_sequence_get_instance_private (seq); | ||||
|   g_free (priv->id); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_startup_notification_sequence_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_set_property (GObject      *object, | ||||
|                                                  guint         prop_id, | ||||
|                                                  const GValue *value, | ||||
|                                                  GParamSpec   *pspec) | ||||
| { | ||||
|   MetaStartupNotificationSequence *seq; | ||||
|   MetaStartupNotificationSequencePrivate *priv; | ||||
|  | ||||
|   seq = META_STARTUP_NOTIFICATION_SEQUENCE (object); | ||||
|   priv = meta_startup_notification_sequence_get_instance_private (seq); | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_SEQ_ID: | ||||
|       priv->id = g_value_dup_string (value); | ||||
|       break; | ||||
|     case PROP_SEQ_TIMESTAMP: | ||||
|       priv->timestamp = g_value_get_int64 (value); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_get_property (GObject    *object, | ||||
|                                                  guint       prop_id, | ||||
|                                                  GValue     *value, | ||||
|                                                  GParamSpec *pspec) | ||||
| { | ||||
|   MetaStartupNotificationSequence *seq; | ||||
|   MetaStartupNotificationSequencePrivate *priv; | ||||
|  | ||||
|   seq = META_STARTUP_NOTIFICATION_SEQUENCE (object); | ||||
|   priv = meta_startup_notification_sequence_get_instance_private (seq); | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_SEQ_ID: | ||||
|       g_value_set_string (value, priv->id); | ||||
|       break; | ||||
|     case PROP_SEQ_TIMESTAMP: | ||||
|       g_value_set_int64 (value, priv->timestamp); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_class_init (MetaStartupNotificationSequenceClass *klass) | ||||
| { | ||||
|   GObjectClass *object_class; | ||||
|  | ||||
|   object_class = G_OBJECT_CLASS (klass); | ||||
|   object_class->finalize = meta_startup_notification_sequence_finalize; | ||||
|   object_class->set_property = meta_startup_notification_sequence_set_property; | ||||
|   object_class->get_property = meta_startup_notification_sequence_get_property; | ||||
|  | ||||
|   seq_props[PROP_SEQ_ID] = | ||||
|     g_param_spec_string ("id", | ||||
|                          "ID", | ||||
|                          "ID", | ||||
|                          NULL, | ||||
|                          G_PARAM_READWRITE | | ||||
|                          G_PARAM_CONSTRUCT_ONLY); | ||||
|   seq_props[PROP_SEQ_TIMESTAMP] = | ||||
|     g_param_spec_int64 ("timestamp", | ||||
|                         "Timestamp", | ||||
|                         "Timestamp", | ||||
|                         G_MININT64, G_MAXINT64, 0, | ||||
|                         G_PARAM_READWRITE | | ||||
|                         G_PARAM_CONSTRUCT_ONLY); | ||||
|  | ||||
|   g_object_class_install_properties (object_class, N_SEQ_PROPS, seq_props); | ||||
| } | ||||
|  | ||||
| static const gchar * | ||||
| meta_startup_notification_sequence_get_id (MetaStartupNotificationSequence *seq) | ||||
| { | ||||
|   MetaStartupNotificationSequencePrivate *priv; | ||||
|  | ||||
|   priv = meta_startup_notification_sequence_get_instance_private (seq); | ||||
|   return priv->id; | ||||
| } | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
| static gint64 | ||||
| meta_startup_notification_sequence_get_timestamp (MetaStartupNotificationSequence *seq) | ||||
| { | ||||
|   MetaStartupNotificationSequencePrivate *priv; | ||||
|  | ||||
|   priv = meta_startup_notification_sequence_get_instance_private (seq); | ||||
|   return priv->timestamp; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_complete (MetaStartupNotificationSequence *seq) | ||||
| { | ||||
|   MetaStartupNotificationSequenceClass *klass; | ||||
|  | ||||
|   klass = META_STARTUP_NOTIFICATION_SEQUENCE_GET_CLASS (seq); | ||||
|  | ||||
|   if (klass->complete) | ||||
|     klass->complete (seq); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
| static void | ||||
| meta_startup_notification_sequence_x11_complete (MetaStartupNotificationSequence *seq) | ||||
| { | ||||
|   MetaStartupNotificationSequenceX11 *seq_x11; | ||||
|  | ||||
|   seq_x11 = META_STARTUP_NOTIFICATION_SEQUENCE_X11 (seq); | ||||
|   sn_startup_sequence_complete (seq_x11->seq); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_x11_finalize (GObject *object) | ||||
| { | ||||
|   MetaStartupNotificationSequenceX11 *seq; | ||||
|  | ||||
|   seq = META_STARTUP_NOTIFICATION_SEQUENCE_X11 (object); | ||||
|   sn_startup_sequence_unref (seq->seq); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_startup_notification_sequence_x11_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_x11_set_property (GObject      *object, | ||||
|                                                      guint         prop_id, | ||||
|                                                      const GValue *value, | ||||
|                                                      GParamSpec   *pspec) | ||||
| { | ||||
|   MetaStartupNotificationSequenceX11 *seq; | ||||
|  | ||||
|   seq = META_STARTUP_NOTIFICATION_SEQUENCE_X11 (object); | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_SEQ_X11_SEQ: | ||||
|       seq->seq = g_value_get_pointer (value); | ||||
|       sn_startup_sequence_ref (seq->seq); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_x11_get_property (GObject    *object, | ||||
|                                                      guint       prop_id, | ||||
|                                                      GValue     *value, | ||||
|                                                      GParamSpec *pspec) | ||||
| { | ||||
|   MetaStartupNotificationSequenceX11 *seq; | ||||
|  | ||||
|   seq = META_STARTUP_NOTIFICATION_SEQUENCE_X11 (object); | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_SEQ_X11_SEQ: | ||||
|       g_value_set_pointer (value, seq->seq); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_x11_init (MetaStartupNotificationSequenceX11 *seq) | ||||
| { | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sequence_x11_class_init (MetaStartupNotificationSequenceX11Class *klass) | ||||
| { | ||||
|   MetaStartupNotificationSequenceClass *seq_class; | ||||
|   GObjectClass *object_class; | ||||
|  | ||||
|   seq_class = META_STARTUP_NOTIFICATION_SEQUENCE_CLASS (klass); | ||||
|   seq_class->complete = meta_startup_notification_sequence_x11_complete; | ||||
|  | ||||
|   object_class = G_OBJECT_CLASS (klass); | ||||
|   object_class->finalize = meta_startup_notification_sequence_x11_finalize; | ||||
|   object_class->set_property = meta_startup_notification_sequence_x11_set_property; | ||||
|   object_class->get_property = meta_startup_notification_sequence_x11_get_property; | ||||
|  | ||||
|   seq_x11_props[PROP_SEQ_X11_SEQ] = | ||||
|     g_param_spec_pointer ("seq", | ||||
|                           "Sequence", | ||||
|                           "Sequence", | ||||
|                           G_PARAM_READWRITE | | ||||
|                           G_PARAM_CONSTRUCT_ONLY); | ||||
|  | ||||
|   g_object_class_install_properties (object_class, N_SEQ_X11_PROPS, | ||||
|                                      seq_x11_props); | ||||
| } | ||||
|  | ||||
| static MetaStartupNotificationSequence * | ||||
| meta_startup_notification_sequence_x11_new (SnStartupSequence *seq) | ||||
| { | ||||
|   gint64 timestamp; | ||||
|  | ||||
|   timestamp = sn_startup_sequence_get_timestamp (seq) * 1000; | ||||
|   return g_object_new (META_TYPE_STARTUP_NOTIFICATION_SEQUENCE_X11, | ||||
|                        "id", sn_startup_sequence_get_id (seq), | ||||
|                        "timestamp", timestamp, | ||||
|                        "seq", seq, | ||||
|                        NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_add_sequence_internal (MetaStartupNotification         *sn, | ||||
|                                                  MetaStartupNotificationSequence *seq) | ||||
| { | ||||
|   sn->startup_sequences = g_slist_prepend (sn->startup_sequences, | ||||
|                                            g_object_ref (seq)); | ||||
|  | ||||
|   meta_startup_notification_ensure_timeout (sn); | ||||
|   meta_startup_notification_update_feedback (sn); | ||||
| } | ||||
|  | ||||
| static void | ||||
| collect_timed_out_foreach (void *element, | ||||
|                            void *data) | ||||
| { | ||||
|   MetaStartupNotificationSequence *sequence = element; | ||||
|   CollectTimedOutData *ctod = data; | ||||
|   gint64 elapsed, timestamp; | ||||
|  | ||||
|   timestamp = meta_startup_notification_sequence_get_timestamp (sequence); | ||||
|   elapsed = ctod->now - timestamp; | ||||
|  | ||||
|   meta_topic (META_DEBUG_STARTUP, | ||||
|               "Sequence used %ld ms vs. %d max: %s\n", | ||||
|               elapsed, STARTUP_TIMEOUT, | ||||
|               meta_startup_notification_sequence_get_id (sequence)); | ||||
|  | ||||
|   if (elapsed > STARTUP_TIMEOUT) | ||||
|     ctod->list = g_slist_prepend (ctod->list, sequence); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| startup_sequence_timeout (void *data) | ||||
| { | ||||
|   MetaStartupNotification *sn = data; | ||||
|   CollectTimedOutData ctod; | ||||
|   GSList *l; | ||||
|  | ||||
|   ctod.list = NULL; | ||||
|   ctod.now = g_get_monotonic_time (); | ||||
|   g_slist_foreach (sn->startup_sequences, | ||||
|                    collect_timed_out_foreach, | ||||
|                    &ctod); | ||||
|  | ||||
|   for (l = ctod.list; l != NULL; l = l->next) | ||||
|     { | ||||
|       MetaStartupNotificationSequence *sequence = l->data; | ||||
|  | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Timed out sequence %s\n", | ||||
|                   meta_startup_notification_sequence_get_id (sequence)); | ||||
|  | ||||
|       meta_startup_notification_sequence_complete (sequence); | ||||
|     } | ||||
|  | ||||
|   g_slist_free (ctod.list); | ||||
|  | ||||
|   if (sn->startup_sequences != NULL) | ||||
|     { | ||||
|       return TRUE; | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       /* remove */ | ||||
|       sn->startup_sequence_timeout = 0; | ||||
|       return FALSE; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_ensure_timeout (MetaStartupNotification *sn) | ||||
| { | ||||
|   if (sn->startup_sequence_timeout != 0) | ||||
|     return; | ||||
|  | ||||
|   /* our timeout just polls every second, instead of bothering | ||||
|    * to compute exactly when we may next time out | ||||
|    */ | ||||
|   sn->startup_sequence_timeout = g_timeout_add_seconds (1, | ||||
|                                                         startup_sequence_timeout, | ||||
|                                                         sn); | ||||
|   g_source_set_name_by_id (sn->startup_sequence_timeout, | ||||
|                            "[mutter] startup_sequence_timeout"); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_remove_sequence_internal (MetaStartupNotification         *sn, | ||||
|                                                     MetaStartupNotificationSequence *seq) | ||||
| { | ||||
|   sn->startup_sequences = g_slist_remove (sn->startup_sequences, seq); | ||||
|   meta_startup_notification_update_feedback (sn); | ||||
|  | ||||
|   if (sn->startup_sequences == NULL && | ||||
|       sn->startup_sequence_timeout != 0) | ||||
|     { | ||||
|       g_source_remove (sn->startup_sequence_timeout); | ||||
|       sn->startup_sequence_timeout = 0; | ||||
|     } | ||||
|  | ||||
|   g_object_unref (seq); | ||||
| } | ||||
|  | ||||
| static MetaStartupNotificationSequence * | ||||
| meta_startup_notification_lookup_sequence (MetaStartupNotification *sn, | ||||
|                                            const gchar             *id) | ||||
| { | ||||
|   MetaStartupNotificationSequence *seq; | ||||
|   const gchar *seq_id; | ||||
|   GSList *l; | ||||
|  | ||||
|   for (l = sn->startup_sequences; l; l = l->next) | ||||
|     { | ||||
|       seq = l->data; | ||||
|       seq_id = meta_startup_notification_sequence_get_id (seq); | ||||
|  | ||||
|       if (g_str_equal (seq_id, id)) | ||||
|         return l->data; | ||||
|     } | ||||
|  | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_init (MetaStartupNotification *sn) | ||||
| { | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_finalize (GObject *object) | ||||
| { | ||||
|   MetaStartupNotification *sn = META_STARTUP_NOTIFICATION (object); | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   sn_monitor_context_unref (sn->sn_context); | ||||
|   sn_display_unref (sn->sn_display); | ||||
| #endif | ||||
|  | ||||
|   if (sn->startup_sequence_timeout) | ||||
|     g_source_remove (sn->startup_sequence_timeout); | ||||
|  | ||||
|   g_slist_foreach (sn->startup_sequences, (GFunc) g_object_unref, NULL); | ||||
|   g_slist_free (sn->startup_sequences); | ||||
|   sn->startup_sequences = NULL; | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_startup_notification_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_set_property (GObject      *object, | ||||
|                                         guint         prop_id, | ||||
|                                         const GValue *value, | ||||
|                                         GParamSpec   *pspec) | ||||
| { | ||||
|   MetaStartupNotification *sn = META_STARTUP_NOTIFICATION (object); | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_SN_DISPLAY: | ||||
|       sn->display = g_value_get_object (value); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_get_property (GObject    *object, | ||||
|                                         guint       prop_id, | ||||
|                                         GValue     *value, | ||||
|                                         GParamSpec *pspec) | ||||
| { | ||||
|   MetaStartupNotification *sn = META_STARTUP_NOTIFICATION (object); | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_SN_DISPLAY: | ||||
|       g_value_set_object (value, sn->display); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
| static void | ||||
| sn_error_trap_push (SnDisplay *sn_display, | ||||
|                     Display   *xdisplay) | ||||
| { | ||||
|   MetaDisplay *display; | ||||
|   display = meta_display_for_x_display (xdisplay); | ||||
|   if (display != NULL) | ||||
|     meta_error_trap_push (display); | ||||
| } | ||||
|  | ||||
| static void | ||||
| sn_error_trap_pop (SnDisplay *sn_display, | ||||
|                    Display   *xdisplay) | ||||
| { | ||||
|   MetaDisplay *display; | ||||
|   display = meta_display_for_x_display (xdisplay); | ||||
|   if (display != NULL) | ||||
|     meta_error_trap_pop (display); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_sn_event (SnMonitorEvent *event, | ||||
|                                     void           *user_data) | ||||
| { | ||||
|   MetaStartupNotification *sn = user_data; | ||||
|   MetaStartupNotificationSequence *seq; | ||||
|   SnStartupSequence *sequence; | ||||
|  | ||||
|   sequence = sn_monitor_event_get_startup_sequence (event); | ||||
|  | ||||
|   sn_startup_sequence_ref (sequence); | ||||
|  | ||||
|   switch (sn_monitor_event_get_type (event)) | ||||
|     { | ||||
|     case SN_MONITOR_EVENT_INITIATED: | ||||
|       { | ||||
|         const char *wmclass; | ||||
|  | ||||
|         wmclass = sn_startup_sequence_get_wmclass (sequence); | ||||
|  | ||||
|         meta_topic (META_DEBUG_STARTUP, | ||||
|                     "Received startup initiated for %s wmclass %s\n", | ||||
|                     sn_startup_sequence_get_id (sequence), | ||||
|                     wmclass ? wmclass : "(unset)"); | ||||
|  | ||||
|         seq = meta_startup_notification_sequence_x11_new (sequence); | ||||
|         meta_startup_notification_add_sequence_internal (sn, seq); | ||||
|         g_object_unref (seq); | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case SN_MONITOR_EVENT_COMPLETED: | ||||
|       { | ||||
|         meta_topic (META_DEBUG_STARTUP, | ||||
|                     "Received startup completed for %s\n", | ||||
|                     sn_startup_sequence_get_id (sequence)); | ||||
|  | ||||
|         meta_startup_notification_remove_sequence (sn, sn_startup_sequence_get_id (sequence)); | ||||
|       } | ||||
|       break; | ||||
|  | ||||
|     case SN_MONITOR_EVENT_CHANGED: | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Received startup changed for %s\n", | ||||
|                   sn_startup_sequence_get_id (sequence)); | ||||
|       break; | ||||
|  | ||||
|     case SN_MONITOR_EVENT_CANCELED: | ||||
|       meta_topic (META_DEBUG_STARTUP, | ||||
|                   "Received startup canceled for %s\n", | ||||
|                   sn_startup_sequence_get_id (sequence)); | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|   g_signal_emit (sn, sn_signals[SN_CHANGED], 0, sequence); | ||||
|  | ||||
|   sn_startup_sequence_unref (sequence); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_constructed (GObject *object) | ||||
| { | ||||
|   MetaStartupNotification *sn = META_STARTUP_NOTIFICATION (object); | ||||
|  | ||||
|   g_assert (sn->display != NULL); | ||||
|  | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   sn->sn_display = sn_display_new (sn->display->xdisplay, | ||||
|                                    sn_error_trap_push, | ||||
|                                    sn_error_trap_pop); | ||||
|   sn->sn_context = | ||||
|     sn_monitor_context_new (sn->sn_display, | ||||
|                             sn->display->screen->number, | ||||
|                             meta_startup_notification_sn_event, | ||||
|                             sn, | ||||
|                             NULL); | ||||
| #endif | ||||
|   sn->startup_sequences = NULL; | ||||
|   sn->startup_sequence_timeout = 0; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_startup_notification_class_init (MetaStartupNotificationClass *klass) | ||||
| { | ||||
|   GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||||
|  | ||||
|   object_class->constructed = meta_startup_notification_constructed; | ||||
|   object_class->finalize = meta_startup_notification_finalize; | ||||
|   object_class->set_property = meta_startup_notification_set_property; | ||||
|   object_class->get_property = meta_startup_notification_get_property; | ||||
|  | ||||
|   sn_props[PROP_SN_DISPLAY] = | ||||
|     g_param_spec_object ("display", | ||||
|                          "Display", | ||||
|                          "Display", | ||||
|                          META_TYPE_DISPLAY, | ||||
|                          G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | | ||||
|                          G_PARAM_STATIC_STRINGS); | ||||
|  | ||||
|   sn_signals[SN_CHANGED] = | ||||
|     g_signal_new ("changed", | ||||
|                   META_TYPE_STARTUP_NOTIFICATION, | ||||
|                   G_SIGNAL_RUN_LAST, | ||||
|                   0, NULL, NULL, NULL, | ||||
|                   G_TYPE_NONE, 1, G_TYPE_POINTER); | ||||
|  | ||||
|   g_object_class_install_properties (object_class, N_SN_PROPS, sn_props); | ||||
| } | ||||
|  | ||||
| MetaStartupNotification * | ||||
| meta_startup_notification_get (MetaDisplay *display) | ||||
| { | ||||
|   static MetaStartupNotification *notification = NULL; | ||||
|  | ||||
|   if (!notification) | ||||
|     notification = g_object_new (META_TYPE_STARTUP_NOTIFICATION, | ||||
|                                  "display", display, | ||||
|                                  NULL); | ||||
|  | ||||
|   return notification; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_startup_notification_remove_sequence (MetaStartupNotification *sn, | ||||
|                                            const gchar             *id) | ||||
| { | ||||
|   MetaStartupNotificationSequence *seq; | ||||
|  | ||||
|   seq = meta_startup_notification_lookup_sequence (sn, id); | ||||
|   if (seq) | ||||
|     meta_startup_notification_remove_sequence_internal (sn, seq); | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_startup_notification_handle_xevent (MetaStartupNotification *sn, | ||||
|                                          XEvent                  *xevent) | ||||
| { | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   return sn_display_process_event (sn->sn_display, xevent); | ||||
| #endif | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| GSList * | ||||
| meta_startup_notification_get_sequences (MetaStartupNotification *sn) | ||||
| { | ||||
|   GSList *sequences = NULL; | ||||
| #ifdef HAVE_STARTUP_NOTIFICATION | ||||
|   GSList *l; | ||||
|  | ||||
|   /* We return a list of SnStartupSequences here */ | ||||
|   for (l = sn->startup_sequences; l; l = l->next) | ||||
|     { | ||||
|       MetaStartupNotificationSequenceX11 *seq_x11; | ||||
|  | ||||
|       if (!META_IS_STARTUP_NOTIFICATION_SEQUENCE_X11 (l->data)) | ||||
|         continue; | ||||
|  | ||||
|       seq_x11 = META_STARTUP_NOTIFICATION_SEQUENCE_X11 (l->data); | ||||
|       sequences = g_slist_prepend (sequences, seq_x11->seq); | ||||
|     } | ||||
| #endif | ||||
|  | ||||
|   return sequences; | ||||
| } | ||||
							
								
								
									
										105
									
								
								src/core/util.c
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								src/core/util.c
									
									
									
									
									
								
							| @@ -49,6 +49,9 @@ meta_topic_real_valist (MetaDebugTopic topic, | ||||
|                         va_list        args) G_GNUC_PRINTF(2, 0); | ||||
| #endif | ||||
|  | ||||
| static gboolean | ||||
| meta_later_remove_from_list (guint later_id, GSList **laters_list); | ||||
|  | ||||
| static gint verbose_topics = 0; | ||||
| static gboolean is_debugging = FALSE; | ||||
| static gboolean replace_current = FALSE; | ||||
| @@ -739,7 +742,14 @@ typedef struct | ||||
|   gboolean run_once; | ||||
| } MetaLater; | ||||
|  | ||||
| static GSList *laters = NULL; | ||||
| static GSList *laters[] = { | ||||
|   NULL, /* META_LATER_RESIZE */ | ||||
|   NULL, /* META_LATER_CALC_SHOWING */ | ||||
|   NULL, /* META_LATER_CHECK_FULLSCREEN */ | ||||
|   NULL, /* META_LATER_SYNC_STACK */ | ||||
|   NULL, /* META_LATER_BEFORE_REDRAW */ | ||||
|   NULL, /* META_LATER_IDLE */ | ||||
| }; | ||||
| /* This is a dummy timeline used to get the Clutter master clock running */ | ||||
| static ClutterTimeline *later_timeline; | ||||
| static guint later_repaint_func = 0; | ||||
| @@ -772,25 +782,14 @@ destroy_later (MetaLater *later) | ||||
|   unref_later (later); | ||||
| } | ||||
|  | ||||
| /* Used to sort the list of laters with the highest priority | ||||
|  * functions first. | ||||
|  */ | ||||
| static int | ||||
| compare_laters (gconstpointer a, | ||||
|                 gconstpointer b) | ||||
| { | ||||
|   return ((const MetaLater *)a)->when - ((const MetaLater *)b)->when; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| run_repaint_laters (gpointer data) | ||||
| static void | ||||
| run_repaint_laters (GSList **laters_list) | ||||
| { | ||||
|   GSList *laters_copy; | ||||
|   GSList *l; | ||||
|   gboolean keep_timeline_running = FALSE; | ||||
|  | ||||
|   laters_copy = NULL; | ||||
|   for (l = laters; l; l = l->next) | ||||
|   for (l = *laters_list; l; l = l->next) | ||||
|     { | ||||
|       MetaLater *later = l->data; | ||||
|       if (later->source == 0 || | ||||
| @@ -806,22 +805,41 @@ run_repaint_laters (gpointer data) | ||||
|     { | ||||
|       MetaLater *later = l->data; | ||||
|  | ||||
|       if (later->func && later->func (later->data)) | ||||
|       if (!later->func || !later->func (later->data)) | ||||
|         meta_later_remove_from_list (later->id, laters_list); | ||||
|       unref_later (later); | ||||
|     } | ||||
|  | ||||
|   g_slist_free (laters_copy); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| run_all_repaint_laters (gpointer data) | ||||
| { | ||||
|   guint i; | ||||
|   GSList *l; | ||||
|   gboolean keep_timeline_running = FALSE; | ||||
|  | ||||
|   for (i = 0; i < G_N_ELEMENTS (laters); i++) | ||||
|     { | ||||
|       run_repaint_laters (&laters[i]); | ||||
|     } | ||||
|  | ||||
|   for (i = 0; i < G_N_ELEMENTS (laters); i++) | ||||
|     { | ||||
|       for (l = laters[i]; l; l = l->next) | ||||
|         { | ||||
|           MetaLater *later = l->data; | ||||
|  | ||||
|           if (later->source == 0) | ||||
|             keep_timeline_running = TRUE; | ||||
|         } | ||||
|       else | ||||
|         meta_later_remove (later->id); | ||||
|       unref_later (later); | ||||
|     } | ||||
|  | ||||
|   if (!keep_timeline_running) | ||||
|     clutter_timeline_stop (later_timeline); | ||||
|  | ||||
|   g_slist_free (laters_copy); | ||||
|  | ||||
|   /* Just keep the repaint func around - it's cheap if the list is empty */ | ||||
|   /* Just keep the repaint func around - it's cheap if the lists are empty */ | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| @@ -832,7 +850,7 @@ ensure_later_repaint_func (void) | ||||
|     later_timeline = clutter_timeline_new (G_MAXUINT); | ||||
|  | ||||
|   if (later_repaint_func == 0) | ||||
|     later_repaint_func = clutter_threads_add_repaint_func (run_repaint_laters, | ||||
|     later_repaint_func = clutter_threads_add_repaint_func (run_all_repaint_laters, | ||||
|                                                            NULL, NULL); | ||||
|  | ||||
|   /* Make sure the repaint function gets run */ | ||||
| @@ -888,7 +906,7 @@ meta_later_add (MetaLaterType  when, | ||||
|   later->data = data; | ||||
|   later->notify = notify; | ||||
|  | ||||
|   laters = g_slist_insert_sorted (laters, later, compare_laters); | ||||
|   laters[when] = g_slist_prepend (laters[when], later); | ||||
|  | ||||
|   switch (when) | ||||
|     { | ||||
| @@ -920,6 +938,29 @@ meta_later_add (MetaLaterType  when, | ||||
|   return later->id; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| meta_later_remove_from_list (guint later_id, GSList **laters_list) | ||||
| { | ||||
|   GSList *l; | ||||
|  | ||||
|   for (l = *laters_list; l; l = l->next) | ||||
|     { | ||||
|       MetaLater *later = l->data; | ||||
|  | ||||
|       if (later->id == later_id) | ||||
|         { | ||||
|           *laters_list = g_slist_delete_link (*laters_list, l); | ||||
|           /* If this was a "repaint func" later, we just let the | ||||
|            * repaint func run and get removed | ||||
|            */ | ||||
|           destroy_later (later); | ||||
|           return TRUE; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_later_remove: | ||||
|  * @later_id: the integer ID returned from meta_later_add() | ||||
| @@ -929,20 +970,12 @@ meta_later_add (MetaLaterType  when, | ||||
| void | ||||
| meta_later_remove (guint later_id) | ||||
| { | ||||
|   GSList *l; | ||||
|   guint i; | ||||
|  | ||||
|   for (l = laters; l; l = l->next) | ||||
|   for (i = 0; i < G_N_ELEMENTS (laters); i++) | ||||
|     { | ||||
|       MetaLater *later = l->data; | ||||
|       if (later->id == later_id) | ||||
|         { | ||||
|           laters = g_slist_delete_link (laters, l); | ||||
|           /* If this was a "repaint func" later, we just let the | ||||
|            * repaint func run and get removed | ||||
|            */ | ||||
|           destroy_later (later); | ||||
|           return; | ||||
|         } | ||||
|       if (meta_later_remove_from_list (later_id, &laters[i])) | ||||
|         return; | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -88,6 +88,20 @@ typedef enum | ||||
|   META_MOVE_RESIZE_RESULT_FRAME_SHAPE_CHANGED = 1 << 2, | ||||
| } MetaMoveResizeResultFlags; | ||||
|  | ||||
| /* This contains all the "state" needed for a certain size configuration. | ||||
|  * We have three of these size configurations: normal, tiled, and | ||||
|  * maximized. The idea here is that if the user tiles a normal window, | ||||
|  * then maximizes it, we should, upon unmaximizing and untiling the window, | ||||
|  * return to a normal state. We need a way of storing this information | ||||
|  * while maximized, so we use this structure. */ | ||||
| struct _MetaWindowSizeState | ||||
| { | ||||
|   guint maximized_horizontally : 1; | ||||
|   guint maximized_vertically : 1; | ||||
|   MetaRectangle rect; | ||||
| }; | ||||
| typedef struct _MetaWindowSizeState MetaWindowSizeState; | ||||
|  | ||||
| struct _MetaWindow | ||||
| { | ||||
|   GObject parent_instance; | ||||
| @@ -157,14 +171,6 @@ struct _MetaWindow | ||||
|   guint maximize_vertically_after_placement : 1; | ||||
|   guint minimize_after_placement : 1; | ||||
|  | ||||
|   /* The current or requested tile mode. If maximized_vertically is true, | ||||
|    * this is the current mode. If not, it is the mode which will be | ||||
|    * requested after the window grab is released */ | ||||
|   guint tile_mode : 2; | ||||
|   /* The last "full" maximized/unmaximized state. We need to keep track of | ||||
|    * that to toggle between normal/tiled or maximized/tiled states. */ | ||||
|   guint saved_maximize : 1; | ||||
|   int tile_monitor_number; | ||||
|   int preferred_output_winsys_id; | ||||
|  | ||||
|   /* Whether we're shaded */ | ||||
| @@ -401,9 +407,6 @@ struct _MetaWindow | ||||
|   /* The current window geometry of the window. */ | ||||
|   MetaRectangle rect; | ||||
|  | ||||
|   /* The geometry to restore when we unmaximize. */ | ||||
|   MetaRectangle saved_rect; | ||||
|  | ||||
|   /* This is the geometry the window will have if no constraints have | ||||
|    * applied. We use this whenever we are moving implicitly (for example, | ||||
|    * if we move to avoid a panel, we can snap back to this position if | ||||
| @@ -441,11 +444,16 @@ struct _MetaWindow | ||||
|   /* Focused window that is (directly or indirectly) attached to this one */ | ||||
|   MetaWindow *attached_focus_window; | ||||
|  | ||||
|   /* The currently complementary tiled window, if any */ | ||||
|   MetaWindow *tile_match; | ||||
|  | ||||
|   /* Bypass compositor hints */ | ||||
|   guint bypass_compositor; | ||||
|  | ||||
|   /* This is where we store data while in another state. The information | ||||
|    * above in MetaWindow is always the current state of the window. */ | ||||
|   struct { | ||||
|     MetaWindowSizeState normal, tiled, maximized; | ||||
|   } size_states; | ||||
|  | ||||
|   MetaDirection constrained_edges; | ||||
| }; | ||||
|  | ||||
| struct _MetaWindowClass | ||||
| @@ -492,17 +500,8 @@ struct _MetaWindowClass | ||||
|                                         (w)->maximized_vertically) | ||||
| #define META_WINDOW_MAXIMIZED_VERTICALLY(w)    ((w)->maximized_vertically) | ||||
| #define META_WINDOW_MAXIMIZED_HORIZONTALLY(w)  ((w)->maximized_horizontally) | ||||
| #define META_WINDOW_TILED_SIDE_BY_SIDE(w)      ((w)->maximized_vertically && \ | ||||
|                                                 !(w)->maximized_horizontally && \ | ||||
|                                                  (w)->tile_mode != META_TILE_NONE) | ||||
| #define META_WINDOW_TILED_LEFT(w)     (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \ | ||||
|                                        (w)->tile_mode == META_TILE_LEFT) | ||||
| #define META_WINDOW_TILED_RIGHT(w)    (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \ | ||||
|                                        (w)->tile_mode == META_TILE_RIGHT) | ||||
| #define META_WINDOW_TILED_MAXIMIZED(w)(META_WINDOW_MAXIMIZED(w) && \ | ||||
|                                        (w)->tile_mode == META_TILE_MAXIMIZED) | ||||
| #define META_WINDOW_ALLOWS_MOVE(w)     ((w)->has_move_func && !(w)->fullscreen) | ||||
| #define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w)   ((w)->has_resize_func && !META_WINDOW_MAXIMIZED (w) && !META_WINDOW_TILED_SIDE_BY_SIDE(w) && !(w)->fullscreen && !(w)->shaded) | ||||
| #define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w)   ((w)->has_resize_func && !META_WINDOW_MAXIMIZED (w) && !(w)->fullscreen && !(w)->shaded) | ||||
| #define META_WINDOW_ALLOWS_RESIZE(w)   (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) &&                \ | ||||
|                                         (((w)->size_hints.min_width < (w)->size_hints.max_width) ||  \ | ||||
|                                          ((w)->size_hints.min_height < (w)->size_hints.max_height))) | ||||
| @@ -522,7 +521,6 @@ void        meta_window_unmanage           (MetaWindow  *window, | ||||
|                                             guint32      timestamp); | ||||
| void        meta_window_queue              (MetaWindow  *window, | ||||
|                                             guint queuebits); | ||||
| void        meta_window_tile               (MetaWindow        *window); | ||||
| void        meta_window_maximize_internal  (MetaWindow        *window, | ||||
|                                             MetaMaximizeFlags  directions, | ||||
|                                             MetaRectangle     *saved_rect); | ||||
| @@ -584,11 +582,6 @@ gboolean meta_window_handle_mouse_grab_op_event  (MetaWindow         *window, | ||||
|  | ||||
| GList* meta_window_get_workspaces (MetaWindow *window); | ||||
|  | ||||
| int meta_window_get_current_tile_monitor_number (MetaWindow *window); | ||||
| void meta_window_get_current_tile_area         (MetaWindow    *window, | ||||
|                                                 MetaRectangle *tile_area); | ||||
|  | ||||
|  | ||||
| gboolean meta_window_same_application (MetaWindow *window, | ||||
|                                        MetaWindow *other_window); | ||||
|  | ||||
| @@ -626,9 +619,6 @@ void meta_window_update_for_monitors_changed (MetaWindow *window); | ||||
| void meta_window_on_all_workspaces_changed (MetaWindow *window); | ||||
|  | ||||
| gboolean meta_window_should_attach_to_parent (MetaWindow *window); | ||||
| gboolean meta_window_can_tile_side_by_side   (MetaWindow *window); | ||||
|  | ||||
| void meta_window_compute_tile_match (MetaWindow *window); | ||||
|  | ||||
| gboolean meta_window_updates_are_frozen (MetaWindow *window); | ||||
|  | ||||
| @@ -695,4 +685,7 @@ gboolean meta_window_has_pointer (MetaWindow *window); | ||||
|  | ||||
| void meta_window_emit_size_changed (MetaWindow *window); | ||||
|  | ||||
| void meta_window_toggle_tile (MetaWindow   *window, | ||||
|                               MetaTileZone  tile_zone); | ||||
|  | ||||
| #endif | ||||
|   | ||||
							
								
								
									
										1025
									
								
								src/core/window.c
									
									
									
									
									
								
							
							
						
						
									
										1025
									
								
								src/core/window.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -83,7 +83,11 @@ typedef enum | ||||
|   META_FRAME_IS_FLASHING              = 1 << 14, | ||||
|   META_FRAME_ABOVE                    = 1 << 15, | ||||
|   META_FRAME_TILED_LEFT               = 1 << 16, | ||||
|   META_FRAME_TILED_RIGHT              = 1 << 17 | ||||
|   META_FRAME_TILED_RIGHT              = 1 << 17, | ||||
|   META_FRAME_CONSTRAINED_LEFT_EDGE    = 1 << 18, | ||||
|   META_FRAME_CONSTRAINED_RIGHT_EDGE   = 1 << 19, | ||||
|   META_FRAME_CONSTRAINED_TOP_EDGE     = 1 << 20, | ||||
|   META_FRAME_CONSTRAINED_BOTTOM_EDGE  = 1 << 21, | ||||
| } MetaFrameFlags; | ||||
|  | ||||
| /** | ||||
| @@ -317,6 +321,26 @@ typedef enum | ||||
|   META_DIRECTION_VERTICAL   = META_DIRECTION_UP   | META_DIRECTION_DOWN, | ||||
| } MetaDirection; | ||||
|  | ||||
| /* Tile zones are specified in terms of their constrained edges. | ||||
|  * So, "top left corner" is top and left, which should be obvious, | ||||
|  * but "left side of the screen" is top, bottom, and left | ||||
|  */ | ||||
| typedef enum { | ||||
|   META_TILE_ZONE_MAXIMIZED_HORZ = META_DIRECTION_HORIZONTAL, | ||||
|   META_TILE_ZONE_MAXIMIZED_VERT = META_DIRECTION_VERTICAL, | ||||
|   META_TILE_ZONE_MAXIMIZED      = META_TILE_ZONE_MAXIMIZED_HORZ | META_TILE_ZONE_MAXIMIZED_VERT, | ||||
|  | ||||
|   META_TILE_ZONE_W = META_TILE_ZONE_MAXIMIZED_VERT | META_DIRECTION_LEFT, | ||||
|   META_TILE_ZONE_E = META_TILE_ZONE_MAXIMIZED_VERT | META_DIRECTION_RIGHT, | ||||
|   META_TILE_ZONE_N = META_TILE_ZONE_MAXIMIZED_HORZ | META_DIRECTION_TOP, | ||||
|   META_TILE_ZONE_S = META_TILE_ZONE_MAXIMIZED_HORZ | META_DIRECTION_BOTTOM, | ||||
|  | ||||
|   META_TILE_ZONE_NW = META_DIRECTION_TOP | META_DIRECTION_LEFT, | ||||
|   META_TILE_ZONE_NE = META_DIRECTION_TOP | META_DIRECTION_RIGHT, | ||||
|   META_TILE_ZONE_SW = META_DIRECTION_BOTTOM | META_DIRECTION_LEFT, | ||||
|   META_TILE_ZONE_SE = META_DIRECTION_BOTTOM | META_DIRECTION_RIGHT, | ||||
| } MetaTileZone; | ||||
|  | ||||
| /** | ||||
|  * MetaMotionDirection: | ||||
|  * @META_MOTION_UP: Upwards motion | ||||
| @@ -372,12 +396,6 @@ typedef enum | ||||
|  * @META_BUTTON_FUNCTION_MINIMIZE: Minimize | ||||
|  * @META_BUTTON_FUNCTION_MAXIMIZE: Maximize | ||||
|  * @META_BUTTON_FUNCTION_CLOSE: Close | ||||
|  * @META_BUTTON_FUNCTION_SHADE: Shade | ||||
|  * @META_BUTTON_FUNCTION_ABOVE: Above | ||||
|  * @META_BUTTON_FUNCTION_STICK: Stick | ||||
|  * @META_BUTTON_FUNCTION_UNSHADE: Unshade | ||||
|  * @META_BUTTON_FUNCTION_UNABOVE: Unabove | ||||
|  * @META_BUTTON_FUNCTION_UNSTICK: Unstick | ||||
|  * @META_BUTTON_FUNCTION_LAST: Marks the end of the #MetaButtonFunction enumeration | ||||
|  * | ||||
|  * Function a window button can have.  Note, you can't add stuff here | ||||
| @@ -390,12 +408,6 @@ typedef enum | ||||
|   META_BUTTON_FUNCTION_MINIMIZE, | ||||
|   META_BUTTON_FUNCTION_MAXIMIZE, | ||||
|   META_BUTTON_FUNCTION_CLOSE, | ||||
|   META_BUTTON_FUNCTION_SHADE, | ||||
|   META_BUTTON_FUNCTION_ABOVE, | ||||
|   META_BUTTON_FUNCTION_STICK, | ||||
|   META_BUTTON_FUNCTION_UNSHADE, | ||||
|   META_BUTTON_FUNCTION_UNABOVE, | ||||
|   META_BUTTON_FUNCTION_UNSTICK, | ||||
|   META_BUTTON_FUNCTION_APPMENU, | ||||
|   META_BUTTON_FUNCTION_LAST | ||||
| } MetaButtonFunction; | ||||
| @@ -405,10 +417,10 @@ typedef enum | ||||
| /* Keep array size in sync with MAX_BUTTONS_PER_CORNER */ | ||||
| /** | ||||
|  * MetaButtonLayout: | ||||
|  * @left_buttons: (array fixed-size=11): | ||||
|  * @right_buttons: (array fixed-size=11): | ||||
|  * @left_buttons_has_spacer: (array fixed-size=11): | ||||
|  * @right_buttons_has_spacer: (array fixed-size=11): | ||||
|  * @left_buttons: (array fixed-size=5): | ||||
|  * @right_buttons: (array fixed-size=5): | ||||
|  * @left_buttons_has_spacer: (array fixed-size=5): | ||||
|  * @right_buttons_has_spacer: (array fixed-size=5): | ||||
|  */ | ||||
| typedef struct _MetaButtonLayout MetaButtonLayout; | ||||
| struct _MetaButtonLayout | ||||
| @@ -532,7 +544,6 @@ void meta_frame_borders_clear (MetaFrameBorders *self); | ||||
|  * @META_LAYER_TOP: Top layer | ||||
|  * @META_LAYER_DOCK: Dock layer | ||||
|  * @META_LAYER_FULLSCREEN: Fullscreen layer | ||||
|  * @META_LAYER_FOCUSED_WINDOW: Focused window layer | ||||
|  * @META_LAYER_OVERRIDE_REDIRECT: Override-redirect layer | ||||
|  * @META_LAYER_LAST: Marks the end of the #MetaStackLayer enumeration | ||||
|  * | ||||
| @@ -547,7 +558,6 @@ typedef enum | ||||
|   META_LAYER_TOP	       = 4, /* Same as DOCK; see EWMH and bug 330717 */ | ||||
|   META_LAYER_DOCK	       = 4, | ||||
|   META_LAYER_FULLSCREEN	       = 5, | ||||
|   META_LAYER_FOCUSED_WINDOW    = 6, | ||||
|   META_LAYER_OVERRIDE_REDIRECT = 7, | ||||
|   META_LAYER_LAST	       = 8 | ||||
| } MetaStackLayer; | ||||
|   | ||||
| @@ -57,6 +57,8 @@ typedef enum | ||||
| typedef enum { | ||||
|   META_SIZE_CHANGE_MAXIMIZE, | ||||
|   META_SIZE_CHANGE_UNMAXIMIZE, | ||||
|   META_SIZE_CHANGE_FULLSCREEN, | ||||
|   META_SIZE_CHANGE_UNFULLSCREEN, | ||||
| } MetaSizeChange; | ||||
|  | ||||
| MetaCompositor *meta_compositor_new     (MetaDisplay    *display); | ||||
|   | ||||
| @@ -214,8 +214,6 @@ MetaFrameType meta_window_get_frame_type (MetaWindow *window); | ||||
|  | ||||
| cairo_region_t *meta_window_get_frame_bounds (MetaWindow *window); | ||||
|  | ||||
| MetaWindow *meta_window_get_tile_match (MetaWindow *window); | ||||
|  | ||||
| void        meta_window_make_fullscreen    (MetaWindow  *window); | ||||
| void        meta_window_unmake_fullscreen  (MetaWindow  *window); | ||||
| void        meta_window_make_above         (MetaWindow  *window); | ||||
| @@ -260,4 +258,8 @@ gboolean meta_window_is_client_decorated (MetaWindow *window); | ||||
| gboolean meta_window_titlebar_is_onscreen    (MetaWindow *window); | ||||
| void     meta_window_shove_titlebar_onscreen (MetaWindow *window); | ||||
|  | ||||
| void     meta_window_tile (MetaWindow   *window, | ||||
|                            MetaTileZone  tile_zone); | ||||
| void     meta_window_untile (MetaWindow *window); | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -9,6 +9,8 @@ | ||||
|     <method name="TakeControl"> | ||||
|       <arg name="force" type="b"/> | ||||
|     </method> | ||||
|     <method name="ReleaseControl"> | ||||
|     </method> | ||||
|     <method name="TakeDevice"> | ||||
|       <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/> | ||||
|       <arg name="major" type="u" direction="in"/> | ||||
|   | ||||
							
								
								
									
										14
									
								
								src/tests/stacking/set-parent.metatest
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/tests/stacking/set-parent.metatest
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| new_client 1 wayland | ||||
| create 1/1 | ||||
| show 1/1 | ||||
| create 1/2 | ||||
| show 1/2 | ||||
| wait | ||||
| assert_stacking 1/1 1/2 | ||||
|  | ||||
| set_parent 1/1 2 | ||||
| wait | ||||
| assert_stacking 1/2 1/1 | ||||
|  | ||||
| local_activate 1/2 | ||||
| assert_stacking 1/2 1/1 | ||||
| @@ -41,6 +41,16 @@ lookup_window (const char *window_id) | ||||
|   return window; | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_after_paint  (GdkFrameClock *clock, | ||||
|                  GMainLoop     *loop) | ||||
| { | ||||
|   g_signal_handlers_disconnect_by_func (clock, | ||||
|                                         (gpointer) on_after_paint, | ||||
|                                         loop); | ||||
|   g_main_loop_quit (loop); | ||||
| } | ||||
|  | ||||
| static void | ||||
| process_line (const char *line) | ||||
| { | ||||
| @@ -126,6 +136,31 @@ process_line (const char *line) | ||||
|         } | ||||
|  | ||||
|     } | ||||
|   else if (strcmp (argv[0], "set_parent") == 0) | ||||
|     { | ||||
|       if (argc != 3) | ||||
|         { | ||||
|           g_print ("usage: menu <window-id> <parent-id>"); | ||||
|           goto out; | ||||
|         } | ||||
|  | ||||
|       GtkWidget *window = lookup_window (argv[1]); | ||||
|       if (!window) | ||||
|         { | ||||
|           g_print ("unknown window %s", argv[1]); | ||||
|           goto out; | ||||
|         } | ||||
|  | ||||
|       GtkWidget *parent_window = lookup_window (argv[2]); | ||||
|       if (!parent_window) | ||||
|         { | ||||
|           g_print ("unknown parent window %s", argv[2]); | ||||
|           goto out; | ||||
|         } | ||||
|  | ||||
|       gtk_window_set_transient_for (GTK_WINDOW (window), | ||||
|                                     GTK_WINDOW (parent_window)); | ||||
|     } | ||||
|   else if (strcmp (argv[0], "show") == 0) | ||||
|     { | ||||
|       if (argc != 2) | ||||
| @@ -135,10 +170,25 @@ process_line (const char *line) | ||||
|         } | ||||
|  | ||||
|       GtkWidget *window = lookup_window (argv[1]); | ||||
|       GdkWindow *gdk_window = gtk_widget_get_window (window); | ||||
|       if (!window) | ||||
|         goto out; | ||||
|  | ||||
|       gtk_widget_show (window); | ||||
|  | ||||
|       /* When a Wayland client, we cannot be really sure that the window has | ||||
|        * been mappable until after we have painted. So, in order to have the | ||||
|        * test runner rely on the "show" command to have done what the client | ||||
|        * needs to do in order for a window to be mappable compositor side, lets | ||||
|        * wait with returning until after the first frame. | ||||
|        */ | ||||
|       GdkFrameClock *frame_clock = gdk_window_get_frame_clock (gdk_window); | ||||
|       GMainLoop *loop = g_main_loop_new (NULL, FALSE); | ||||
|       g_signal_connect (frame_clock, "after-paint", | ||||
|                         G_CALLBACK (on_after_paint), | ||||
|                         loop); | ||||
|       g_main_loop_run (loop); | ||||
|       g_main_loop_unref (loop); | ||||
|     } | ||||
|   else if (strcmp (argv[0], "hide") == 0) | ||||
|     { | ||||
|   | ||||
| @@ -767,6 +767,23 @@ test_case_do (TestCase *test, | ||||
|                            NULL)) | ||||
|         return FALSE; | ||||
|     } | ||||
|   else if (strcmp (argv[0], "set_parent") == 0) | ||||
|     { | ||||
|       if (argc != 3) | ||||
|         BAD_COMMAND("usage: %s <client-id>/<window-id> <parent-window-id>", | ||||
|                     argv[0]); | ||||
|  | ||||
|       TestClient *client; | ||||
|       const char *window_id; | ||||
|       if (!test_case_parse_window_id (test, argv[1], &client, &window_id, error)) | ||||
|         return FALSE; | ||||
|  | ||||
|       if (!test_client_do (client, error, | ||||
|                            "set_parent", window_id, | ||||
|                            argv[2], | ||||
|                            NULL)) | ||||
|         return FALSE; | ||||
|     } | ||||
|   else if (strcmp (argv[0], "show") == 0 || | ||||
|            strcmp (argv[0], "hide") == 0 || | ||||
|            strcmp (argv[0], "activate") == 0 || | ||||
| @@ -1119,10 +1136,10 @@ main (int argc, char **argv) | ||||
|  | ||||
|   /* Then initalize mutter with a different set of arguments */ | ||||
|  | ||||
|   char *fake_args[] = { NULL, (char *)"--wayland" }; | ||||
|   char *fake_args[] = { NULL, (char *)"--wayland", (char *)"--nested" }; | ||||
|   fake_args[0] = argv[0]; | ||||
|   char **fake_argv = fake_args; | ||||
|   int fake_argc = 2; | ||||
|   int fake_argc = G_N_ELEMENTS (fake_args); | ||||
|  | ||||
|   char *basename = g_path_get_basename (argv[0]); | ||||
|   char *dirname = g_path_get_dirname (argv[0]); | ||||
|   | ||||
							
								
								
									
										238
									
								
								src/tests/unit-tests.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										238
									
								
								src/tests/unit-tests.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,238 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2015 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/>. | ||||
|  */ | ||||
|  | ||||
| #include <glib.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include <meta/main.h> | ||||
| #include <meta/util.h> | ||||
|  | ||||
| #include "compositor/meta-plugin-manager.h" | ||||
|  | ||||
| typedef struct _MetaTestLaterOrderCallbackData | ||||
| { | ||||
|   GMainLoop *loop; /* Loop to terminate when done. */ | ||||
|   int callback_num; /* Callback number integer. */ | ||||
|   int *expected_callback_num; /* Pointer to the expected callback number. */ | ||||
| } MetaTestLaterOrderCallbackData; | ||||
|  | ||||
| static gboolean | ||||
| test_later_order_callback (gpointer user_data) | ||||
| { | ||||
|   MetaTestLaterOrderCallbackData *data = user_data; | ||||
|  | ||||
|   g_assert_cmpint (data->callback_num, ==, *data->expected_callback_num); | ||||
|  | ||||
|   if (*data->expected_callback_num == 0) | ||||
|     g_main_loop_quit (data->loop); | ||||
|   else | ||||
|     (*data->expected_callback_num)--; | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_test_util_later_order (void) | ||||
| { | ||||
|   GMainLoop *loop; | ||||
|   int expected_callback_num; | ||||
|   int i; | ||||
|   const int num_callbacks = 3; | ||||
|   MetaTestLaterOrderCallbackData callback_data[num_callbacks]; | ||||
|  | ||||
|   loop = g_main_loop_new (NULL, FALSE); | ||||
|  | ||||
|   /* Schedule three BEFORE_DRAW callbacks each with its own number associated | ||||
|    * with it. | ||||
|    */ | ||||
|   for (i = 0; i < num_callbacks; i++) | ||||
|     { | ||||
|       callback_data[i] = (MetaTestLaterOrderCallbackData) { | ||||
|         .loop = loop, | ||||
|         .callback_num = i, | ||||
|         .expected_callback_num = &expected_callback_num, | ||||
|       }; | ||||
|       meta_later_add (META_LATER_BEFORE_REDRAW, | ||||
|                       test_later_order_callback, | ||||
|                       &callback_data[i], | ||||
|                       NULL); | ||||
|     } | ||||
|  | ||||
|   /* Check that the callbacks are invoked in the opposite order that they were | ||||
|    * scheduled. Each callback will decrease the number by 1 after it checks the | ||||
|    * validity. | ||||
|    */ | ||||
|   expected_callback_num = num_callbacks - 1; | ||||
|   g_main_loop_run (loop); | ||||
|   g_assert_cmpint (expected_callback_num, ==, 0); | ||||
|   g_main_loop_unref (loop); | ||||
| } | ||||
|  | ||||
| typedef enum _MetaTestLaterScheduleFromLaterState | ||||
| { | ||||
|   META_TEST_LATER_EXPECT_CALC_SHOWING, | ||||
|   META_TEST_LATER_EXPECT_SYNC_STACK, | ||||
|   META_TEST_LATER_EXPECT_BEFORE_REDRAW, | ||||
|   META_TEST_LATER_FINISHED, | ||||
| } MetaTestLaterScheduleFromLaterState; | ||||
|  | ||||
| typedef struct _MetaTestLaterScheduleFromLaterData | ||||
| { | ||||
|   GMainLoop *loop; | ||||
|   MetaTestLaterScheduleFromLaterState state; | ||||
| } MetaTestLaterScheduleFromLaterData; | ||||
|  | ||||
| static gboolean | ||||
| test_later_schedule_from_later_sync_stack_callback (gpointer user_data); | ||||
|  | ||||
| static gboolean | ||||
| test_later_schedule_from_later_calc_showing_callback (gpointer user_data) | ||||
| { | ||||
|   MetaTestLaterScheduleFromLaterData *data = user_data; | ||||
|  | ||||
|   g_assert_cmpint (data->state, ==, META_TEST_LATER_EXPECT_CALC_SHOWING); | ||||
|  | ||||
|   meta_later_add (META_LATER_SYNC_STACK, | ||||
|                   test_later_schedule_from_later_sync_stack_callback, | ||||
|                   data, | ||||
|                   NULL); | ||||
|  | ||||
|   data->state = META_TEST_LATER_EXPECT_SYNC_STACK; | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| test_later_schedule_from_later_sync_stack_callback (gpointer user_data) | ||||
| { | ||||
|   MetaTestLaterScheduleFromLaterData *data = user_data; | ||||
|  | ||||
|   g_assert_cmpint (data->state, ==, META_TEST_LATER_EXPECT_SYNC_STACK); | ||||
|  | ||||
|   data->state = META_TEST_LATER_EXPECT_BEFORE_REDRAW; | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| test_later_schedule_from_later_before_redraw_callback (gpointer user_data) | ||||
| { | ||||
|   MetaTestLaterScheduleFromLaterData *data = user_data; | ||||
|  | ||||
|   g_assert_cmpint (data->state, ==, META_TEST_LATER_EXPECT_BEFORE_REDRAW); | ||||
|   data->state = META_TEST_LATER_FINISHED; | ||||
|   g_main_loop_quit (data->loop); | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_test_util_later_schedule_from_later (void) | ||||
| { | ||||
|   MetaTestLaterScheduleFromLaterData data; | ||||
|  | ||||
|   data.loop = g_main_loop_new (NULL, FALSE); | ||||
|  | ||||
|   /* Test that scheduling a MetaLater with 'when' being later than the one being | ||||
|    * invoked causes it to be invoked before any callback with a later 'when' | ||||
|    * value being invoked. | ||||
|    * | ||||
|    * The first and last callback is queued here. The one to be invoked in | ||||
|    * between is invoked in test_later_schedule_from_later_calc_showing_callback. | ||||
|    */ | ||||
|   meta_later_add (META_LATER_CALC_SHOWING, | ||||
|                   test_later_schedule_from_later_calc_showing_callback, | ||||
|                   &data, | ||||
|                   NULL); | ||||
|   meta_later_add (META_LATER_BEFORE_REDRAW, | ||||
|                   test_later_schedule_from_later_before_redraw_callback, | ||||
|                   &data, | ||||
|                   NULL); | ||||
|  | ||||
|   data.state = META_TEST_LATER_EXPECT_CALC_SHOWING; | ||||
|  | ||||
|   g_main_loop_run (data.loop); | ||||
|   g_main_loop_unref (data.loop); | ||||
|  | ||||
|   g_assert_cmpint (data.state, ==, META_TEST_LATER_FINISHED); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| run_tests (gpointer data) | ||||
| { | ||||
|   gboolean ret; | ||||
|  | ||||
|   ret = g_test_run (); | ||||
|  | ||||
|   meta_quit (ret != 0); | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| init_tests (int argc, char **argv) | ||||
| { | ||||
|   g_test_init (&argc, &argv, NULL); | ||||
|   g_test_bug_base ("http://bugzilla.gnome.org/show_bug.cgi?id="); | ||||
|  | ||||
|   g_test_add_func ("/util/meta-later/order", meta_test_util_later_order); | ||||
|   g_test_add_func ("/util/meta-later/schedule-from-later", | ||||
|                    meta_test_util_later_schedule_from_later); | ||||
| } | ||||
|  | ||||
| int | ||||
| main (int argc, char *argv[]) | ||||
| { | ||||
|   GOptionContext *ctx; | ||||
|   GError *error = NULL; | ||||
|  | ||||
|   ctx = g_option_context_new (NULL); | ||||
|  | ||||
|   if (!g_option_context_parse (ctx, | ||||
|                                &argc, &argv, &error)) | ||||
|     { | ||||
|       g_printerr ("%s", error->message); | ||||
|       return 1; | ||||
|     } | ||||
|  | ||||
|   g_option_context_free (ctx); | ||||
|  | ||||
|   const char *fake_args[] = { NULL, "--wayland", "--nested" }; | ||||
|   fake_args[0] = argv[0]; | ||||
|   char **fake_argv = (char**)fake_args; | ||||
|   int fake_argc = G_N_ELEMENTS (fake_args); | ||||
|  | ||||
|   ctx = meta_get_option_context (); | ||||
|   if (!g_option_context_parse (ctx, &fake_argc, &fake_argv, &error)) | ||||
|     { | ||||
|       g_printerr ("mutter: %s\n", error->message); | ||||
|       exit (1); | ||||
|     } | ||||
|   g_option_context_free (ctx); | ||||
|  | ||||
|   meta_plugin_manager_load ("default"); | ||||
|  | ||||
|   meta_init (); | ||||
|   meta_register_with_session (); | ||||
|  | ||||
|   init_tests (argc, argv); | ||||
|   g_idle_add (run_tests, NULL); | ||||
|  | ||||
|   return meta_run (); | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user