Compare commits
7 Commits
3.11.4-way
...
3.8.2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
e15792c983 | ||
![]() |
1627044c39 | ||
![]() |
5615e36112 | ||
![]() |
2c210e0e25 | ||
![]() |
1c06f0dc09 | ||
![]() |
51d98be1f2 | ||
![]() |
859d231129 |
24
.gitignore
vendored
24
.gitignore
vendored
@@ -23,7 +23,7 @@ src/50-mutter-navigation.xml
|
|||||||
src/50-mutter-system.xml
|
src/50-mutter-system.xml
|
||||||
src/50-mutter-windows.xml
|
src/50-mutter-windows.xml
|
||||||
src/mutter-wm.desktop
|
src/mutter-wm.desktop
|
||||||
src/mutter-wayland.desktop
|
src/mutter.desktop
|
||||||
*.o
|
*.o
|
||||||
*.a
|
*.a
|
||||||
*.lo
|
*.lo
|
||||||
@@ -46,13 +46,13 @@ POTFILES
|
|||||||
po/*.pot
|
po/*.pot
|
||||||
50-metacity-desktop-key.xml
|
50-metacity-desktop-key.xml
|
||||||
50-metacity-key.xml
|
50-metacity-key.xml
|
||||||
libmutter-wayland.pc
|
inlinepixbufs.h
|
||||||
mutter-wayland
|
libmutter.pc
|
||||||
mutter-launch
|
mutter
|
||||||
|
mutter-theme-viewer
|
||||||
|
mutter.desktop
|
||||||
org.gnome.mutter.gschema.valid
|
org.gnome.mutter.gschema.valid
|
||||||
org.gnome.mutter.gschema.xml
|
org.gnome.mutter.gschema.xml
|
||||||
org.gnome.mutter.wayland.gschema.valid
|
|
||||||
org.gnome.mutter.wayland.gschema.xml
|
|
||||||
testasyncgetprop
|
testasyncgetprop
|
||||||
testboxes
|
testboxes
|
||||||
testgradient
|
testgradient
|
||||||
@@ -62,7 +62,6 @@ mutter-message
|
|||||||
mutter-window-demo
|
mutter-window-demo
|
||||||
focus-window
|
focus-window
|
||||||
test-attached
|
test-attached
|
||||||
test-focus
|
|
||||||
test-gravity
|
test-gravity
|
||||||
test-resizing
|
test-resizing
|
||||||
test-size-hints
|
test-size-hints
|
||||||
@@ -75,18 +74,7 @@ src/mutter-enum-types.[ch]
|
|||||||
src/stamp-mutter-enum-types.h
|
src/stamp-mutter-enum-types.h
|
||||||
src/mutter-marshal.[ch]
|
src/mutter-marshal.[ch]
|
||||||
src/stamp-mutter-marshal.h
|
src/stamp-mutter-marshal.h
|
||||||
src/meta-dbus-xrandr.[ch]
|
|
||||||
src/meta-dbus-idle-monitor.[ch]
|
|
||||||
src/mutter-plugins.pc
|
src/mutter-plugins.pc
|
||||||
src/wayland/gtk-shell-protocol.c
|
|
||||||
src/wayland/gtk-shell-client-protocol.h
|
|
||||||
src/wayland/gtk-shell-server-protocol.h
|
|
||||||
src/wayland/xdg-shell-protocol.c
|
|
||||||
src/wayland/xdg-shell-client-protocol.h
|
|
||||||
src/wayland/xdg-shell-server-protocol.h
|
|
||||||
src/wayland/xserver-protocol.c
|
|
||||||
src/wayland/xserver-client-protocol.h
|
|
||||||
src/wayland/xserver-server-protocol.h
|
|
||||||
doc/reference/*.args
|
doc/reference/*.args
|
||||||
doc/reference/*.bak
|
doc/reference/*.bak
|
||||||
doc/reference/*.hierarchy
|
doc/reference/*.hierarchy
|
||||||
|
41
COPYING
41
COPYING
@@ -1,12 +1,12 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The licenses for most software are designed to take away your
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
|||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
@@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
0. This License applies to any program or other work which contains
|
||||||
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
|||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
|||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
@@ -225,7 +225,7 @@ impose that choice.
|
|||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
|||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
@@ -303,16 +303,17 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
You should have received a copy of the GNU General Public License
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
along with this program; if not, write to the Free Software
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program is interactive, make it output a short notice like this
|
||||||
when it starts in an interactive mode:
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
@@ -335,5 +336,5 @@ necessary. Here is a sample; alter the names:
|
|||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
library. If this is what you want to do, use the GNU Library General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
@@ -1,10 +1,8 @@
|
|||||||
|
|
||||||
SUBDIRS=src protocol po doc
|
SUBDIRS=src po doc
|
||||||
|
|
||||||
EXTRA_DIST = HACKING MAINTAINERS rationales.txt
|
EXTRA_DIST = HACKING MAINTAINERS rationales.txt
|
||||||
|
|
||||||
DISTCLEANFILES = intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache
|
DISTCLEANFILES = intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache
|
||||||
|
|
||||||
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
|
|
||||||
|
232
NEWS
232
NEWS
@@ -1,232 +1,14 @@
|
|||||||
3.11.4
|
3.8.2
|
||||||
======
|
|
||||||
* Don't leave focus on windows that are being unmanaged [Owen; #711618]
|
|
||||||
* Reduce server grabs [Daniel Drake; #721345, #721709]
|
|
||||||
* Improve heuristic to determine display output name [Cosimo Cecchi; #721674]
|
|
||||||
* Atomically unmaximize both directions [Jasper; #722108]
|
|
||||||
* Misc bug fixes [Debarshi, Andika, Florian; #721517, #721674, #722347]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Cosimo Cecchi, Daniel Drake, Florian Müllner, Debarshi Ray, Jasper St. Pierre,
|
|
||||||
Andika Triwidada, Owen W. Taylor
|
|
||||||
|
|
||||||
3.11.3
|
|
||||||
======
|
|
||||||
* Fix focus issues with external OSKs[Jasper; #715030]
|
|
||||||
* Add a MetaCullable interface [Jasper; #714706]
|
|
||||||
* Fix window keybindings [Rui; #719724]
|
|
||||||
* Fix settings keyboard/pointer focus for new clients [Rui; #719725]
|
|
||||||
* Fix window group paint volume [Owen; #719669]
|
|
||||||
* Fix frame extents problems [Owen; #714707]
|
|
||||||
* Add shortcut to move windows between monitors [Florian; #671054]
|
|
||||||
* Fix problems with focus tracking [Owen; #720558]
|
|
||||||
* Misc. bug fixes and cleanups: [Rui, Colin, Lionel, Jasper, Owen; #712833,
|
|
||||||
#719557, #719695, #719833, #678989, #720417, #720630]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Lionel Landwerlin, Rui Matos, Alberto Milone, Florian Müllner,
|
|
||||||
Jasper St. Pierre, Rico Tzschichholz, Owen W. Taylor, Colin Walters
|
|
||||||
|
|
||||||
3.11.2
|
|
||||||
======
|
|
||||||
* Support setting a NULL opaque region [Andreas; #711518]
|
|
||||||
* Sync keymap from X to wayland [Giovanni; #707446]
|
|
||||||
* Implement support for subsurfaces [Jonas; #705502]
|
|
||||||
* Don't focus the no-focus-window for globally active windows [Jasper; #710296]
|
|
||||||
* Support "hotplug_mode_update" property [Marc-André; #711216]
|
|
||||||
* Fix resize operations using mouse-button-modifier [Lionel; #710251]
|
|
||||||
* Fix position of attached modals for CSD windows [Giovanni, Owen; #707194]
|
|
||||||
* Misc. bug fixes [Rui, Jasper, Neil, Florian; #712247, #711731]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Giovanni Campagna, Andreas Heider, Lionel Landwerlin, Marc-André Lureau,
|
|
||||||
Rui Matos, Florian Müllner, Neil Roberts, Sindhu S, Jasper St. Pierre,
|
|
||||||
Rico Tzschichholz, Owen W. Taylor, Jonas Ådahl
|
|
||||||
|
|
||||||
3.11.1
|
|
||||||
======
|
|
||||||
* Fix tile previews getting stuck on right click during drags [Lionel; #704759]
|
|
||||||
* Use new UPower API [Bastien]
|
|
||||||
* Set hot spot when cursor set from wl_buffer [Jonas; #709593]
|
|
||||||
* Expose min-backlight-step [Asad; #710380]
|
|
||||||
* Misc. bug fixes and cleanups [Jasper, Olav, Magdalen; #709776]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Magdalen Berns, Lionel Landwerlin, Asad Mehmood, Bastien Nocera,
|
|
||||||
Jasper St. Pierre, Olav Vitters, Jonas Ådahl
|
|
||||||
|
|
||||||
3.10.1
|
|
||||||
======
|
|
||||||
* Don't apply fullscreen workarounds to CSD windows [Giovanni; #708718]
|
|
||||||
* Fix hangs during DND operations [Adel; #709340]
|
|
||||||
* Misc bug fixes [Dan, Giovanni, Jasper; #708813, #708420]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Giovanni Campagna, Adel Gadllah, Dan Horák, Hans Petter Jansson,
|
|
||||||
Jasper St. Pierre
|
|
||||||
|
|
||||||
3.10.0.1
|
|
||||||
========
|
|
||||||
* Fix bug when a window changed size twice in a single frame - this
|
|
||||||
can happen with GTK+ client-side decorations [Giovanni, Owen; #708367]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Giovanni Campagna, Owen Taylor
|
|
||||||
|
|
||||||
3.10.0
|
|
||||||
======
|
|
||||||
* Update dependencies [Giovanni; #708210]
|
|
||||||
|
|
||||||
3.9.92
|
|
||||||
======
|
|
||||||
* Constrain the pointer position onto visible monitors [Giovanni; #706655]
|
|
||||||
* Fix keyboard state handling in face of event compression [Giovanni; #706963]
|
|
||||||
* Extend the MetaCursorTracker API with query pointer and cursor visibility [Giovanni; #707474]
|
|
||||||
* Be stricter in checking and exposing the wayland protocol version [#707851]
|
|
||||||
* Don't require plugins to pass event to Clutter [Giovanni; #707482]
|
|
||||||
* Move the --wayland option from the binary to the library [Giovanni; #707897]
|
|
||||||
* Implement running from gnome-session (environment variable setting, process group
|
|
||||||
handling, Clutter backend variables) [Giovanni; #706421]
|
|
||||||
* Add support for more cursor types [Giovanni; #707919]
|
|
||||||
* Drop man pages for removed utilities [Kalev; #706579]
|
|
||||||
* Implement monitor configuration on KMS [Giovanni; #706308]
|
|
||||||
* Implement HW cursors [Giovanni; #707573]
|
|
||||||
* Implement minimal support for resizing and maximizing wayland clients [Giovanni; #707401]
|
|
||||||
* Implement transient hints for wayland clients [Giovanni; #707401]
|
|
||||||
* Implement popup menu surfaces and grabs [Giovanni; #707863]
|
|
||||||
* Immediately fire idle watches that are already expired [Giovanni; #707302]
|
|
||||||
* Remove holes generated by disabling the laptop lid [Giovanni; #707473]
|
|
||||||
* Misc bug fixes [Giovanni, Pavel, Adel; #707649, #706124, #707584, #707851, #707929,
|
|
||||||
#708070]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Adel Gadllah, Giovanni Campagna, Kalev Lember, Pavel Vasin
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Мирослав Николић po/sr, sr@latin.po, Мирослав Николић [sr, sr@latin],
|
|
||||||
Chao-Hsiung Liao [zh_HK, zh_TW], Yuri Myasoedov [ru],
|
|
||||||
Ville-Pekka Vainio [fi], Changwoo Ryu [ko], A S Alam [pa],
|
|
||||||
Mattias Põldaru [et], Rūdolfs Mazurs [lv], Ihar Hrachyshka [be],
|
|
||||||
Nilamdyuti Goswami [as], Andika Triwidada [id], Baurzhan Muftakhidinov [kk],
|
|
||||||
Benjamin Steinwender [de]
|
|
||||||
|
|
||||||
3.9.91
|
|
||||||
======
|
|
||||||
* Drop man pages for removed utilities [Kalev; #706579]
|
|
||||||
* Add support for idle tracking [Giovanni, Cosimo; #706005, #707250]
|
|
||||||
* Skip CRTC reconfigurations that have no effect [Giovanni; #706672]
|
|
||||||
* Ignore skip-taskbar hints on parentless dialogs [Giovanni; #673399]
|
|
||||||
* Don't save pixbuf data in user data [Tim; #706777]
|
|
||||||
* Don't queue redraws for obscured regions [Adel; #703332]
|
|
||||||
* Suppor the opaque region hints for wayland clients [Jasper; #707019]
|
|
||||||
* Turn blending off when drawing entirely opaque regions [Jasper; #707019]
|
|
||||||
* Check event timestamps before reconfiguring [Giovanni; #706735]
|
|
||||||
* Merge the DBus API for display configuration in the wayland branch [Giovanni]
|
|
||||||
* Install an X IO error handler for XWayland [Giovanni; #706962]
|
|
||||||
* Use the clutter xkbcommon integration for the wayland keyboard [Giovanni; #705862]
|
|
||||||
* Add a setuid helper for running on KMS+evdev [Giovanni, Colin; #705861]
|
|
||||||
* Add keybindings for switching VT [Giovanni; #705861]
|
|
||||||
* Implement plugin modality when running as a wayland compositor [Giovanni; #705917]
|
|
||||||
* Add support for the application menu for wayland clients [Giovanni; #707128]
|
|
||||||
* Several Coverity spotted fixes [Jasper]
|
|
||||||
* Don't create a dummy texture for the texture template [Neil; #707458]
|
|
||||||
* Use a more conservative paint volume for obscured windows [Adel]
|
|
||||||
* Misc bug fixes [Giovanni, Colin, Seán, Jasper, Cosimo; #706582, #706598,
|
|
||||||
#706787, #706729, #706825, #707081, #707090, #707267, #706982, #706289]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Giovanni Campagna, Cosimo Cecchi, Adel Gadllah, Colin Guthrie, Kalev Lember,
|
|
||||||
Tim Lunn, Jasper St. Pierre, Neil Roberts, Rico Tzschichholz, Seán de Búrca
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Piotr Drąg [pl], Alexandre Franke [fr], Kjartan Maraas [nb],
|
|
||||||
Milo Casagrande [it], Balázs Úr [hu], Seán de Búrca [ga], Fran Diéguez [gl],
|
|
||||||
Daniel Mustieles [es], Aurimas Černius [lt], Gil Forcada [ca]
|
|
||||||
|
|
||||||
3.9.90
|
|
||||||
======
|
|
||||||
* First release from the wayland branch, includes basic support for running
|
|
||||||
as a wayland compositor [Robert, Neil, Giovanni]
|
|
||||||
* Add support for _GTK_FRAME_EXTENTS [Jasper; #705766]
|
|
||||||
* Fix quick consecutive <super> presses breaking keyboard input [Alban; #666101]
|
|
||||||
* Work towards running as wayland compositor [Giovanni]
|
|
||||||
- Add DBus API for display configuration
|
|
||||||
[#705670, #706231, #706233, #706322, #706382]
|
|
||||||
- Add abstraction layer for cursor tracking [#705911]
|
|
||||||
- Add support for plugin modality under wayland [#705917]
|
|
||||||
* Disable GTK+ scaling [Alexander; #706388]
|
|
||||||
* Disable blending while updating tower [Robert]
|
|
||||||
* Misc bug fixes and cleanups [Adel, Jasper, Giovanni, Colin, Rico, Florian;
|
|
||||||
#703332, #704437, #706207]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Robert Bragg, Giovanni Campagna, Alban Crequy, Adel Gadllah,
|
|
||||||
Alexander Larsson, Florian Müllner, Jasper St. Pierre, Neil Roberts,
|
|
||||||
Rico Tzschichholz, Colin Walters
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Jiro Matsuzawa [ja], Kjartan Maraas [nb], Matej Urbančič [sl],
|
|
||||||
Marek Černocký [cs], Daniel Mustieles [es], Rafael Ferreira [pt_BR],
|
|
||||||
Yaron Shahrabani [he], Ján Kyselica [sk]
|
|
||||||
|
|
||||||
3.9.5
|
|
||||||
=====
|
|
||||||
* Don't select for touch events on the stage [Jasper; #697192]
|
|
||||||
* Don't queue redraws for obscured regions [Adel; #703332]
|
|
||||||
* Export timestamp of global keybinding events [Bastien; #704858]
|
|
||||||
* Misc bug fixes and cleanups [Jasper, Rico; #703970]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Adel Gadllah, Bastien Nocera, Jasper St. Pierre, Rico Tzschichholz
|
|
||||||
|
|
||||||
3.9.4
|
|
||||||
=====
|
|
||||||
* Tweak window shadows [Allan; #702141]
|
|
||||||
* Ignore our own focus events for focus prediction [Jasper; #701017]
|
|
||||||
* Add API to query if the stage is focused [Jasper; #700735]
|
|
||||||
* Add API to query the monitor for a given position [Adel]
|
|
||||||
* Don't force attached dialogs to be border-only [Florian; #702764]
|
|
||||||
* Allow slicing of backgrounds to avoid texture size limits [Ray; #702283]
|
|
||||||
* Miscellaneous bug fixes and cleanups [Adel; #701224, #702564]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Allan Day, Adel Gadllah, Florian Müllner, Jasper St. Pierre, Ray Strode
|
|
||||||
|
|
||||||
3.9.3
|
|
||||||
=====
|
|
||||||
* Ensure events are always reported to the grab window [Rui; #701219]
|
|
||||||
* Use new clutter_stage_set_paint_callback() function to prevent dropping
|
|
||||||
frames with frame synced toolkits [Owen; #698794]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Rui Matos, Owen W. Taylor
|
|
||||||
|
|
||||||
3.9.2
|
|
||||||
=====
|
|
||||||
* Add meta_window_can_close() function [Jasper; #699269]
|
|
||||||
* Add support for string-array preferences [Florian; #700223]
|
|
||||||
* Fix a potential race condition with _NET_WM_MOVERESIZE [Jasper; #699777]
|
|
||||||
* Fix shade window action [Stef; #693714]
|
|
||||||
* Remove overlay_group [Giovanni; #700735]
|
|
||||||
* Improve tracking of the focus window [Dan, Jasper; #647706]
|
|
||||||
* Add API to freeze/unfreeze the keyboard [Rui; #697001]
|
|
||||||
* Grab and emit a signal when XK_ISO_Next_Group is pressed [Rui; #697002]
|
|
||||||
* Misc bug fixes and cleanups [Dieter, Jasper, Rui; #699636, #700735, #697000]
|
|
||||||
|
|
||||||
Contributors:
|
|
||||||
Giovanni Campagna, Rui Matos, Florian Müllner, Jasper St. Pierre,
|
|
||||||
Dieter Verfaillie, Stef Walter, Dan Winship
|
|
||||||
|
|
||||||
Translations:
|
|
||||||
Kjartan Maraas [nb], Ján Kyselica [sk]
|
|
||||||
|
|
||||||
3.9.1
|
|
||||||
=====
|
=====
|
||||||
* Fix miscellaneous memory leaks [Pavel; #698710]
|
* Fix miscellaneous memory leaks [Pavel; #698710]
|
||||||
* Misc fixes and cleanups [Stef, Simon; #698179, #697758]
|
* Fix binding remaining grabbed after clearing all strokes [Rui; #697000]
|
||||||
|
* Misc fixes [Stef; #698179]
|
||||||
|
|
||||||
Contributors:
|
Contributors:
|
||||||
Simon McVittie, Pavel Vasin, Stef Walter
|
Rui Matos, Pavel Vasin, Stef Walter
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Kjartan Maraas [nb]
|
||||||
|
|
||||||
3.8.1
|
3.8.1
|
||||||
=====
|
=====
|
||||||
|
@@ -5,7 +5,7 @@ srcdir=`dirname $0`
|
|||||||
test -z "$srcdir" && srcdir=.
|
test -z "$srcdir" && srcdir=.
|
||||||
|
|
||||||
PKG_NAME="mutter"
|
PKG_NAME="mutter"
|
||||||
REQUIRED_AUTOMAKE_VERSION=1.13
|
REQUIRED_AUTOMAKE_VERSION=1.10
|
||||||
|
|
||||||
(test -f $srcdir/configure.ac \
|
(test -f $srcdir/configure.ac \
|
||||||
&& test -d $srcdir/src) || {
|
&& test -d $srcdir/src) || {
|
||||||
|
76
configure.ac
76
configure.ac
@@ -1,9 +1,8 @@
|
|||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.50)
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
|
||||||
|
|
||||||
m4_define([mutter_major_version], [3])
|
m4_define([mutter_major_version], [3])
|
||||||
m4_define([mutter_minor_version], [11])
|
m4_define([mutter_minor_version], [8])
|
||||||
m4_define([mutter_micro_version], [4])
|
m4_define([mutter_micro_version], [2])
|
||||||
|
|
||||||
m4_define([mutter_version],
|
m4_define([mutter_version],
|
||||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||||
@@ -16,14 +15,10 @@ AC_INIT([mutter], [mutter_version],
|
|||||||
AC_CONFIG_SRCDIR(src/core/display.c)
|
AC_CONFIG_SRCDIR(src/core/display.c)
|
||||||
AC_CONFIG_HEADERS(config.h)
|
AC_CONFIG_HEADERS(config.h)
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz tar-ustar])
|
AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar])
|
||||||
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],)
|
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],)
|
||||||
AM_MAINTAINER_MODE([enable])
|
AM_MAINTAINER_MODE([enable])
|
||||||
|
|
||||||
# Change pkglibdir and pkgdatadir to mutter-wayland instead of mutter
|
|
||||||
PACKAGE="mutter-wayland"
|
|
||||||
AC_SUBST([PACKAGE], [$PACKAGE])
|
|
||||||
|
|
||||||
MUTTER_MAJOR_VERSION=mutter_major_version
|
MUTTER_MAJOR_VERSION=mutter_major_version
|
||||||
MUTTER_MINOR_VERSION=mutter_minor_version
|
MUTTER_MINOR_VERSION=mutter_minor_version
|
||||||
MUTTER_MICRO_VERSION=mutter_micro_version
|
MUTTER_MICRO_VERSION=mutter_micro_version
|
||||||
@@ -39,7 +34,7 @@ AC_SUBST(MUTTER_PLUGIN_DIR)
|
|||||||
# Honor aclocal flags
|
# Honor aclocal flags
|
||||||
AC_SUBST(ACLOCAL_AMFLAGS, "\${ACLOCAL_FLAGS}")
|
AC_SUBST(ACLOCAL_AMFLAGS, "\${ACLOCAL_FLAGS}")
|
||||||
|
|
||||||
GETTEXT_PACKAGE=mutter-wayland
|
GETTEXT_PACKAGE=mutter
|
||||||
AC_SUBST(GETTEXT_PACKAGE)
|
AC_SUBST(GETTEXT_PACKAGE)
|
||||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain])
|
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain])
|
||||||
|
|
||||||
@@ -78,10 +73,8 @@ MUTTER_PC_MODULES="
|
|||||||
cairo >= 1.10.0
|
cairo >= 1.10.0
|
||||||
gsettings-desktop-schemas >= 3.7.3
|
gsettings-desktop-schemas >= 3.7.3
|
||||||
xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0
|
xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0
|
||||||
$CLUTTER_PACKAGE >= 1.17.1
|
$CLUTTER_PACKAGE >= 1.13.5
|
||||||
cogl-1.0 >= 1.17.1
|
cogl-1.0 >= 1.13.3
|
||||||
upower-glib >= 0.99.0
|
|
||||||
gnome-desktop-3.0
|
|
||||||
"
|
"
|
||||||
|
|
||||||
GLIB_GSETTINGS
|
GLIB_GSETTINGS
|
||||||
@@ -120,32 +113,14 @@ AC_ARG_ENABLE(shape,
|
|||||||
[disable mutter's use of the shaped window extension]),,
|
[disable mutter's use of the shaped window extension]),,
|
||||||
enable_shape=auto)
|
enable_shape=auto)
|
||||||
|
|
||||||
## Wayland support requires the xserver.xml protocol extension found in the weston
|
|
||||||
## repository but since there aren't currently established conventions for
|
|
||||||
## installing and discovering these we simply require a location to be given
|
|
||||||
## explicitly...
|
|
||||||
AC_ARG_WITH([wayland-protocols],
|
|
||||||
[AS_HELP_STRING([--with-wayland-protocols], [Location for wayland extension protocol specs])],
|
|
||||||
[
|
|
||||||
],
|
|
||||||
[])
|
|
||||||
|
|
||||||
AC_ARG_WITH([xwayland-path],
|
|
||||||
[AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])],
|
|
||||||
[XWAYLAND_PATH="$withval"],
|
|
||||||
[XWAYLAND_PATH="$bindir/Xorg"])
|
|
||||||
|
|
||||||
AM_GLIB_GNU_GETTEXT
|
AM_GLIB_GNU_GETTEXT
|
||||||
|
|
||||||
## here we get the flags we'll actually use
|
## here we get the flags we'll actually use
|
||||||
# GRegex requires Glib-2.14.0
|
# GRegex requires Glib-2.14.0
|
||||||
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
|
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
|
||||||
PKG_CHECK_MODULES(MUTTER_LAUNCH, libdrm libsystemd-login)
|
# gtk_window_set_icon_name requires gtk2+-2.6.0
|
||||||
|
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0)
|
||||||
saved_LIBS="$LIBS"
|
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0)
|
||||||
LIBS="$LIBS $MUTTER_LAUNCH"
|
|
||||||
AC_CHECK_FUNCS([sd_session_get_vt])
|
|
||||||
LIBS="$saved_LIBS"
|
|
||||||
|
|
||||||
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
# Unconditionally use this dir to avoid a circular dep with gnomecc
|
||||||
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
|
||||||
@@ -210,18 +185,20 @@ if test x$found_introspection != xno; then
|
|||||||
AC_SUBST(META_GIR)
|
AC_SUBST(META_GIR)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcursor"
|
AC_MSG_CHECKING([Xcursor])
|
||||||
|
if $PKG_CONFIG xcursor; then
|
||||||
|
have_xcursor=yes
|
||||||
|
else
|
||||||
|
have_xcursor=no
|
||||||
|
fi
|
||||||
|
AC_MSG_RESULT($have_xcursor)
|
||||||
|
|
||||||
# We always build with wayland enabled
|
if test x$have_xcursor = xyes; then
|
||||||
AC_DEFINE(HAVE_WAYLAND, , [Building with Wayland support])
|
echo "Building with Xcursor"
|
||||||
|
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcursor"
|
||||||
|
AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support])
|
||||||
|
fi
|
||||||
|
|
||||||
AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no])
|
|
||||||
AS_IF([test "x$WAYLAND_SCANNER" = "xno"],
|
|
||||||
AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols]))
|
|
||||||
AC_SUBST([WAYLAND_SCANNER])
|
|
||||||
AC_SUBST(XWAYLAND_PATH)
|
|
||||||
|
|
||||||
MUTTER_PC_MODULES="$MUTTER_PC_MODULES clutter-wayland-1.0 clutter-wayland-compositor-1.0 clutter-egl-1.0 wayland-server libdrm"
|
|
||||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||||
|
|
||||||
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
PKG_CHECK_EXISTS([xi >= 1.6.99.1],
|
||||||
@@ -330,6 +307,9 @@ if test "x$found_xsync" = "xyes"; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
MUTTER_LIBS="$MUTTER_LIBS $XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
MUTTER_LIBS="$MUTTER_LIBS $XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||||
|
MUTTER_MESSAGE_LIBS="$MUTTER_MESSAGE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||||
|
MUTTER_WINDOW_DEMO_LIBS="$MUTTER_WINDOW_DEMO_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm"
|
||||||
|
MUTTER_PROPS_LIBS="$MUTTER_PROPS_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||||
|
|
||||||
found_sm=no
|
found_sm=no
|
||||||
case "$MUTTER_LIBS" in
|
case "$MUTTER_LIBS" in
|
||||||
@@ -459,9 +439,11 @@ doc/man/Makefile
|
|||||||
doc/reference/Makefile
|
doc/reference/Makefile
|
||||||
doc/reference/meta-docs.sgml
|
doc/reference/meta-docs.sgml
|
||||||
src/Makefile
|
src/Makefile
|
||||||
src/libmutter-wayland.pc
|
src/wm-tester/Makefile
|
||||||
|
src/libmutter.pc
|
||||||
|
src/mutter-plugins.pc
|
||||||
|
src/tools/Makefile
|
||||||
src/compositor/plugins/Makefile
|
src/compositor/plugins/Makefile
|
||||||
protocol/Makefile
|
|
||||||
po/Makefile.in
|
po/Makefile.in
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -477,7 +459,7 @@ fi
|
|||||||
|
|
||||||
dnl ==========================================================================
|
dnl ==========================================================================
|
||||||
echo "
|
echo "
|
||||||
mutter-wayland-$VERSION
|
mutter-$VERSION
|
||||||
|
|
||||||
prefix: ${prefix}
|
prefix: ${prefix}
|
||||||
source code location: ${srcdir}
|
source code location: ${srcdir}
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
man_MANS = mutter.1
|
man_MANS = mutter.1 mutter-theme-viewer.1 \
|
||||||
|
mutter-window-demo.1 mutter-message.1
|
||||||
|
|
||||||
EXTRA_DIST = $(man_MANS)
|
EXTRA_DIST = $(man_MANS)
|
||||||
|
60
doc/man/mutter-message.1
Normal file
60
doc/man/mutter-message.1
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
.\" Hey, EMACS: -*- nroff -*-
|
||||||
|
.\" First parameter, NAME, should be all caps
|
||||||
|
.\" Second parameter, SECTION, should be 1-8, maybe w/ subsection
|
||||||
|
.\" other parameters are allowed: see man(7), man(1)
|
||||||
|
.\" -----
|
||||||
|
.\" This file was confirmed to be licenced under the GPL
|
||||||
|
.\" by its author and copyright holder, Akira TAGOH, on June 1st 2008:
|
||||||
|
.\"
|
||||||
|
.\" > I'm comfortable with DFSG-free. that sounds great if you think it's
|
||||||
|
.\" > useful and worth containing it in upstream.
|
||||||
|
.\" ...
|
||||||
|
.\" > Right I know. any licenses that is DFSG-free, I'm ok with whatever,
|
||||||
|
.\" > since I have contributed that for Debian. so GPL is no problem for me.
|
||||||
|
.\" -----
|
||||||
|
.TH MUTTER\-MESSAGE 1 "28 August 2002"
|
||||||
|
.\" Please adjust this date whenever revising the manpage.
|
||||||
|
.\"
|
||||||
|
.\" Some roff macros, for reference:
|
||||||
|
.\" .nh disable hyphenation
|
||||||
|
.\" .hy enable hyphenation
|
||||||
|
.\" .ad l left justify
|
||||||
|
.\" .ad b justify to both left and right margins
|
||||||
|
.\" .nf disable filling
|
||||||
|
.\" .fi enable filling
|
||||||
|
.\" .br insert line break
|
||||||
|
.\" .sp <n> insert n+1 empty lines
|
||||||
|
.\" for manpage-specific macros, see man(7)
|
||||||
|
.SH NAME
|
||||||
|
MUTTER\-MESSAGE \- a command to send a message to Mutter
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B MUTTER\-MESSAGE
|
||||||
|
[restart|reload\-theme|enable\-keybindings|disable\-keybindings]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This manual page documents briefly the
|
||||||
|
.B mutter\-message\fP.
|
||||||
|
This manual page was written for the Debian distribution
|
||||||
|
because the original program does not have a manual page.
|
||||||
|
.PP
|
||||||
|
.\" TeX users may be more comfortable with the \fB<whatever>\fP and
|
||||||
|
.\" \fI<whatever>\fP escape sequences to invode bold face and italics,
|
||||||
|
.\" respectively.
|
||||||
|
\fBmutter\-message\fP send a specified message to \fBmutter\fP(1).
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.B restart
|
||||||
|
Restart \fBmutter\fP(1) which is running.
|
||||||
|
.TP
|
||||||
|
.B reload-theme
|
||||||
|
Reload a theme which is specified on gsettings database.
|
||||||
|
.TP
|
||||||
|
.B enable-keybindings
|
||||||
|
Enable all of keybindings which is specified on gsettings database.
|
||||||
|
.TP
|
||||||
|
.B disable-keybindings
|
||||||
|
Disable all of keybindings which is specified on gsettings database.
|
||||||
|
.SH SEE ALSO
|
||||||
|
.BR mutter (1)
|
||||||
|
.SH AUTHOR
|
||||||
|
This manual page was written by Akira TAGOH <tagoh@debian.org>,
|
||||||
|
for the Debian GNU/Linux system (but may be used by others).
|
43
doc/man/mutter-theme-viewer.1
Normal file
43
doc/man/mutter-theme-viewer.1
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection
|
||||||
|
.\" other parms are allowed: see man(7), man(1)
|
||||||
|
.\"
|
||||||
|
.\" Based on template provided by Tom Christiansen <tchrist@jhereg.perl.com>.
|
||||||
|
.\"
|
||||||
|
.TH MUTTER-THEME-VIEWER 1 "1 June 2004"
|
||||||
|
.SH NAME
|
||||||
|
mutter-theme-viewer \- view mutter themes
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B mutter-theme-viewer
|
||||||
|
[
|
||||||
|
.I THEMENAME
|
||||||
|
]
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.\" Putting a newline after each sentence can generate better output.
|
||||||
|
.B mutter-theme-viewer
|
||||||
|
allows you to preview any installed Mutter theme.
|
||||||
|
.PP
|
||||||
|
When designing a new Mutter theme, you can use
|
||||||
|
.B mutter-theme-viewer
|
||||||
|
to measure the performance of a window frame option, and to preview
|
||||||
|
the option.
|
||||||
|
.SH OPTIONS
|
||||||
|
.TP
|
||||||
|
.I THEMENAME
|
||||||
|
Name of the theme to be shown (\fIAtlanta\fR by default).
|
||||||
|
It is case-sensitive.
|
||||||
|
.SH FILES
|
||||||
|
.br
|
||||||
|
.nf
|
||||||
|
.TP
|
||||||
|
.I /usr/share/themes
|
||||||
|
system themes directory
|
||||||
|
.TP
|
||||||
|
.I /usr/share/themes/*/mutter-1/mutter-theme-1.xml
|
||||||
|
theme specification file
|
||||||
|
.SH AUTHOR
|
||||||
|
This manual page was written by Jose M. Moya <josem@die.upm.es>, for
|
||||||
|
the Debian GNU/Linux system (but may be used by others).
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.\" Always quote multiple words for .SH
|
||||||
|
.BR mutter (1),
|
||||||
|
.BR mutter-window-demo (1).
|
25
doc/man/mutter-window-demo.1
Normal file
25
doc/man/mutter-window-demo.1
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection
|
||||||
|
.\" other parms are allowed: see man(7), man(1)
|
||||||
|
.\"
|
||||||
|
.\" Based on template provided by Tom Christiansen <tchrist@jhereg.perl.com>.
|
||||||
|
.\"
|
||||||
|
.TH MUTTER-WINDOW-DEMO 1 "1 June 2004"
|
||||||
|
.SH NAME
|
||||||
|
mutter-window-demo \- demo of window features
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B mutter-window-demo
|
||||||
|
.SH DESCRIPTION
|
||||||
|
.\" Putting a newline after each sentence can generate better output.
|
||||||
|
This program demonstrates various kinds of windows that window
|
||||||
|
managers and window manager themes should handle.
|
||||||
|
.PP
|
||||||
|
Be sure to tear off the menu and toolbar, those are also a special
|
||||||
|
kind of window.
|
||||||
|
.SH AUTHOR
|
||||||
|
This manual page was written by Jose M. Moya <josem@die.upm.es>, for
|
||||||
|
the Debian GNU/Linux system (but may be used by others).
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
.\" Always quote multiple words for .SH
|
||||||
|
.BR x-window-manager (1),
|
||||||
|
.BR mutter (1),
|
||||||
|
.BR mutter-theme-viewer (1).
|
@@ -49,8 +49,8 @@ FIXXREF_OPTIONS=
|
|||||||
# Used for dependencies. The docs will be rebuilt if any of these change.
|
# Used for dependencies. The docs will be rebuilt if any of these change.
|
||||||
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
# e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h
|
||||||
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
# e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c
|
||||||
HFILE_GLOB=$(top_srcdir)/src/*/*.h
|
HFILE_GLOB=$(top_srcdir)/src/*.h
|
||||||
CFILE_GLOB=$(top_srcdir)/src/*/*.c
|
CFILE_GLOB=$(top_srcdir)/src/*.c
|
||||||
|
|
||||||
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
# Extra header to include when scanning, which are not under DOC_SOURCE_DIR
|
||||||
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
# e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h
|
||||||
@@ -140,7 +140,7 @@ expand_content_files= \
|
|||||||
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
# e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS)
|
||||||
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
# e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib)
|
||||||
GTKDOC_CFLAGS=$(MUTTER_CFLAGS)
|
GTKDOC_CFLAGS=$(MUTTER_CFLAGS)
|
||||||
GTKDOC_LIBS=$(MUTTER_LIBS) $(top_builddir)/src/libmutter-wayland.la
|
GTKDOC_LIBS=$(MUTTER_LIBS) $(top_builddir)/src/libmutter.la
|
||||||
|
|
||||||
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
# This includes the standard gtk-doc make rules, copied by gtkdocize.
|
||||||
include $(top_srcdir)/gtk-doc.make
|
include $(top_srcdir)/gtk-doc.make
|
||||||
|
@@ -207,6 +207,7 @@ meta_key_binding_get_modifiers
|
|||||||
meta_key_binding_get_mask
|
meta_key_binding_get_mask
|
||||||
meta_key_binding_is_builtin
|
meta_key_binding_is_builtin
|
||||||
meta_keybindings_set_custom_handler
|
meta_keybindings_set_custom_handler
|
||||||
|
meta_keybindings_switch_window
|
||||||
meta_screen_ungrab_all_keys
|
meta_screen_ungrab_all_keys
|
||||||
meta_screen_grab_all_keys
|
meta_screen_grab_all_keys
|
||||||
</SECTION>
|
</SECTION>
|
||||||
@@ -388,23 +389,6 @@ MetaWindowActorPrivate
|
|||||||
meta_window_actor_get_type
|
meta_window_actor_get_type
|
||||||
</SECTION>
|
</SECTION>
|
||||||
|
|
||||||
<SECTION>
|
|
||||||
<FILE>meta-cullable</FILE>
|
|
||||||
<TITLE>MetaCullable</TITLE>
|
|
||||||
MetaCullable
|
|
||||||
MetaCullableInterface
|
|
||||||
meta_cullable_cull_out
|
|
||||||
meta_cullable_reset_culling
|
|
||||||
meta_cullable_cull_out_children
|
|
||||||
meta_cullable_reset_culling_children
|
|
||||||
<SUBSECTION Standard>
|
|
||||||
META_TYPE_CULLABLE
|
|
||||||
META_CULLABLE
|
|
||||||
META_IS_CULLABLE
|
|
||||||
META_CULLABLE_GET_IFACE
|
|
||||||
meta_cullable_get_type
|
|
||||||
</SECTION>
|
|
||||||
|
|
||||||
<SECTION>
|
<SECTION>
|
||||||
<FILE>prefs</FILE>
|
<FILE>prefs</FILE>
|
||||||
MetaPreference
|
MetaPreference
|
||||||
@@ -425,6 +409,7 @@ meta_prefs_get_theme
|
|||||||
meta_prefs_get_titlebar_font
|
meta_prefs_get_titlebar_font
|
||||||
meta_prefs_get_num_workspaces
|
meta_prefs_get_num_workspaces
|
||||||
meta_prefs_get_dynamic_workspaces
|
meta_prefs_get_dynamic_workspaces
|
||||||
|
meta_prefs_get_application_based
|
||||||
meta_prefs_get_disable_workarounds
|
meta_prefs_get_disable_workarounds
|
||||||
meta_prefs_get_auto_raise
|
meta_prefs_get_auto_raise
|
||||||
meta_prefs_get_auto_raise_delay
|
meta_prefs_get_auto_raise_delay
|
||||||
@@ -558,10 +543,7 @@ meta_window_is_override_redirect
|
|||||||
meta_window_is_skip_taskbar
|
meta_window_is_skip_taskbar
|
||||||
meta_window_get_rect
|
meta_window_get_rect
|
||||||
meta_window_get_input_rect
|
meta_window_get_input_rect
|
||||||
meta_window_get_frame_rect
|
|
||||||
meta_window_get_outer_rect
|
meta_window_get_outer_rect
|
||||||
meta_window_client_rect_to_frame_rect
|
|
||||||
meta_window_frame_rect_to_client_rect
|
|
||||||
meta_window_get_screen
|
meta_window_get_screen
|
||||||
meta_window_get_display
|
meta_window_get_display
|
||||||
meta_window_get_xwindow
|
meta_window_get_xwindow
|
||||||
|
@@ -21,7 +21,6 @@ environment.</description>
|
|||||||
-->
|
-->
|
||||||
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
|
||||||
<download-page rdf:resource="http://download.gnome.org/sources/mutter/" />
|
<download-page rdf:resource="http://download.gnome.org/sources/mutter/" />
|
||||||
<download-page rdf:resource="http://download.gnome.org/sources/mutter-wayland/" />
|
|
||||||
<bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=mutter" />
|
<bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=mutter" />
|
||||||
|
|
||||||
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
|
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
|
||||||
|
@@ -44,7 +44,6 @@ is
|
|||||||
it
|
it
|
||||||
ja
|
ja
|
||||||
ka
|
ka
|
||||||
kk
|
|
||||||
kn
|
kn
|
||||||
ko
|
ko
|
||||||
ku
|
ku
|
||||||
|
@@ -12,7 +12,6 @@ src/core/display.c
|
|||||||
src/core/errors.c
|
src/core/errors.c
|
||||||
src/core/keybindings.c
|
src/core/keybindings.c
|
||||||
src/core/main.c
|
src/core/main.c
|
||||||
src/core/monitor.c
|
|
||||||
src/core/mutter.c
|
src/core/mutter.c
|
||||||
src/core/prefs.c
|
src/core/prefs.c
|
||||||
src/core/screen.c
|
src/core/screen.c
|
||||||
@@ -21,12 +20,15 @@ src/core/util.c
|
|||||||
src/core/window.c
|
src/core/window.c
|
||||||
src/core/window-props.c
|
src/core/window-props.c
|
||||||
src/core/xprops.c
|
src/core/xprops.c
|
||||||
src/mutter-wayland.desktop.in
|
src/mutter.desktop.in
|
||||||
|
src/mutter-wm.desktop.in
|
||||||
src/org.gnome.mutter.gschema.xml.in
|
src/org.gnome.mutter.gschema.xml.in
|
||||||
src/org.gnome.mutter.wayland.gschema.xml.in
|
src/tools/mutter-message.c
|
||||||
src/ui/frames.c
|
src/ui/frames.c
|
||||||
src/ui/menu.c
|
src/ui/menu.c
|
||||||
src/ui/metaaccellabel.c
|
src/ui/metaaccellabel.c
|
||||||
src/ui/resizepopup.c
|
src/ui/resizepopup.c
|
||||||
src/ui/theme.c
|
src/ui/theme.c
|
||||||
src/ui/theme-parser.c
|
src/ui/theme-parser.c
|
||||||
|
src/ui/theme-viewer.c
|
||||||
|
|
||||||
|
441
po/be.po
441
po/be.po
@@ -1,10 +1,10 @@
|
|||||||
# Ihar Hrachyshka <ihar.hrachyshka@gmail.com>, 2011, 2013.
|
# Ihar Hrachyshka <ihar.hrachyshka@gmail.com>, 2011.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter.master\n"
|
"Project-Id-Version: mutter.master\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
"POT-Creation-Date: 2013-03-01 15:50+0000\n"
|
||||||
"PO-Revision-Date: 2012-10-13 17:44+0300\n"
|
"PO-Revision-Date: 2012-10-13 17:44+0300\n"
|
||||||
"Last-Translator: Ігар Грачышка <ihar.hrachyshka@gmail.com>\n"
|
"Last-Translator: Ігар Грачышка <ihar.hrachyshka@gmail.com>\n"
|
||||||
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
|
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
|
||||||
@@ -206,7 +206,7 @@ msgstr "Падзяліць прагляд справа"
|
|||||||
|
|
||||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||||
#. * we have no way to get it to exit
|
#. * we have no way to get it to exit
|
||||||
#: ../src/compositor/compositor.c:589
|
#: ../src/compositor/compositor.c:507
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Another compositing manager is already running on screen %i on display \"%s"
|
"Another compositing manager is already running on screen %i on display \"%s"
|
||||||
@@ -214,11 +214,11 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Іншы кампазітны кіраўнік вокнаў ужо абслугоўвае экран %i дысплея \"%s\"."
|
"Іншы кампазітны кіраўнік вокнаў ужо абслугоўвае экран %i дысплея \"%s\"."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1076
|
#: ../src/compositor/meta-background.c:1111
|
||||||
msgid "background texture could not be created from file"
|
msgid "background texture could not be created from file"
|
||||||
msgstr "не ўдалося стварыць фонавую тэкстуру з файла"
|
msgstr "не ўдалося стварыць фонавую тэкстуру з файла"
|
||||||
|
|
||||||
#: ../src/core/bell.c:322
|
#: ../src/core/bell.c:320
|
||||||
msgid "Bell event"
|
msgid "Bell event"
|
||||||
msgstr "Падзея з сігналам"
|
msgstr "Падзея з сігналам"
|
||||||
|
|
||||||
@@ -251,18 +251,18 @@ msgstr "_Пачакаць"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Змусіць да выхаду"
|
msgstr "_Змусіць да выхаду"
|
||||||
|
|
||||||
#: ../src/core/display.c:421
|
#: ../src/core/display.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Адсутнічае пашырэнне \"%s\", патрэбнае для ажыццяўлення кампазітнага вываду"
|
"Адсутнічае пашырэнне \"%s\", патрэбнае для ажыццяўлення кампазітнага вываду"
|
||||||
|
|
||||||
#: ../src/core/display.c:513
|
#: ../src/core/display.c:493
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "Не ўдалося адкрыць X-дысплей аконнай сістэмы \"%s\"\n"
|
msgstr "Не ўдалося адкрыць X-дысплей аконнай сістэмы \"%s\"\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1136
|
#: ../src/core/keybindings.c:929
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Some other program is already using the key %s with modifiers %x as a "
|
"Some other program is already using the key %s with modifiers %x as a "
|
||||||
@@ -271,41 +271,41 @@ msgstr ""
|
|||||||
"Нейкая іншая праграма ўжо выкарыстоўвае як скарот клавішу %s з "
|
"Нейкая іншая праграма ўжо выкарыстоўвае як скарот клавішу %s з "
|
||||||
"мадыфікатарамі %x\n"
|
"мадыфікатарамі %x\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1333
|
#: ../src/core/keybindings.c:1129
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "\"%s\" - гэта хібны клавіятурны скарот\n"
|
msgstr "\"%s\" - гэта хібны клавіятурны скарот\n"
|
||||||
|
|
||||||
#: ../src/core/main.c:197
|
#: ../src/core/main.c:196
|
||||||
msgid "Disable connection to session manager"
|
msgid "Disable connection to session manager"
|
||||||
msgstr "Выключыць злучэнне з кіраўніком сеансаў"
|
msgstr "Выключыць злучэнне з кіраўніком сеансаў"
|
||||||
|
|
||||||
#: ../src/core/main.c:203
|
#: ../src/core/main.c:202
|
||||||
msgid "Replace the running window manager"
|
msgid "Replace the running window manager"
|
||||||
msgstr "Замяніць дзейнага кіраўніка вокнаў"
|
msgstr "Замяніць дзейнага кіраўніка вокнаў"
|
||||||
|
|
||||||
#: ../src/core/main.c:209
|
#: ../src/core/main.c:208
|
||||||
msgid "Specify session management ID"
|
msgid "Specify session management ID"
|
||||||
msgstr "Вызначыць ідэнтыфікатар для кіравання сеансам"
|
msgstr "Вызначыць ідэнтыфікатар для кіравання сеансам"
|
||||||
|
|
||||||
#: ../src/core/main.c:214
|
#: ../src/core/main.c:213
|
||||||
msgid "X Display to use"
|
msgid "X Display to use"
|
||||||
msgstr "Патрэбны X-дысплей"
|
msgstr "Патрэбны X-дысплей"
|
||||||
|
|
||||||
#: ../src/core/main.c:220
|
#: ../src/core/main.c:219
|
||||||
msgid "Initialize session from savefile"
|
msgid "Initialize session from savefile"
|
||||||
msgstr "Ініцыяваць сеанс з файла"
|
msgstr "Ініцыяваць сеанс з файла"
|
||||||
|
|
||||||
#: ../src/core/main.c:226
|
#: ../src/core/main.c:225
|
||||||
msgid "Make X calls synchronous"
|
msgid "Make X calls synchronous"
|
||||||
msgstr "Сінхронна выконваць выклікі X-сістэмы"
|
msgstr "Сінхронна выконваць выклікі X-сістэмы"
|
||||||
|
|
||||||
#: ../src/core/main.c:534
|
#: ../src/core/main.c:494
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to scan themes directory: %s\n"
|
msgid "Failed to scan themes directory: %s\n"
|
||||||
msgstr "Не ўдалося праглядзець каталог з матывамі аздаблення: %s\n"
|
msgstr "Не ўдалося праглядзець каталог з матывамі аздаблення: %s\n"
|
||||||
|
|
||||||
#: ../src/core/main.c:550
|
#: ../src/core/main.c:510
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||||
@@ -313,19 +313,6 @@ msgstr ""
|
|||||||
"Не ўдалося адшукаць матыў аздаблення! Праверце, каб каталог %s існаваў і "
|
"Не ўдалося адшукаць матыў аздаблення! Праверце, каб каталог %s існаваў і "
|
||||||
"змяшчаў звычайныя матывы.\n"
|
"змяшчаў звычайныя матывы.\n"
|
||||||
|
|
||||||
#: ../src/core/monitor.c:711
|
|
||||||
msgid "Built-in display"
|
|
||||||
msgstr "Убудаваны дысплей"
|
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor name (in case we don't know
|
|
||||||
#. the vendor), it's Unknown followed by a size in inches,
|
|
||||||
#. like 'Unknown 15"'
|
|
||||||
#.
|
|
||||||
#: ../src/core/monitor.c:739
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown %s"
|
|
||||||
msgstr "Невядомы %s"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -350,7 +337,7 @@ msgstr "Вывесці нумар версіі праграмы"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Патрэбны плугін Mutter"
|
msgstr "Патрэбны плугін Mutter"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1202
|
#: ../src/core/prefs.c:1087
|
||||||
msgid ""
|
msgid ""
|
||||||
"Workarounds for broken applications disabled. Some applications may not "
|
"Workarounds for broken applications disabled. Some applications may not "
|
||||||
"behave properly.\n"
|
"behave properly.\n"
|
||||||
@@ -358,12 +345,12 @@ msgstr ""
|
|||||||
"Асаблівыя паводзіны для некаторых хібных праграм выключаныя. Некаторыя "
|
"Асаблівыя паводзіны для некаторых хібных праграм выключаныя. Некаторыя "
|
||||||
"праграмы могуць перастаць працаваць, як мае быць.\n"
|
"праграмы могуць перастаць працаваць, як мае быць.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1277
|
#: ../src/core/prefs.c:1162
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "Не ўдалося разабраць азначэнне шрыфту \"%s\" з GSettings-ключа %s\n"
|
msgstr "Не ўдалося разабраць азначэнне шрыфту \"%s\" з GSettings-ключа %s\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1343
|
#: ../src/core/prefs.c:1228
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||||
@@ -372,7 +359,7 @@ msgstr ""
|
|||||||
"Значэнне \"%s\", знойдзенае ў базе канфігурацыйных даных, не азначае "
|
"Значэнне \"%s\", знойдзенае ў базе канфігурацыйных даных, не азначае "
|
||||||
"мадыфікатар мышынай кнопкі\n"
|
"мадыфікатар мышынай кнопкі\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1909
|
#: ../src/core/prefs.c:1780
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||||
@@ -381,17 +368,17 @@ msgstr ""
|
|||||||
"Значэнне \"%s\", знойдзенае ў базе канфігурацыйных даных, не азначае "
|
"Значэнне \"%s\", знойдзенае ў базе канфігурацыйных даных, не азначае "
|
||||||
"клавіятурны скарот \"%s\"\n"
|
"клавіятурны скарот \"%s\"\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1999
|
#: ../src/core/prefs.c:1879
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Прастора працы %d"
|
msgstr "Прастора працы %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:534
|
#: ../src/core/screen.c:673
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "Экран %d на дысплеі \"%s\" хібны\n"
|
msgstr "Экран %d на дысплеі \"%s\" хібны\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:550
|
#: ../src/core/screen.c:689
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||||
@@ -400,19 +387,19 @@ msgstr ""
|
|||||||
"Экран %d на дысплеі \"%s\" ужо мае аконнага кіраўніка. Каб замяніць яго "
|
"Экран %d на дысплеі \"%s\" ужо мае аконнага кіраўніка. Каб замяніць яго "
|
||||||
"новым, дадайце опцыю --replace.\n"
|
"новым, дадайце опцыю --replace.\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:577
|
#: ../src/core/screen.c:716
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Не ўдалося пераняць вылучэнне кіраўніка вокнаў для экрана %d дысплея \"%s\"\n"
|
"Не ўдалося пераняць вылучэнне кіраўніка вокнаў для экрана %d дысплея \"%s\"\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:655
|
#: ../src/core/screen.c:794
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
msgstr "Экран %d на дысплеі \"%s\" ужо мае кіраўніка вокнаў\n"
|
msgstr "Экран %d на дысплеі \"%s\" ужо мае кіраўніка вокнаў\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:846
|
#: ../src/core/screen.c:979
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not release screen %d on display \"%s\"\n"
|
msgid "Could not release screen %d on display \"%s\"\n"
|
||||||
msgstr "Не ўдалося вызваліць экран %d на дысплеі \"%s\"\n"
|
msgstr "Не ўдалося вызваліць экран %d на дысплеі \"%s\"\n"
|
||||||
@@ -473,45 +460,46 @@ msgstr ""
|
|||||||
"Гэтыя вокны не падтрымліваюць функцыі захавання дзейнага ладу працы, і таму "
|
"Гэтыя вокны не падтрымліваюць функцыі захавання дзейнага ладу працы, і таму "
|
||||||
"іх прыйдзецца запусціць уручную пасля наступнага ўваходу ў сістэму."
|
"іх прыйдзецца запусціць уручную пасля наступнага ўваходу ў сістэму."
|
||||||
|
|
||||||
#: ../src/core/util.c:84
|
#: ../src/core/util.c:80
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open debug log: %s\n"
|
msgid "Failed to open debug log: %s\n"
|
||||||
msgstr "Не ўдалося адкрыць адладачны журнал: %s\n"
|
msgstr "Не ўдалося адкрыць адладачны журнал: %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:94
|
#: ../src/core/util.c:90
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to fdopen() log file %s: %s\n"
|
msgid "Failed to fdopen() log file %s: %s\n"
|
||||||
msgstr "Не ўдалося выканаць fdopen() для журнальнага файла %s: %s\n"
|
msgstr "Не ўдалося выканаць fdopen() для журнальнага файла %s: %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:100
|
#: ../src/core/util.c:96
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "Журнальны файл %s адкрыты\n"
|
msgstr "Журнальны файл %s адкрыты\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:119
|
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
|
||||||
|
#, c-format
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Праграма \"Mutter\" была скампіляваная без падтрымкі падрабязнага "
|
"Праграма \"Mutter\" была скампіляваная без падтрымкі падрабязнага "
|
||||||
"пратакаліравання\n"
|
"пратакаліравання\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:264
|
#: ../src/core/util.c:259
|
||||||
msgid "Window manager: "
|
msgid "Window manager: "
|
||||||
msgstr "Кіраўнік вокнаў: "
|
msgstr "Кіраўнік вокнаў: "
|
||||||
|
|
||||||
#: ../src/core/util.c:414
|
#: ../src/core/util.c:407
|
||||||
msgid "Bug in window manager: "
|
msgid "Bug in window manager: "
|
||||||
msgstr "Хіба ў кіраўніку вокнаў: "
|
msgstr "Хіба ў кіраўніку вокнаў: "
|
||||||
|
|
||||||
#: ../src/core/util.c:445
|
#: ../src/core/util.c:438
|
||||||
msgid "Window manager warning: "
|
msgid "Window manager warning: "
|
||||||
msgstr "Перасцярога ад кіраўніка вокнаў: "
|
msgstr "Перасцярога ад кіраўніка вокнаў: "
|
||||||
|
|
||||||
#: ../src/core/util.c:473
|
#: ../src/core/util.c:466
|
||||||
msgid "Window manager error: "
|
msgid "Window manager error: "
|
||||||
msgstr "Памылка кіраўніка вокнаў: "
|
msgstr "Памылка кіраўніка вокнаў: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7533
|
#: ../src/core/window.c:7539
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||||
@@ -527,7 +515,7 @@ msgstr ""
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8257
|
#: ../src/core/window.c:8263
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||||
@@ -537,22 +525,22 @@ msgstr ""
|
|||||||
"памеру, але разам з гэтым прызначыла для сябе мінімальны памер %d x %d і "
|
"памеру, але разам з гэтым прызначыла для сябе мінімальны памер %d x %d і "
|
||||||
"максімальны памер %d x %d. Такія паводзіны не маюць сэнсу.\n"
|
"максімальны памер %d x %d. Такія паводзіны не маюць сэнсу.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:347
|
#: ../src/core/window-props.c:318
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||||
msgstr "Праграма прызначыла памылковае значэнне _NET_WM_PID %lu\n"
|
msgstr "Праграма прызначыла памылковае значэнне _NET_WM_PID %lu\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:463
|
#: ../src/core/window-props.c:434
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (на %s)"
|
msgstr "%s (на %s)"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1546
|
#: ../src/core/window-props.c:1517
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||||
msgstr "Для %2$s вызначана хібнае акно WM_TRANSIENT_FOR 0x%1$lx.\n"
|
msgstr "Для %2$s вызначана хібнае акно WM_TRANSIENT_FOR 0x%1$lx.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1557
|
#: ../src/core/window-props.c:1528
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||||
msgstr "WM_TRANSIENT_FOR акно 0x%lx для %s стварыла б цыкл.\n"
|
msgstr "WM_TRANSIENT_FOR акно 0x%lx для %s стварыла б цыкл.\n"
|
||||||
@@ -701,8 +689,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
|
#: ../src/org.gnome.mutter.gschema.xml.in.h:17
|
||||||
msgid "Auto maximize nearly monitor sized windows"
|
msgid "Auto maximize nearly monitor sized windows"
|
||||||
msgstr ""
|
msgstr "Аўтаматычна максімалізаваць вокны, якія расцягнутыя амаль на ўвесь экран"
|
||||||
"Аўтаматычна максімалізаваць вокны, якія расцягнутыя амаль на ўвесь экран"
|
|
||||||
|
|
||||||
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
#: ../src/org.gnome.mutter.gschema.xml.in.h:18
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -720,104 +707,109 @@ msgstr "Выбраць акно з выплыўнога акенца"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "Закрыць выплыўное акенца"
|
msgstr "Закрыць выплыўное акенца"
|
||||||
|
|
||||||
|
#: ../src/tools/mutter-message.c:123
|
||||||
|
#, c-format
|
||||||
|
msgid "Usage: %s\n"
|
||||||
|
msgstr "Правілы выкарыстання: %s\n"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:67
|
#: ../src/ui/menu.c:69
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "_Мінімалізаваць"
|
msgstr "_Мінімалізаваць"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:69
|
#: ../src/ui/menu.c:71
|
||||||
msgid "Ma_ximize"
|
msgid "Ma_ximize"
|
||||||
msgstr "Ма_ксімалізаваць"
|
msgstr "Ма_ксімалізаваць"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:71
|
#: ../src/ui/menu.c:73
|
||||||
msgid "Unma_ximize"
|
msgid "Unma_ximize"
|
||||||
msgstr "Скасаваць ма_ксімалізацыю"
|
msgstr "Скасаваць ма_ксімалізацыю"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:73
|
#: ../src/ui/menu.c:75
|
||||||
msgid "Roll _Up"
|
msgid "Roll _Up"
|
||||||
msgstr "_Скруціць акно ў загаловак"
|
msgstr "_Скруціць акно ў загаловак"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:75
|
#: ../src/ui/menu.c:77
|
||||||
msgid "_Unroll"
|
msgid "_Unroll"
|
||||||
msgstr "Рас_круціць акно з загалоўка"
|
msgstr "Рас_круціць акно з загалоўка"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:77
|
#: ../src/ui/menu.c:79
|
||||||
msgid "_Move"
|
msgid "_Move"
|
||||||
msgstr "_Перамясціць акно"
|
msgstr "_Перамясціць акно"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:79
|
#: ../src/ui/menu.c:81
|
||||||
msgid "_Resize"
|
msgid "_Resize"
|
||||||
msgstr "_Змяніць памер акна"
|
msgstr "_Змяніць памер акна"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:81
|
#: ../src/ui/menu.c:83
|
||||||
msgid "Move Titlebar On_screen"
|
msgid "Move Titlebar On_screen"
|
||||||
msgstr "Перамясціць загаловак акна па _экране"
|
msgstr "Перамясціць загаловак акна па _экране"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:84 ../src/ui/menu.c:86
|
#: ../src/ui/menu.c:86 ../src/ui/menu.c:88
|
||||||
msgid "Always on _Top"
|
msgid "Always on _Top"
|
||||||
msgstr "Заўсёды _наверсе"
|
msgstr "Заўсёды _наверсе"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:88
|
#: ../src/ui/menu.c:90
|
||||||
msgid "_Always on Visible Workspace"
|
msgid "_Always on Visible Workspace"
|
||||||
msgstr "Заўсёды на _бачнай прасторы працы"
|
msgstr "Заўсёды на _бачнай прасторы працы"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:90
|
#: ../src/ui/menu.c:92
|
||||||
msgid "_Only on This Workspace"
|
msgid "_Only on This Workspace"
|
||||||
msgstr "_Толькі на гэтай прасторы працы"
|
msgstr "_Толькі на гэтай прасторы працы"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:92
|
#: ../src/ui/menu.c:94
|
||||||
msgid "Move to Workspace _Left"
|
msgid "Move to Workspace _Left"
|
||||||
msgstr "Перамясціць на прастору працы з_лева"
|
msgstr "Перамясціць на прастору працы з_лева"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:94
|
#: ../src/ui/menu.c:96
|
||||||
msgid "Move to Workspace R_ight"
|
msgid "Move to Workspace R_ight"
|
||||||
msgstr "Перамясціць на прастору працы с_права"
|
msgstr "Перамясціць на прастору працы с_права"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:96
|
#: ../src/ui/menu.c:98
|
||||||
msgid "Move to Workspace _Up"
|
msgid "Move to Workspace _Up"
|
||||||
msgstr "Перамясціць на прастору працы з_верху"
|
msgstr "Перамясціць на прастору працы з_верху"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:98
|
#: ../src/ui/menu.c:100
|
||||||
msgid "Move to Workspace _Down"
|
msgid "Move to Workspace _Down"
|
||||||
msgstr "Перамясціць на прастору працы з_нізу"
|
msgstr "Перамясціць на прастору працы з_нізу"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:102
|
#: ../src/ui/menu.c:104
|
||||||
msgid "_Close"
|
msgid "_Close"
|
||||||
msgstr "_Закрыць акно"
|
msgstr "_Закрыць акно"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:202
|
#: ../src/ui/menu.c:204
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d%n"
|
msgid "Workspace %d%n"
|
||||||
msgstr "Прастора працы %d%n"
|
msgstr "Прастора працы %d%n"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:212
|
#: ../src/ui/menu.c:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace 1_0"
|
msgid "Workspace 1_0"
|
||||||
msgstr "Прастора працы 1_0"
|
msgstr "Прастора працы 1_0"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:214
|
#: ../src/ui/menu.c:216
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %s%d"
|
msgid "Workspace %s%d"
|
||||||
msgstr "Прастора працы %s%d"
|
msgstr "Прастора працы %s%d"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:384
|
#: ../src/ui/menu.c:397
|
||||||
msgid "Move to Another _Workspace"
|
msgid "Move to Another _Workspace"
|
||||||
msgstr "П_ерамясціць на іншую прастору працы"
|
msgstr "П_ерамясціць на іншую прастору працы"
|
||||||
|
|
||||||
@@ -919,49 +911,49 @@ msgstr "Mod5"
|
|||||||
msgid "%d x %d"
|
msgid "%d x %d"
|
||||||
msgstr "%d x %d"
|
msgstr "%d x %d"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:236
|
#: ../src/ui/theme.c:235
|
||||||
msgid "top"
|
msgid "top"
|
||||||
msgstr "верхнюю"
|
msgstr "верхнюю"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:238
|
#: ../src/ui/theme.c:237
|
||||||
msgid "bottom"
|
msgid "bottom"
|
||||||
msgstr "ніжнюю"
|
msgstr "ніжнюю"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:240
|
#: ../src/ui/theme.c:239
|
||||||
msgid "left"
|
msgid "left"
|
||||||
msgstr "левую"
|
msgstr "левую"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:242
|
#: ../src/ui/theme.c:241
|
||||||
msgid "right"
|
msgid "right"
|
||||||
msgstr "правую"
|
msgstr "правую"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:270
|
#: ../src/ui/theme.c:269
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "frame geometry does not specify \"%s\" dimension"
|
msgid "frame geometry does not specify \"%s\" dimension"
|
||||||
msgstr "апісанне геаметрыі рамкі акна не вызначае %s граніцу"
|
msgstr "апісанне геаметрыі рамкі акна не вызначае %s граніцу"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:289
|
#: ../src/ui/theme.c:288
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"апісанне геаметрыі рамкі акна не вызначае %s граніцу для аблямоўкі \"%s\""
|
"апісанне геаметрыі рамкі акна не вызначае %s граніцу для аблямоўкі \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:326
|
#: ../src/ui/theme.c:325
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Button aspect ratio %g is not reasonable"
|
msgid "Button aspect ratio %g is not reasonable"
|
||||||
msgstr "Прапорцыі кнопкі %g не маюць сэнсу"
|
msgstr "Прапорцыі кнопкі %g не маюць сэнсу"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:338
|
#: ../src/ui/theme.c:337
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Frame geometry does not specify size of buttons"
|
msgid "Frame geometry does not specify size of buttons"
|
||||||
msgstr "Апісанне геаметрыі рамкі акна не вызначае памер кнопак"
|
msgstr "Апісанне геаметрыі рамкі акна не вызначае памер кнопак"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1051
|
#: ../src/ui/theme.c:1050
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Gradients should have at least two colors"
|
msgid "Gradients should have at least two colors"
|
||||||
msgstr "Градыент мусіць мець прынамсі два колеры"
|
msgstr "Градыент мусіць мець прынамсі два колеры"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1203
|
#: ../src/ui/theme.c:1202
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK custom color specification must have color name and fallback in "
|
"GTK custom color specification must have color name and fallback in "
|
||||||
@@ -970,7 +962,7 @@ msgstr ""
|
|||||||
"Уласная спецыфікацыя колеру GTK мусіць змяшчаць назвы асноўнага і запаснога "
|
"Уласная спецыфікацыя колеру GTK мусіць змяшчаць назвы асноўнага і запаснога "
|
||||||
"колераў у дужках, напрыклад, gtk:custom(foo,bar). Не ўдалося разабраць \"%s\""
|
"колераў у дужках, напрыклад, gtk:custom(foo,bar). Не ўдалося разабраць \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1219
|
#: ../src/ui/theme.c:1218
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||||
@@ -979,7 +971,7 @@ msgstr ""
|
|||||||
"Хібны знак \"%c\" у параметры color_name спецыфікацыі gtk:custom, дазволеныя "
|
"Хібны знак \"%c\" у параметры color_name спецыфікацыі gtk:custom, дазволеныя "
|
||||||
"толькі A-Za-z0-9-_"
|
"толькі A-Za-z0-9-_"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1233
|
#: ../src/ui/theme.c:1232
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||||
@@ -988,7 +980,7 @@ msgstr ""
|
|||||||
"Фармат gtk:custom: \"gtk:custom(назва_колеру,запасны_колер)\"; \"%s\" не "
|
"Фармат gtk:custom: \"gtk:custom(назва_колеру,запасны_колер)\"; \"%s\" не "
|
||||||
"адпавядае фармату"
|
"адпавядае фармату"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1278
|
#: ../src/ui/theme.c:1277
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||||
@@ -997,7 +989,7 @@ msgstr ""
|
|||||||
"Спецыфікацыя колеру GTK мусіць мець стан у квадратных дужках, напрыклад, gtk:"
|
"Спецыфікацыя колеру GTK мусіць мець стан у квадратных дужках, напрыклад, gtk:"
|
||||||
"fg[NORMAL], дзе NORMAL - гэта стан. Не ўдалося разабраць \"%s\""
|
"fg[NORMAL], дзе NORMAL - гэта стан. Не ўдалося разабраць \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1292
|
#: ../src/ui/theme.c:1291
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||||
@@ -1007,17 +999,17 @@ msgstr ""
|
|||||||
"напрыклад, gtk:fg[NORMAL], дзе NORMAL - гэта стан. Не ўдалося разабраць \"%s"
|
"напрыклад, gtk:fg[NORMAL], дзе NORMAL - гэта стан. Не ўдалося разабраць \"%s"
|
||||||
"\""
|
"\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1303
|
#: ../src/ui/theme.c:1302
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Did not understand state \"%s\" in color specification"
|
msgid "Did not understand state \"%s\" in color specification"
|
||||||
msgstr "Незразумелы стан \"%s\" у спецыфікацыі колеру"
|
msgstr "Незразумелы стан \"%s\" у спецыфікацыі колеру"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1316
|
#: ../src/ui/theme.c:1315
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Did not understand color component \"%s\" in color specification"
|
msgid "Did not understand color component \"%s\" in color specification"
|
||||||
msgstr "Незразумелы складнік колеру \"%s\" у спецыфікацыі колеру"
|
msgstr "Незразумелы складнік колеру \"%s\" у спецыфікацыі колеру"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1345
|
#: ../src/ui/theme.c:1344
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||||
@@ -1026,58 +1018,58 @@ msgstr ""
|
|||||||
"Фармат змяшанага колеру - \"blend/bg_color/fg_color/alpha\". \"%s\" не "
|
"Фармат змяшанага колеру - \"blend/bg_color/fg_color/alpha\". \"%s\" не "
|
||||||
"адпавядае фармату."
|
"адпавядае фармату."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1356
|
#: ../src/ui/theme.c:1355
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||||
msgstr "Не ўдалося разабраць значэнне альфа \"%s\" ў змяшаным колеры"
|
msgstr "Не ўдалося разабраць значэнне альфа \"%s\" ў змяшаным колеры"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1366
|
#: ../src/ui/theme.c:1365
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Значэнне альфа \"%s\" у змяшаным колеры не ўваходзіць у дыяпазон ад 0.0 да "
|
"Значэнне альфа \"%s\" у змяшаным колеры не ўваходзіць у дыяпазон ад 0.0 да "
|
||||||
"1.0"
|
"1.0"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1413
|
#: ../src/ui/theme.c:1412
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Фармат ценю - \"shade/base_color/factor\". \"%s\" не адпавядае фармату."
|
"Фармат ценю - \"shade/base_color/factor\". \"%s\" не адпавядае фармату."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1424
|
#: ../src/ui/theme.c:1423
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||||
msgstr "Не ўдалося разабраць каэфіцыент ценю \"%s\" у зацененым колеры"
|
msgstr "Не ўдалося разабраць каэфіцыент ценю \"%s\" у зацененым колеры"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1434
|
#: ../src/ui/theme.c:1433
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||||
msgstr "Каэфіцыент ценю \"%s\" у зацененым колеры адмоўны"
|
msgstr "Каэфіцыент ценю \"%s\" у зацененым колеры адмоўны"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1463
|
#: ../src/ui/theme.c:1462
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse color \"%s\""
|
msgid "Could not parse color \"%s\""
|
||||||
msgstr "Не ўдалося разабраць колер \"%s\""
|
msgstr "Не ўдалося разабраць колер \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1780
|
#: ../src/ui/theme.c:1779
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||||
msgstr "Каардынатны выраз змяшчае забаронены знак \"%s\""
|
msgstr "Каардынатны выраз змяшчае забаронены знак \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1807
|
#: ../src/ui/theme.c:1806
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression contains floating point number '%s' which could not be "
|
"Coordinate expression contains floating point number '%s' which could not be "
|
||||||
"parsed"
|
"parsed"
|
||||||
msgstr "Каардынатны выраз змяшчае незразумелы лік з нефіксаванай коскай \"%s\""
|
msgstr "Каардынатны выраз змяшчае незразумелы лік з нефіксаванай коскай \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1821
|
#: ../src/ui/theme.c:1820
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||||
msgstr "Каардынатны выраз змяшчае незразумелы цэлы лік \"%s\""
|
msgstr "Каардынатны выраз змяшчае незразумелы цэлы лік \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1942
|
#: ../src/ui/theme.c:1941
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression contained unknown operator at the start of this text: "
|
"Coordinate expression contained unknown operator at the start of this text: "
|
||||||
@@ -1085,17 +1077,17 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Каардынатны выраз змяшчае невядомы аператар у пачатку гэтага тэксту: \"%s\""
|
"Каардынатны выраз змяшчае невядомы аператар у пачатку гэтага тэксту: \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1999
|
#: ../src/ui/theme.c:1998
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression was empty or not understood"
|
msgid "Coordinate expression was empty or not understood"
|
||||||
msgstr "Каардынатны выраз пусты ці незразумелы"
|
msgstr "Каардынатны выраз пусты ці незразумелы"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2112 ../src/ui/theme.c:2122 ../src/ui/theme.c:2156
|
#: ../src/ui/theme.c:2111 ../src/ui/theme.c:2121 ../src/ui/theme.c:2155
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression results in division by zero"
|
msgid "Coordinate expression results in division by zero"
|
||||||
msgstr "Каардынатны выраз вымагае дзялення на нуль"
|
msgstr "Каардынатны выраз вымагае дзялення на нуль"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2164
|
#: ../src/ui/theme.c:2163
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||||
@@ -1103,24 +1095,24 @@ msgstr ""
|
|||||||
"Каардынатны выраз спрабуе ўжыць аператар дзялення па модулі для ліку з "
|
"Каардынатны выраз спрабуе ўжыць аператар дзялення па модулі для ліку з "
|
||||||
"нефіксаванай коскай"
|
"нефіксаванай коскай"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2220
|
#: ../src/ui/theme.c:2219
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"У каардынатным выразе ўжыты аператар \"%s\" там, дзе мусіў быць аперанд"
|
"У каардынатным выразе ўжыты аператар \"%s\" там, дзе мусіў быць аперанд"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2229
|
#: ../src/ui/theme.c:2228
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had an operand where an operator was expected"
|
msgid "Coordinate expression had an operand where an operator was expected"
|
||||||
msgstr "У каардынатным выразе ўжыты аперанд там, дзе мусіў быць аператар"
|
msgstr "У каардынатным выразе ўжыты аперанд там, дзе мусіў быць аператар"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2237
|
#: ../src/ui/theme.c:2236
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||||
msgstr "Каардынатны выраз заканчваецца аператарам, а не аперандам"
|
msgstr "Каардынатны выраз заканчваецца аператарам, а не аперандам"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2247
|
#: ../src/ui/theme.c:2246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||||
@@ -1129,41 +1121,41 @@ msgstr ""
|
|||||||
"У каардынатным выразе за аператарам \"%c\" ідзе аператар \"%c\", але паміж "
|
"У каардынатным выразе за аператарам \"%c\" ідзе аператар \"%c\", але паміж "
|
||||||
"імі няма аперанда"
|
"імі няма аперанда"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2398 ../src/ui/theme.c:2443
|
#: ../src/ui/theme.c:2397 ../src/ui/theme.c:2442
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||||
msgstr "У каардынатным выразе невядомая зменная альбо канстанта \"%s\""
|
msgstr "У каардынатным выразе невядомая зменная альбо канстанта \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2497
|
#: ../src/ui/theme.c:2496
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression parser overflowed its buffer."
|
msgid "Coordinate expression parser overflowed its buffer."
|
||||||
msgstr "Прылада для разбору каардынатных выразаў перапоўніла свой буфер."
|
msgstr "Прылада для разбору каардынатных выразаў перапоўніла свой буфер."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2526
|
#: ../src/ui/theme.c:2525
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"У каардынатным выразе ўжытыя дужкі, якія закрываюцца, але няма тых, якія б "
|
"У каардынатным выразе ўжытыя дужкі, якія закрываюцца, але няма тых, якія б "
|
||||||
"адкрываліся"
|
"адкрываліся"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2590
|
#: ../src/ui/theme.c:2589
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"У каардынатным выразе ўжытыя дужкі, якія адкрываюцца, але няма тых, якія б "
|
"У каардынатным выразе ўжытыя дужкі, якія адкрываюцца, але няма тых, якія б "
|
||||||
"закрываліся"
|
"закрываліся"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2601
|
#: ../src/ui/theme.c:2600
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||||
msgstr "У каардынатным выразе няма ні аператараў, ні аперандаў"
|
msgstr "У каардынатным выразе няма ні аператараў, ні аперандаў"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2814 ../src/ui/theme.c:2834 ../src/ui/theme.c:2854
|
#: ../src/ui/theme.c:2813 ../src/ui/theme.c:2833 ../src/ui/theme.c:2853
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||||
msgstr "Матыў аздаблення змяшчае выраз, які стаў прычынай памылкі: %s\n"
|
msgstr "Матыў аздаблення змяшчае выраз, які стаў прычынай памылкі: %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4500
|
#: ../src/ui/theme.c:4499
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||||
@@ -1172,25 +1164,25 @@ msgstr ""
|
|||||||
"Для гэтага стылю рамкі трэба вызначыць <button function=\"%s\" state=\"%s\" "
|
"Для гэтага стылю рамкі трэба вызначыць <button function=\"%s\" state=\"%s\" "
|
||||||
"draw_ops=\"whatever\"/>"
|
"draw_ops=\"whatever\"/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5011 ../src/ui/theme.c:5036
|
#: ../src/ui/theme.c:5010 ../src/ui/theme.c:5035
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Няма <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"што-небудзь\"/>"
|
"Няма <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"што-небудзь\"/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5082
|
#: ../src/ui/theme.c:5083
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
msgid "Failed to load theme \"%s\": %s\n"
|
||||||
msgstr "Не ўдалося загрузіць матыў аздаблення \"%s\": %s\n"
|
msgstr "Не ўдалося загрузіць матыў аздаблення \"%s\": %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
#: ../src/ui/theme.c:5219 ../src/ui/theme.c:5226 ../src/ui/theme.c:5233
|
||||||
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
#: ../src/ui/theme.c:5240 ../src/ui/theme.c:5247
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "No <%s> set for theme \"%s\""
|
msgid "No <%s> set for theme \"%s\""
|
||||||
msgstr "Для матыву аздаблення \"%2$s\" не прызначана <%1$s>"
|
msgstr "Для матыву аздаблення \"%2$s\" не прызначана <%1$s>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5254
|
#: ../src/ui/theme.c:5255
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||||
@@ -1199,7 +1191,7 @@ msgstr ""
|
|||||||
"Стыль рамкі не вызначаны для вокнаў тыпу \"%s\" для матыву аздаблення \"%s"
|
"Стыль рамкі не вызначаны для вокнаў тыпу \"%s\" для матыву аздаблення \"%s"
|
||||||
"\". Дадайце <window type=\"%s\" style_set=\"штосьці\"/>."
|
"\". Дадайце <window type=\"%s\" style_set=\"штосьці\"/>."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5661 ../src/ui/theme.c:5723 ../src/ui/theme.c:5786
|
#: ../src/ui/theme.c:5662 ../src/ui/theme.c:5724 ../src/ui/theme.c:5787
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||||
@@ -1207,7 +1199,7 @@ msgstr ""
|
|||||||
"Назвы канстантаў, вызначаных карыстальнікам, мусяць пачынацца з вялікай "
|
"Назвы канстантаў, вызначаных карыстальнікам, мусяць пачынацца з вялікай "
|
||||||
"літары. \"%s\" не адпавядае гэтаму патрабаванню."
|
"літары. \"%s\" не адпавядае гэтаму патрабаванню."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5669 ../src/ui/theme.c:5731 ../src/ui/theme.c:5794
|
#: ../src/ui/theme.c:5670 ../src/ui/theme.c:5732 ../src/ui/theme.c:5795
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Constant \"%s\" has already been defined"
|
msgid "Constant \"%s\" has already been defined"
|
||||||
msgstr "Канстанта \"%s\" ужо азначана"
|
msgstr "Канстанта \"%s\" ужо азначана"
|
||||||
@@ -1593,8 +1585,207 @@ msgstr "Выкарыстанне тэксту ўнутры элемента <%s>
|
|||||||
msgid "<%s> specified twice for this theme"
|
msgid "<%s> specified twice for this theme"
|
||||||
msgstr "<%s> двойчы вызначаны для гэтага матыву аздаблення"
|
msgstr "<%s> двойчы вызначаны для гэтага матыву аздаблення"
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4336
|
#: ../src/ui/theme-parser.c:4334
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "Памылка пошуку правільнага файла для матыву аздаблення %s\n"
|
msgstr "Памылка пошуку правільнага файла для матыву аздаблення %s\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:99
|
||||||
|
msgid "_Windows"
|
||||||
|
msgstr "_Вокны"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:100
|
||||||
|
msgid "_Dialog"
|
||||||
|
msgstr "_Дыялогавае акенца"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:101
|
||||||
|
msgid "_Modal dialog"
|
||||||
|
msgstr "_Мадальнае дыялогавае акенца"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:102
|
||||||
|
msgid "_Utility"
|
||||||
|
msgstr "_Дапаможная праграма"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:103
|
||||||
|
msgid "_Splashscreen"
|
||||||
|
msgstr "_Экранная застаўка"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:104
|
||||||
|
msgid "_Top dock"
|
||||||
|
msgstr "_Верхняя ўбудова"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:105
|
||||||
|
msgid "_Bottom dock"
|
||||||
|
msgstr "_Ніжняя ўбудова"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:106
|
||||||
|
msgid "_Left dock"
|
||||||
|
msgstr "_Левая ўбудова"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:107
|
||||||
|
msgid "_Right dock"
|
||||||
|
msgstr "_Правая ўбудова"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:108
|
||||||
|
msgid "_All docks"
|
||||||
|
msgstr "_Усе ўбудовы"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:109
|
||||||
|
msgid "Des_ktop"
|
||||||
|
msgstr "_Стол"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:115
|
||||||
|
msgid "Open another one of these windows"
|
||||||
|
msgstr "Адкрыць чарговае з гэтых вокнаў"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:117
|
||||||
|
msgid "This is a demo button with an 'open' icon"
|
||||||
|
msgstr "Гэта дэманстрацыйная кнопка са значком \"Адкрыць\""
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:119
|
||||||
|
msgid "This is a demo button with a 'quit' icon"
|
||||||
|
msgstr "Гэта дэманстрацыйная кнопка са значком \"Выйсці\""
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:248
|
||||||
|
msgid "This is a sample message in a sample dialog"
|
||||||
|
msgstr "Гэта ўзорнае паведамленне ва ўзорным дыялогавым акенцы"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:328
|
||||||
|
#, c-format
|
||||||
|
msgid "Fake menu item %d\n"
|
||||||
|
msgstr "Несапраўдны пункт меню %d\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:363
|
||||||
|
msgid "Border-only window"
|
||||||
|
msgstr "Акно толькі з аблямоўкай"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:365
|
||||||
|
msgid "Bar"
|
||||||
|
msgstr "Стужка"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:382
|
||||||
|
msgid "Normal Application Window"
|
||||||
|
msgstr "Звычайнае акно праграмы"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:386
|
||||||
|
msgid "Dialog Box"
|
||||||
|
msgstr "Дыялогавае акенца"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:390
|
||||||
|
msgid "Modal Dialog Box"
|
||||||
|
msgstr "Мадальнае дыялогавае акенца"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:394
|
||||||
|
msgid "Utility Palette"
|
||||||
|
msgstr "Дапаможная палітра"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:398
|
||||||
|
msgid "Torn-off Menu"
|
||||||
|
msgstr "Адчэпленае меню"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:402
|
||||||
|
msgid "Border"
|
||||||
|
msgstr "Аблямоўка"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:406
|
||||||
|
msgid "Attached Modal Dialog"
|
||||||
|
msgstr "Прычапленае мадальнае дыялогавае акенца"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:737
|
||||||
|
#, c-format
|
||||||
|
msgid "Button layout test %d"
|
||||||
|
msgstr "Выпрабаванне размяшчэння кнопак %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:766
|
||||||
|
#, c-format
|
||||||
|
msgid "%g milliseconds to draw one window frame"
|
||||||
|
msgstr "%g мілісекунд, каб намаляваць адну рамку акна"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:811
|
||||||
|
#, c-format
|
||||||
|
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||||
|
msgstr "Правілы карыстання: metacity-theme-viewer [НАЗВА_МАТЫВУ]\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:818
|
||||||
|
#, c-format
|
||||||
|
msgid "Error loading theme: %s\n"
|
||||||
|
msgstr "Памылка загрузкі матыву аздаблення: %s\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:824
|
||||||
|
#, c-format
|
||||||
|
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||||
|
msgstr "Матыў аздаблення \"%s\" загружаны за %g секунд\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:869
|
||||||
|
msgid "Normal Title Font"
|
||||||
|
msgstr "Звычайны шрыфт загалоўка"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:875
|
||||||
|
msgid "Small Title Font"
|
||||||
|
msgstr "Маленькі шрыфт загалоўка"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:881
|
||||||
|
msgid "Large Title Font"
|
||||||
|
msgstr "Вялікі шрыфт загалоўка"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:886
|
||||||
|
msgid "Button Layouts"
|
||||||
|
msgstr "Размяшчэнне кнопак"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:891
|
||||||
|
msgid "Benchmark"
|
||||||
|
msgstr "Выпрабаванне"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:947
|
||||||
|
msgid "Window Title Goes Here"
|
||||||
|
msgstr "Месца для загалоўка акна"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1053
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
||||||
|
"seconds wall clock time including X server resources (%g milliseconds per "
|
||||||
|
"frame)\n"
|
||||||
|
msgstr ""
|
||||||
|
"Намалявана %d рамак цягам %g секунд кліенцкага часу (%g мілісекунд на рамку) "
|
||||||
|
"і %g секунд каляндарнага часу, уключна з рэсурсамі X-сервера (%g мілісекунд "
|
||||||
|
"на рамку)\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1273
|
||||||
|
msgid "position expression test returned TRUE but set error"
|
||||||
|
msgstr "выпрабаванне выразу пазіцыі вярнула TRUE, але паведаміла аб памылцы"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1275
|
||||||
|
msgid "position expression test returned FALSE but didn't set error"
|
||||||
|
msgstr ""
|
||||||
|
"выпрабаванне выразу пазіцыі вярнула FALSE, але не паведаміла аб памылцы"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1279
|
||||||
|
msgid "Error was expected but none given"
|
||||||
|
msgstr "Чакалася памылка, але звесткі не атрыманыя"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1281
|
||||||
|
#, c-format
|
||||||
|
msgid "Error %d was expected but %d given"
|
||||||
|
msgstr "Чакалася памылка %d, але атрымана %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1287
|
||||||
|
#, c-format
|
||||||
|
msgid "Error not expected but one was returned: %s"
|
||||||
|
msgstr "Атрымана нечаканая памылка: %s"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1291
|
||||||
|
#, c-format
|
||||||
|
msgid "x value was %d, %d was expected"
|
||||||
|
msgstr "X-значэнне было %d, а чакалася %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1294
|
||||||
|
#, c-format
|
||||||
|
msgid "y value was %d, %d was expected"
|
||||||
|
msgstr "Y-значэнне было %d, а чакалася %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1359
|
||||||
|
#, c-format
|
||||||
|
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||||
|
msgstr ""
|
||||||
|
"%d каардынатных выразаў разабраныя за %g секунд (у сярэднім %g секунд)\n"
|
||||||
|
231
po/et.po
231
po/et.po
@@ -14,8 +14,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter MASTER\n"
|
"Project-Id-Version: mutter MASTER\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-09-10 15:25+0000\n"
|
"POT-Creation-Date: 2013-03-12 18:53+0000\n"
|
||||||
"PO-Revision-Date: 2013-09-11 23:20+0300\n"
|
"PO-Revision-Date: 2013-03-12 20:55+0300\n"
|
||||||
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
||||||
"Language-Team: Estonian <>\n"
|
"Language-Team: Estonian <>\n"
|
||||||
"Language: et\n"
|
"Language: et\n"
|
||||||
@@ -23,7 +23,6 @@ msgstr ""
|
|||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
|
||||||
"X-Generator: Poedit 1.5.4\n"
|
|
||||||
|
|
||||||
msgid "Navigation"
|
msgid "Navigation"
|
||||||
msgstr "Navigeerimine"
|
msgstr "Navigeerimine"
|
||||||
@@ -250,17 +249,6 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Teemat ei leitud! Veendu, et %s on olemas ja sisaldab harilikke teemasid.\n"
|
"Teemat ei leitud! Veendu, et %s on olemas ja sisaldab harilikke teemasid.\n"
|
||||||
|
|
||||||
msgid "Built-in display"
|
|
||||||
msgstr "Sisseehitatud kuva"
|
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor name (in case we don't know
|
|
||||||
#. the vendor), it's Unknown followed by a size in inches,
|
|
||||||
#. like 'Unknown 15"'
|
|
||||||
#.
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown %s"
|
|
||||||
msgstr "Tundmatu %s"
|
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"mutter %s\n"
|
"mutter %s\n"
|
||||||
@@ -393,6 +381,7 @@ msgstr "Tõrge logifaili %s avamisel funktsiooniga fdopen(): %s\n"
|
|||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "Avati logifail %s\n"
|
msgstr "Avati logifail %s\n"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Mutter kompileeriti ilma jutuka režiimi toeta\n"
|
msgstr "Mutter kompileeriti ilma jutuka režiimi toeta\n"
|
||||||
|
|
||||||
@@ -583,6 +572,10 @@ msgstr "Akna valimine tabulaatori hüpikaknalt"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "Tabulaatori hüpikakna katkestamine"
|
msgstr "Tabulaatori hüpikakna katkestamine"
|
||||||
|
|
||||||
|
#, c-format
|
||||||
|
msgid "Usage: %s\n"
|
||||||
|
msgstr "Kasutamine: %s\n"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "_Minimeeri"
|
msgstr "_Minimeeri"
|
||||||
@@ -1288,151 +1281,159 @@ msgstr "Selle teema jaoks on <%s> määratud kaks korda"
|
|||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "Tõrge %s teema jaoks korrektse faili leidmisel\n"
|
msgstr "Tõrge %s teema jaoks korrektse faili leidmisel\n"
|
||||||
|
|
||||||
#~ msgid "Usage: %s\n"
|
msgid "_Windows"
|
||||||
#~ msgstr "Kasutamine: %s\n"
|
msgstr "_Aknad"
|
||||||
|
|
||||||
#~ msgid "_Windows"
|
msgid "_Dialog"
|
||||||
#~ msgstr "_Aknad"
|
msgstr "_Dialoog"
|
||||||
|
|
||||||
#~ msgid "_Dialog"
|
msgid "_Modal dialog"
|
||||||
#~ msgstr "_Dialoog"
|
msgstr "_Modaaldialoog"
|
||||||
|
|
||||||
#~ msgid "_Modal dialog"
|
msgid "_Utility"
|
||||||
#~ msgstr "_Modaaldialoog"
|
msgstr "_Utiliit"
|
||||||
|
|
||||||
#~ msgid "_Utility"
|
msgid "_Splashscreen"
|
||||||
#~ msgstr "_Utiliit"
|
msgstr "_Käivitusekraan"
|
||||||
|
|
||||||
#~ msgid "_Splashscreen"
|
msgid "_Top dock"
|
||||||
#~ msgstr "_Käivitusekraan"
|
msgstr "Ü_lemine dokk"
|
||||||
|
|
||||||
#~ msgid "_Top dock"
|
msgid "_Bottom dock"
|
||||||
#~ msgstr "Ü_lemine dokk"
|
msgstr "_Alumine dokk"
|
||||||
|
|
||||||
#~ msgid "_Bottom dock"
|
msgid "_Left dock"
|
||||||
#~ msgstr "_Alumine dokk"
|
msgstr "_Vasak dokk"
|
||||||
|
|
||||||
#~ msgid "_Left dock"
|
msgid "_Right dock"
|
||||||
#~ msgstr "_Vasak dokk"
|
msgstr "_Parem dokk"
|
||||||
|
|
||||||
#~ msgid "_Right dock"
|
msgid "_All docks"
|
||||||
#~ msgstr "_Parem dokk"
|
msgstr "_Kõik dokid"
|
||||||
|
|
||||||
#~ msgid "_All docks"
|
msgid "Des_ktop"
|
||||||
#~ msgstr "_Kõik dokid"
|
msgstr "_Töölaud"
|
||||||
|
|
||||||
#~ msgid "Des_ktop"
|
msgid "Open another one of these windows"
|
||||||
#~ msgstr "_Töölaud"
|
msgstr "Ava neist akendest järgmine"
|
||||||
|
|
||||||
#~ msgid "Open another one of these windows"
|
msgid "This is a demo button with an 'open' icon"
|
||||||
#~ msgstr "Ava neist akendest järgmine"
|
msgstr "See on näidisnupp koos 'ava' ikooniga"
|
||||||
|
|
||||||
#~ msgid "This is a demo button with an 'open' icon"
|
msgid "This is a demo button with a 'quit' icon"
|
||||||
#~ msgstr "See on näidisnupp koos 'ava' ikooniga"
|
msgstr "See on näidisnupp koos 'lõpeta' ikooniga"
|
||||||
|
|
||||||
#~ msgid "This is a demo button with a 'quit' icon"
|
msgid "This is a sample message in a sample dialog"
|
||||||
#~ msgstr "See on näidisnupp koos 'lõpeta' ikooniga"
|
msgstr "See on näidisteade näidisdialoogis"
|
||||||
|
|
||||||
#~ msgid "This is a sample message in a sample dialog"
|
#, c-format
|
||||||
#~ msgstr "See on näidisteade näidisdialoogis"
|
msgid "Fake menu item %d\n"
|
||||||
|
msgstr "Võltsitud menüüpunkt %d\n"
|
||||||
|
|
||||||
#~ msgid "Fake menu item %d\n"
|
msgid "Border-only window"
|
||||||
#~ msgstr "Võltsitud menüüpunkt %d\n"
|
msgstr "Ainult raamiga aken"
|
||||||
|
|
||||||
#~ msgid "Border-only window"
|
msgid "Bar"
|
||||||
#~ msgstr "Ainult raamiga aken"
|
msgstr "Riba"
|
||||||
|
|
||||||
#~ msgid "Bar"
|
msgid "Normal Application Window"
|
||||||
#~ msgstr "Riba"
|
msgstr "Tavaline rakenduseaken"
|
||||||
|
|
||||||
#~ msgid "Normal Application Window"
|
msgid "Dialog Box"
|
||||||
#~ msgstr "Tavaline rakenduseaken"
|
msgstr "Dialoogikast"
|
||||||
|
|
||||||
#~ msgid "Dialog Box"
|
msgid "Modal Dialog Box"
|
||||||
#~ msgstr "Dialoogikast"
|
msgstr "Modaalne dialoogikast"
|
||||||
|
|
||||||
#~ msgid "Modal Dialog Box"
|
msgid "Utility Palette"
|
||||||
#~ msgstr "Modaalne dialoogikast"
|
msgstr "Rakendite palett"
|
||||||
|
|
||||||
#~ msgid "Utility Palette"
|
msgid "Torn-off Menu"
|
||||||
#~ msgstr "Rakendite palett"
|
msgstr "Ärarebitav menüü"
|
||||||
|
|
||||||
#~ msgid "Torn-off Menu"
|
msgid "Border"
|
||||||
#~ msgstr "Ärarebitav menüü"
|
msgstr "Raam"
|
||||||
|
|
||||||
#~ msgid "Border"
|
msgid "Attached Modal Dialog"
|
||||||
#~ msgstr "Raam"
|
msgstr "Kinnistatud modaaldialoog"
|
||||||
|
|
||||||
#~ msgid "Attached Modal Dialog"
|
#, c-format
|
||||||
#~ msgstr "Kinnistatud modaaldialoog"
|
msgid "Button layout test %d"
|
||||||
|
msgstr "Nuppude paigutuse test %d"
|
||||||
|
|
||||||
#~ msgid "Button layout test %d"
|
#, c-format
|
||||||
#~ msgstr "Nuppude paigutuse test %d"
|
msgid "%g milliseconds to draw one window frame"
|
||||||
|
msgstr "%g millisekundit kulub ühe akna raami joonistamiseks"
|
||||||
|
|
||||||
#~ msgid "%g milliseconds to draw one window frame"
|
#, c-format
|
||||||
#~ msgstr "%g millisekundit kulub ühe akna raami joonistamiseks"
|
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||||
|
msgstr "Kasutamine: metacity-theme-viewer [TEEMANIMI]\n"
|
||||||
|
|
||||||
#~ msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
#, c-format
|
||||||
#~ msgstr "Kasutamine: metacity-theme-viewer [TEEMANIMI]\n"
|
msgid "Error loading theme: %s\n"
|
||||||
|
msgstr "Viga teema laadimisel: %s\n"
|
||||||
|
|
||||||
#~ msgid "Error loading theme: %s\n"
|
#, c-format
|
||||||
#~ msgstr "Viga teema laadimisel: %s\n"
|
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||||
|
msgstr "Teema \"%s\" laaditi %g sekundiga\n"
|
||||||
|
|
||||||
#~ msgid "Loaded theme \"%s\" in %g seconds\n"
|
msgid "Normal Title Font"
|
||||||
#~ msgstr "Teema \"%s\" laaditi %g sekundiga\n"
|
msgstr "Tiitli tavasuurusega kirjatüüp"
|
||||||
|
|
||||||
#~ msgid "Normal Title Font"
|
msgid "Small Title Font"
|
||||||
#~ msgstr "Tiitli tavasuurusega kirjatüüp"
|
msgstr "Tiitli väike kirjatüüp"
|
||||||
|
|
||||||
#~ msgid "Small Title Font"
|
msgid "Large Title Font"
|
||||||
#~ msgstr "Tiitli väike kirjatüüp"
|
msgstr "Tiitli suur kirjatüüp"
|
||||||
|
|
||||||
#~ msgid "Large Title Font"
|
msgid "Button Layouts"
|
||||||
#~ msgstr "Tiitli suur kirjatüüp"
|
msgstr "Nuppude paigutus"
|
||||||
|
|
||||||
#~ msgid "Button Layouts"
|
msgid "Benchmark"
|
||||||
#~ msgstr "Nuppude paigutus"
|
msgstr "Jõudlus"
|
||||||
|
|
||||||
#~ msgid "Benchmark"
|
msgid "Window Title Goes Here"
|
||||||
#~ msgstr "Jõudlus"
|
msgstr "Siia tuleb akna pealkiri"
|
||||||
|
|
||||||
#~ msgid "Window Title Goes Here"
|
#, c-format
|
||||||
#~ msgstr "Siia tuleb akna pealkiri"
|
msgid ""
|
||||||
|
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
||||||
|
"seconds wall clock time including X server resources (%g milliseconds per "
|
||||||
|
"frame)\n"
|
||||||
|
msgstr ""
|
||||||
|
"Joonistati %d kaadrit %g kliendi-kella sekundiga (%g millisekundit kaadrile) "
|
||||||
|
"ja %g sekundiga seinakella järgi, millesse on kaasatud X-serveri "
|
||||||
|
"ressursikasutus (%g millisekundit kaadrile)\n"
|
||||||
|
|
||||||
#~ msgid ""
|
msgid "position expression test returned TRUE but set error"
|
||||||
#~ "Drew %d frames in %g client-side seconds (%g milliseconds per frame) and "
|
msgstr "asukoha avaldise kontroll tagastas TÕENE, aga määras vea"
|
||||||
#~ "%g seconds wall clock time including X server resources (%g milliseconds "
|
|
||||||
#~ "per frame)\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "Joonistati %d kaadrit %g kliendi-kella sekundiga (%g millisekundit "
|
|
||||||
#~ "kaadrile) ja %g sekundiga seinakella järgi, millesse on kaasatud X-"
|
|
||||||
#~ "serveri ressursikasutus (%g millisekundit kaadrile)\n"
|
|
||||||
|
|
||||||
#~ msgid "position expression test returned TRUE but set error"
|
msgid "position expression test returned FALSE but didn't set error"
|
||||||
#~ msgstr "asukoha avaldise kontroll tagastas TÕENE, aga määras vea"
|
msgstr "asukoha avaldise kontroll tagastas VÄÄR, aga ei määranud viga"
|
||||||
|
|
||||||
#~ msgid "position expression test returned FALSE but didn't set error"
|
msgid "Error was expected but none given"
|
||||||
#~ msgstr "asukoha avaldise kontroll tagastas VÄÄR, aga ei määranud viga"
|
msgstr "Oodati viga, aga ühtegi ei edastatud"
|
||||||
|
|
||||||
#~ msgid "Error was expected but none given"
|
#, c-format
|
||||||
#~ msgstr "Oodati viga, aga ühtegi ei edastatud"
|
msgid "Error %d was expected but %d given"
|
||||||
|
msgstr "Oodati viga %d, aga edastati viga %d"
|
||||||
|
|
||||||
#~ msgid "Error %d was expected but %d given"
|
#, c-format
|
||||||
#~ msgstr "Oodati viga %d, aga edastati viga %d"
|
msgid "Error not expected but one was returned: %s"
|
||||||
|
msgstr "Viga ei oodatud, aga üks edastati: %s"
|
||||||
|
|
||||||
#~ msgid "Error not expected but one was returned: %s"
|
#, c-format
|
||||||
#~ msgstr "Viga ei oodatud, aga üks edastati: %s"
|
msgid "x value was %d, %d was expected"
|
||||||
|
msgstr "x väärtus oli %d, oodati väärtust %d"
|
||||||
|
|
||||||
#~ msgid "x value was %d, %d was expected"
|
#, c-format
|
||||||
#~ msgstr "x väärtus oli %d, oodati väärtust %d"
|
msgid "y value was %d, %d was expected"
|
||||||
|
msgstr "y väärtus oli %d, oodati väärtust %d"
|
||||||
|
|
||||||
#~ msgid "y value was %d, %d was expected"
|
#, c-format
|
||||||
#~ msgstr "y väärtus oli %d, oodati väärtust %d"
|
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||||
|
msgstr ""
|
||||||
#~ msgid ""
|
"%d koordinaatide avaldis töödeldi %g sekundiga (keskmine %g sekundit)\n"
|
||||||
#~ "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
|
||||||
#~ msgstr ""
|
|
||||||
#~ "%d koordinaatide avaldis töödeldi %g sekundiga (keskmine %g sekundit)\n"
|
|
||||||
|
|
||||||
#~ msgid "Minimize window"
|
#~ msgid "Minimize window"
|
||||||
#~ msgstr "Akna minimeerimine"
|
#~ msgstr "Akna minimeerimine"
|
||||||
|
327
po/id.po
327
po/id.po
@@ -11,15 +11,15 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter master\n"
|
"Project-Id-Version: mutter master\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
"POT-Creation-Date: 2013-03-28 10:28+0000\n"
|
||||||
"PO-Revision-Date: 2013-09-14 15:44+0700\n"
|
"PO-Revision-Date: 2013-03-30 11:24+0700\n"
|
||||||
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
|
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
|
||||||
"Language-Team: Indonesian <gnome@i15n.org>\n"
|
"Language-Team: Indonesian <gnome@i15n.org>\n"
|
||||||
"Language: id\n"
|
"Language: id\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"X-Generator: Poedit 1.5.7\n"
|
"X-Generator: Poedit 1.5.5\n"
|
||||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||||
|
|
||||||
#: ../src/50-mutter-navigation.xml.in.h:1
|
#: ../src/50-mutter-navigation.xml.in.h:1
|
||||||
@@ -212,7 +212,7 @@ msgstr "Tampilan dipisah ke kanan"
|
|||||||
|
|
||||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||||
#. * we have no way to get it to exit
|
#. * we have no way to get it to exit
|
||||||
#: ../src/compositor/compositor.c:589
|
#: ../src/compositor/compositor.c:568
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Another compositing manager is already running on screen %i on display \"%s"
|
"Another compositing manager is already running on screen %i on display \"%s"
|
||||||
@@ -220,7 +220,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Manajer komposit lain telah berjalan pada layar %i pada tampilan \"%s\"."
|
"Manajer komposit lain telah berjalan pada layar %i pada tampilan \"%s\"."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1076
|
#: ../src/compositor/meta-background.c:1065
|
||||||
msgid "background texture could not be created from file"
|
msgid "background texture could not be created from file"
|
||||||
msgstr "tekstur latar tak bisa dibuat dari berkas"
|
msgstr "tekstur latar tak bisa dibuat dari berkas"
|
||||||
|
|
||||||
@@ -257,24 +257,24 @@ msgstr "_Tunggu"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Matikan Paksa"
|
msgstr "_Matikan Paksa"
|
||||||
|
|
||||||
#: ../src/core/display.c:421
|
#: ../src/core/display.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr "Kehilangan ekstensi %s yang diperlukan untuk pengkomposisian"
|
msgstr "Kehilangan ekstensi %s yang diperlukan untuk pengkomposisian"
|
||||||
|
|
||||||
#: ../src/core/display.c:513
|
#: ../src/core/display.c:493
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "Gagal membuka tampilan X Window System '%s'\n"
|
msgstr "Gagal membuka tampilan X Window System '%s'\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1136
|
#: ../src/core/keybindings.c:935
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Some other program is already using the key %s with modifiers %x as a "
|
"Some other program is already using the key %s with modifiers %x as a "
|
||||||
"binding\n"
|
"binding\n"
|
||||||
msgstr "Ada program lain yang menggunakan tombol %s dengan kombinasi %x\n"
|
msgstr "Ada program lain yang menggunakan tombol %s dengan kombinasi %x\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1333
|
#: ../src/core/keybindings.c:1135
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "\"%s\" bukan akselerator yang valid\n"
|
msgstr "\"%s\" bukan akselerator yang valid\n"
|
||||||
@@ -314,19 +314,6 @@ msgid ""
|
|||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||||
msgstr "Tak menemukan tema! Pastikan %s ada dan berisi tema yang biasa.\n"
|
msgstr "Tak menemukan tema! Pastikan %s ada dan berisi tema yang biasa.\n"
|
||||||
|
|
||||||
#: ../src/core/monitor.c:711
|
|
||||||
msgid "Built-in display"
|
|
||||||
msgstr "Tampilan bawaan"
|
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor name (in case we don't know
|
|
||||||
#. the vendor), it's Unknown followed by a size in inches,
|
|
||||||
#. like 'Unknown 15"'
|
|
||||||
#.
|
|
||||||
#: ../src/core/monitor.c:739
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown %s"
|
|
||||||
msgstr "%s tidak dikenal"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -351,7 +338,7 @@ msgstr "Cetak versi"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Pengaya Mutter yang dipakai"
|
msgstr "Pengaya Mutter yang dipakai"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1202
|
#: ../src/core/prefs.c:1095
|
||||||
msgid ""
|
msgid ""
|
||||||
"Workarounds for broken applications disabled. Some applications may not "
|
"Workarounds for broken applications disabled. Some applications may not "
|
||||||
"behave properly.\n"
|
"behave properly.\n"
|
||||||
@@ -359,12 +346,12 @@ msgstr ""
|
|||||||
"Pencegahan kesalahan bagi aplikasi yang rusak sedang dinonaktifkan. Mungkin "
|
"Pencegahan kesalahan bagi aplikasi yang rusak sedang dinonaktifkan. Mungkin "
|
||||||
"nanti ada beberapa aplikasi yang akan bertingkah aneh.\n"
|
"nanti ada beberapa aplikasi yang akan bertingkah aneh.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1277
|
#: ../src/core/prefs.c:1170
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "Tak dapat mengurai deskripsi fonta \"%s\" dari kunci GSettings %s\n"
|
msgstr "Tak dapat mengurai deskripsi fonta \"%s\" dari kunci GSettings %s\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1343
|
#: ../src/core/prefs.c:1236
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||||
@@ -373,7 +360,7 @@ msgstr ""
|
|||||||
"\"%s\" yang ada pada database konfigurasi bukanlah nilai yang benar untuk "
|
"\"%s\" yang ada pada database konfigurasi bukanlah nilai yang benar untuk "
|
||||||
"tombol mouse.\n"
|
"tombol mouse.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1909
|
#: ../src/core/prefs.c:1788
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||||
@@ -382,17 +369,17 @@ msgstr ""
|
|||||||
"\"%s\" yang ada pada database konfigurasi bernilai tidak benar untuk "
|
"\"%s\" yang ada pada database konfigurasi bernilai tidak benar untuk "
|
||||||
"kombinasi tombol \"%s\"\n"
|
"kombinasi tombol \"%s\"\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1999
|
#: ../src/core/prefs.c:1887
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Area kerja %d"
|
msgstr "Area kerja %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:534
|
#: ../src/core/screen.c:691
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "Layar %d pada tampilan '%s' tidak benar\n"
|
msgstr "Layar %d pada tampilan '%s' tidak benar\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:550
|
#: ../src/core/screen.c:707
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||||
@@ -401,7 +388,7 @@ msgstr ""
|
|||||||
"Layar %d pada tampilan \"%s\" sudah memiliki pengatur jendela. Cobalah "
|
"Layar %d pada tampilan \"%s\" sudah memiliki pengatur jendela. Cobalah "
|
||||||
"gunakan pilihan --replace untuk mengganti pengatur jendela yang aktif.\n"
|
"gunakan pilihan --replace untuk mengganti pengatur jendela yang aktif.\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:577
|
#: ../src/core/screen.c:734
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||||
@@ -409,12 +396,12 @@ msgstr ""
|
|||||||
"Tidak dapat mendapatkan pilihan pengatur jendela pada layar %d tampilan \"%s"
|
"Tidak dapat mendapatkan pilihan pengatur jendela pada layar %d tampilan \"%s"
|
||||||
"\"\n"
|
"\"\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:655
|
#: ../src/core/screen.c:812
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
msgstr "Layar %d pada tampilan \"%s\" sudah ada pengatur jendelanya\n"
|
msgstr "Layar %d pada tampilan \"%s\" sudah ada pengatur jendelanya\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:846
|
#: ../src/core/screen.c:998
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not release screen %d on display \"%s\"\n"
|
msgid "Could not release screen %d on display \"%s\"\n"
|
||||||
msgstr "Layar %d pada tampilan \"%s\" tidak dapat dilepas\n"
|
msgstr "Layar %d pada tampilan \"%s\" tidak dapat dilepas\n"
|
||||||
@@ -489,7 +476,8 @@ msgstr "Gagal melakukan fdopen pada berkas log %s: %s\n"
|
|||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "Berkas log yang dibuka %s\n"
|
msgstr "Berkas log yang dibuka %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:119
|
#: ../src/core/util.c:119 ../src/tools/mutter-message.c:149
|
||||||
|
#, c-format
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "Muter dikompilasi tanpa dukungan mode riuh\n"
|
msgstr "Muter dikompilasi tanpa dukungan mode riuh\n"
|
||||||
|
|
||||||
@@ -497,20 +485,20 @@ msgstr "Muter dikompilasi tanpa dukungan mode riuh\n"
|
|||||||
msgid "Window manager: "
|
msgid "Window manager: "
|
||||||
msgstr "Pengatur jendela: "
|
msgstr "Pengatur jendela: "
|
||||||
|
|
||||||
#: ../src/core/util.c:414
|
#: ../src/core/util.c:412
|
||||||
msgid "Bug in window manager: "
|
msgid "Bug in window manager: "
|
||||||
msgstr "Bug pada pengatur jendela: "
|
msgstr "Bug pada pengatur jendela: "
|
||||||
|
|
||||||
#: ../src/core/util.c:445
|
#: ../src/core/util.c:443
|
||||||
msgid "Window manager warning: "
|
msgid "Window manager warning: "
|
||||||
msgstr "Peringatan pengatur jendela: "
|
msgstr "Peringatan pengatur jendela: "
|
||||||
|
|
||||||
#: ../src/core/util.c:473
|
#: ../src/core/util.c:471
|
||||||
msgid "Window manager error: "
|
msgid "Window manager error: "
|
||||||
msgstr "Eror pengatur jendela: "
|
msgstr "Eror pengatur jendela: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7533
|
#: ../src/core/window.c:7596
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||||
@@ -526,7 +514,7 @@ msgstr ""
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8257
|
#: ../src/core/window.c:8320
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||||
@@ -536,22 +524,22 @@ msgstr ""
|
|||||||
"ukurannya, sedangkan ukuran minimalnya adalah %d x %d dan maksimal %d x %d "
|
"ukurannya, sedangkan ukuran minimalnya adalah %d x %d dan maksimal %d x %d "
|
||||||
"yang tidak masuk di akal.\n"
|
"yang tidak masuk di akal.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:347
|
#: ../src/core/window-props.c:318
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||||
msgstr "Aplikasi telah membuat _NET_WM_PID %lu bohongan\n"
|
msgstr "Aplikasi telah membuat _NET_WM_PID %lu bohongan\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:463
|
#: ../src/core/window-props.c:434
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (pada %s)"
|
msgstr "%s (pada %s)"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1546
|
#: ../src/core/window-props.c:1517
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||||
msgstr "WM_TRANSIENT_FOR salah jendela 0x%lx ditentukan untuk %s.\n"
|
msgstr "WM_TRANSIENT_FOR salah jendela 0x%lx ditentukan untuk %s.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1557
|
#: ../src/core/window-props.c:1528
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||||
msgstr "Jendela WM_TRANSIENT_FOR 0x%lx untuk %s akan membuat loop.\n"
|
msgstr "Jendela WM_TRANSIENT_FOR 0x%lx untuk %s akan membuat loop.\n"
|
||||||
@@ -715,104 +703,109 @@ msgstr "Pilih jendela dari popup tab"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "Batalkan popup tab"
|
msgstr "Batalkan popup tab"
|
||||||
|
|
||||||
|
#: ../src/tools/mutter-message.c:123
|
||||||
|
#, c-format
|
||||||
|
msgid "Usage: %s\n"
|
||||||
|
msgstr "Cara pakai: %s\n"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:67
|
#: ../src/ui/menu.c:69
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "Kecilka_n"
|
msgstr "Kecilka_n"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:69
|
#: ../src/ui/menu.c:71
|
||||||
msgid "Ma_ximize"
|
msgid "Ma_ximize"
|
||||||
msgstr "Pe_rbesar"
|
msgstr "Pe_rbesar"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:71
|
#: ../src/ui/menu.c:73
|
||||||
msgid "Unma_ximize"
|
msgid "Unma_ximize"
|
||||||
msgstr "Kem_balikan"
|
msgstr "Kem_balikan"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:73
|
#: ../src/ui/menu.c:75
|
||||||
msgid "Roll _Up"
|
msgid "Roll _Up"
|
||||||
msgstr "G_ulung"
|
msgstr "G_ulung"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:75
|
#: ../src/ui/menu.c:77
|
||||||
msgid "_Unroll"
|
msgid "_Unroll"
|
||||||
msgstr "B_uka"
|
msgstr "B_uka"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:77
|
#: ../src/ui/menu.c:79
|
||||||
msgid "_Move"
|
msgid "_Move"
|
||||||
msgstr "_Pindahkan"
|
msgstr "_Pindahkan"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:79
|
#: ../src/ui/menu.c:81
|
||||||
msgid "_Resize"
|
msgid "_Resize"
|
||||||
msgstr "Ganti·Uku_ran"
|
msgstr "Ganti·Uku_ran"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:81
|
#: ../src/ui/menu.c:83
|
||||||
msgid "Move Titlebar On_screen"
|
msgid "Move Titlebar On_screen"
|
||||||
msgstr "Pindahkan Judul Pada _layar"
|
msgstr "Pindahkan Judul Pada _layar"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:84 ../src/ui/menu.c:86
|
#: ../src/ui/menu.c:86 ../src/ui/menu.c:88
|
||||||
msgid "Always on _Top"
|
msgid "Always on _Top"
|
||||||
msgstr "Selalu di A_tas"
|
msgstr "Selalu di A_tas"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:88
|
#: ../src/ui/menu.c:90
|
||||||
msgid "_Always on Visible Workspace"
|
msgid "_Always on Visible Workspace"
|
||||||
msgstr "T_ampak pada Area Kerja Aktif"
|
msgstr "T_ampak pada Area Kerja Aktif"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:90
|
#: ../src/ui/menu.c:92
|
||||||
msgid "_Only on This Workspace"
|
msgid "_Only on This Workspace"
|
||||||
msgstr "_Tampak pada Area Kerja Ini Saja"
|
msgstr "_Tampak pada Area Kerja Ini Saja"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:92
|
#: ../src/ui/menu.c:94
|
||||||
msgid "Move to Workspace _Left"
|
msgid "Move to Workspace _Left"
|
||||||
msgstr "Pindahkan ke Area Kerja _Kiri"
|
msgstr "Pindahkan ke Area Kerja _Kiri"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:94
|
#: ../src/ui/menu.c:96
|
||||||
msgid "Move to Workspace R_ight"
|
msgid "Move to Workspace R_ight"
|
||||||
msgstr "Pindahkan ke A_rea Kerja Kanan"
|
msgstr "Pindahkan ke A_rea Kerja Kanan"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:96
|
#: ../src/ui/menu.c:98
|
||||||
msgid "Move to Workspace _Up"
|
msgid "Move to Workspace _Up"
|
||||||
msgstr "Pindahkan ke Area Kerja Ata_s"
|
msgstr "Pindahkan ke Area Kerja Ata_s"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:98
|
#: ../src/ui/menu.c:100
|
||||||
msgid "Move to Workspace _Down"
|
msgid "Move to Workspace _Down"
|
||||||
msgstr "Pindahkan ke Area Kerja _Bawah"
|
msgstr "Pindahkan ke Area Kerja _Bawah"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:102
|
#: ../src/ui/menu.c:104
|
||||||
msgid "_Close"
|
msgid "_Close"
|
||||||
msgstr "_Tutup"
|
msgstr "_Tutup"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:202
|
#: ../src/ui/menu.c:204
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d%n"
|
msgid "Workspace %d%n"
|
||||||
msgstr "Area Kerja %d%n"
|
msgstr "Area Kerja %d%n"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:212
|
#: ../src/ui/menu.c:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace 1_0"
|
msgid "Workspace 1_0"
|
||||||
msgstr "Area Kerja 1_0"
|
msgstr "Area Kerja 1_0"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:214
|
#: ../src/ui/menu.c:216
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %s%d"
|
msgid "Workspace %s%d"
|
||||||
msgstr "Area Kerja %s%d"
|
msgstr "Area Kerja %s%d"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:384
|
#: ../src/ui/menu.c:397
|
||||||
msgid "Move to Another _Workspace"
|
msgid "Move to Another _Workspace"
|
||||||
msgstr "Pindahkan ke Area Kerja _Lain"
|
msgstr "Pindahkan ke Area Kerja _Lain"
|
||||||
|
|
||||||
@@ -1170,18 +1163,18 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> tidak ada"
|
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> tidak ada"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5082
|
#: ../src/ui/theme.c:5084
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
msgid "Failed to load theme \"%s\": %s\n"
|
||||||
msgstr "Gagal membuka tema \"%s\": %s\n"
|
msgstr "Gagal membuka tema \"%s\": %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
#: ../src/ui/theme.c:5220 ../src/ui/theme.c:5227 ../src/ui/theme.c:5234
|
||||||
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
#: ../src/ui/theme.c:5241 ../src/ui/theme.c:5248
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "No <%s> set for theme \"%s\""
|
msgid "No <%s> set for theme \"%s\""
|
||||||
msgstr "Tidak ada <%s> yang ditentukan untuk tema \"%s\""
|
msgstr "Tidak ada <%s> yang ditentukan untuk tema \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5254
|
#: ../src/ui/theme.c:5256
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||||
@@ -1190,14 +1183,14 @@ msgstr ""
|
|||||||
"Tidak ada gaya frame untuk tipe window \"%s\" pada tema \"%s\". Tambah dulu "
|
"Tidak ada gaya frame untuk tipe window \"%s\" pada tema \"%s\". Tambah dulu "
|
||||||
"elemen <window type=\"%s\" style_set=\"whatever\"/>"
|
"elemen <window type=\"%s\" style_set=\"whatever\"/>"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5661 ../src/ui/theme.c:5723 ../src/ui/theme.c:5786
|
#: ../src/ui/theme.c:5663 ../src/ui/theme.c:5725 ../src/ui/theme.c:5788
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Konstanta buatan pengguna harus dimulai dengan huruf besar: \"%s\" tidak"
|
"Konstanta buatan pengguna harus dimulai dengan huruf besar: \"%s\" tidak"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5669 ../src/ui/theme.c:5731 ../src/ui/theme.c:5794
|
#: ../src/ui/theme.c:5671 ../src/ui/theme.c:5733 ../src/ui/theme.c:5796
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Constant \"%s\" has already been defined"
|
msgid "Constant \"%s\" has already been defined"
|
||||||
msgstr "Konstanta \"%s\" telah didefinisikan sebelumnya"
|
msgstr "Konstanta \"%s\" telah didefinisikan sebelumnya"
|
||||||
@@ -1585,3 +1578,201 @@ msgstr "<%s> disebutkan dua kali pada tema ini"
|
|||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "Gagal menemukan berkas yang sah untuk tema %s\n"
|
msgstr "Gagal menemukan berkas yang sah untuk tema %s\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:99
|
||||||
|
msgid "_Windows"
|
||||||
|
msgstr "_Jendela"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:100
|
||||||
|
msgid "_Dialog"
|
||||||
|
msgstr "_Dialog"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:101
|
||||||
|
msgid "_Modal dialog"
|
||||||
|
msgstr "Dialog _modal"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:102
|
||||||
|
msgid "_Utility"
|
||||||
|
msgstr "_Utilitas"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:103
|
||||||
|
msgid "_Splashscreen"
|
||||||
|
msgstr "Layar _pembuka"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:104
|
||||||
|
msgid "_Top dock"
|
||||||
|
msgstr "Dok a_tas"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:105
|
||||||
|
msgid "_Bottom dock"
|
||||||
|
msgstr "Dok _bawah"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:106
|
||||||
|
msgid "_Left dock"
|
||||||
|
msgstr "Dok k_iri"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:107
|
||||||
|
msgid "_Right dock"
|
||||||
|
msgstr "Dok kana_n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:108
|
||||||
|
msgid "_All docks"
|
||||||
|
msgstr "Semu_a dok"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:109
|
||||||
|
msgid "Des_ktop"
|
||||||
|
msgstr "Des_ktop"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:115
|
||||||
|
msgid "Open another one of these windows"
|
||||||
|
msgstr "Buka lagi jendela semacam ini"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:117
|
||||||
|
msgid "This is a demo button with an 'open' icon"
|
||||||
|
msgstr "Ini contoh tombol dengan ikon 'open'"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:119
|
||||||
|
msgid "This is a demo button with a 'quit' icon"
|
||||||
|
msgstr "Ini contoh tombol dengan ikon 'quit'"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:248
|
||||||
|
msgid "This is a sample message in a sample dialog"
|
||||||
|
msgstr "Ini contoh pesan pada suatu dialog"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:328
|
||||||
|
#, c-format
|
||||||
|
msgid "Fake menu item %d\n"
|
||||||
|
msgstr "Item menu %d\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:363
|
||||||
|
msgid "Border-only window"
|
||||||
|
msgstr "Jendela dengan garis pembatas"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:365
|
||||||
|
msgid "Bar"
|
||||||
|
msgstr "Kotak"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:382
|
||||||
|
msgid "Normal Application Window"
|
||||||
|
msgstr "Jendela Aplikasi Normal"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:386
|
||||||
|
msgid "Dialog Box"
|
||||||
|
msgstr "Kotak Dialog"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:390
|
||||||
|
msgid "Modal Dialog Box"
|
||||||
|
msgstr "Kotak Dialog Modal"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:394
|
||||||
|
msgid "Utility Palette"
|
||||||
|
msgstr "Kotak Perkakas"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:398
|
||||||
|
msgid "Torn-off Menu"
|
||||||
|
msgstr "Menu Dapat Dilepas"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:402
|
||||||
|
msgid "Border"
|
||||||
|
msgstr "Batas"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:406
|
||||||
|
msgid "Attached Modal Dialog"
|
||||||
|
msgstr "Dialog Modal yang Dilampirkan"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:737
|
||||||
|
#, c-format
|
||||||
|
msgid "Button layout test %d"
|
||||||
|
msgstr "Tes komposisi tombol %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:766
|
||||||
|
#, c-format
|
||||||
|
msgid "%g milliseconds to draw one window frame"
|
||||||
|
msgstr "lama waktu menggambar satu bingkai jendela %g milidetik"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:811
|
||||||
|
#, c-format
|
||||||
|
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||||
|
msgstr "Cara pakai: metacity-theme-viewer [NAMA TEMA]\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:818
|
||||||
|
#, c-format
|
||||||
|
msgid "Error loading theme: %s\n"
|
||||||
|
msgstr "Ada error saat membaca tema: %s\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:824
|
||||||
|
#, c-format
|
||||||
|
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||||
|
msgstr "Tema \"%s\" dibuka dalam %g detik\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:869
|
||||||
|
msgid "Normal Title Font"
|
||||||
|
msgstr "Judul dengan huruf normal"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:875
|
||||||
|
msgid "Small Title Font"
|
||||||
|
msgstr "Judul dengan huruf ukuran kecil"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:881
|
||||||
|
msgid "Large Title Font"
|
||||||
|
msgstr "Judul Raksasa"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:886
|
||||||
|
msgid "Button Layouts"
|
||||||
|
msgstr "Komposisi Tombol"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:891
|
||||||
|
msgid "Benchmark"
|
||||||
|
msgstr "Pengukuran"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:947
|
||||||
|
msgid "Window Title Goes Here"
|
||||||
|
msgstr "Ini tempat judul jendela"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1053
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
||||||
|
"seconds wall clock time including X server resources (%g milliseconds per "
|
||||||
|
"frame)\n"
|
||||||
|
msgstr ""
|
||||||
|
"%d frame dibuat dalam %g detik dalam waktu klien (%g milidetik per frame) "
|
||||||
|
"dan %g detik dalam waktu sebenarnya (%g milidetik per frame)\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1273
|
||||||
|
msgid "position expression test returned TRUE but set error"
|
||||||
|
msgstr "tes ekspresi posisi berakhir TRUE tapi justru ada error"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1275
|
||||||
|
msgid "position expression test returned FALSE but didn't set error"
|
||||||
|
msgstr "tes ekspresi posisi berakhir FALSE tapi tidak ada error"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1279
|
||||||
|
msgid "Error was expected but none given"
|
||||||
|
msgstr "Seharusnya ada error, tapi ini kok tidak ada"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1281
|
||||||
|
#, c-format
|
||||||
|
msgid "Error %d was expected but %d given"
|
||||||
|
msgstr "Seharunya ada error %d, tapi yang terjadi %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1287
|
||||||
|
#, c-format
|
||||||
|
msgid "Error not expected but one was returned: %s"
|
||||||
|
msgstr "Seharusnya tidak ada error, tapi ini tiba-tiba ada error: %s"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1291
|
||||||
|
#, c-format
|
||||||
|
msgid "x value was %d, %d was expected"
|
||||||
|
msgstr "nilai x sebelumnya %d, padahal seharusnya %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1294
|
||||||
|
#, c-format
|
||||||
|
msgid "y value was %d, %d was expected"
|
||||||
|
msgstr "nilai y sebelumnya %d, padahal seharusnya %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1359
|
||||||
|
#, c-format
|
||||||
|
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||||
|
msgstr "ekspresi koordinat %d diambil dalam %g detik (rata-rata %g detik)\n"
|
||||||
|
|
||||||
|
32
po/ja.po
32
po/ja.po
@@ -12,8 +12,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter master\n"
|
"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"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-07-30 12:29+0000\n"
|
"POT-Creation-Date: 2013-03-22 10:02+0000\n"
|
||||||
"PO-Revision-Date: 2013-07-30 23:01+0900\n"
|
"PO-Revision-Date: 2013-03-25 17:02+0000\n"
|
||||||
"Last-Translator: Jiro Matsuzawa <jmatsuzawa@gnome.org>\n"
|
"Last-Translator: Jiro Matsuzawa <jmatsuzawa@gnome.org>\n"
|
||||||
"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
|
"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
|
||||||
"Language: ja\n"
|
"Language: ja\n"
|
||||||
@@ -133,7 +133,7 @@ msgstr "コマンド実行プロンプトを表示する"
|
|||||||
|
|
||||||
#: ../src/50-mutter-system.xml.in.h:3
|
#: ../src/50-mutter-system.xml.in.h:3
|
||||||
msgid "Show the activities overview"
|
msgid "Show the activities overview"
|
||||||
msgstr "アクティビティ画面を表示する"
|
msgstr "アクティビティを表示する"
|
||||||
|
|
||||||
#: ../src/50-mutter-windows.xml.in.h:1
|
#: ../src/50-mutter-windows.xml.in.h:1
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
@@ -213,12 +213,12 @@ msgstr "画面右半分に表示する"
|
|||||||
|
|
||||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||||
#. * we have no way to get it to exit
|
#. * we have no way to get it to exit
|
||||||
#: ../src/compositor/compositor.c:589
|
#: ../src/compositor/compositor.c:568
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Another compositing manager is already running on screen %i on display \"%s\"."
|
msgid "Another compositing manager is already running on screen %i on display \"%s\"."
|
||||||
msgstr "既に別の合成マネージャーがディスプレイ \"%2$s\" 上のスクリーン %1$i で起動中です"
|
msgstr "既に別の合成マネージャーがディスプレイ \"%2$s\" 上のスクリーン %1$i で起動中です"
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1076
|
#: ../src/compositor/meta-background.c:1191
|
||||||
msgid "background texture could not be created from file"
|
msgid "background texture could not be created from file"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -252,22 +252,22 @@ msgstr "待機する(_W)"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "強制終了する(_F)"
|
msgstr "強制終了する(_F)"
|
||||||
|
|
||||||
#: ../src/core/display.c:421
|
#: ../src/core/display.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr "ウィンドウの合成に必要な %s という拡張モジュールが存在しません"
|
msgstr "ウィンドウの合成に必要な %s という拡張モジュールが存在しません"
|
||||||
|
|
||||||
#: ../src/core/display.c:513
|
#: ../src/core/display.c:493
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "X Window System のディスプレイ '%s' のオープンに失敗しました\n"
|
msgstr "X Window System のディスプレイ '%s' のオープンに失敗しました\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1138
|
#: ../src/core/keybindings.c:935
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Some other program is already using the key %s with modifiers %x as a binding\n"
|
msgid "Some other program is already using the key %s with modifiers %x as a binding\n"
|
||||||
msgstr "既にバインディングとして別のプログラムでキー %s (修飾キー %x) を使っています\n"
|
msgstr "既にバインディングとして別のプログラムでキー %s (修飾キー %x) を使っています\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1335
|
#: ../src/core/keybindings.c:1135
|
||||||
#, fuzzy, c-format
|
#, fuzzy, c-format
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "\"%s\" はフォーカス属性のためには有効な値ではありません"
|
msgstr "\"%s\" はフォーカス属性のためには有効な値ではありません"
|
||||||
@@ -328,26 +328,26 @@ msgstr "バージョンを表示する"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "使用する Mutter のプラグイン"
|
msgstr "使用する Mutter のプラグイン"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1202
|
#: ../src/core/prefs.c:1095
|
||||||
msgid "Workarounds for broken applications disabled. Some applications may not behave properly.\n"
|
msgid "Workarounds for broken applications disabled. Some applications may not behave properly.\n"
|
||||||
msgstr "仕様に準拠していないアプリケーションに対する次善策は無効になっています。一部のアプリケーションは正常に動作しない可能性があります\n"
|
msgstr "仕様に準拠していないアプリケーションに対する次善策は無効になっています。一部のアプリケーションは正常に動作しない可能性があります\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1277
|
#: ../src/core/prefs.c:1170
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "GSettings の %2$s キーからフォント名 \"%1$s\" を解析できませんでした\n"
|
msgstr "GSettings の %2$s キーからフォント名 \"%1$s\" を解析できませんでした\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1343
|
#: ../src/core/prefs.c:1236
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" found in configuration database is not a valid value for mouse button modifier\n"
|
msgid "\"%s\" found in configuration database is not a valid value for mouse button modifier\n"
|
||||||
msgstr "設定データベース中の \"%s\" はマウスボタンの修飾キーとして妥当な値ではありません\n"
|
msgstr "設定データベース中の \"%s\" はマウスボタンの修飾キーとして妥当な値ではありません\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1909
|
#: ../src/core/prefs.c:1788
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" found in configuration database is not a valid value for keybinding \"%s\"\n"
|
msgid "\"%s\" found in configuration database is not a valid value for keybinding \"%s\"\n"
|
||||||
msgstr "設定データベース中の \"%s\" はキーバインド \"%s\" に有効な値ではありません\n"
|
msgstr "設定データベース中の \"%s\" はキーバインド \"%s\" に有効な値ではありません\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1999
|
#: ../src/core/prefs.c:1887
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "ワークスペース %d"
|
msgstr "ワークスペース %d"
|
||||||
@@ -465,7 +465,7 @@ msgid "Window manager error: "
|
|||||||
msgstr "ウィンドウマネージャーのエラー: "
|
msgstr "ウィンドウマネージャーのエラー: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7513
|
#: ../src/core/window.c:7596
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER window as specified in the ICCCM.\n"
|
msgid "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER window as specified in the ICCCM.\n"
|
||||||
msgstr "ウィンドウ %s は ICCCM で指定されていたような WM_CLIENT_LEADER ウィンドウの代わりに自分自身で SM_CLIENT_ID を設定しています\n"
|
msgstr "ウィンドウ %s は ICCCM で指定されていたような WM_CLIENT_LEADER ウィンドウの代わりに自分自身で SM_CLIENT_ID を設定しています\n"
|
||||||
@@ -477,7 +477,7 @@ msgstr "ウィンドウ %s は ICCCM で指定されていたような WM_CLIENT
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8237
|
#: ../src/core/window.c:8320
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Window %s sets an MWM hint indicating it isn't resizable, but sets min size %d x %d and max size %d x %d; this doesn't make much sense.\n"
|
msgid "Window %s sets an MWM hint indicating it isn't resizable, but sets min size %d x %d and max size %d x %d; this doesn't make much sense.\n"
|
||||||
msgstr "ウィンドウ %s はリサイズ可能ではない MWM ヒント指示を設定していますが、最小サイズ %d x %d と最大サイズ %d x %dも設定しています。これはあまり意味がありません\n"
|
msgstr "ウィンドウ %s はリサイズ可能ではない MWM ヒント指示を設定していますが、最小サイズ %d x %d と最大サイズ %d x %dも設定しています。これはあまり意味がありません\n"
|
||||||
|
458
po/ko.po
458
po/ko.po
@@ -18,8 +18,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter\n"
|
"Project-Id-Version: mutter\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
"POT-Creation-Date: 2013-03-01 15:50+0000\n"
|
||||||
"PO-Revision-Date: 2013-09-09 04:46+0900\n"
|
"PO-Revision-Date: 2013-03-13 03:52+0900\n"
|
||||||
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
|
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
|
||||||
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
|
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
|
||||||
"Language: Korean\n"
|
"Language: Korean\n"
|
||||||
@@ -218,7 +218,7 @@ msgstr "오른쪽 절반 뷰"
|
|||||||
|
|
||||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||||
#. * we have no way to get it to exit
|
#. * we have no way to get it to exit
|
||||||
#: ../src/compositor/compositor.c:589
|
#: ../src/compositor/compositor.c:507
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Another compositing manager is already running on screen %i on display \"%s"
|
"Another compositing manager is already running on screen %i on display \"%s"
|
||||||
@@ -227,11 +227,11 @@ msgstr ""
|
|||||||
"다른 창 구성 관리 프로그램이 이미 디스플레이 \"%2$s\" 화면 %1$i번에서 실행 중"
|
"다른 창 구성 관리 프로그램이 이미 디스플레이 \"%2$s\" 화면 %1$i번에서 실행 중"
|
||||||
"입니다."
|
"입니다."
|
||||||
|
|
||||||
#: ../src/compositor/meta-background.c:1076
|
#: ../src/compositor/meta-background.c:1111
|
||||||
msgid "background texture could not be created from file"
|
msgid "background texture could not be created from file"
|
||||||
msgstr "파일에서 배경 텍스처를 만들 수 없습니다"
|
msgstr "파일에서 배경 텍스처를 만들 수 없습니다"
|
||||||
|
|
||||||
#: ../src/core/bell.c:322
|
#: ../src/core/bell.c:320
|
||||||
msgid "Bell event"
|
msgid "Bell event"
|
||||||
msgstr "삑소리 이벤트"
|
msgstr "삑소리 이벤트"
|
||||||
|
|
||||||
@@ -263,17 +263,17 @@ msgstr "기다리기(_W)"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "강제로 끝내기(_F)"
|
msgstr "강제로 끝내기(_F)"
|
||||||
|
|
||||||
#: ../src/core/display.c:421
|
#: ../src/core/display.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr "콤포짓에 필요한 %s 확장 기능이 없습니다"
|
msgstr "콤포짓에 필요한 %s 확장 기능이 없습니다"
|
||||||
|
|
||||||
#: ../src/core/display.c:513
|
#: ../src/core/display.c:493
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "X 윈도 시스템 디스플레이 '%s'을(를) 여는데 실패하였습니다\n"
|
msgstr "X 윈도 시스템 디스플레이 '%s'을(를) 여는데 실패하였습니다\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1136
|
#: ../src/core/keybindings.c:929
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Some other program is already using the key %s with modifiers %x as a "
|
"Some other program is already using the key %s with modifiers %x as a "
|
||||||
@@ -282,41 +282,41 @@ msgstr ""
|
|||||||
"다른 프로그램에서 이미 단축키로 변경 키 %2$x와(과) 키 %1$s을(를) 사용하고 있"
|
"다른 프로그램에서 이미 단축키로 변경 키 %2$x와(과) 키 %1$s을(를) 사용하고 있"
|
||||||
"습니다\n"
|
"습니다\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1333
|
#: ../src/core/keybindings.c:1129
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "\"%s\"은(는) 올바른 단축키가 아닙니다\n"
|
msgstr "\"%s\"은(는) 올바른 단축키가 아닙니다\n"
|
||||||
|
|
||||||
#: ../src/core/main.c:197
|
#: ../src/core/main.c:196
|
||||||
msgid "Disable connection to session manager"
|
msgid "Disable connection to session manager"
|
||||||
msgstr "세션 관리자와 연결 하지 않습니다"
|
msgstr "세션 관리자와 연결 하지 않습니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:203
|
#: ../src/core/main.c:202
|
||||||
msgid "Replace the running window manager"
|
msgid "Replace the running window manager"
|
||||||
msgstr "실행 중인 창 관리자를 바꿉니다"
|
msgstr "실행 중인 창 관리자를 바꿉니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:209
|
#: ../src/core/main.c:208
|
||||||
msgid "Specify session management ID"
|
msgid "Specify session management ID"
|
||||||
msgstr "세션 관리 ID를 지정합니다"
|
msgstr "세션 관리 ID를 지정합니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:214
|
#: ../src/core/main.c:213
|
||||||
msgid "X Display to use"
|
msgid "X Display to use"
|
||||||
msgstr "사용할 X 디스플레이"
|
msgstr "사용할 X 디스플레이"
|
||||||
|
|
||||||
#: ../src/core/main.c:220
|
#: ../src/core/main.c:219
|
||||||
msgid "Initialize session from savefile"
|
msgid "Initialize session from savefile"
|
||||||
msgstr "저장 파일에서 세션을 초기화 합니다"
|
msgstr "저장 파일에서 세션을 초기화 합니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:226
|
#: ../src/core/main.c:225
|
||||||
msgid "Make X calls synchronous"
|
msgid "Make X calls synchronous"
|
||||||
msgstr "동기 X 호출을 합니다"
|
msgstr "동기 X 호출을 합니다"
|
||||||
|
|
||||||
#: ../src/core/main.c:534
|
#: ../src/core/main.c:494
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to scan themes directory: %s\n"
|
msgid "Failed to scan themes directory: %s\n"
|
||||||
msgstr "테마 디렉터리를 읽는 데 실패했습니다: %s\n"
|
msgstr "테마 디렉터리를 읽는 데 실패했습니다: %s\n"
|
||||||
|
|
||||||
#: ../src/core/main.c:550
|
#: ../src/core/main.c:510
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
|
||||||
@@ -324,19 +324,6 @@ msgstr ""
|
|||||||
"테마를 찾을 수 없습니다! %s이(가) 있고 올바른 테마가 들어 있는지 확인하십시"
|
"테마를 찾을 수 없습니다! %s이(가) 있고 올바른 테마가 들어 있는지 확인하십시"
|
||||||
"오.\n"
|
"오.\n"
|
||||||
|
|
||||||
#: ../src/core/monitor.c:711
|
|
||||||
msgid "Built-in display"
|
|
||||||
msgstr "내장 디스플레이"
|
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor name (in case we don't know
|
|
||||||
#. the vendor), it's Unknown followed by a size in inches,
|
|
||||||
#. like 'Unknown 15"'
|
|
||||||
#.
|
|
||||||
#: ../src/core/monitor.c:739
|
|
||||||
#, c-format
|
|
||||||
msgid "Unknown %s"
|
|
||||||
msgstr "알 수 없는 %s인치"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -360,20 +347,18 @@ msgstr "버전을 출력합니다"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "사용할 머터 플러그인"
|
msgstr "사용할 머터 플러그인"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1202
|
#: ../src/core/prefs.c:1087
|
||||||
msgid ""
|
msgid ""
|
||||||
"Workarounds for broken applications disabled. Some applications may not "
|
"Workarounds for broken applications disabled. Some applications may not "
|
||||||
"behave properly.\n"
|
"behave properly.\n"
|
||||||
msgstr ""
|
msgstr "응용 프로그램에 대한 임시 방편을 막았습니다. 몇몇 응용 프로그램이 제대로 동작하지 않을것입니다.\n"
|
||||||
"응용 프로그램에 대한 임시 방편을 막았습니다. 몇몇 응용 프로그램이 제대로 동작"
|
|
||||||
"하지 않을것입니다.\n"
|
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1277
|
#: ../src/core/prefs.c:1162
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "GSettings 키 %2$s에서 글꼴 지정 \"%1$s\"을(를) 분석할 수 없습니다\n"
|
msgstr "GSettings 키 %2$s에서 글꼴 지정 \"%1$s\"을(를) 분석할 수 없습니다\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1343
|
#: ../src/core/prefs.c:1228
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||||
@@ -382,7 +367,7 @@ msgstr ""
|
|||||||
"설정 데이터베이스에서 찾은 \"%s\"이(가) 마우스 단추 변경 키의 올바른 값이 아"
|
"설정 데이터베이스에서 찾은 \"%s\"이(가) 마우스 단추 변경 키의 올바른 값이 아"
|
||||||
"닙니다\n"
|
"닙니다\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1909
|
#: ../src/core/prefs.c:1780
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||||
@@ -391,17 +376,17 @@ msgstr ""
|
|||||||
"설정 데이터베이스에서 찾은 \"%s\"이(가) 단축키 \"%s\"에 대한 올바른 값이 아닙"
|
"설정 데이터베이스에서 찾은 \"%s\"이(가) 단축키 \"%s\"에 대한 올바른 값이 아닙"
|
||||||
"니다\n"
|
"니다\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1999
|
#: ../src/core/prefs.c:1879
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "작업 공간 %d"
|
msgstr "작업 공간 %d"
|
||||||
|
|
||||||
#: ../src/core/screen.c:534
|
#: ../src/core/screen.c:673
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display '%s' is invalid\n"
|
msgid "Screen %d on display '%s' is invalid\n"
|
||||||
msgstr "디스플레이 '%2$s'의 화면 %1$d은(는) 잘못되었습니다\n"
|
msgstr "디스플레이 '%2$s'의 화면 %1$d은(는) 잘못되었습니다\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:550
|
#: ../src/core/screen.c:689
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
"Screen %d on display \"%s\" already has a window manager; try using the --"
|
||||||
@@ -410,19 +395,19 @@ msgstr ""
|
|||||||
"디스플레이 \"%2$s\"의 화면 %1$d에 이미 창 관리자가 실행되고 있습니다. 현재 "
|
"디스플레이 \"%2$s\"의 화면 %1$d에 이미 창 관리자가 실행되고 있습니다. 현재 "
|
||||||
"창 관리자를 무시하는 --replace 옵션을 써보십시오.\n"
|
"창 관리자를 무시하는 --replace 옵션을 써보십시오.\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:577
|
#: ../src/core/screen.c:716
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
"Could not acquire window manager selection on screen %d display \"%s\"\n"
|
||||||
msgstr "디스플레이 \"%2$s\"의 화면 %1$d에 창 관리 선택을 가질 수 없습니다\n"
|
msgstr "디스플레이 \"%2$s\"의 화면 %1$d에 창 관리 선택을 가질 수 없습니다\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:655
|
#: ../src/core/screen.c:794
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"디스플레이 \"%2$s\"의 화면 %1$d은(는) 이미 창 관리자가 실행되고 있습니다\n"
|
"디스플레이 \"%2$s\"의 화면 %1$d은(는) 이미 창 관리자가 실행되고 있습니다\n"
|
||||||
|
|
||||||
#: ../src/core/screen.c:846
|
#: ../src/core/screen.c:979
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not release screen %d on display \"%s\"\n"
|
msgid "Could not release screen %d on display \"%s\"\n"
|
||||||
msgstr "디스플레이 \"%2$s\"의 화면 %1$d을(를) 떼어 놓을수 없습니다\n"
|
msgstr "디스플레이 \"%2$s\"의 화면 %1$d을(를) 떼어 놓을수 없습니다\n"
|
||||||
@@ -482,43 +467,44 @@ msgstr ""
|
|||||||
"이 창은 "현재 설정 저장"을 지원하지 않기 때문에 다음 번에 로그인 "
|
"이 창은 "현재 설정 저장"을 지원하지 않기 때문에 다음 번에 로그인 "
|
||||||
"할 때 수동으로 다시 시작해야 합니다."
|
"할 때 수동으로 다시 시작해야 합니다."
|
||||||
|
|
||||||
#: ../src/core/util.c:84
|
#: ../src/core/util.c:80
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open debug log: %s\n"
|
msgid "Failed to open debug log: %s\n"
|
||||||
msgstr "디버그 로그 열기 실패: %s\n"
|
msgstr "디버그 로그 열기 실패: %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:94
|
#: ../src/core/util.c:90
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to fdopen() log file %s: %s\n"
|
msgid "Failed to fdopen() log file %s: %s\n"
|
||||||
msgstr "로그 파일 %s을(를) fdopen()하기 실패: %s\n"
|
msgstr "로그 파일 %s을(를) fdopen()하기 실패: %s\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:100
|
#: ../src/core/util.c:96
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Opened log file %s\n"
|
msgid "Opened log file %s\n"
|
||||||
msgstr "로그 파일 %s을(를) 엽니다\n"
|
msgstr "로그 파일 %s을(를) 엽니다\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:119
|
#: ../src/core/util.c:115 ../src/tools/mutter-message.c:149
|
||||||
|
#, c-format
|
||||||
msgid "Mutter was compiled without support for verbose mode\n"
|
msgid "Mutter was compiled without support for verbose mode\n"
|
||||||
msgstr "머터가 자세한 모드 지원 없이 컴파일 되었습니다\n"
|
msgstr "머터가 자세한 모드 지원 없이 컴파일 되었습니다\n"
|
||||||
|
|
||||||
#: ../src/core/util.c:264
|
#: ../src/core/util.c:259
|
||||||
msgid "Window manager: "
|
msgid "Window manager: "
|
||||||
msgstr "창 관리자: "
|
msgstr "창 관리자: "
|
||||||
|
|
||||||
#: ../src/core/util.c:414
|
#: ../src/core/util.c:407
|
||||||
msgid "Bug in window manager: "
|
msgid "Bug in window manager: "
|
||||||
msgstr "창 관리자의 벌레: "
|
msgstr "창 관리자의 벌레: "
|
||||||
|
|
||||||
#: ../src/core/util.c:445
|
#: ../src/core/util.c:438
|
||||||
msgid "Window manager warning: "
|
msgid "Window manager warning: "
|
||||||
msgstr "창 관리자 주의: "
|
msgstr "창 관리자 주의: "
|
||||||
|
|
||||||
#: ../src/core/util.c:473
|
#: ../src/core/util.c:466
|
||||||
msgid "Window manager error: "
|
msgid "Window manager error: "
|
||||||
msgstr "장 관리자 오류: "
|
msgstr "장 관리자 오류: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7533
|
#: ../src/core/window.c:7539
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||||
@@ -534,7 +520,7 @@ msgstr ""
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8257
|
#: ../src/core/window.c:8263
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||||
@@ -543,23 +529,23 @@ msgstr ""
|
|||||||
"%s 창에서 크기 변경이 불가능하다는 MWM 힌트를 설정했지만, 최소 크기 %d x %d "
|
"%s 창에서 크기 변경이 불가능하다는 MWM 힌트를 설정했지만, 최소 크기 %d x %d "
|
||||||
"및 최대 크기 %d x %d(으)로 설정했습니다. 앞뒤가 맞지 않습니다.\n"
|
"및 최대 크기 %d x %d(으)로 설정했습니다. 앞뒤가 맞지 않습니다.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:347
|
#: ../src/core/window-props.c:318
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
msgid "Application set a bogus _NET_WM_PID %lu\n"
|
||||||
msgstr "응용 프로그램이 가짜 _NET_WM_PID %lu을(를) 설정하였습니다\n"
|
msgstr "응용 프로그램이 가짜 _NET_WM_PID %lu을(를) 설정하였습니다\n"
|
||||||
|
|
||||||
# <창제목> (on <기계>)
|
# <창제목> (on <기계>)
|
||||||
#: ../src/core/window-props.c:463
|
#: ../src/core/window-props.c:434
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s (on %s)"
|
msgid "%s (on %s)"
|
||||||
msgstr "%s (%s에서)"
|
msgstr "%s (%s에서)"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1546
|
#: ../src/core/window-props.c:1517
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
|
||||||
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창이 잘못되었습니다.\n"
|
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창이 잘못되었습니다.\n"
|
||||||
|
|
||||||
#: ../src/core/window-props.c:1557
|
#: ../src/core/window-props.c:1528
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
|
||||||
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창은 무한 반복입니다.\n"
|
msgstr "%2$s에 대해 WM_TRANSIENT_FOR 0x%1$lx 창은 무한 반복입니다.\n"
|
||||||
@@ -588,7 +574,9 @@ msgstr "창 0x%2$lx의 등록 정보 %1$s은(는) 잘못된 UTF-8이 들어 있
|
|||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
|
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
|
||||||
msgstr "창 0x%2$lx의 등록 정보 %1$s은(는) 목록안의 항목 %3$d에 잘못된 UTF-8 문자가 들어 있습니다\n"
|
msgstr ""
|
||||||
|
"창 0x%2$lx의 등록 정보 %1$s은(는) 목록안의 항목 %3$d에 잘못된 UTF-8을 포함하"
|
||||||
|
"고 있습니다\n"
|
||||||
|
|
||||||
#: ../src/mutter.desktop.in.h:1 ../src/mutter-wm.desktop.in.h:1
|
#: ../src/mutter.desktop.in.h:1 ../src/mutter-wm.desktop.in.h:1
|
||||||
msgid "Mutter"
|
msgid "Mutter"
|
||||||
@@ -717,104 +705,109 @@ msgstr "탭 팝업에서 창 선택"
|
|||||||
msgid "Cancel tab popup"
|
msgid "Cancel tab popup"
|
||||||
msgstr "탭 팝업 취소"
|
msgstr "탭 팝업 취소"
|
||||||
|
|
||||||
|
#: ../src/tools/mutter-message.c:123
|
||||||
|
#, c-format
|
||||||
|
msgid "Usage: %s\n"
|
||||||
|
msgstr "사용법: %s\n"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:67
|
#: ../src/ui/menu.c:69
|
||||||
msgid "Mi_nimize"
|
msgid "Mi_nimize"
|
||||||
msgstr "최소화(_N)"
|
msgstr "최소화(_N)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:69
|
#: ../src/ui/menu.c:71
|
||||||
msgid "Ma_ximize"
|
msgid "Ma_ximize"
|
||||||
msgstr "최대화(_X)"
|
msgstr "최대화(_X)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:71
|
#: ../src/ui/menu.c:73
|
||||||
msgid "Unma_ximize"
|
msgid "Unma_ximize"
|
||||||
msgstr "최대화 취소(_X)"
|
msgstr "최대화 취소(_X)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:73
|
#: ../src/ui/menu.c:75
|
||||||
msgid "Roll _Up"
|
msgid "Roll _Up"
|
||||||
msgstr "말아올리기(_U)"
|
msgstr "말아올리기(_U)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:75
|
#: ../src/ui/menu.c:77
|
||||||
msgid "_Unroll"
|
msgid "_Unroll"
|
||||||
msgstr "펼치기(_U)"
|
msgstr "펼치기(_U)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:77
|
#: ../src/ui/menu.c:79
|
||||||
msgid "_Move"
|
msgid "_Move"
|
||||||
msgstr "옮기기(_M)"
|
msgstr "옮기기(_M)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:79
|
#: ../src/ui/menu.c:81
|
||||||
msgid "_Resize"
|
msgid "_Resize"
|
||||||
msgstr "크기 조정(_R)"
|
msgstr "크기 조정(_R)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:81
|
#: ../src/ui/menu.c:83
|
||||||
msgid "Move Titlebar On_screen"
|
msgid "Move Titlebar On_screen"
|
||||||
msgstr "창 제목막대 화면에 표시(_S)"
|
msgstr "창 제목막대 화면에 표시(_S)"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:84 ../src/ui/menu.c:86
|
#: ../src/ui/menu.c:86 ../src/ui/menu.c:88
|
||||||
msgid "Always on _Top"
|
msgid "Always on _Top"
|
||||||
msgstr "항상 위(_T)"
|
msgstr "항상 위(_T)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:88
|
#: ../src/ui/menu.c:90
|
||||||
msgid "_Always on Visible Workspace"
|
msgid "_Always on Visible Workspace"
|
||||||
msgstr "항상 현재 작업 공간에 놓기(_A)"
|
msgstr "항상 현재 작업 공간에 놓기(_A)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:90
|
#: ../src/ui/menu.c:92
|
||||||
msgid "_Only on This Workspace"
|
msgid "_Only on This Workspace"
|
||||||
msgstr "이 작업 공간에만 놓기(_O)"
|
msgstr "이 작업 공간에만 놓기(_O)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:92
|
#: ../src/ui/menu.c:94
|
||||||
msgid "Move to Workspace _Left"
|
msgid "Move to Workspace _Left"
|
||||||
msgstr "왼쪽 작업 공간으로 옮기기(_L)"
|
msgstr "왼쪽 작업 공간으로 옮기기(_L)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:94
|
#: ../src/ui/menu.c:96
|
||||||
msgid "Move to Workspace R_ight"
|
msgid "Move to Workspace R_ight"
|
||||||
msgstr "오른쪽 작업 공간으로 옮기기(_I)"
|
msgstr "오른쪽 작업 공간으로 옮기기(_I)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:96
|
#: ../src/ui/menu.c:98
|
||||||
msgid "Move to Workspace _Up"
|
msgid "Move to Workspace _Up"
|
||||||
msgstr "위쪽 작업 공간으로 옮기기(_U)"
|
msgstr "위쪽 작업 공간으로 옮기기(_U)"
|
||||||
|
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:98
|
#: ../src/ui/menu.c:100
|
||||||
msgid "Move to Workspace _Down"
|
msgid "Move to Workspace _Down"
|
||||||
msgstr "아래쪽 작업 공간으로 옮기기(_D)"
|
msgstr "아래쪽 작업 공간으로 옮기기(_D)"
|
||||||
|
|
||||||
#. separator
|
#. separator
|
||||||
#. Translators: Translate this string the same way as you do in libwnck!
|
#. Translators: Translate this string the same way as you do in libwnck!
|
||||||
#: ../src/ui/menu.c:102
|
#: ../src/ui/menu.c:104
|
||||||
msgid "_Close"
|
msgid "_Close"
|
||||||
msgstr "닫기(_C)"
|
msgstr "닫기(_C)"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:202
|
#: ../src/ui/menu.c:204
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d%n"
|
msgid "Workspace %d%n"
|
||||||
msgstr "작업 공간 %d%n"
|
msgstr "작업 공간 %d%n"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:212
|
#: ../src/ui/menu.c:214
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace 1_0"
|
msgid "Workspace 1_0"
|
||||||
msgstr "작업 공간 1_0"
|
msgstr "작업 공간 1_0"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:214
|
#: ../src/ui/menu.c:216
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %s%d"
|
msgid "Workspace %s%d"
|
||||||
msgstr "작업 공간 %s%d"
|
msgstr "작업 공간 %s%d"
|
||||||
|
|
||||||
#: ../src/ui/menu.c:384
|
#: ../src/ui/menu.c:397
|
||||||
msgid "Move to Another _Workspace"
|
msgid "Move to Another _Workspace"
|
||||||
msgstr "다른 작업 공간으로 옮기기(_W)"
|
msgstr "다른 작업 공간으로 옮기기(_W)"
|
||||||
|
|
||||||
@@ -916,50 +909,50 @@ msgstr "Mod5"
|
|||||||
msgid "%d x %d"
|
msgid "%d x %d"
|
||||||
msgstr "%d x %d"
|
msgstr "%d x %d"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:236
|
#: ../src/ui/theme.c:235
|
||||||
msgid "top"
|
msgid "top"
|
||||||
msgstr "맨 위"
|
msgstr "맨 위"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:238
|
#: ../src/ui/theme.c:237
|
||||||
msgid "bottom"
|
msgid "bottom"
|
||||||
msgstr "맨 아래"
|
msgstr "맨 아래"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:240
|
#: ../src/ui/theme.c:239
|
||||||
msgid "left"
|
msgid "left"
|
||||||
msgstr "왼쪽"
|
msgstr "왼쪽"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:242
|
#: ../src/ui/theme.c:241
|
||||||
msgid "right"
|
msgid "right"
|
||||||
msgstr "오른쪽"
|
msgstr "오른쪽"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:270
|
#: ../src/ui/theme.c:269
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "frame geometry does not specify \"%s\" dimension"
|
msgid "frame geometry does not specify \"%s\" dimension"
|
||||||
msgstr "프레임 위치가 \"%s\"차원으로 지정되지 않았습니다"
|
msgstr "프레임 위치가 \"%s\"차원으로 지정되지 않았습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:289
|
#: ../src/ui/theme.c:288
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"프레임 위치가 가장자리 \"%2$s\" 가장자리의 \"%1$s\"차원으로 지정되지 않았습니"
|
"프레임 위치가 가장자리 \"%2$s\" 가장자리의 \"%1$s\"차원으로 지정되지 않았습니"
|
||||||
"다."
|
"다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:326
|
#: ../src/ui/theme.c:325
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Button aspect ratio %g is not reasonable"
|
msgid "Button aspect ratio %g is not reasonable"
|
||||||
msgstr "단추의 가로세로 비 %g이(가) 적당하지 않습니다"
|
msgstr "단추의 가로세로 비 %g이(가) 적당하지 않습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:338
|
#: ../src/ui/theme.c:337
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Frame geometry does not specify size of buttons"
|
msgid "Frame geometry does not specify size of buttons"
|
||||||
msgstr "프레임 위치가 단추의 크기로 지정되지 않았습니다"
|
msgstr "프레임 위치가 단추의 크기로 지정되지 않았습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1051
|
#: ../src/ui/theme.c:1050
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Gradients should have at least two colors"
|
msgid "Gradients should have at least two colors"
|
||||||
msgstr "서서히 변하는 색으로 지정하려면 최소 2색이 필요합니다"
|
msgstr "서서히 변하는 색으로 지정하려면 최소 2색이 필요합니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1203
|
#: ../src/ui/theme.c:1202
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK custom color specification must have color name and fallback in "
|
"GTK custom color specification must have color name and fallback in "
|
||||||
@@ -968,7 +961,7 @@ msgstr ""
|
|||||||
"GTK 사용자 지정 색상 지정은 색 이름과 대체할 색을 괄호 안에 써야 합니다. 예"
|
"GTK 사용자 지정 색상 지정은 색 이름과 대체할 색을 괄호 안에 써야 합니다. 예"
|
||||||
"를 들어: gtk:custom(foo,bar). \"%s\"을(를) 분석할 수 없습니다"
|
"를 들어: gtk:custom(foo,bar). \"%s\"을(를) 분석할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1219
|
#: ../src/ui/theme.c:1218
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
|
||||||
@@ -977,7 +970,7 @@ msgstr ""
|
|||||||
"gtk:custom의 color_name 파라미터 안에 잘못된 문자 '%c'. A-Za-z0-9-_ 문자만 허"
|
"gtk:custom의 color_name 파라미터 안에 잘못된 문자 '%c'. A-Za-z0-9-_ 문자만 허"
|
||||||
"용합니다."
|
"용합니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1233
|
#: ../src/ui/theme.c:1232
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
|
||||||
@@ -986,7 +979,7 @@ msgstr ""
|
|||||||
"gtk:custom 형식은 \"gtk:custom(색이름,대체색)\"입니다, \"%s\"(은)는 형식에 맞"
|
"gtk:custom 형식은 \"gtk:custom(색이름,대체색)\"입니다, \"%s\"(은)는 형식에 맞"
|
||||||
"지 않습니다"
|
"지 않습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1278
|
#: ../src/ui/theme.c:1277
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||||
@@ -995,7 +988,7 @@ msgstr ""
|
|||||||
"GTK 색상 지정은 중괄호안에 있어야 합니다. 예를 들어: gtk:fg[NORMAL], 여기서 "
|
"GTK 색상 지정은 중괄호안에 있어야 합니다. 예를 들어: gtk:fg[NORMAL], 여기서 "
|
||||||
"NORMAL이 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
"NORMAL이 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1292
|
#: ../src/ui/theme.c:1291
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||||
@@ -1004,17 +997,17 @@ msgstr ""
|
|||||||
"GTK 색상 지정은 값 뒤에 중괄호로 닫혀 있어야 합니다. 예를 들어: gtk:fg"
|
"GTK 색상 지정은 값 뒤에 중괄호로 닫혀 있어야 합니다. 예를 들어: gtk:fg"
|
||||||
"[NORMAL], 여기서 NORMAL은 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
"[NORMAL], 여기서 NORMAL은 값입니다. \"%s\"을(를) 분석할 수 없습니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1303
|
#: ../src/ui/theme.c:1302
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Did not understand state \"%s\" in color specification"
|
msgid "Did not understand state \"%s\" in color specification"
|
||||||
msgstr "색상 지정의 \"%s\" 값을 이해할 수 없습니다"
|
msgstr "색상 지정의 \"%s\" 값을 이해할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1316
|
#: ../src/ui/theme.c:1315
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Did not understand color component \"%s\" in color specification"
|
msgid "Did not understand color component \"%s\" in color specification"
|
||||||
msgstr "색상 지정의 색상 구성요소 \"%s\"을(를) 이해할 수 없습니다"
|
msgstr "색상 지정의 색상 구성요소 \"%s\"을(를) 이해할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1345
|
#: ../src/ui/theme.c:1344
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||||
@@ -1023,17 +1016,17 @@ msgstr ""
|
|||||||
"섞기 형식은 \"blend/bg_color/fg_color/alpha\"입니다, \"%s\"은(는) 형식에 맞"
|
"섞기 형식은 \"blend/bg_color/fg_color/alpha\"입니다, \"%s\"은(는) 형식에 맞"
|
||||||
"지 않습니다"
|
"지 않습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1356
|
#: ../src/ui/theme.c:1355
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||||
msgstr "색상 섞기에서 알파 값 \"%s\"을(를) 분석할 수 없습니다"
|
msgstr "색상 섞기에서 알파 값 \"%s\"을(를) 분석할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1366
|
#: ../src/ui/theme.c:1365
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||||
msgstr "색상 섞기에서 알파 값 \"%s\"은(는) 0.0과 1.0 사이의 값이 아닙니다"
|
msgstr "색상 섞기에서 알파 값 \"%s\"은(는) 0.0 과 1.0사이의 값이 아닙니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1413
|
#: ../src/ui/theme.c:1412
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||||
@@ -1041,78 +1034,79 @@ msgstr ""
|
|||||||
"그림자 형식은 \"shade/base_color/format\"입니다, \"%s\"(은)는 형식에 맞지 않"
|
"그림자 형식은 \"shade/base_color/format\"입니다, \"%s\"(은)는 형식에 맞지 않"
|
||||||
"습니다"
|
"습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1424
|
#: ../src/ui/theme.c:1423
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||||
msgstr "그림자색에서 그림자 인자 \"%s\"(을)를 해석할 수 없습니다"
|
msgstr "그림자색에서 그림자 인자 \"%s\"(을)를 해석할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1434
|
#: ../src/ui/theme.c:1433
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||||
msgstr "그림자색에서 그림자 인자 \"%s\"(은)는 음수입니다"
|
msgstr "그림자색에서 그림자 인자 \"%s\"(은)는 음수입니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1463
|
#: ../src/ui/theme.c:1462
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse color \"%s\""
|
msgid "Could not parse color \"%s\""
|
||||||
msgstr "색상 \"%s\"을(를) 해석할 수 없습니다"
|
msgstr "색상 \"%s\"을(를) 해석할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1780
|
#: ../src/ui/theme.c:1779
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||||
msgstr "좌표식에 허용되지 않는 문자 '%s'(이)가 들어 있습니다"
|
msgstr "좌표식에 허용되지 않는 문자 '%s'(이)가 포함되어 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1807
|
#: ../src/ui/theme.c:1806
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression contains floating point number '%s' which could not be "
|
"Coordinate expression contains floating point number '%s' which could not be "
|
||||||
"parsed"
|
"parsed"
|
||||||
msgstr "좌표식에 분석할 수 없는 부동소수점 숫자 '%s'이(가) 포함되어 있습니다"
|
msgstr "좌표식에 분석할 수 없는 부동소수점 숫자 '%s'이(가) 포함되어 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1821
|
#: ../src/ui/theme.c:1820
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||||
msgstr "좌표식에 분석할 수 없는 정수 '%s'이(가) 포함되어 있습니다"
|
msgstr "좌표식에 분석할 수 없는 정수 '%s'이(가) 포함되어 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1942
|
#: ../src/ui/theme.c:1941
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression contained unknown operator at the start of this text: "
|
"Coordinate expression contained unknown operator at the start of this text: "
|
||||||
"\"%s\""
|
"\"%s\""
|
||||||
msgstr "좌표식에 이 글자 시작부분에 알 수 없는 연산자가 들어 있습니다: \"%s\""
|
msgstr ""
|
||||||
|
"좌표식에 이 글자 시작부분에 알 수 없는 연산자가 포함되어 있습니다: \"%s\""
|
||||||
|
|
||||||
#: ../src/ui/theme.c:1999
|
#: ../src/ui/theme.c:1998
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression was empty or not understood"
|
msgid "Coordinate expression was empty or not understood"
|
||||||
msgstr "좌표식이 비어있거나 이해할 수 없습니다"
|
msgstr "좌표식이 비어있거나 이해할 수 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2112 ../src/ui/theme.c:2122 ../src/ui/theme.c:2156
|
#: ../src/ui/theme.c:2111 ../src/ui/theme.c:2121 ../src/ui/theme.c:2155
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression results in division by zero"
|
msgid "Coordinate expression results in division by zero"
|
||||||
msgstr "좌표식의 결과 값이 0로 나누었습니다"
|
msgstr "좌표식의 결과 값이 0로 나누었습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2164
|
#: ../src/ui/theme.c:2163
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||||
msgstr "좌표식에서 부동소수점 수에 나머지 연산을 하려 합니다"
|
msgstr "좌표식에서 부동소수점 수에 나머지 연산을 하려 합니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2220
|
#: ../src/ui/theme.c:2219
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||||
msgstr "좌표식에서 피연산자가 들어갈 곳에 연산자 \"%s\"이(가) 있습니다"
|
msgstr "좌표식에서 피연산자가 들어갈 곳에 연산자 \"%s\"이(가) 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2229
|
#: ../src/ui/theme.c:2228
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had an operand where an operator was expected"
|
msgid "Coordinate expression had an operand where an operator was expected"
|
||||||
msgstr "좌표식에서 연산자가 들어갈 곳에 피연산자가 있습니다"
|
msgstr "좌표식에서 연산자가 들어갈 곳에 피연산자가 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2237
|
#: ../src/ui/theme.c:2236
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||||
msgstr "좌표식에서 피연산자 대신에 연산자로 끝나있습니다"
|
msgstr "좌표식에서 피연산자 대신에 연산자로 끝나있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2247
|
#: ../src/ui/theme.c:2246
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||||
@@ -1121,37 +1115,37 @@ msgstr ""
|
|||||||
"좌표식에서 피연산자가 없는 연산자 \"%2$c\"다음에 연산자 \"%1$c\"이(가) 있습니"
|
"좌표식에서 피연산자가 없는 연산자 \"%2$c\"다음에 연산자 \"%1$c\"이(가) 있습니"
|
||||||
"다"
|
"다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2398 ../src/ui/theme.c:2443
|
#: ../src/ui/theme.c:2397 ../src/ui/theme.c:2442
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||||
msgstr "좌표식에 알 수 없는 변수나 상수 \"%s\"이(가) 있습니다"
|
msgstr "좌표식에 알 수 없는 변수나 상수 \"%s\"이(가) 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2497
|
#: ../src/ui/theme.c:2496
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression parser overflowed its buffer."
|
msgid "Coordinate expression parser overflowed its buffer."
|
||||||
msgstr "좌표 계산 파서의 버퍼가 크기를 넘어갔습니다."
|
msgstr "좌표 계산 파서의 버퍼가 크기를 넘어갔습니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2526
|
#: ../src/ui/theme.c:2525
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||||
msgstr "좌표식에 닫는 괄호는 있지만 여는 괄호가 없습니다"
|
msgstr "좌표식에 닫는 괄호는 있지만 여는 괄호가 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2590
|
#: ../src/ui/theme.c:2589
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||||
msgstr "좌표식에 여는 괄호는 있지만 닫는 괄호가 없습니다"
|
msgstr "좌표식에 여는 괄호는 있지만 닫는 괄호가 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2601
|
#: ../src/ui/theme.c:2600
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||||
msgstr "좌표식에 어떠한 연산자나 피연산자가 없습니다"
|
msgstr "좌표식에 어떠한 연산자나 피연산자가 없습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:2814 ../src/ui/theme.c:2834 ../src/ui/theme.c:2854
|
#: ../src/ui/theme.c:2813 ../src/ui/theme.c:2833 ../src/ui/theme.c:2853
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Theme contained an expression that resulted in an error: %s\n"
|
msgid "Theme contained an expression that resulted in an error: %s\n"
|
||||||
msgstr "테마가 오류 값을 내는 표현식이 들어 있습니다: %s\n"
|
msgstr "테마가 오류 값을 내는 표현식이 들어 있습니다: %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:4500
|
#: ../src/ui/theme.c:4499
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||||
@@ -1160,7 +1154,7 @@ msgstr ""
|
|||||||
"이 프레임 스타일에는 <button function=\"%s\" style=\"%s\" draw_ops=\"whatever"
|
"이 프레임 스타일에는 <button function=\"%s\" style=\"%s\" draw_ops=\"whatever"
|
||||||
"\"/>가 지정되어야 합니다"
|
"\"/>가 지정되어야 합니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5011 ../src/ui/theme.c:5036
|
#: ../src/ui/theme.c:5010 ../src/ui/theme.c:5035
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||||
@@ -1168,18 +1162,18 @@ msgstr ""
|
|||||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" state=\"whatever\"/> 가 없습니"
|
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" state=\"whatever\"/> 가 없습니"
|
||||||
"다"
|
"다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5082
|
#: ../src/ui/theme.c:5083
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to load theme \"%s\": %s\n"
|
msgid "Failed to load theme \"%s\": %s\n"
|
||||||
msgstr "테마 \"%s\"을(를) 읽을 수 없습니다: %s\n"
|
msgstr "테마 \"%s\"을(를) 읽을 수 없습니다: %s\n"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
|
#: ../src/ui/theme.c:5219 ../src/ui/theme.c:5226 ../src/ui/theme.c:5233
|
||||||
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
|
#: ../src/ui/theme.c:5240 ../src/ui/theme.c:5247
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "No <%s> set for theme \"%s\""
|
msgid "No <%s> set for theme \"%s\""
|
||||||
msgstr "테마 \"%2$s\"의 <%1$s>(이)가 설정되지 않았습니다"
|
msgstr "테마 \"%2$s\"의 <%1$s>(이)가 설정되지 않았습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5254
|
#: ../src/ui/theme.c:5255
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||||
@@ -1188,14 +1182,14 @@ msgstr ""
|
|||||||
"테마 \"%2$s\"의 창 형식 \"%1$s\"에 대한 프레임 스타일이 없습니다,<window "
|
"테마 \"%2$s\"의 창 형식 \"%1$s\"에 대한 프레임 스타일이 없습니다,<window "
|
||||||
"type=\"%3$s\" style_set=\"whatever\"/> 엘리먼트를 추가하십시오"
|
"type=\"%3$s\" style_set=\"whatever\"/> 엘리먼트를 추가하십시오"
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5661 ../src/ui/theme.c:5723 ../src/ui/theme.c:5786
|
#: ../src/ui/theme.c:5662 ../src/ui/theme.c:5724 ../src/ui/theme.c:5787
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"사용자 정의 상수는 대문자로 시작되어야 합니다. \"%s\"은(는) 그렇지 않습니다."
|
"사용자 정의 상수는 대문자로 시작되어야 합니다. \"%s\"은(는) 그렇지 않습니다."
|
||||||
|
|
||||||
#: ../src/ui/theme.c:5669 ../src/ui/theme.c:5731 ../src/ui/theme.c:5794
|
#: ../src/ui/theme.c:5670 ../src/ui/theme.c:5732 ../src/ui/theme.c:5795
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Constant \"%s\" has already been defined"
|
msgid "Constant \"%s\" has already been defined"
|
||||||
msgstr "상수 \"%s\"은(는) 이미 지정되어 있습니다"
|
msgstr "상수 \"%s\"은(는) 이미 지정되어 있습니다"
|
||||||
@@ -1330,7 +1324,9 @@ msgstr "<%s> 엘리먼트는 <%s> 아래에 허용되지 않습니다"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
|
||||||
"for buttons"
|
"for buttons"
|
||||||
msgstr "단추의 \"button_width\"/\"button_height\"와 \"aspect_ratio\"를 한꺼번에 지정할 수 없습니다"
|
msgstr ""
|
||||||
|
"단추의 button_width/button_height 와 \"aspect_ratio\"를 한꺼번에 지정할 수 없"
|
||||||
|
"습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:1450
|
#: ../src/ui/theme-parser.c:1450
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1391,7 +1387,7 @@ msgstr "\"%s\"라 불리는 <draw_ops>는 정의되지 않았습니다"
|
|||||||
#: ../src/ui/theme-parser.c:2706 ../src/ui/theme-parser.c:2802
|
#: ../src/ui/theme-parser.c:2706 ../src/ui/theme-parser.c:2802
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
msgid "Including draw_ops \"%s\" here would create a circular reference"
|
||||||
msgstr "여기서 draw_ops \"%s\"을(를) 포함하면 순환 참조가 됩니다."
|
msgstr "draw_ops를 포함하는 \"%s\"이(가) 자기 자신을 참조하고 있습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:2917
|
#: ../src/ui/theme-parser.c:2917
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1573,7 +1569,205 @@ msgstr "<%s> 엘리먼트 안에 텍스트가 허용되지 않습니다"
|
|||||||
msgid "<%s> specified twice for this theme"
|
msgid "<%s> specified twice for this theme"
|
||||||
msgstr "이 테마에서 <%s> 태그가 두 번 지정되었습니다"
|
msgstr "이 테마에서 <%s> 태그가 두 번 지정되었습니다"
|
||||||
|
|
||||||
#: ../src/ui/theme-parser.c:4336
|
#: ../src/ui/theme-parser.c:4334
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to find a valid file for theme %s\n"
|
msgid "Failed to find a valid file for theme %s\n"
|
||||||
msgstr "%s 테마의 올바른 파일을 찾는 데 실패했습니다\n"
|
msgstr "%s 테마의 올바른 파일을 찾는 데 실패했습니다\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:99
|
||||||
|
msgid "_Windows"
|
||||||
|
msgstr "창(_W)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:100
|
||||||
|
msgid "_Dialog"
|
||||||
|
msgstr "대화 상자(_D)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:101
|
||||||
|
msgid "_Modal dialog"
|
||||||
|
msgstr "모달 대화 상자(_M)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:102
|
||||||
|
msgid "_Utility"
|
||||||
|
msgstr "도구(_U)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:103
|
||||||
|
msgid "_Splashscreen"
|
||||||
|
msgstr "스플래시 화면(_S)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:104
|
||||||
|
msgid "_Top dock"
|
||||||
|
msgstr "위 도크(_T)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:105
|
||||||
|
msgid "_Bottom dock"
|
||||||
|
msgstr "아래 도크(_B)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:106
|
||||||
|
msgid "_Left dock"
|
||||||
|
msgstr "왼쪽 도크(_L)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:107
|
||||||
|
msgid "_Right dock"
|
||||||
|
msgstr "오른쪽 도크(_R)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:108
|
||||||
|
msgid "_All docks"
|
||||||
|
msgstr "모든 도크(_A)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:109
|
||||||
|
msgid "Des_ktop"
|
||||||
|
msgstr "데스크톱(_K)"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:115
|
||||||
|
msgid "Open another one of these windows"
|
||||||
|
msgstr "이 창을 하나 더 엽니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:117
|
||||||
|
msgid "This is a demo button with an 'open' icon"
|
||||||
|
msgstr "'열기' 아이콘이 들어 있는 데모 단추입니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:119
|
||||||
|
msgid "This is a demo button with a 'quit' icon"
|
||||||
|
msgstr "'끝내기' 아이콘이 들어 있는 데모 단추입니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:248
|
||||||
|
msgid "This is a sample message in a sample dialog"
|
||||||
|
msgstr "예제 대화 상자의 예제 메시지입니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:328
|
||||||
|
#, c-format
|
||||||
|
msgid "Fake menu item %d\n"
|
||||||
|
msgstr "가짜 메뉴 항목 %d\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:363
|
||||||
|
msgid "Border-only window"
|
||||||
|
msgstr "테두리만 있는 창"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:365
|
||||||
|
msgid "Bar"
|
||||||
|
msgstr "모음"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:382
|
||||||
|
msgid "Normal Application Window"
|
||||||
|
msgstr "보통 프로그램 창"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:386
|
||||||
|
msgid "Dialog Box"
|
||||||
|
msgstr "대화 상자"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:390
|
||||||
|
msgid "Modal Dialog Box"
|
||||||
|
msgstr "모달 대화 상자"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:394
|
||||||
|
msgid "Utility Palette"
|
||||||
|
msgstr "도구 팔레트"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:398
|
||||||
|
msgid "Torn-off Menu"
|
||||||
|
msgstr "떼어내기 메뉴"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:402
|
||||||
|
msgid "Border"
|
||||||
|
msgstr "테두리"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:406
|
||||||
|
msgid "Attached Modal Dialog"
|
||||||
|
msgstr "부착한 모달 대화 상자"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:737
|
||||||
|
#, c-format
|
||||||
|
msgid "Button layout test %d"
|
||||||
|
msgstr "단추 배치 테스트 %d"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:766
|
||||||
|
#, c-format
|
||||||
|
msgid "%g milliseconds to draw one window frame"
|
||||||
|
msgstr "창 프레임 하나를 그리는 데 %g ms"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:811
|
||||||
|
#, c-format
|
||||||
|
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
|
||||||
|
msgstr "사용법: metacity-theme-viewer [테마이름]\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:818
|
||||||
|
#, c-format
|
||||||
|
msgid "Error loading theme: %s\n"
|
||||||
|
msgstr "테마를 읽어들이는 데 오류가 발생했습니다: %s\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:824
|
||||||
|
#, c-format
|
||||||
|
msgid "Loaded theme \"%s\" in %g seconds\n"
|
||||||
|
msgstr "\"%s\" 테마를 읽어들이는 데 %g초\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:869
|
||||||
|
msgid "Normal Title Font"
|
||||||
|
msgstr "보통 제목 글꼴"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:875
|
||||||
|
msgid "Small Title Font"
|
||||||
|
msgstr "작은 제목 글꼴"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:881
|
||||||
|
msgid "Large Title Font"
|
||||||
|
msgstr "큰 제목 글꼴"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:886
|
||||||
|
msgid "Button Layouts"
|
||||||
|
msgstr "단추 배치"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:891
|
||||||
|
msgid "Benchmark"
|
||||||
|
msgstr "벤치마크"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:947
|
||||||
|
msgid "Window Title Goes Here"
|
||||||
|
msgstr "창 제목이 여기에 들어갑니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1053
|
||||||
|
#, c-format
|
||||||
|
msgid ""
|
||||||
|
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
|
||||||
|
"seconds wall clock time including X server resources (%g milliseconds per "
|
||||||
|
"frame)\n"
|
||||||
|
msgstr ""
|
||||||
|
"%d개 프레임을 그리는 데 클라이언트 입장에서 %g초가 걸렸습니다(한 프레임에 %g "
|
||||||
|
"ms). 그리고 X 서버 리소스까지 포함해 실제 시간으로 %g 초가 걸렸습니다(한 프레"
|
||||||
|
"임에 %g ms).\n"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1273
|
||||||
|
msgid "position expression test returned TRUE but set error"
|
||||||
|
msgstr "위치 표현식 테스트가 참을 리턴했지만 오류가 발생했습니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1275
|
||||||
|
msgid "position expression test returned FALSE but didn't set error"
|
||||||
|
msgstr "위치 표현식 테스트가 거짓을 리턴했지만 오류가 발생하지 않았습니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1279
|
||||||
|
msgid "Error was expected but none given"
|
||||||
|
msgstr "오류가 발생해야 하지만 발생하지 않았습니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1281
|
||||||
|
#, c-format
|
||||||
|
msgid "Error %d was expected but %d given"
|
||||||
|
msgstr "오류 %d번이 발생해야 하지만 오류 %d번이 발생했습니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1287
|
||||||
|
#, c-format
|
||||||
|
msgid "Error not expected but one was returned: %s"
|
||||||
|
msgstr "오류가 발생하면 안 되지만 오류 한 개가 발생했습니다: %s"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1291
|
||||||
|
#, c-format
|
||||||
|
msgid "x value was %d, %d was expected"
|
||||||
|
msgstr "가로값이 %d입니다. 와야 하는 값은 %d입니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1294
|
||||||
|
#, c-format
|
||||||
|
msgid "y value was %d, %d was expected"
|
||||||
|
msgstr "세로값이 %d입니다. 와야 하는 값은 %d입니다"
|
||||||
|
|
||||||
|
#: ../src/ui/theme-viewer.c:1359
|
||||||
|
#, c-format
|
||||||
|
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
|
||||||
|
msgstr "좌표 표현식 %d개를 %g초에 파싱했습니다(평균 %g초)\n"
|
||||||
|
30
po/nb.po
30
po/nb.po
@@ -4,10 +4,10 @@
|
|||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter 3.9.x\n"
|
"Project-Id-Version: mutter 3.8.x\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2013-08-08 22:14+0200\n"
|
"POT-Creation-Date: 2013-05-13 10:30+0200\n"
|
||||||
"PO-Revision-Date: 2013-05-28 09:48+0200\n"
|
"PO-Revision-Date: 2013-04-03 14:11+0200\n"
|
||||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||||
"Language-Team: Norwegian bokmål <i18n-no@lister.ping.uio.no>\n"
|
"Language-Team: Norwegian bokmål <i18n-no@lister.ping.uio.no>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
@@ -205,7 +205,7 @@ msgstr "Visning delt til høyre"
|
|||||||
|
|
||||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||||
#. * we have no way to get it to exit
|
#. * we have no way to get it to exit
|
||||||
#: ../src/compositor/compositor.c:589
|
#: ../src/compositor/compositor.c:568
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Another compositing manager is already running on screen %i on display \"%s"
|
"Another compositing manager is already running on screen %i on display \"%s"
|
||||||
@@ -250,17 +250,17 @@ msgstr "_Vent"
|
|||||||
msgid "_Force Quit"
|
msgid "_Force Quit"
|
||||||
msgstr "_Tvungen nedstenging"
|
msgstr "_Tvungen nedstenging"
|
||||||
|
|
||||||
#: ../src/core/display.c:421
|
#: ../src/core/display.c:401
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Missing %s extension required for compositing"
|
msgid "Missing %s extension required for compositing"
|
||||||
msgstr "Mangler utvidelsen %s som kreves for komposittfunksjon"
|
msgstr "Mangler utvidelsen %s som kreves for komposittfunksjon"
|
||||||
|
|
||||||
#: ../src/core/display.c:513
|
#: ../src/core/display.c:493
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to open X Window System display '%s'\n"
|
msgid "Failed to open X Window System display '%s'\n"
|
||||||
msgstr "Feil under åpning av X Window System skjerm «%s»\n"
|
msgstr "Feil under åpning av X Window System skjerm «%s»\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1138
|
#: ../src/core/keybindings.c:970
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Some other program is already using the key %s with modifiers %x as a "
|
"Some other program is already using the key %s with modifiers %x as a "
|
||||||
@@ -269,7 +269,7 @@ msgstr ""
|
|||||||
"Et annet program bruker allerede nøkkelen %s med modifikatorer %x som "
|
"Et annet program bruker allerede nøkkelen %s med modifikatorer %x som "
|
||||||
"binding\n"
|
"binding\n"
|
||||||
|
|
||||||
#: ../src/core/keybindings.c:1335
|
#: ../src/core/keybindings.c:1151
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "\"%s\" is not a valid accelerator\n"
|
msgid "\"%s\" is not a valid accelerator\n"
|
||||||
msgstr "«%s» er ikke en gyldig aksellerator\n"
|
msgstr "«%s» er ikke en gyldig aksellerator\n"
|
||||||
@@ -333,7 +333,7 @@ msgstr "Skriv versjonsnummer"
|
|||||||
msgid "Mutter plugin to use"
|
msgid "Mutter plugin to use"
|
||||||
msgstr "Mutter-tillegg som skal brukes"
|
msgstr "Mutter-tillegg som skal brukes"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1202
|
#: ../src/core/prefs.c:1095
|
||||||
msgid ""
|
msgid ""
|
||||||
"Workarounds for broken applications disabled. Some applications may not "
|
"Workarounds for broken applications disabled. Some applications may not "
|
||||||
"behave properly.\n"
|
"behave properly.\n"
|
||||||
@@ -341,12 +341,12 @@ msgstr ""
|
|||||||
"Funksjonalitet for å gå rundt ødelagte programmer er deaktivert. Noen "
|
"Funksjonalitet for å gå rundt ødelagte programmer er deaktivert. Noen "
|
||||||
"programmer vil kanskje ikke oppføre seg korrekt.\n"
|
"programmer vil kanskje ikke oppføre seg korrekt.\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1277
|
#: ../src/core/prefs.c:1170
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
|
||||||
msgstr "Kunne ikke tolke skriftbeskrivelsen «%s» fra GSettings-nøkkel %s\n"
|
msgstr "Kunne ikke tolke skriftbeskrivelsen «%s» fra GSettings-nøkkel %s\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1343
|
#: ../src/core/prefs.c:1236
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||||
@@ -355,7 +355,7 @@ msgstr ""
|
|||||||
"«%s» funnet i konfigurasjonsdatabasen er ikke en gyldig verdi for endring av "
|
"«%s» funnet i konfigurasjonsdatabasen er ikke en gyldig verdi for endring av "
|
||||||
"musknapp\n"
|
"musknapp\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1909
|
#: ../src/core/prefs.c:1789
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||||
@@ -364,7 +364,7 @@ msgstr ""
|
|||||||
"«%s» funnet i konfigurasjonsdatabasen er ikke en gyldig verdi for "
|
"«%s» funnet i konfigurasjonsdatabasen er ikke en gyldig verdi for "
|
||||||
"tastaturbinding «%s»\n"
|
"tastaturbinding «%s»\n"
|
||||||
|
|
||||||
#: ../src/core/prefs.c:1999
|
#: ../src/core/prefs.c:1888
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Workspace %d"
|
msgid "Workspace %d"
|
||||||
msgstr "Arbeidsområde %d"
|
msgstr "Arbeidsområde %d"
|
||||||
@@ -492,7 +492,7 @@ msgid "Window manager error: "
|
|||||||
msgstr "Feil i vindushåndterer: "
|
msgstr "Feil i vindushåndterer: "
|
||||||
|
|
||||||
#. first time through
|
#. first time through
|
||||||
#: ../src/core/window.c:7513
|
#: ../src/core/window.c:7598
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||||
@@ -508,7 +508,7 @@ msgstr ""
|
|||||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||||
#. * about these apps but make them work.
|
#. * about these apps but make them work.
|
||||||
#.
|
#.
|
||||||
#: ../src/core/window.c:8237
|
#: ../src/core/window.c:8322
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
|
||||||
|
18
po/sr.po
18
po/sr.po
@@ -10,8 +10,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter\n"
|
"Project-Id-Version: mutter\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
||||||
"&keywords=I18N+L10N&component=general\n"
|
"&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
"POT-Creation-Date: 2013-03-01 15:50+0000\n"
|
||||||
"PO-Revision-Date: 2013-09-06 09:19+0200\n"
|
"PO-Revision-Date: 2013-03-11 11:40+0200\n"
|
||||||
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
|
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
|
||||||
"Language-Team: Serbian <gnom@prevod.org>\n"
|
"Language-Team: Serbian <gnom@prevod.org>\n"
|
||||||
"Language: sr\n"
|
"Language: sr\n"
|
||||||
@@ -320,20 +320,6 @@ msgstr ""
|
|||||||
"Не могу да пронађем тему! Проверите да „%s“ постоји и да садржи уобичајене "
|
"Не могу да пронађем тему! Проверите да „%s“ постоји и да садржи уобичајене "
|
||||||
"теме.\n"
|
"теме.\n"
|
||||||
|
|
||||||
#: ../src/core/monitor.c:711
|
|
||||||
msgid "Built-in display"
|
|
||||||
msgstr "Уграђени дисплеј"
|
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor name (in case we don't know
|
|
||||||
#. the vendor), it's Unknown followed by a size in inches,
|
|
||||||
#. like 'Unknown 15"'
|
|
||||||
#.
|
|
||||||
#: ../src/core/monitor.c:739
|
|
||||||
#, c-format
|
|
||||||
#| msgid "Unknown element %s"
|
|
||||||
msgid "Unknown %s"
|
|
||||||
msgstr "Непознат %s"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
|
@@ -10,8 +10,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: mutter\n"
|
"Project-Id-Version: mutter\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter"
|
||||||
"&keywords=I18N+L10N&component=general\n"
|
"&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2013-08-18 20:03+0000\n"
|
"POT-Creation-Date: 2013-03-01 15:50+0000\n"
|
||||||
"PO-Revision-Date: 2013-09-06 09:19+0200\n"
|
"PO-Revision-Date: 2013-03-11 11:40+0200\n"
|
||||||
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
|
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
|
||||||
"Language-Team: Serbian <gnom@prevod.org>\n"
|
"Language-Team: Serbian <gnom@prevod.org>\n"
|
||||||
"Language: sr\n"
|
"Language: sr\n"
|
||||||
@@ -320,20 +320,6 @@ msgstr ""
|
|||||||
"Ne mogu da pronađem temu! Proverite da „%s“ postoji i da sadrži uobičajene "
|
"Ne mogu da pronađem temu! Proverite da „%s“ postoji i da sadrži uobičajene "
|
||||||
"teme.\n"
|
"teme.\n"
|
||||||
|
|
||||||
#: ../src/core/monitor.c:711
|
|
||||||
msgid "Built-in display"
|
|
||||||
msgstr "Ugrađeni displej"
|
|
||||||
|
|
||||||
#. TRANSLATORS: this is a monitor name (in case we don't know
|
|
||||||
#. the vendor), it's Unknown followed by a size in inches,
|
|
||||||
#. like 'Unknown 15"'
|
|
||||||
#.
|
|
||||||
#: ../src/core/monitor.c:739
|
|
||||||
#, c-format
|
|
||||||
#| msgid "Unknown element %s"
|
|
||||||
msgid "Unknown %s"
|
|
||||||
msgstr "Nepoznat %s"
|
|
||||||
|
|
||||||
#: ../src/core/mutter.c:40
|
#: ../src/core/mutter.c:40
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid ""
|
||||||
|
648
po/zh_HK.po
648
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
648
po/zh_TW.po
648
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -1,7 +0,0 @@
|
|||||||
NULL =
|
|
||||||
|
|
||||||
EXTRA_DIST = \
|
|
||||||
gtk-shell.xml \
|
|
||||||
xdg-shell.xml \
|
|
||||||
xserver.xml \
|
|
||||||
$(NULL)
|
|
@@ -1,30 +0,0 @@
|
|||||||
<protocol name="gtk">
|
|
||||||
|
|
||||||
<interface name="gtk_shell" version="1">
|
|
||||||
<enum name="capability">
|
|
||||||
<entry name="global_app_menu" value="1"/>
|
|
||||||
<entry name="global_menu_bar" value="2"/>
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
<event name="capabilities">
|
|
||||||
<arg name="capabilities" type="uint"/>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<request name="get_gtk_surface">
|
|
||||||
<arg name="gtk_surface" type="new_id" interface="gtk_surface"/>
|
|
||||||
<arg name="surface" type="object" interface="wl_surface"/>
|
|
||||||
</request>
|
|
||||||
</interface>
|
|
||||||
|
|
||||||
<interface name="gtk_surface" version="1">
|
|
||||||
<request name="set_dbus_properties">
|
|
||||||
<arg name="application_id" type="string" allow-null="true"/>
|
|
||||||
<arg name="app_menu_path" type="string" allow-null="true"/>
|
|
||||||
<arg name="menubar_path" type="string" allow-null="true"/>
|
|
||||||
<arg name="window_object_path" type="string" allow-null="true"/>
|
|
||||||
<arg name="application_object_path" type="string" allow-null="true"/>
|
|
||||||
<arg name="unique_bus_name" type="string" allow-null="true"/>
|
|
||||||
</request>
|
|
||||||
</interface>
|
|
||||||
|
|
||||||
</protocol>
|
|
@@ -1,438 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<protocol name="xdg_shell">
|
|
||||||
|
|
||||||
<copyright>
|
|
||||||
Copyright © 2008-2013 Kristian Høgsberg
|
|
||||||
Copyright © 2013 Rafael Antognolli
|
|
||||||
Copyright © 2013 Jasper St. Pierre
|
|
||||||
Copyright © 2010-2013 Intel Corporation
|
|
||||||
|
|
||||||
Permission to use, copy, modify, distribute, and sell this
|
|
||||||
software and its documentation for any purpose is hereby granted
|
|
||||||
without fee, provided that the above copyright notice appear in
|
|
||||||
all copies and that both that copyright notice and this permission
|
|
||||||
notice appear in supporting documentation, and that the name of
|
|
||||||
the copyright holders not be used in advertising or publicity
|
|
||||||
pertaining to distribution of the software without specific,
|
|
||||||
written prior permission. The copyright holders make no
|
|
||||||
representations about the suitability of this software for any
|
|
||||||
purpose. It is provided "as is" without express or implied
|
|
||||||
warranty.
|
|
||||||
|
|
||||||
THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
|
|
||||||
SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
||||||
FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
|
||||||
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
|
||||||
THIS SOFTWARE.
|
|
||||||
</copyright>
|
|
||||||
|
|
||||||
<interface name="xdg_shell" version="1">
|
|
||||||
<description summary="create desktop-style surfaces">
|
|
||||||
This interface is implemented by servers that provide
|
|
||||||
desktop-style user interfaces.
|
|
||||||
|
|
||||||
It allows clients to associate a xdg_surface with
|
|
||||||
a basic surface.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<enum name="version">
|
|
||||||
<description summary="latest protocol version">
|
|
||||||
Use this enum to check the protocol version, and it will be updated
|
|
||||||
automatically.
|
|
||||||
</description>
|
|
||||||
<entry name="current" value="1" summary="Always the latest version"/>
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
|
|
||||||
<request name="use_unstable_version">
|
|
||||||
<description summary="enable use of this unstable version">
|
|
||||||
Use this request in order to enable use of this interface.
|
|
||||||
|
|
||||||
Understand and agree that one is using an unstable interface,
|
|
||||||
that will likely change in the future, breaking the API.
|
|
||||||
</description>
|
|
||||||
<arg name="version" type="int"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="get_xdg_surface">
|
|
||||||
<description summary="create a shell surface from a surface">
|
|
||||||
Create a shell surface for an existing surface.
|
|
||||||
|
|
||||||
Only one shell or popup surface can be associated with a given
|
|
||||||
surface.
|
|
||||||
</description>
|
|
||||||
<arg name="id" type="new_id" interface="xdg_surface"/>
|
|
||||||
<arg name="surface" type="object" interface="wl_surface"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="get_xdg_popup">
|
|
||||||
<description summary="create a shell surface from a surface">
|
|
||||||
Create a popup surface for an existing surface.
|
|
||||||
|
|
||||||
Only one shell or popup surface can be associated with a given
|
|
||||||
surface.
|
|
||||||
</description>
|
|
||||||
<arg name="id" type="new_id" interface="xdg_popup"/>
|
|
||||||
<arg name="surface" type="object" interface="wl_surface"/>
|
|
||||||
<arg name="parent" type="object" interface="wl_surface"/>
|
|
||||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
|
||||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
|
||||||
<arg name="x" type="int"/>
|
|
||||||
<arg name="y" type="int"/>
|
|
||||||
<arg name="flags" type="uint"/>
|
|
||||||
</request>
|
|
||||||
</interface>
|
|
||||||
|
|
||||||
<interface name="xdg_surface" version="1">
|
|
||||||
|
|
||||||
<description summary="desktop-style metadata interface">
|
|
||||||
An interface that may be implemented by a wl_surface, for
|
|
||||||
implementations that provide a desktop-style user interface.
|
|
||||||
|
|
||||||
It provides requests to treat surfaces like windows, allowing to set
|
|
||||||
properties like maximized, fullscreen, minimized, and to move and resize
|
|
||||||
them, and associate metadata like title and app id.
|
|
||||||
|
|
||||||
On the server side the object is automatically destroyed when
|
|
||||||
the related wl_surface is destroyed. On client side,
|
|
||||||
xdg_surface.destroy() must be called before destroying
|
|
||||||
the wl_surface object.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
|
||||||
<description summary="remove xdg_surface interface">
|
|
||||||
The xdg_surface interface is removed from the wl_surface object
|
|
||||||
that was turned into a xdg_surface with
|
|
||||||
xdg_shell.get_xdg_surface request. The xdg_surface properties,
|
|
||||||
like maximized and fullscreen, are lost. The wl_surface loses
|
|
||||||
its role as a xdg_surface. The wl_surface is unmapped.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="set_transient_for">
|
|
||||||
<description summary="surface is a child of another surface">
|
|
||||||
Setting a surface as transient of another means that it is child
|
|
||||||
of another surface.
|
|
||||||
|
|
||||||
Child surfaces are stacked above their parents, and will be
|
|
||||||
unmapped if the parent is unmapped too. They should not appear
|
|
||||||
on task bars and alt+tab.
|
|
||||||
</description>
|
|
||||||
<arg name="parent" type="object" interface="wl_surface" allow-null="true"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="set_title">
|
|
||||||
<description summary="set surface title">
|
|
||||||
Set a short title for the surface.
|
|
||||||
|
|
||||||
This string may be used to identify the surface in a task bar,
|
|
||||||
window list, or other user interface elements provided by the
|
|
||||||
compositor.
|
|
||||||
|
|
||||||
The string must be encoded in UTF-8.
|
|
||||||
</description>
|
|
||||||
<arg name="title" type="string"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="set_app_id">
|
|
||||||
<description summary="set surface class">
|
|
||||||
Set an id for the surface.
|
|
||||||
|
|
||||||
The app id identifies the general class of applications to which
|
|
||||||
the surface belongs.
|
|
||||||
|
|
||||||
It should be the ID that appears in the new desktop entry
|
|
||||||
specification, the interface name.
|
|
||||||
</description>
|
|
||||||
<arg name="app_id" type="string"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="pong">
|
|
||||||
<description summary="respond to a ping event">
|
|
||||||
A client must respond to a ping event with a pong request or
|
|
||||||
the client may be deemed unresponsive.
|
|
||||||
</description>
|
|
||||||
<arg name="serial" type="uint" summary="serial of the ping event"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="ping">
|
|
||||||
<description summary="ping client">
|
|
||||||
Ping a client to check if it is receiving events and sending
|
|
||||||
requests. A client is expected to reply with a pong request.
|
|
||||||
</description>
|
|
||||||
<arg name="serial" type="uint"/>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<request name="move">
|
|
||||||
<description summary="start an interactive move">
|
|
||||||
Start a pointer-driven move of the surface.
|
|
||||||
|
|
||||||
This request must be used in response to a button press event.
|
|
||||||
The server may ignore move requests depending on the state of
|
|
||||||
the surface (e.g. fullscreen or maximized).
|
|
||||||
</description>
|
|
||||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
|
||||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<enum name="resize_edge">
|
|
||||||
<description summary="edge values for resizing">
|
|
||||||
These values are used to indicate which edge of a surface
|
|
||||||
is being dragged in a resize operation. The server may
|
|
||||||
use this information to adapt its behavior, e.g. choose
|
|
||||||
an appropriate cursor image.
|
|
||||||
</description>
|
|
||||||
<entry name="none" value="0"/>
|
|
||||||
<entry name="top" value="1"/>
|
|
||||||
<entry name="bottom" value="2"/>
|
|
||||||
<entry name="left" value="4"/>
|
|
||||||
<entry name="top_left" value="5"/>
|
|
||||||
<entry name="bottom_left" value="6"/>
|
|
||||||
<entry name="right" value="8"/>
|
|
||||||
<entry name="top_right" value="9"/>
|
|
||||||
<entry name="bottom_right" value="10"/>
|
|
||||||
</enum>
|
|
||||||
|
|
||||||
<request name="resize">
|
|
||||||
<description summary="start an interactive resize">
|
|
||||||
Start a pointer-driven resizing of the surface.
|
|
||||||
|
|
||||||
This request must be used in response to a button press event.
|
|
||||||
The server may ignore resize requests depending on the state of
|
|
||||||
the surface (e.g. fullscreen or maximized).
|
|
||||||
</description>
|
|
||||||
<arg name="seat" type="object" interface="wl_seat" summary="the wl_seat whose pointer is used"/>
|
|
||||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
|
||||||
<arg name="edges" type="uint" summary="which edge or corner is being dragged"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="configure">
|
|
||||||
<description summary="suggest resize">
|
|
||||||
The configure event asks the client to resize its surface.
|
|
||||||
|
|
||||||
The size is a hint, in the sense that the client is free to
|
|
||||||
ignore it if it doesn't resize, pick a smaller size (to
|
|
||||||
satisfy aspect ratio or resize in steps of NxM pixels).
|
|
||||||
|
|
||||||
The edges parameter provides a hint about how the surface
|
|
||||||
was resized. The client may use this information to decide
|
|
||||||
how to adjust its content to the new size (e.g. a scrolling
|
|
||||||
area might adjust its content position to leave the viewable
|
|
||||||
content unmoved). Valid edge values are from resize_edge enum.
|
|
||||||
|
|
||||||
The client is free to dismiss all but the last configure
|
|
||||||
event it received.
|
|
||||||
|
|
||||||
The width and height arguments specify the size of the window
|
|
||||||
in surface local coordinates.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<arg name="edges" type="uint"/>
|
|
||||||
<arg name="width" type="int"/>
|
|
||||||
<arg name="height" type="int"/>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<request name="set_output">
|
|
||||||
<description summary="set the default output used by this surface">
|
|
||||||
Set the default output used by this surface when it is first mapped.
|
|
||||||
|
|
||||||
If this value is NULL (default), it's up to the compositor to choose
|
|
||||||
which display will be used to map this surface.
|
|
||||||
|
|
||||||
When fullscreen or maximized state are set on this surface, and it
|
|
||||||
wasn't mapped yet, the output set with this method will be used.
|
|
||||||
Otherwise, the output where the surface is currently mapped will be
|
|
||||||
used.
|
|
||||||
</description>
|
|
||||||
<arg name="output" type="object" interface="wl_output" allow-null="true"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="request_set_fullscreen">
|
|
||||||
<description summary="server requests that the client set fullscreen">
|
|
||||||
Event sent from the compositor to the client requesting that the client
|
|
||||||
goes to a fullscreen state. It's the client job to call set_fullscreen
|
|
||||||
and really trigger the fullscreen state.
|
|
||||||
</description>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<event name="request_unset_fullscreen">
|
|
||||||
<description summary="server requests that the client unset fullscreen">
|
|
||||||
Event sent from the compositor to the client requesting that the client
|
|
||||||
leaves the fullscreen state. It's the client job to call
|
|
||||||
unset_fullscreen and really leave the fullscreen state.
|
|
||||||
</description>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<request name="set_fullscreen">
|
|
||||||
<description summary="set the surface state as fullscreen">
|
|
||||||
Set the surface as fullscreen.
|
|
||||||
|
|
||||||
After this request, the compositor should send a configure event
|
|
||||||
informing the output size.
|
|
||||||
|
|
||||||
This request informs the compositor that the next attached buffer
|
|
||||||
committed will be in a fullscreen state. The buffer size should be the
|
|
||||||
same size as the size informed in the configure event, if the client
|
|
||||||
doesn't want to leave any empty area.
|
|
||||||
|
|
||||||
In other words: the next attached buffer after set_maximized is the new
|
|
||||||
maximized buffer. And the surface will be positioned at the maximized
|
|
||||||
position on commit.
|
|
||||||
|
|
||||||
A simple way to synchronize and wait for the correct configure event is
|
|
||||||
to use a wl_display.sync request right after the set_fullscreen
|
|
||||||
request. When the sync callback returns, the last configure event
|
|
||||||
received just before it will be the correct one, and should contain the
|
|
||||||
right size for the surface to maximize.
|
|
||||||
|
|
||||||
Setting one state won't unset another state. Use
|
|
||||||
xdg_surface.unset_fullscreen for unsetting it.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="unset_fullscreen">
|
|
||||||
<description summary="unset the surface state as fullscreen">
|
|
||||||
Unset the surface fullscreen state.
|
|
||||||
|
|
||||||
Same negotiation as set_fullscreen must be used.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="request_set_maximized">
|
|
||||||
<description summary="server requests that the client set maximized">
|
|
||||||
Event sent from the compositor to the client requesting that the client
|
|
||||||
goes to a maximized state. It's the client job to call set_maximized
|
|
||||||
and really trigger the maximized state.
|
|
||||||
</description>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<event name="request_unset_maximized">
|
|
||||||
<description summary="server requests that the client unset maximized">
|
|
||||||
Event sent from the compositor to the client requesting that the client
|
|
||||||
leaves the maximized state. It's the client job to call unset_maximized
|
|
||||||
and really leave the maximized state.
|
|
||||||
</description>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<request name="set_maximized">
|
|
||||||
<description summary="set the surface state as maximized">
|
|
||||||
Set the surface as maximized.
|
|
||||||
|
|
||||||
After this request, the compositor will send a configure event
|
|
||||||
informing the output size minus panel and other MW decorations.
|
|
||||||
|
|
||||||
This request informs the compositor that the next attached buffer
|
|
||||||
committed will be in a maximized state. The buffer size should be the
|
|
||||||
same size as the size informed in the configure event, if the client
|
|
||||||
doesn't want to leave any empty area.
|
|
||||||
|
|
||||||
In other words: the next attached buffer after set_maximized is the new
|
|
||||||
maximized buffer. And the surface will be positioned at the maximized
|
|
||||||
position on commit.
|
|
||||||
|
|
||||||
A simple way to synchronize and wait for the correct configure event is
|
|
||||||
to use a wl_display.sync request right after the set_maximized request.
|
|
||||||
When the sync callback returns, the last configure event received just
|
|
||||||
before it will be the correct one, and should contain the right size
|
|
||||||
for the surface to maximize.
|
|
||||||
|
|
||||||
Setting one state won't unset another state. Use
|
|
||||||
xdg_surface.unset_maximized for unsetting it.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="unset_maximized">
|
|
||||||
<description summary="unset the surface state as maximized">
|
|
||||||
Unset the surface maximized state.
|
|
||||||
|
|
||||||
Same negotiation as set_maximized must be used.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="set_minimized">
|
|
||||||
<description summary="set the surface state as minimized">
|
|
||||||
Set the surface minimized state.
|
|
||||||
|
|
||||||
Setting one state won't unset another state.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="focused_set">
|
|
||||||
<description summary="surface was focused">
|
|
||||||
The focused_set event is sent when this surface has been
|
|
||||||
activated. Window decorations should be updated accordingly.
|
|
||||||
</description>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<event name="focused_unset">
|
|
||||||
<description summary="surface was unfocused">
|
|
||||||
The focused_unset event is sent when this surface has been
|
|
||||||
deactivated, because another surface has been activated. Window
|
|
||||||
decorations should be updated accordingly.
|
|
||||||
</description>
|
|
||||||
</event>
|
|
||||||
</interface>
|
|
||||||
|
|
||||||
<interface name="xdg_popup" version="1">
|
|
||||||
<description summary="desktop-style metadata interface">
|
|
||||||
An interface that may be implemented by a wl_surface, for
|
|
||||||
implementations that provide a desktop-style popups/menus. A popup
|
|
||||||
surface is a transient surface with an added pointer grab.
|
|
||||||
|
|
||||||
An existing implicit grab will be changed to owner-events mode,
|
|
||||||
and the popup grab will continue after the implicit grab ends
|
|
||||||
(i.e. releasing the mouse button does not cause the popup to be
|
|
||||||
unmapped).
|
|
||||||
|
|
||||||
The popup grab continues until the window is destroyed or a mouse
|
|
||||||
button is pressed in any other clients window. A click in any of
|
|
||||||
the clients surfaces is reported as normal, however, clicks in
|
|
||||||
other clients surfaces will be discarded and trigger the callback.
|
|
||||||
|
|
||||||
The x and y arguments specify the locations of the upper left
|
|
||||||
corner of the surface relative to the upper left corner of the
|
|
||||||
parent surface, in surface local coordinates.
|
|
||||||
|
|
||||||
xdg_popup surfaces are always transient for another surface.
|
|
||||||
</description>
|
|
||||||
|
|
||||||
<request name="destroy" type="destructor">
|
|
||||||
<description summary="remove xdg_surface interface">
|
|
||||||
The xdg_surface interface is removed from the wl_surface object
|
|
||||||
that was turned into a xdg_surface with
|
|
||||||
xdg_shell.get_xdg_surface request. The xdg_surface properties,
|
|
||||||
like maximized and fullscreen, are lost. The wl_surface loses
|
|
||||||
its role as a xdg_surface. The wl_surface is unmapped.
|
|
||||||
</description>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<request name="pong">
|
|
||||||
<description summary="respond to a ping event">
|
|
||||||
A client must respond to a ping event with a pong request or
|
|
||||||
the client may be deemed unresponsive.
|
|
||||||
</description>
|
|
||||||
<arg name="serial" type="uint" summary="serial of the ping event"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="ping">
|
|
||||||
<description summary="ping client">
|
|
||||||
Ping a client to check if it is receiving events and sending
|
|
||||||
requests. A client is expected to reply with a pong request.
|
|
||||||
</description>
|
|
||||||
<arg name="serial" type="uint"/>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<event name="popup_done">
|
|
||||||
<description summary="popup interaction is done">
|
|
||||||
The popup_done event is sent out when a popup grab is broken,
|
|
||||||
that is, when the users clicks a surface that doesn't belong
|
|
||||||
to the client owning the popup surface.
|
|
||||||
</description>
|
|
||||||
<arg name="serial" type="uint" summary="serial of the implicit grab on the pointer"/>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
</interface>
|
|
||||||
</protocol>
|
|
@@ -1,18 +0,0 @@
|
|||||||
<protocol name="xserver">
|
|
||||||
|
|
||||||
<interface name="xserver" version="1">
|
|
||||||
<request name="set_window_id">
|
|
||||||
<arg name="surface" type="object" interface="wl_surface"/>
|
|
||||||
<arg name="id" type="uint"/>
|
|
||||||
</request>
|
|
||||||
|
|
||||||
<event name="client">
|
|
||||||
<arg name="fd" type="fd"/>
|
|
||||||
</event>
|
|
||||||
|
|
||||||
<event name="listen_socket">
|
|
||||||
<arg name="fd" type="fd"/>
|
|
||||||
</event>
|
|
||||||
</interface>
|
|
||||||
|
|
||||||
</protocol>
|
|
181
src/Makefile.am
181
src/Makefile.am
@@ -1,16 +1,15 @@
|
|||||||
# Flag build for parallelism; see https://savannah.gnu.org/patch/?6905
|
# Flag build for parallelism; see https://savannah.gnu.org/patch/?6905
|
||||||
.AUTOPARALLEL:
|
.AUTOPARALLEL:
|
||||||
|
|
||||||
lib_LTLIBRARIES = libmutter-wayland.la
|
lib_LTLIBRARIES = libmutter.la
|
||||||
|
|
||||||
SUBDIRS=compositor/plugins
|
SUBDIRS=wm-tester tools compositor/plugins
|
||||||
|
|
||||||
INCLUDES= \
|
INCLUDES= \
|
||||||
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
|
-DCLUTTER_ENABLE_EXPERIMENTAL_API \
|
||||||
-DCOGL_ENABLE_EXPERIMENTAL_API \
|
-DCOGL_ENABLE_EXPERIMENTAL_API \
|
||||||
-DCOGL_ENABLE_EXPERIMENTAL_2_0_API \
|
-DCOGL_ENABLE_EXPERIMENTAL_2_0_API \
|
||||||
$(MUTTER_CFLAGS) \
|
$(MUTTER_CFLAGS) \
|
||||||
-I$(top_builddir) \
|
|
||||||
-I$(srcdir) \
|
-I$(srcdir) \
|
||||||
-I$(srcdir)/core \
|
-I$(srcdir)/core \
|
||||||
-I$(srcdir)/ui \
|
-I$(srcdir)/ui \
|
||||||
@@ -30,27 +29,11 @@ INCLUDES= \
|
|||||||
-DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\" \
|
-DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\" \
|
||||||
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
|
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
|
||||||
|
|
||||||
INCLUDES += \
|
|
||||||
-I$(srcdir)/wayland \
|
|
||||||
-I$(builddir)/wayland \
|
|
||||||
-DXWAYLAND_PATH='"@XWAYLAND_PATH@"'
|
|
||||||
|
|
||||||
mutter_built_sources = \
|
mutter_built_sources = \
|
||||||
$(dbus_idle_built_sources) \
|
mutter-enum-types.h \
|
||||||
$(dbus_xrandr_built_sources) \
|
mutter-enum-types.c
|
||||||
mutter-enum-types.h \
|
|
||||||
mutter-enum-types.c \
|
|
||||||
wayland/gtk-shell-protocol.c \
|
|
||||||
wayland/gtk-shell-server-protocol.h \
|
|
||||||
wayland/gtk-shell-client-protocol.h \
|
|
||||||
wayland/xdg-shell-protocol.c \
|
|
||||||
wayland/xdg-shell-server-protocol.h \
|
|
||||||
wayland/xdg-shell-client-protocol.h \
|
|
||||||
wayland/xserver-protocol.c \
|
|
||||||
wayland/xserver-server-protocol.h \
|
|
||||||
wayland/xserver-client-protocol.h
|
|
||||||
|
|
||||||
libmutter_wayland_la_SOURCES = \
|
libmutter_la_SOURCES = \
|
||||||
core/async-getprop.c \
|
core/async-getprop.c \
|
||||||
core/async-getprop.h \
|
core/async-getprop.h \
|
||||||
core/barrier.c \
|
core/barrier.c \
|
||||||
@@ -70,8 +53,7 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
compositor/meta-background-actor.c \
|
compositor/meta-background-actor.c \
|
||||||
compositor/meta-background-actor-private.h \
|
compositor/meta-background-actor-private.h \
|
||||||
compositor/meta-background-group.c \
|
compositor/meta-background-group.c \
|
||||||
compositor/meta-cullable.c \
|
compositor/meta-background-group-private.h \
|
||||||
compositor/meta-cullable.h \
|
|
||||||
compositor/meta-module.c \
|
compositor/meta-module.c \
|
||||||
compositor/meta-module.h \
|
compositor/meta-module.h \
|
||||||
compositor/meta-plugin.c \
|
compositor/meta-plugin.c \
|
||||||
@@ -80,9 +62,6 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
compositor/meta-shadow-factory.c \
|
compositor/meta-shadow-factory.c \
|
||||||
compositor/meta-shadow-factory-private.h \
|
compositor/meta-shadow-factory-private.h \
|
||||||
compositor/meta-shaped-texture.c \
|
compositor/meta-shaped-texture.c \
|
||||||
compositor/meta-shaped-texture-private.h \
|
|
||||||
compositor/meta-surface-actor.c \
|
|
||||||
compositor/meta-surface-actor.h \
|
|
||||||
compositor/meta-texture-rectangle.c \
|
compositor/meta-texture-rectangle.c \
|
||||||
compositor/meta-texture-rectangle.h \
|
compositor/meta-texture-rectangle.h \
|
||||||
compositor/meta-texture-tower.c \
|
compositor/meta-texture-tower.c \
|
||||||
@@ -115,8 +94,6 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
ui/draw-workspace.h \
|
ui/draw-workspace.h \
|
||||||
core/edge-resistance.c \
|
core/edge-resistance.c \
|
||||||
core/edge-resistance.h \
|
core/edge-resistance.h \
|
||||||
core/edid-parse.c \
|
|
||||||
core/edid.h \
|
|
||||||
core/errors.c \
|
core/errors.c \
|
||||||
meta/errors.h \
|
meta/errors.h \
|
||||||
core/frame.c \
|
core/frame.c \
|
||||||
@@ -133,16 +110,6 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
core/keybindings.c \
|
core/keybindings.c \
|
||||||
core/keybindings-private.h \
|
core/keybindings-private.h \
|
||||||
core/main.c \
|
core/main.c \
|
||||||
core/meta-cursor-tracker.c \
|
|
||||||
core/meta-cursor-tracker-private.h \
|
|
||||||
core/meta-idle-monitor.c \
|
|
||||||
core/meta-idle-monitor-private.h \
|
|
||||||
core/meta-xrandr-shared.h \
|
|
||||||
core/monitor.c \
|
|
||||||
core/monitor-config.c \
|
|
||||||
core/monitor-kms.c \
|
|
||||||
core/monitor-private.h \
|
|
||||||
core/monitor-xrandr.c \
|
|
||||||
core/mutter-Xatomtype.h \
|
core/mutter-Xatomtype.h \
|
||||||
core/place.c \
|
core/place.c \
|
||||||
core/place.h \
|
core/place.h \
|
||||||
@@ -160,7 +127,6 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
core/stack-tracker.h \
|
core/stack-tracker.h \
|
||||||
core/util.c \
|
core/util.c \
|
||||||
meta/util.h \
|
meta/util.h \
|
||||||
core/util-private.h \
|
|
||||||
core/window-props.c \
|
core/window-props.c \
|
||||||
core/window-props.h \
|
core/window-props.h \
|
||||||
core/window.c \
|
core/window.c \
|
||||||
@@ -173,6 +139,7 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
meta/common.h \
|
meta/common.h \
|
||||||
core/core.h \
|
core/core.h \
|
||||||
ui/ui.h \
|
ui/ui.h \
|
||||||
|
inlinepixbufs.h \
|
||||||
ui/frames.c \
|
ui/frames.c \
|
||||||
ui/frames.h \
|
ui/frames.h \
|
||||||
ui/menu.c \
|
ui/menu.c \
|
||||||
@@ -189,35 +156,13 @@ libmutter_wayland_la_SOURCES = \
|
|||||||
ui/theme.c \
|
ui/theme.c \
|
||||||
meta/theme.h \
|
meta/theme.h \
|
||||||
ui/theme-private.h \
|
ui/theme-private.h \
|
||||||
ui/ui.c
|
ui/ui.c \
|
||||||
|
meta/preview-widget.h \
|
||||||
nodist_libmutter_wayland_la_SOURCES = \
|
ui/preview-widget.c \
|
||||||
$(mutter_built_sources)
|
$(mutter_built_sources)
|
||||||
|
|
||||||
libmutter_wayland_la_SOURCES += \
|
libmutter_la_LDFLAGS = -no-undefined
|
||||||
wayland/meta-wayland.c \
|
libmutter_la_LIBADD = $(MUTTER_LIBS)
|
||||||
wayland/meta-wayland-private.h \
|
|
||||||
wayland/meta-xwayland-private.h \
|
|
||||||
wayland/meta-xwayland.c \
|
|
||||||
wayland/meta-wayland-data-device.c \
|
|
||||||
wayland/meta-wayland-data-device.h \
|
|
||||||
wayland/meta-wayland-keyboard.c \
|
|
||||||
wayland/meta-wayland-keyboard.h \
|
|
||||||
wayland/meta-wayland-pointer.c \
|
|
||||||
wayland/meta-wayland-pointer.h \
|
|
||||||
wayland/meta-wayland-seat.c \
|
|
||||||
wayland/meta-wayland-seat.h \
|
|
||||||
wayland/meta-wayland-stage.h \
|
|
||||||
wayland/meta-wayland-stage.c \
|
|
||||||
wayland/meta-wayland-surface.c \
|
|
||||||
wayland/meta-wayland-surface.h \
|
|
||||||
wayland/meta-wayland-types.h \
|
|
||||||
wayland/meta-wayland-versions.h \
|
|
||||||
wayland/meta-weston-launch.c \
|
|
||||||
wayland/meta-weston-launch.h
|
|
||||||
|
|
||||||
libmutter_wayland_la_LDFLAGS = -no-undefined
|
|
||||||
libmutter_wayland_la_LIBADD = $(MUTTER_LIBS)
|
|
||||||
|
|
||||||
# Headers installed for plugins; introspected information will
|
# Headers installed for plugins; introspected information will
|
||||||
# be extracted into Mutter-<version>.gir
|
# be extracted into Mutter-<version>.gir
|
||||||
@@ -236,8 +181,6 @@ libmutterinclude_base_headers = \
|
|||||||
meta/meta-background-actor.h \
|
meta/meta-background-actor.h \
|
||||||
meta/meta-background-group.h \
|
meta/meta-background-group.h \
|
||||||
meta/meta-background.h \
|
meta/meta-background.h \
|
||||||
meta/meta-cursor-tracker.h \
|
|
||||||
meta/meta-idle-monitor.h \
|
|
||||||
meta/meta-plugin.h \
|
meta/meta-plugin.h \
|
||||||
meta/meta-shaped-texture.h \
|
meta/meta-shaped-texture.h \
|
||||||
meta/meta-shadow-factory.h \
|
meta/meta-shadow-factory.h \
|
||||||
@@ -253,29 +196,22 @@ libmutterinclude_base_headers = \
|
|||||||
# Excluded from scanning for introspection but installed
|
# Excluded from scanning for introspection but installed
|
||||||
# atomnames.h: macros cause problems for scanning process
|
# atomnames.h: macros cause problems for scanning process
|
||||||
libmutterinclude_extra_headers = \
|
libmutterinclude_extra_headers = \
|
||||||
|
meta/preview-widget.h \
|
||||||
meta/atomnames.h
|
meta/atomnames.h
|
||||||
|
|
||||||
libmutterincludedir = $(includedir)/mutter-wayland/meta
|
libmutterincludedir = $(includedir)/mutter/meta
|
||||||
|
|
||||||
libmutterinclude_HEADERS = \
|
libmutterinclude_HEADERS = \
|
||||||
$(libmutterinclude_base_headers) \
|
$(libmutterinclude_base_headers) \
|
||||||
$(libmutterinclude_extra_headers)
|
$(libmutterinclude_extra_headers)
|
||||||
|
|
||||||
bin_PROGRAMS=mutter-wayland
|
mutter_theme_viewer_SOURCES= \
|
||||||
|
ui/theme-viewer.c
|
||||||
|
|
||||||
mutter_wayland_SOURCES = core/mutter.c
|
bin_PROGRAMS=mutter mutter-theme-viewer
|
||||||
mutter_wayland_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
|
||||||
|
|
||||||
bin_PROGRAMS+=mutter-launch
|
mutter_SOURCES = core/mutter.c
|
||||||
|
mutter_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
mutter_launch_SOURCES = wayland/weston-launch.c wayland/weston-launch.h
|
|
||||||
|
|
||||||
mutter_launch_CFLAGS = $(MUTTER_LAUNCH_CFLAGS) -DLIBDIR=\"$(libdir)\"
|
|
||||||
mutter_launch_LDFLAGS = $(MUTTER_LAUNCH_LIBS) -lpam
|
|
||||||
|
|
||||||
install-exec-hook:
|
|
||||||
-chown root $(DESTDIR)$(bindir)/mutter-launch
|
|
||||||
-chmod u+s $(DESTDIR)$(bindir)/mutter-launch
|
|
||||||
|
|
||||||
if HAVE_INTROSPECTION
|
if HAVE_INTROSPECTION
|
||||||
include $(INTROSPECTION_MAKEFILE)
|
include $(INTROSPECTION_MAKEFILE)
|
||||||
@@ -297,36 +233,43 @@ typelib_DATA = Meta-$(api_version).typelib
|
|||||||
|
|
||||||
INTROSPECTION_GIRS = Meta-$(api_version).gir
|
INTROSPECTION_GIRS = Meta-$(api_version).gir
|
||||||
|
|
||||||
Meta-$(api_version).gir: libmutter-wayland.la
|
Meta-$(api_version).gir: libmutter.la
|
||||||
@META_GIR@_INCLUDES = GObject-2.0 GDesktopEnums-3.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0 Cogl-1.0
|
@META_GIR@_INCLUDES = GObject-2.0 GDesktopEnums-3.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0 Cogl-1.0
|
||||||
@META_GIR@_EXPORT_PACKAGES = libmutter-wayland
|
@META_GIR@_EXPORT_PACKAGES = libmutter
|
||||||
@META_GIR@_CFLAGS = $(INCLUDES)
|
@META_GIR@_CFLAGS = $(INCLUDES)
|
||||||
@META_GIR@_LIBS = libmutter-wayland.la
|
@META_GIR@_LIBS = libmutter.la
|
||||||
@META_GIR@_FILES = \
|
@META_GIR@_FILES = \
|
||||||
mutter-enum-types.h \
|
mutter-enum-types.h \
|
||||||
$(libmutterinclude_base_headers) \
|
$(libmutterinclude_base_headers) \
|
||||||
$(filter %.c,$(libmutter_wayland_la_SOURCES) $(nodist_libmutter_wayland_la_SOURCES))
|
$(filter %.c,$(libmutter_la_SOURCES))
|
||||||
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error
|
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
mutter_theme_viewer_LDADD= $(MUTTER_LIBS) libmutter.la
|
||||||
|
|
||||||
testboxes_SOURCES = core/testboxes.c
|
testboxes_SOURCES = core/testboxes.c
|
||||||
testgradient_SOURCES = ui/testgradient.c
|
testgradient_SOURCES = ui/testgradient.c
|
||||||
testasyncgetprop_SOURCES = core/testasyncgetprop.c
|
testasyncgetprop_SOURCES = core/testasyncgetprop.c
|
||||||
|
|
||||||
noinst_PROGRAMS=testboxes testgradient testasyncgetprop
|
noinst_PROGRAMS=testboxes testgradient testasyncgetprop
|
||||||
|
|
||||||
testboxes_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
testboxes_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
testgradient_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
testgradient_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter-wayland.la
|
testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter.la
|
||||||
|
|
||||||
@INTLTOOL_DESKTOP_RULE@
|
@INTLTOOL_DESKTOP_RULE@
|
||||||
|
|
||||||
desktopfilesdir=$(datadir)/applications
|
desktopfilesdir=$(datadir)/applications
|
||||||
desktopfiles_in_files=mutter-wayland.desktop.in
|
desktopfiles_in_files=mutter.desktop.in
|
||||||
desktopfiles_files=$(desktopfiles_in_files:.desktop.in=.desktop)
|
desktopfiles_files=$(desktopfiles_in_files:.desktop.in=.desktop)
|
||||||
desktopfiles_DATA = $(desktopfiles_files)
|
desktopfiles_DATA = $(desktopfiles_files)
|
||||||
|
|
||||||
|
wmpropertiesdir=$(datadir)/gnome/wm-properties
|
||||||
|
wmproperties_in_files=mutter-wm.desktop.in
|
||||||
|
wmproperties_files=$(wmproperties_in_files:.desktop.in=.desktop)
|
||||||
|
wmproperties_DATA = $(wmproperties_files)
|
||||||
|
|
||||||
xmldir = @GNOME_KEYBINDINGS_KEYSDIR@
|
xmldir = @GNOME_KEYBINDINGS_KEYSDIR@
|
||||||
xml_in_files = \
|
xml_in_files = \
|
||||||
50-mutter-navigation.xml.in \
|
50-mutter-navigation.xml.in \
|
||||||
@@ -334,28 +277,35 @@ xml_in_files = \
|
|||||||
50-mutter-windows.xml.in
|
50-mutter-windows.xml.in
|
||||||
xml_DATA = $(xml_in_files:.xml.in=.xml)
|
xml_DATA = $(xml_in_files:.xml.in=.xml)
|
||||||
|
|
||||||
dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h
|
gsettings_SCHEMAS = org.gnome.mutter.gschema.xml
|
||||||
|
|
||||||
gsettings_SCHEMAS = org.gnome.mutter.gschema.xml org.gnome.mutter.wayland.gschema.xml
|
|
||||||
@INTLTOOL_XML_NOMERGE_RULE@
|
@INTLTOOL_XML_NOMERGE_RULE@
|
||||||
@GSETTINGS_RULES@
|
@GSETTINGS_RULES@
|
||||||
|
|
||||||
convertdir = $(datadir)/GConf/gsettings
|
convertdir = $(datadir)/GConf/gsettings
|
||||||
convert_DATA = mutter-schemas.convert
|
convert_DATA = mutter-schemas.convert
|
||||||
|
|
||||||
|
IMAGES=stock_maximize.png stock_minimize.png stock_delete.png
|
||||||
|
VARIABLES=stock_maximize_data $(srcdir)/stock_maximize.png \
|
||||||
|
stock_minimize_data $(srcdir)/stock_minimize.png \
|
||||||
|
stock_delete_data $(srcdir)/stock_delete.png
|
||||||
|
|
||||||
|
BUILT_SOURCES = inlinepixbufs.h
|
||||||
CLEANFILES = \
|
CLEANFILES = \
|
||||||
mutter-wayland.desktop \
|
inlinepixbufs.h \
|
||||||
|
mutter.desktop \
|
||||||
mutter-wm.desktop \
|
mutter-wm.desktop \
|
||||||
org.gnome.mutter.gschema.xml \
|
org.gnome.mutter.gschema.xml \
|
||||||
org.gnome.mutter.wayland.gschema.xml \
|
|
||||||
$(xml_DATA) \
|
$(xml_DATA) \
|
||||||
$(mutter_built_sources) \
|
$(mutter_built_sources) \
|
||||||
$(typelib_DATA) \
|
$(typelib_DATA) \
|
||||||
$(gir_DATA)
|
$(gir_DATA)
|
||||||
|
|
||||||
|
inlinepixbufs.h: $(IMAGES)
|
||||||
|
$(GDK_PIXBUF_CSOURCE) --raw --build-list $(VARIABLES) >$(srcdir)/inlinepixbufs.h
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
|
|
||||||
pkgconfig_DATA = libmutter-wayland.pc
|
pkgconfig_DATA = libmutter.pc mutter-plugins.pc
|
||||||
|
|
||||||
EXTRA_DIST=$(desktopfiles_files) \
|
EXTRA_DIST=$(desktopfiles_files) \
|
||||||
$(wmproperties_files) \
|
$(wmproperties_files) \
|
||||||
@@ -364,14 +314,13 @@ EXTRA_DIST=$(desktopfiles_files) \
|
|||||||
$(wmproperties_in_files) \
|
$(wmproperties_in_files) \
|
||||||
$(xml_in_files) \
|
$(xml_in_files) \
|
||||||
org.gnome.mutter.gschema.xml.in \
|
org.gnome.mutter.gschema.xml.in \
|
||||||
org.gnome.mutter.wayland.gschema.xml.in \
|
|
||||||
mutter-schemas.convert \
|
mutter-schemas.convert \
|
||||||
libmutter-wayland.pc.in \
|
libmutter.pc.in \
|
||||||
|
mutter-plugins.pc.in \
|
||||||
mutter-enum-types.h.in \
|
mutter-enum-types.h.in \
|
||||||
mutter-enum-types.c.in \
|
mutter-enum-types.c.in
|
||||||
xrandr.xml idle-monitor.xml
|
|
||||||
|
|
||||||
BUILT_SOURCES = $(mutter_built_sources)
|
BUILT_SOURCES += $(mutter_built_sources)
|
||||||
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
|
||||||
CLEANFILES += $(MUTTER_STAMP_FILES)
|
CLEANFILES += $(MUTTER_STAMP_FILES)
|
||||||
|
|
||||||
@@ -393,31 +342,3 @@ mutter-enum-types.c: stamp-mutter-enum-types.h mutter-enum-types.c.in
|
|||||||
$(libmutterinclude_base_headers) ) >> xgen-tetc && \
|
$(libmutterinclude_base_headers) ) >> xgen-tetc && \
|
||||||
cp xgen-tetc mutter-enum-types.c && \
|
cp xgen-tetc mutter-enum-types.c && \
|
||||||
rm -f xgen-tetc
|
rm -f xgen-tetc
|
||||||
|
|
||||||
dbus_xrandr_built_sources = meta-dbus-xrandr.c meta-dbus-xrandr.h
|
|
||||||
|
|
||||||
$(dbus_xrandr_built_sources) : Makefile.am xrandr.xml
|
|
||||||
$(AM_V_GEN)gdbus-codegen \
|
|
||||||
--interface-prefix org.gnome.Mutter \
|
|
||||||
--c-namespace MetaDBus \
|
|
||||||
--generate-c-code meta-dbus-xrandr \
|
|
||||||
$(srcdir)/xrandr.xml
|
|
||||||
|
|
||||||
|
|
||||||
$(dbus_idle_built_sources) : Makefile.am idle-monitor.xml
|
|
||||||
$(AM_V_GEN)gdbus-codegen \
|
|
||||||
--interface-prefix org.gnome.Mutter \
|
|
||||||
--c-namespace MetaDBus \
|
|
||||||
--generate-c-code meta-dbus-idle-monitor \
|
|
||||||
--c-generate-object-manager \
|
|
||||||
$(srcdir)/idle-monitor.xml
|
|
||||||
|
|
||||||
wayland/%-protocol.c : $(top_builddir)/protocol/%.xml
|
|
||||||
mkdir -p wayland
|
|
||||||
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
|
|
||||||
wayland/%-server-protocol.h : $(top_builddir)/protocol/%.xml
|
|
||||||
mkdir -p wayland
|
|
||||||
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@
|
|
||||||
wayland/%-client-protocol.h : $(top_builddir)/protocol/%.xml
|
|
||||||
mkdir -p wayland
|
|
||||||
$(AM_V_GEN)$(WAYLAND_SCANNER) client-header < $< > $@
|
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "clutter-utils.h"
|
#include "clutter-utils.h"
|
||||||
@@ -93,10 +95,8 @@ meta_actor_vertices_are_untransformed (ClutterVertex *verts,
|
|||||||
v3x != v1x || v3y != v2y)
|
v3x != v1x || v3y != v2y)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (x_origin)
|
*x_origin = x;
|
||||||
*x_origin = x;
|
*y_origin = y;
|
||||||
if (y_origin)
|
|
||||||
*y_origin = y;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@@ -15,7 +15,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_CLUTTER_UTILS_H__
|
#ifndef __META_CLUTTER_UTILS_H__
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
@@ -48,7 +50,7 @@ meta_create_color_texture_4ub (guint8 red,
|
|||||||
CoglColor color;
|
CoglColor color;
|
||||||
guint8 pixel[4];
|
guint8 pixel[4];
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&color, red, green, blue, alpha);
|
cogl_color_set_from_4ub (&color, red, green, blue, alpha);
|
||||||
cogl_color_premultiply (&color);
|
cogl_color_premultiply (&color);
|
||||||
|
|
||||||
pixel[0] = cogl_color_get_red_byte (&color);
|
pixel[0] = cogl_color_get_red_byte (&color);
|
||||||
@@ -71,8 +73,10 @@ meta_create_color_texture_4ub (guint8 red,
|
|||||||
* @src_texture: (allow-none): texture to use initially for the layer
|
* @src_texture: (allow-none): texture to use initially for the layer
|
||||||
*
|
*
|
||||||
* Creates a pipeline with a single layer. Using a common template
|
* Creates a pipeline with a single layer. Using a common template
|
||||||
* makes it easier for Cogl to share a shader for different uses in
|
* allows sharing a shader for different uses in Mutter. To share the same
|
||||||
* Mutter.
|
* shader with all other pipelines that are just texture plus opacity
|
||||||
|
* would require Cogl fixes.
|
||||||
|
* (See http://bugzilla.clutter-project.org/show_bug.cgi?id=2425)
|
||||||
*
|
*
|
||||||
* Return value: (transfer full): a newly created #CoglPipeline
|
* Return value: (transfer full): a newly created #CoglPipeline
|
||||||
*/
|
*/
|
||||||
@@ -82,21 +86,22 @@ meta_create_texture_pipeline (CoglTexture *src_texture)
|
|||||||
static CoglPipeline *texture_pipeline_template = NULL;
|
static CoglPipeline *texture_pipeline_template = NULL;
|
||||||
CoglPipeline *pipeline;
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
/* The only state used in the pipeline that would affect the shader
|
/* We use a pipeline that has a dummy texture as a base for all
|
||||||
generation is the texture type on the layer. Therefore we create
|
texture pipelines. The idea is that only the Cogl texture object
|
||||||
a template pipeline which sets this state and all texture
|
would be different in the children so it is likely that Cogl will
|
||||||
pipelines are created as a copy of this. That way Cogl can find
|
be able to share GL programs between all the textures. */
|
||||||
the shader state for the pipeline more quickly by looking at the
|
|
||||||
pipeline ancestry instead of resorting to the shader cache. */
|
|
||||||
if (G_UNLIKELY (texture_pipeline_template == NULL))
|
if (G_UNLIKELY (texture_pipeline_template == NULL))
|
||||||
{
|
{
|
||||||
CoglContext *ctx =
|
CoglTexture *dummy_texture;
|
||||||
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
|
|
||||||
|
dummy_texture = meta_create_color_texture_4ub (0xff, 0xff, 0xff, 0xff,
|
||||||
|
COGL_TEXTURE_NONE);
|
||||||
|
|
||||||
|
|
||||||
texture_pipeline_template = cogl_pipeline_new (ctx);
|
texture_pipeline_template = cogl_pipeline_new (ctx);
|
||||||
cogl_pipeline_set_layer_null_texture (texture_pipeline_template,
|
cogl_pipeline_set_layer_texture (texture_pipeline_template, 0, dummy_texture);
|
||||||
0, /* layer */
|
cogl_object_unref (dummy_texture);
|
||||||
COGL_TEXTURE_TYPE_2D);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pipeline = cogl_pipeline_copy (texture_pipeline_template);
|
pipeline = cogl_pipeline_copy (texture_pipeline_template);
|
||||||
|
@@ -15,7 +15,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_COGL_UTILS_H__
|
#ifndef __META_COGL_UTILS_H__
|
||||||
|
@@ -17,6 +17,8 @@ struct _MetaCompositor
|
|||||||
{
|
{
|
||||||
MetaDisplay *display;
|
MetaDisplay *display;
|
||||||
|
|
||||||
|
Atom atom_x_root_pixmap;
|
||||||
|
Atom atom_net_wm_window_opacity;
|
||||||
guint repaint_func_id;
|
guint repaint_func_id;
|
||||||
|
|
||||||
ClutterActor *shadow_src;
|
ClutterActor *shadow_src;
|
||||||
@@ -64,6 +66,8 @@ void meta_switch_workspace_completed (MetaScreen *screen);
|
|||||||
|
|
||||||
gboolean meta_begin_modal_for_plugin (MetaScreen *screen,
|
gboolean meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||||
MetaPlugin *plugin,
|
MetaPlugin *plugin,
|
||||||
|
Window grab_window,
|
||||||
|
Cursor cursor,
|
||||||
MetaModalOptions options,
|
MetaModalOptions options,
|
||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
void meta_end_modal_for_plugin (MetaScreen *screen,
|
void meta_end_modal_for_plugin (MetaScreen *screen,
|
||||||
|
@@ -53,15 +53,17 @@
|
|||||||
*
|
*
|
||||||
* # Containers #
|
* # Containers #
|
||||||
*
|
*
|
||||||
* There's two containers in the stage that are used to place window actors, here
|
* There's three containers in the stage that can be used to place actors, here
|
||||||
* are listed in the order in which they are painted:
|
* are listed in the order in which they are painted:
|
||||||
*
|
*
|
||||||
* - window group, accessible with meta_get_window_group_for_screen()
|
* - window group, accessible with meta_get_window_group_for_screen()
|
||||||
* - top window group, accessible with meta_get_top_window_group_for_screen()
|
* - top window group, accessible with meta_get_top_window_group_for_screen()
|
||||||
|
* - overlay group, accessible with meta_get_overlay_group_for_screen()
|
||||||
*
|
*
|
||||||
* Mutter will place actors representing windows in the window group, except for
|
* Mutter will place actors representing windows in the window group, except for
|
||||||
* override-redirect windows (ie. popups and menus) which will be placed in the
|
* override-redirect windows (ie. popups and menus) which will be placed in the
|
||||||
* top window group.
|
* top window group. Mutter won't put any actors in the overlay group, but it's
|
||||||
|
* intended for compositors to place there panel, dashes, status bars, etc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -84,10 +86,6 @@
|
|||||||
#include "meta-window-group.h"
|
#include "meta-window-group.h"
|
||||||
#include "window-private.h" /* to check window->hidden */
|
#include "window-private.h" /* to check window->hidden */
|
||||||
#include "display-private.h" /* for meta_display_lookup_x_window() */
|
#include "display-private.h" /* for meta_display_lookup_x_window() */
|
||||||
#include "util-private.h"
|
|
||||||
#include "meta-wayland-private.h"
|
|
||||||
#include "meta-wayland-pointer.h"
|
|
||||||
#include "meta-wayland-keyboard.h"
|
|
||||||
#include <X11/extensions/shape.h>
|
#include <X11/extensions/shape.h>
|
||||||
#include <X11/extensions/Xcomposite.h>
|
#include <X11/extensions/Xcomposite.h>
|
||||||
|
|
||||||
@@ -176,7 +174,32 @@ process_damage (MetaCompositor *compositor,
|
|||||||
if (window_actor == NULL)
|
if (window_actor == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
meta_window_actor_process_x11_damage (window_actor, event);
|
meta_window_actor_process_damage (window_actor, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_property_notify (MetaCompositor *compositor,
|
||||||
|
XPropertyEvent *event,
|
||||||
|
MetaWindow *window)
|
||||||
|
{
|
||||||
|
MetaWindowActor *window_actor;
|
||||||
|
|
||||||
|
if (window == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||||
|
if (window_actor == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Check for the opacity changing */
|
||||||
|
if (event->atom == compositor->atom_net_wm_window_opacity)
|
||||||
|
{
|
||||||
|
meta_window_actor_update_opacity (window_actor);
|
||||||
|
DEBUG_TRACE ("process_property_notify: net_wm_window_opacity\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG_TRACE ("process_property_notify: unknown\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static Window
|
static Window
|
||||||
@@ -232,6 +255,23 @@ meta_get_stage_for_screen (MetaScreen *screen)
|
|||||||
return info->stage;
|
return info->stage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_get_overlay_group_for_screen:
|
||||||
|
* @screen: a #MetaScreen
|
||||||
|
*
|
||||||
|
* Returns: (transfer none): The overlay group corresponding to @screen
|
||||||
|
*/
|
||||||
|
ClutterActor *
|
||||||
|
meta_get_overlay_group_for_screen (MetaScreen *screen)
|
||||||
|
{
|
||||||
|
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||||
|
|
||||||
|
if (!info)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return info->overlay_group;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_get_window_group_for_screen:
|
* meta_get_window_group_for_screen:
|
||||||
* @screen: a #MetaScreen
|
* @screen: a #MetaScreen
|
||||||
@@ -306,37 +346,29 @@ void
|
|||||||
meta_set_stage_input_region (MetaScreen *screen,
|
meta_set_stage_input_region (MetaScreen *screen,
|
||||||
XserverRegion region)
|
XserverRegion region)
|
||||||
{
|
{
|
||||||
/* As a wayland compositor we can simply ignore all this trickery
|
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||||
* for setting an input region on the stage for capturing events in
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
* clutter since all input comes to us first and we get to choose
|
Display *xdpy = meta_display_get_xdisplay (display);
|
||||||
* who else sees them.
|
|
||||||
*/
|
|
||||||
if (!meta_is_wayland_compositor ())
|
|
||||||
{
|
|
||||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
|
||||||
Display *xdpy = meta_display_get_xdisplay (display);
|
|
||||||
|
|
||||||
if (info->stage && info->output)
|
if (info->stage && info->output)
|
||||||
{
|
{
|
||||||
do_set_stage_input_region (screen, region);
|
do_set_stage_input_region (screen, region);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Reset info->pending_input_region if one existed before and set the new
|
|
||||||
* one to use it later. */
|
|
||||||
if (info->pending_input_region)
|
|
||||||
{
|
|
||||||
XFixesDestroyRegion (xdpy, info->pending_input_region);
|
|
||||||
info->pending_input_region = None;
|
|
||||||
}
|
|
||||||
if (region != None)
|
|
||||||
{
|
|
||||||
info->pending_input_region = XFixesCreateRegion (xdpy, NULL, 0);
|
|
||||||
XFixesCopyRegion (xdpy, info->pending_input_region, region);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Reset info->pending_input_region if one existed before and set the new
|
||||||
|
* one to use it later. */
|
||||||
|
if (info->pending_input_region)
|
||||||
|
{
|
||||||
|
XFixesDestroyRegion (xdpy, info->pending_input_region);
|
||||||
|
info->pending_input_region = None;
|
||||||
|
}
|
||||||
|
if (region != None)
|
||||||
|
{
|
||||||
|
info->pending_input_region = XFixesCreateRegion (xdpy, NULL, 0);
|
||||||
|
XFixesCopyRegion (xdpy, info->pending_input_region, region);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -356,67 +388,28 @@ meta_empty_stage_input_region (MetaScreen *screen)
|
|||||||
meta_set_stage_input_region (screen, region);
|
meta_set_stage_input_region (screen, region);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_focus_stage_window (MetaScreen *screen,
|
|
||||||
guint32 timestamp)
|
|
||||||
{
|
|
||||||
ClutterStage *stage;
|
|
||||||
Window window;
|
|
||||||
|
|
||||||
stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
|
|
||||||
if (!stage)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor ())
|
|
||||||
{
|
|
||||||
window = clutter_x11_get_stage_window (stage);
|
|
||||||
|
|
||||||
if (window == None)
|
|
||||||
return;
|
|
||||||
|
|
||||||
meta_display_set_input_focus_xwindow (screen->display,
|
|
||||||
screen,
|
|
||||||
META_FOCUS_STAGE,
|
|
||||||
window,
|
|
||||||
timestamp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
meta_display_set_input_focus_xwindow (screen->display,
|
|
||||||
screen,
|
|
||||||
META_FOCUS_STAGE,
|
|
||||||
None,
|
|
||||||
timestamp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_stage_is_focused (MetaScreen *screen)
|
meta_begin_modal_for_plugin (MetaScreen *screen,
|
||||||
|
MetaPlugin *plugin,
|
||||||
|
Window grab_window,
|
||||||
|
Cursor cursor,
|
||||||
|
MetaModalOptions options,
|
||||||
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
ClutterStage *stage;
|
/* To some extent this duplicates code in meta_display_begin_grab_op(), but there
|
||||||
|
* are significant differences in how we handle grabs that make it difficult to
|
||||||
|
* merge the two.
|
||||||
|
*/
|
||||||
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
|
Display *xdpy = meta_display_get_xdisplay (display);
|
||||||
|
MetaCompositor *compositor = display->compositor;
|
||||||
|
gboolean pointer_grabbed = FALSE;
|
||||||
|
gboolean keyboard_grabbed = FALSE;
|
||||||
|
int result;
|
||||||
|
|
||||||
stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
|
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
|
||||||
if (!stage)
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return (screen->display->focus_type == META_FOCUS_STAGE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
begin_modal_x11 (MetaScreen *screen,
|
|
||||||
MetaPlugin *plugin,
|
|
||||||
MetaModalOptions options,
|
|
||||||
guint32 timestamp)
|
|
||||||
{
|
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
|
||||||
Display *xdpy = meta_display_get_xdisplay (display);
|
|
||||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
|
||||||
Window grab_window = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
|
||||||
Cursor cursor = None;
|
|
||||||
int result;
|
|
||||||
gboolean pointer_grabbed = FALSE;
|
|
||||||
gboolean keyboard_grabbed = FALSE;
|
|
||||||
|
|
||||||
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
|
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
|
||||||
{
|
{
|
||||||
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||||
@@ -465,80 +458,6 @@ begin_modal_x11 (MetaScreen *screen,
|
|||||||
keyboard_grabbed = TRUE;
|
keyboard_grabbed = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
if (pointer_grabbed)
|
|
||||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
|
||||||
if (keyboard_grabbed)
|
|
||||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
begin_modal_wayland (MetaScreen *screen,
|
|
||||||
MetaPlugin *plugin,
|
|
||||||
MetaModalOptions options,
|
|
||||||
guint32 timestamp)
|
|
||||||
{
|
|
||||||
MetaWaylandCompositor *compositor;
|
|
||||||
gboolean pointer_grabbed = FALSE;
|
|
||||||
gboolean keyboard_grabbed = FALSE;
|
|
||||||
|
|
||||||
compositor = meta_wayland_compositor_get_default ();
|
|
||||||
|
|
||||||
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
|
|
||||||
{
|
|
||||||
if (!meta_wayland_pointer_begin_modal (&compositor->seat->pointer))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
pointer_grabbed = TRUE;
|
|
||||||
}
|
|
||||||
if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0)
|
|
||||||
{
|
|
||||||
if (!meta_wayland_keyboard_begin_modal (&compositor->seat->keyboard,
|
|
||||||
timestamp))
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
keyboard_grabbed = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
if (pointer_grabbed)
|
|
||||||
meta_wayland_pointer_end_modal (&compositor->seat->pointer);
|
|
||||||
if (keyboard_grabbed)
|
|
||||||
meta_wayland_keyboard_end_modal (&compositor->seat->keyboard, timestamp);
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_begin_modal_for_plugin (MetaScreen *screen,
|
|
||||||
MetaPlugin *plugin,
|
|
||||||
MetaModalOptions options,
|
|
||||||
guint32 timestamp)
|
|
||||||
{
|
|
||||||
/* To some extent this duplicates code in meta_display_begin_grab_op(), but there
|
|
||||||
* are significant differences in how we handle grabs that make it difficult to
|
|
||||||
* merge the two.
|
|
||||||
*/
|
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
|
||||||
MetaCompositor *compositor = display->compositor;
|
|
||||||
gboolean ok;
|
|
||||||
|
|
||||||
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
ok = begin_modal_wayland (screen, plugin, options, timestamp);
|
|
||||||
else
|
|
||||||
ok = begin_modal_x11 (screen, plugin, options, timestamp);
|
|
||||||
if (!ok)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
display->grab_op = META_GRAB_OP_COMPOSITOR;
|
display->grab_op = META_GRAB_OP_COMPOSITOR;
|
||||||
display->grab_window = NULL;
|
display->grab_window = NULL;
|
||||||
display->grab_screen = screen;
|
display->grab_screen = screen;
|
||||||
@@ -548,6 +467,14 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
|
|||||||
compositor->modal_plugin = plugin;
|
compositor->modal_plugin = plugin;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
if (pointer_grabbed)
|
||||||
|
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
||||||
|
if (keyboard_grabbed)
|
||||||
|
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -561,19 +488,8 @@ meta_end_modal_for_plugin (MetaScreen *screen,
|
|||||||
|
|
||||||
g_return_if_fail (compositor->modal_plugin == plugin);
|
g_return_if_fail (compositor->modal_plugin == plugin);
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
||||||
{
|
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
||||||
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
|
|
||||||
|
|
||||||
meta_wayland_pointer_end_modal (&compositor->seat->pointer);
|
|
||||||
meta_wayland_keyboard_end_modal (&compositor->seat->keyboard,
|
|
||||||
timestamp);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
|
||||||
XIUngrabDevice (xdpy, META_VIRTUAL_CORE_KEYBOARD_ID, timestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
display->grab_op = META_GRAB_OP_NONE;
|
display->grab_op = META_GRAB_OP_NONE;
|
||||||
display->grab_window = NULL;
|
display->grab_window = NULL;
|
||||||
@@ -598,14 +514,12 @@ meta_check_end_modal (MetaScreen *screen)
|
|||||||
{
|
{
|
||||||
meta_end_modal_for_plugin (screen,
|
meta_end_modal_for_plugin (screen,
|
||||||
compositor->modal_plugin,
|
compositor->modal_plugin,
|
||||||
|
CurrentTime);
|
||||||
CurrentTime);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
after_stage_paint (ClutterStage *stage,
|
after_stage_paint (gpointer data)
|
||||||
gpointer data)
|
|
||||||
{
|
{
|
||||||
MetaCompScreen *info = (MetaCompScreen*) data;
|
MetaCompScreen *info = (MetaCompScreen*) data;
|
||||||
GList *l;
|
GList *l;
|
||||||
@@ -613,8 +527,7 @@ after_stage_paint (ClutterStage *stage,
|
|||||||
for (l = info->windows; l; l = l->next)
|
for (l = info->windows; l; l = l->next)
|
||||||
meta_window_actor_post_paint (l->data);
|
meta_window_actor_post_paint (l->data);
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
return TRUE;
|
||||||
meta_wayland_compositor_paint_finished (meta_wayland_compositor_get_default ());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -668,9 +581,8 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
MetaCompScreen *info;
|
MetaCompScreen *info;
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||||
Window xwin = None;
|
Window xwin;
|
||||||
gint width, height;
|
gint width, height;
|
||||||
MetaWaylandCompositor *wayland_compositor;
|
|
||||||
|
|
||||||
/* Check if the screen is already managed */
|
/* Check if the screen is already managed */
|
||||||
if (meta_screen_get_compositor_data (screen))
|
if (meta_screen_get_compositor_data (screen))
|
||||||
@@ -683,14 +595,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
* We have to initialize info->pending_input_region to an empty region explicitly,
|
* We have to initialize info->pending_input_region to an empty region explicitly,
|
||||||
* because None value is used to mean that the whole screen is an input region.
|
* because None value is used to mean that the whole screen is an input region.
|
||||||
*/
|
*/
|
||||||
if (!meta_is_wayland_compositor ())
|
info->pending_input_region = XFixesCreateRegion (xdisplay, NULL, 0);
|
||||||
info->pending_input_region = XFixesCreateRegion (xdisplay, NULL, 0);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Stage input region trickery isn't needed when we're running as a
|
|
||||||
* wayland compositor. */
|
|
||||||
info->pending_input_region = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
info->screen = screen;
|
info->screen = screen;
|
||||||
|
|
||||||
@@ -701,125 +606,106 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
|
|||||||
|
|
||||||
meta_screen_set_cm_selection (screen);
|
meta_screen_set_cm_selection (screen);
|
||||||
|
|
||||||
/* We will have already created a stage if running as a wayland
|
info->stage = clutter_stage_new ();
|
||||||
* compositor... */
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
{
|
|
||||||
wayland_compositor = meta_wayland_compositor_get_default ();
|
|
||||||
info->stage = wayland_compositor->stage;
|
|
||||||
|
|
||||||
meta_screen_get_size (screen, &width, &height);
|
clutter_threads_add_repaint_func_full (CLUTTER_REPAINT_FLAGS_POST_PAINT,
|
||||||
clutter_actor_set_size (info->stage, width, height);
|
after_stage_paint,
|
||||||
}
|
info, NULL);
|
||||||
else
|
|
||||||
{
|
|
||||||
info->stage = clutter_stage_new ();
|
|
||||||
|
|
||||||
meta_screen_get_size (screen, &width, &height);
|
|
||||||
clutter_actor_realize (info->stage);
|
|
||||||
|
|
||||||
xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
|
||||||
|
|
||||||
XResizeWindow (xdisplay, xwin, width, height);
|
|
||||||
|
|
||||||
{
|
|
||||||
long event_mask;
|
|
||||||
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
|
||||||
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
|
||||||
XWindowAttributes attr;
|
|
||||||
|
|
||||||
meta_core_add_old_event_mask (xdisplay, xwin, &mask);
|
|
||||||
|
|
||||||
XISetMask (mask.mask, XI_KeyPress);
|
|
||||||
XISetMask (mask.mask, XI_KeyRelease);
|
|
||||||
XISetMask (mask.mask, XI_ButtonPress);
|
|
||||||
XISetMask (mask.mask, XI_ButtonRelease);
|
|
||||||
XISetMask (mask.mask, XI_Enter);
|
|
||||||
XISetMask (mask.mask, XI_Leave);
|
|
||||||
XISetMask (mask.mask, XI_FocusIn);
|
|
||||||
XISetMask (mask.mask, XI_FocusOut);
|
|
||||||
XISetMask (mask.mask, XI_Motion);
|
|
||||||
XIClearMask (mask.mask, XI_TouchBegin);
|
|
||||||
XIClearMask (mask.mask, XI_TouchEnd);
|
|
||||||
XIClearMask (mask.mask, XI_TouchUpdate);
|
|
||||||
XISelectEvents (xdisplay, xwin, &mask, 1);
|
|
||||||
|
|
||||||
event_mask = ExposureMask | PropertyChangeMask | StructureNotifyMask;
|
|
||||||
if (XGetWindowAttributes (xdisplay, xwin, &attr))
|
|
||||||
event_mask |= attr.your_event_mask;
|
|
||||||
|
|
||||||
XSelectInput (xdisplay, xwin, event_mask);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
clutter_stage_set_paint_callback (CLUTTER_STAGE (info->stage),
|
|
||||||
after_stage_paint,
|
|
||||||
info,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
clutter_stage_set_sync_delay (CLUTTER_STAGE (info->stage), META_SYNC_DELAY);
|
clutter_stage_set_sync_delay (CLUTTER_STAGE (info->stage), META_SYNC_DELAY);
|
||||||
|
|
||||||
|
meta_screen_get_size (screen, &width, &height);
|
||||||
|
clutter_actor_realize (info->stage);
|
||||||
|
|
||||||
|
xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||||
|
|
||||||
|
XResizeWindow (xdisplay, xwin, width, height);
|
||||||
|
|
||||||
|
{
|
||||||
|
long event_mask;
|
||||||
|
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||||
|
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
||||||
|
XWindowAttributes attr;
|
||||||
|
|
||||||
|
meta_core_add_old_event_mask (xdisplay, xwin, &mask);
|
||||||
|
|
||||||
|
XISetMask (mask.mask, XI_KeyPress);
|
||||||
|
XISetMask (mask.mask, XI_KeyRelease);
|
||||||
|
XISetMask (mask.mask, XI_ButtonPress);
|
||||||
|
XISetMask (mask.mask, XI_ButtonRelease);
|
||||||
|
XISetMask (mask.mask, XI_Enter);
|
||||||
|
XISetMask (mask.mask, XI_Leave);
|
||||||
|
XISetMask (mask.mask, XI_FocusIn);
|
||||||
|
XISetMask (mask.mask, XI_FocusOut);
|
||||||
|
XISetMask (mask.mask, XI_Motion);
|
||||||
|
XISelectEvents (xdisplay, xwin, &mask, 1);
|
||||||
|
|
||||||
|
event_mask = ExposureMask | PropertyChangeMask | StructureNotifyMask;
|
||||||
|
if (XGetWindowAttributes (xdisplay, xwin, &attr))
|
||||||
|
event_mask |= attr.your_event_mask;
|
||||||
|
|
||||||
|
XSelectInput (xdisplay, xwin, event_mask);
|
||||||
|
}
|
||||||
|
|
||||||
info->window_group = meta_window_group_new (screen);
|
info->window_group = meta_window_group_new (screen);
|
||||||
info->top_window_group = meta_window_group_new (screen);
|
info->top_window_group = meta_window_group_new (screen);
|
||||||
|
info->overlay_group = clutter_actor_new ();
|
||||||
|
|
||||||
clutter_actor_add_child (info->stage, info->window_group);
|
clutter_actor_add_child (info->stage, info->window_group);
|
||||||
clutter_actor_add_child (info->stage, info->top_window_group);
|
clutter_actor_add_child (info->stage, info->top_window_group);
|
||||||
|
clutter_actor_add_child (info->stage, info->overlay_group);
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
{
|
|
||||||
/* NB: When running as a wayland compositor we don't need an X
|
|
||||||
* composite overlay window, and we don't need to play any input
|
|
||||||
* region tricks to redirect events into clutter. */
|
|
||||||
info->output = None;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->output = get_output_window (screen);
|
|
||||||
XReparentWindow (xdisplay, xwin, info->output, 0, 0);
|
|
||||||
|
|
||||||
/* Make sure there isn't any left-over output shape on the
|
|
||||||
* overlay window by setting the whole screen to be an
|
|
||||||
* output region.
|
|
||||||
*
|
|
||||||
* Note: there doesn't seem to be any real chance of that
|
|
||||||
* because the X server will destroy the overlay window
|
|
||||||
* when the last client using it exits.
|
|
||||||
*/
|
|
||||||
XFixesSetWindowShapeRegion (xdisplay, info->output, ShapeBounding, 0, 0, None);
|
|
||||||
|
|
||||||
do_set_stage_input_region (screen, info->pending_input_region);
|
|
||||||
if (info->pending_input_region != None)
|
|
||||||
{
|
|
||||||
XFixesDestroyRegion (xdisplay, info->pending_input_region);
|
|
||||||
info->pending_input_region = None;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Map overlay window before redirecting windows offscreen so we catch their
|
|
||||||
* contents until we show the stage.
|
|
||||||
*/
|
|
||||||
XMapWindow (xdisplay, info->output);
|
|
||||||
}
|
|
||||||
|
|
||||||
redirect_windows (compositor, screen);
|
|
||||||
|
|
||||||
info->plugin_mgr = meta_plugin_manager_new (screen);
|
info->plugin_mgr = meta_plugin_manager_new (screen);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Delay the creation of the overlay window as long as we can, to avoid
|
||||||
|
* blanking out the screen. This means that during the plugin loading, the
|
||||||
|
* overlay window is not accessible; if the plugin needs to access it
|
||||||
|
* directly, it should hook into the "show" signal on stage, and do
|
||||||
|
* its stuff there.
|
||||||
|
*/
|
||||||
|
info->output = get_output_window (screen);
|
||||||
|
XReparentWindow (xdisplay, xwin, info->output, 0, 0);
|
||||||
|
|
||||||
|
/* Make sure there isn't any left-over output shape on the
|
||||||
|
* overlay window by setting the whole screen to be an
|
||||||
|
* output region.
|
||||||
|
*
|
||||||
|
* Note: there doesn't seem to be any real chance of that
|
||||||
|
* because the X server will destroy the overlay window
|
||||||
|
* when the last client using it exits.
|
||||||
|
*/
|
||||||
|
XFixesSetWindowShapeRegion (xdisplay, info->output, ShapeBounding, 0, 0, None);
|
||||||
|
|
||||||
|
do_set_stage_input_region (screen, info->pending_input_region);
|
||||||
|
if (info->pending_input_region != None)
|
||||||
|
{
|
||||||
|
XFixesDestroyRegion (xdisplay, info->pending_input_region);
|
||||||
|
info->pending_input_region = None;
|
||||||
|
}
|
||||||
|
|
||||||
|
clutter_actor_show (info->overlay_group);
|
||||||
|
|
||||||
|
/* Map overlay window before redirecting windows offscreen so we catch their
|
||||||
|
* contents until we show the stage.
|
||||||
|
*/
|
||||||
|
XMapWindow (xdisplay, info->output);
|
||||||
|
|
||||||
|
redirect_windows (compositor, screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_compositor_unmanage_screen (MetaCompositor *compositor,
|
meta_compositor_unmanage_screen (MetaCompositor *compositor,
|
||||||
MetaScreen *screen)
|
MetaScreen *screen)
|
||||||
{
|
{
|
||||||
if (!meta_is_wayland_compositor ())
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
{
|
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
Window xroot = meta_screen_get_xroot (screen);
|
||||||
Display *xdisplay = meta_display_get_xdisplay (display);
|
|
||||||
Window xroot = meta_screen_get_xroot (screen);
|
|
||||||
|
|
||||||
/* This is the most important part of cleanup - we have to do this
|
/* This is the most important part of cleanup - we have to do this
|
||||||
* before giving up the window manager selection or the next
|
* before giving up the window manager selection or the next
|
||||||
* window manager won't be able to redirect subwindows */
|
* window manager won't be able to redirect subwindows */
|
||||||
XCompositeUnredirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
|
XCompositeUnredirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -842,7 +728,7 @@ meta_shape_cow_for_window (MetaScreen *screen,
|
|||||||
int width, height;
|
int width, height;
|
||||||
MetaRectangle rect;
|
MetaRectangle rect;
|
||||||
|
|
||||||
meta_window_get_frame_rect (metaWindow, &rect);
|
meta_window_get_outer_rect (metaWindow, &rect);
|
||||||
|
|
||||||
window_bounds.x = rect.x;
|
window_bounds.x = rect.x;
|
||||||
window_bounds.y = rect.y;
|
window_bounds.y = rect.y;
|
||||||
@@ -891,18 +777,15 @@ meta_compositor_remove_window (MetaCompositor *compositor,
|
|||||||
if (!window_actor)
|
if (!window_actor)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor ())
|
screen = meta_window_get_screen (window);
|
||||||
{
|
info = meta_screen_get_compositor_data (screen);
|
||||||
screen = meta_window_get_screen (window);
|
|
||||||
info = meta_screen_get_compositor_data (screen);
|
|
||||||
|
|
||||||
if (window_actor == info->unredirected_window)
|
if (window_actor == info->unredirected_window)
|
||||||
{
|
{
|
||||||
meta_window_actor_set_redirected (window_actor, TRUE);
|
meta_window_actor_set_redirected (window_actor, TRUE);
|
||||||
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
|
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
|
||||||
NULL);
|
NULL);
|
||||||
info->unredirected_window = NULL;
|
info->unredirected_window = NULL;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_window_actor_destroy (window_actor);
|
meta_window_actor_destroy (window_actor);
|
||||||
@@ -973,30 +856,23 @@ meta_compositor_window_shape_changed (MetaCompositor *compositor,
|
|||||||
meta_window_actor_update_shape (window_actor);
|
meta_window_actor_update_shape (window_actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_compositor_window_opacity_changed (MetaCompositor *compositor,
|
|
||||||
MetaWindow *window)
|
|
||||||
{
|
|
||||||
MetaWindowActor *window_actor;
|
|
||||||
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
|
||||||
if (!window_actor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
meta_window_actor_update_opacity (window_actor);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Clutter makes the assumption that there is only one X window
|
/* Clutter makes the assumption that there is only one X window
|
||||||
* per stage, which is a valid assumption to make for a generic
|
* per stage, which is a valid assumption to make for a generic
|
||||||
* application toolkit. As such, it will ignore any events sent
|
* application toolkit. As such, it will ignore any events sent
|
||||||
* to the a stage that isn't its X window.
|
* to the a stage that isn't its X window.
|
||||||
*
|
*
|
||||||
* When running as an X window manager, we need to respond to
|
* When a user clicks on what she thinks is the wallpaper, she
|
||||||
* events from lots of windows. Trick Clutter into translating
|
* is actually clicking on the guard window, which is an entirely
|
||||||
* these events by pretending we got an event on the stage window.
|
* separate top-level override-redirect window in the hierarchy.
|
||||||
|
* We want to recieve events on this guard window so that users
|
||||||
|
* can right-click on the background actor. We do this by telling
|
||||||
|
* Clutter a little white lie, by transforming clicks on the guard
|
||||||
|
* window to become clicks on the stage window, allowing Clutter
|
||||||
|
* to process the event normally.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
maybe_spoof_event_as_stage_event (MetaCompScreen *info,
|
maybe_spoof_guard_window_event_as_stage_event (MetaCompScreen *info,
|
||||||
XEvent *event)
|
XEvent *event)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = meta_screen_get_display (info->screen);
|
MetaDisplay *display = meta_screen_get_display (info->screen);
|
||||||
|
|
||||||
@@ -1005,22 +881,19 @@ maybe_spoof_event_as_stage_event (MetaCompScreen *info,
|
|||||||
{
|
{
|
||||||
XIEvent *input_event = (XIEvent *) event->xcookie.data;
|
XIEvent *input_event = (XIEvent *) event->xcookie.data;
|
||||||
|
|
||||||
|
/* Only care about pointer events for now. */
|
||||||
switch (input_event->evtype)
|
switch (input_event->evtype)
|
||||||
{
|
{
|
||||||
case XI_Motion:
|
case XI_Motion:
|
||||||
case XI_ButtonPress:
|
case XI_ButtonPress:
|
||||||
case XI_ButtonRelease:
|
case XI_ButtonRelease:
|
||||||
case XI_KeyPress:
|
|
||||||
case XI_KeyRelease:
|
|
||||||
{
|
{
|
||||||
XIDeviceEvent *device_event = ((XIDeviceEvent *) input_event);
|
XIDeviceEvent *device_event = ((XIDeviceEvent *) input_event);
|
||||||
|
if (device_event->event == info->screen->guard_window)
|
||||||
/* If this is a GTK+ widget, like a window menu, let GTK+ handle
|
{
|
||||||
* it as-is without mangling. */
|
Window xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||||
if (meta_ui_window_is_widget (info->screen->ui, device_event->event))
|
device_event->event = xwin;
|
||||||
break;
|
}
|
||||||
|
|
||||||
device_event->event = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -1043,7 +916,10 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
|||||||
{
|
{
|
||||||
if (compositor->modal_plugin && is_grabbed_event (compositor->display, event))
|
if (compositor->modal_plugin && is_grabbed_event (compositor->display, event))
|
||||||
{
|
{
|
||||||
_meta_plugin_xevent_filter (compositor->modal_plugin, event);
|
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (compositor->modal_plugin);
|
||||||
|
|
||||||
|
if (klass->xevent_filter)
|
||||||
|
klass->xevent_filter (compositor->modal_plugin, event);
|
||||||
|
|
||||||
/* We always consume events even if the plugin says it didn't handle them;
|
/* We always consume events even if the plugin says it didn't handle them;
|
||||||
* exclusive is exclusive */
|
* exclusive is exclusive */
|
||||||
@@ -1077,7 +953,7 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
|||||||
|
|
||||||
info = meta_screen_get_compositor_data (screen);
|
info = meta_screen_get_compositor_data (screen);
|
||||||
|
|
||||||
maybe_spoof_event_as_stage_event (info, event);
|
maybe_spoof_guard_window_event_as_stage_event (info, event);
|
||||||
|
|
||||||
if (meta_plugin_manager_xevent_filter (info->plugin_mgr, event))
|
if (meta_plugin_manager_xevent_filter (info->plugin_mgr, event))
|
||||||
{
|
{
|
||||||
@@ -1089,25 +965,33 @@ meta_compositor_process_event (MetaCompositor *compositor,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor () &&
|
switch (event->type)
|
||||||
event->type == meta_display_get_damage_event_base (compositor->display) + XDamageNotify)
|
|
||||||
{
|
{
|
||||||
/* Core code doesn't handle damage events, so we need to extract the MetaWindow
|
case PropertyNotify:
|
||||||
* ourselves
|
process_property_notify (compositor, (XPropertyEvent *) event, window);
|
||||||
*/
|
break;
|
||||||
if (window == NULL)
|
|
||||||
{
|
|
||||||
Window xwin = ((XDamageNotifyEvent *) event)->drawable;
|
|
||||||
window = meta_display_lookup_x_window (compositor->display, xwin);
|
|
||||||
}
|
|
||||||
|
|
||||||
DEBUG_TRACE ("meta_compositor_process_event (process_damage)\n");
|
default:
|
||||||
process_damage (compositor, (XDamageNotifyEvent *) event, window);
|
if (event->type == meta_display_get_damage_event_base (compositor->display) + XDamageNotify)
|
||||||
|
{
|
||||||
|
/* Core code doesn't handle damage events, so we need to extract the MetaWindow
|
||||||
|
* ourselves
|
||||||
|
*/
|
||||||
|
if (window == NULL)
|
||||||
|
{
|
||||||
|
Window xwin = ((XDamageNotifyEvent *) event)->drawable;
|
||||||
|
window = meta_display_lookup_x_window (compositor->display, xwin);
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG_TRACE ("meta_compositor_process_event (process_damage)\n");
|
||||||
|
process_damage (compositor, (XDamageNotifyEvent *) event, window);
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clutter needs to know about MapNotify events otherwise it will
|
/* Clutter needs to know about MapNotify events otherwise it will
|
||||||
think the stage is invisible */
|
think the stage is invisible */
|
||||||
if (!meta_is_wayland_compositor () && event->type == MapNotify)
|
if (event->type == MapNotify)
|
||||||
clutter_x11_handle_event (event);
|
clutter_x11_handle_event (event);
|
||||||
|
|
||||||
/* The above handling is basically just "observing" the events, so we return
|
/* The above handling is basically just "observing" the events, so we return
|
||||||
@@ -1240,7 +1124,6 @@ sync_actor_stacking (MetaCompScreen *info)
|
|||||||
* we go ahead and do it */
|
* we go ahead and do it */
|
||||||
|
|
||||||
children = clutter_actor_get_children (info->window_group);
|
children = clutter_actor_get_children (info->window_group);
|
||||||
has_windows = FALSE;
|
|
||||||
reordered = FALSE;
|
reordered = FALSE;
|
||||||
|
|
||||||
/* We allow for actors in the window group other than the actors we
|
/* We allow for actors in the window group other than the actors we
|
||||||
@@ -1452,38 +1335,20 @@ meta_compositor_sync_screen_size (MetaCompositor *compositor,
|
|||||||
{
|
{
|
||||||
MetaDisplay *display = meta_screen_get_display (screen);
|
MetaDisplay *display = meta_screen_get_display (screen);
|
||||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||||
|
Display *xdisplay;
|
||||||
|
Window xwin;
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
DEBUG_TRACE ("meta_compositor_sync_screen_size\n");
|
||||||
{
|
g_return_if_fail (info);
|
||||||
/* FIXME: when we support a sliced stage, this is the place to do it
|
|
||||||
But! This is not the place to apply KMS config, here we only
|
|
||||||
notify Clutter/Cogl/GL that the framebuffer sizes changed.
|
|
||||||
|
|
||||||
And because for now clutter does not do sliced, we use one
|
xdisplay = meta_display_get_xdisplay (display);
|
||||||
framebuffer the size of the whole screen, and when running on
|
xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
||||||
bare metal MetaMonitorManager will do the necessary tricks to
|
|
||||||
show the right portions on the right screens.
|
|
||||||
*/
|
|
||||||
|
|
||||||
clutter_actor_set_size (info->stage, width, height);
|
XResizeWindow (xdisplay, xwin, width, height);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Display *xdisplay;
|
|
||||||
Window xwin;
|
|
||||||
|
|
||||||
DEBUG_TRACE ("meta_compositor_sync_screen_size\n");
|
|
||||||
g_return_if_fail (info);
|
|
||||||
|
|
||||||
xdisplay = meta_display_get_xdisplay (display);
|
|
||||||
xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
|
|
||||||
|
|
||||||
XResizeWindow (xdisplay, xwin, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
meta_verbose ("Changed size for stage on screen %d to %dx%d\n",
|
meta_verbose ("Changed size for stage on screen %d to %dx%d\n",
|
||||||
meta_screen_get_screen_number (screen),
|
meta_screen_get_screen_number (screen),
|
||||||
width, height);
|
width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1547,32 +1412,29 @@ pre_paint_windows (MetaCompScreen *info)
|
|||||||
if (info->windows == NULL)
|
if (info->windows == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor ())
|
top_window = g_list_last (info->windows)->data;
|
||||||
|
|
||||||
|
if (meta_window_actor_should_unredirect (top_window) &&
|
||||||
|
info->disable_unredirect_count == 0)
|
||||||
|
expected_unredirected_window = top_window;
|
||||||
|
|
||||||
|
if (info->unredirected_window != expected_unredirected_window)
|
||||||
{
|
{
|
||||||
top_window = g_list_last (info->windows)->data;
|
if (info->unredirected_window != NULL)
|
||||||
|
|
||||||
if (meta_window_actor_should_unredirect (top_window) &&
|
|
||||||
info->disable_unredirect_count == 0)
|
|
||||||
expected_unredirected_window = top_window;
|
|
||||||
|
|
||||||
if (info->unredirected_window != expected_unredirected_window)
|
|
||||||
{
|
{
|
||||||
if (info->unredirected_window != NULL)
|
meta_window_actor_set_redirected (info->unredirected_window, TRUE);
|
||||||
{
|
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
|
||||||
meta_window_actor_set_redirected (info->unredirected_window, TRUE);
|
NULL);
|
||||||
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (expected_unredirected_window != NULL)
|
|
||||||
{
|
|
||||||
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (top_window)),
|
|
||||||
meta_window_actor_get_meta_window (top_window));
|
|
||||||
meta_window_actor_set_redirected (top_window, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
info->unredirected_window = expected_unredirected_window;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (expected_unredirected_window != NULL)
|
||||||
|
{
|
||||||
|
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (top_window)),
|
||||||
|
meta_window_actor_get_meta_window (top_window));
|
||||||
|
meta_window_actor_set_redirected (top_window, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
info->unredirected_window = expected_unredirected_window;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l = info->windows; l; l = l->next)
|
for (l = info->windows; l; l = l->next)
|
||||||
@@ -1627,7 +1489,13 @@ on_shadow_factory_changed (MetaShadowFactory *factory,
|
|||||||
MetaCompositor *
|
MetaCompositor *
|
||||||
meta_compositor_new (MetaDisplay *display)
|
meta_compositor_new (MetaDisplay *display)
|
||||||
{
|
{
|
||||||
|
char *atom_names[] = {
|
||||||
|
"_XROOTPMAP_ID",
|
||||||
|
"_NET_WM_WINDOW_OPACITY",
|
||||||
|
};
|
||||||
|
Atom atoms[G_N_ELEMENTS(atom_names)];
|
||||||
MetaCompositor *compositor;
|
MetaCompositor *compositor;
|
||||||
|
Display *xdisplay = meta_display_get_xdisplay (display);
|
||||||
|
|
||||||
if (!composite_at_least_version (display, 0, 3))
|
if (!composite_at_least_version (display, 0, 3))
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1639,11 +1507,18 @@ meta_compositor_new (MetaDisplay *display)
|
|||||||
if (g_getenv("META_DISABLE_MIPMAPS"))
|
if (g_getenv("META_DISABLE_MIPMAPS"))
|
||||||
compositor->no_mipmaps = TRUE;
|
compositor->no_mipmaps = TRUE;
|
||||||
|
|
||||||
|
meta_verbose ("Creating %d atoms\n", (int) G_N_ELEMENTS (atom_names));
|
||||||
|
XInternAtoms (xdisplay, atom_names, G_N_ELEMENTS (atom_names),
|
||||||
|
False, atoms);
|
||||||
|
|
||||||
g_signal_connect (meta_shadow_factory_get_default (),
|
g_signal_connect (meta_shadow_factory_get_default (),
|
||||||
"changed",
|
"changed",
|
||||||
G_CALLBACK (on_shadow_factory_changed),
|
G_CALLBACK (on_shadow_factory_changed),
|
||||||
compositor);
|
compositor);
|
||||||
|
|
||||||
|
compositor->atom_x_root_pixmap = atoms[0];
|
||||||
|
compositor->atom_net_wm_window_opacity = atoms[1];
|
||||||
|
|
||||||
compositor->repaint_func_id = clutter_threads_add_repaint_func (meta_repaint_func,
|
compositor->repaint_func_id = clutter_threads_add_repaint_func (meta_repaint_func,
|
||||||
compositor,
|
compositor,
|
||||||
NULL);
|
NULL);
|
||||||
@@ -1691,10 +1566,8 @@ void
|
|||||||
meta_enable_unredirect_for_screen (MetaScreen *screen)
|
meta_enable_unredirect_for_screen (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
|
||||||
if (info != NULL && info->disable_unredirect_count == 0)
|
if (info != NULL)
|
||||||
g_warning ("Called enable_unredirect_for_screen while unredirection is enabled.");
|
info->disable_unredirect_count = MAX(0, info->disable_unredirect_count - 1);
|
||||||
if (info != NULL && info->disable_unredirect_count > 0)
|
|
||||||
info->disable_unredirect_count = info->disable_unredirect_count - 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define FLASH_TIME_MS 50
|
#define FLASH_TIME_MS 50
|
||||||
|
@@ -6,6 +6,9 @@
|
|||||||
#include <meta/screen.h>
|
#include <meta/screen.h>
|
||||||
#include <meta/meta-background-actor.h>
|
#include <meta/meta-background-actor.h>
|
||||||
|
|
||||||
cairo_region_t *meta_background_actor_get_clip_region (MetaBackgroundActor *self);
|
void meta_background_actor_set_visible_region (MetaBackgroundActor *self,
|
||||||
|
cairo_region_t *visible_region);
|
||||||
|
|
||||||
|
cairo_region_t *meta_background_actor_get_visible_region (MetaBackgroundActor *self);
|
||||||
|
|
||||||
#endif /* META_BACKGROUND_ACTOR_PRIVATE_H */
|
#endif /* META_BACKGROUND_ACTOR_PRIVATE_H */
|
||||||
|
@@ -14,7 +14,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*
|
*
|
||||||
* Portions adapted from gnome-shell/src/shell-global.c
|
* Portions adapted from gnome-shell/src/shell-global.c
|
||||||
*/
|
*/
|
||||||
@@ -39,35 +41,20 @@
|
|||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include <meta/meta-background.h>
|
#include <meta/meta-background.h>
|
||||||
#include "meta-background-actor-private.h"
|
#include "meta-background-actor-private.h"
|
||||||
#include "meta-cullable.h"
|
|
||||||
|
|
||||||
struct _MetaBackgroundActorPrivate
|
struct _MetaBackgroundActorPrivate
|
||||||
{
|
{
|
||||||
cairo_region_t *clip_region;
|
cairo_region_t *visible_region;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void cullable_iface_init (MetaCullableInterface *iface);
|
G_DEFINE_TYPE (MetaBackgroundActor, meta_background_actor, CLUTTER_TYPE_ACTOR);
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (MetaBackgroundActor, meta_background_actor, CLUTTER_TYPE_ACTOR,
|
|
||||||
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_clip_region (MetaBackgroundActor *self,
|
|
||||||
cairo_region_t *clip_region)
|
|
||||||
{
|
|
||||||
MetaBackgroundActorPrivate *priv = self->priv;
|
|
||||||
|
|
||||||
g_clear_pointer (&priv->clip_region, (GDestroyNotify) cairo_region_destroy);
|
|
||||||
if (clip_region)
|
|
||||||
priv->clip_region = cairo_region_copy (clip_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_background_actor_dispose (GObject *object)
|
meta_background_actor_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
|
||||||
|
|
||||||
set_clip_region (self, NULL);
|
meta_background_actor_set_visible_region (self, NULL);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
|
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
@@ -117,6 +104,26 @@ meta_background_actor_get_preferred_height (ClutterActor *actor,
|
|||||||
*natural_height_p = height;
|
*natural_height_p = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_background_actor_get_paint_volume (ClutterActor *actor,
|
||||||
|
ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
ClutterContent *content;
|
||||||
|
gfloat width, height;
|
||||||
|
|
||||||
|
content = clutter_actor_get_content (actor);
|
||||||
|
|
||||||
|
if (!content)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
clutter_content_get_preferred_size (content, &width, &height);
|
||||||
|
|
||||||
|
clutter_paint_volume_set_width (volume, width);
|
||||||
|
clutter_paint_volume_set_height (volume, height);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_background_actor_class_init (MetaBackgroundActorClass *klass)
|
meta_background_actor_class_init (MetaBackgroundActorClass *klass)
|
||||||
{
|
{
|
||||||
@@ -129,6 +136,7 @@ meta_background_actor_class_init (MetaBackgroundActorClass *klass)
|
|||||||
|
|
||||||
actor_class->get_preferred_width = meta_background_actor_get_preferred_width;
|
actor_class->get_preferred_width = meta_background_actor_get_preferred_width;
|
||||||
actor_class->get_preferred_height = meta_background_actor_get_preferred_height;
|
actor_class->get_preferred_height = meta_background_actor_get_preferred_height;
|
||||||
|
actor_class->get_paint_volume = meta_background_actor_get_paint_volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -158,31 +166,35 @@ meta_background_actor_new (void)
|
|||||||
return CLUTTER_ACTOR (self);
|
return CLUTTER_ACTOR (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
/**
|
||||||
meta_background_actor_cull_out (MetaCullable *cullable,
|
* meta_background_actor_set_visible_region:
|
||||||
cairo_region_t *unobscured_region,
|
* @self: a #MetaBackgroundActor
|
||||||
cairo_region_t *clip_region)
|
* @visible_region: (allow-none): the area of the actor (in allocate-relative
|
||||||
|
* coordinates) that is visible.
|
||||||
|
*
|
||||||
|
* Sets the area of the background that is unobscured by overlapping windows.
|
||||||
|
* This is used to optimize and only paint the visible portions.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
meta_background_actor_set_visible_region (MetaBackgroundActor *self,
|
||||||
|
cairo_region_t *visible_region)
|
||||||
{
|
{
|
||||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (cullable);
|
MetaBackgroundActorPrivate *priv;
|
||||||
set_clip_region (self, clip_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
g_return_if_fail (META_IS_BACKGROUND_ACTOR (self));
|
||||||
meta_background_actor_reset_culling (MetaCullable *cullable)
|
|
||||||
{
|
|
||||||
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (cullable);
|
|
||||||
set_clip_region (self, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
priv = self->priv;
|
||||||
cullable_iface_init (MetaCullableInterface *iface)
|
|
||||||
{
|
g_clear_pointer (&priv->visible_region,
|
||||||
iface->cull_out = meta_background_actor_cull_out;
|
(GDestroyNotify)
|
||||||
iface->reset_culling = meta_background_actor_reset_culling;
|
cairo_region_destroy);
|
||||||
|
|
||||||
|
if (visible_region)
|
||||||
|
priv->visible_region = cairo_region_copy (visible_region);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_background_actor_get_clip_region:
|
* meta_background_actor_get_visible_region:
|
||||||
* @self: a #MetaBackgroundActor
|
* @self: a #MetaBackgroundActor
|
||||||
*
|
*
|
||||||
* Return value (transfer full): a #cairo_region_t that represents the part of
|
* Return value (transfer full): a #cairo_region_t that represents the part of
|
||||||
@@ -190,16 +202,16 @@ cullable_iface_init (MetaCullableInterface *iface)
|
|||||||
* #MetaWindowActor objects.
|
* #MetaWindowActor objects.
|
||||||
*/
|
*/
|
||||||
cairo_region_t *
|
cairo_region_t *
|
||||||
meta_background_actor_get_clip_region (MetaBackgroundActor *self)
|
meta_background_actor_get_visible_region (MetaBackgroundActor *self)
|
||||||
{
|
{
|
||||||
MetaBackgroundActorPrivate *priv = self->priv;
|
MetaBackgroundActorPrivate *priv = self->priv;
|
||||||
ClutterActorBox content_box;
|
ClutterActorBox content_box;
|
||||||
cairo_rectangle_int_t content_area = { 0 };
|
cairo_rectangle_int_t content_area = { 0 };
|
||||||
cairo_region_t *clip_region;
|
cairo_region_t *visible_region;
|
||||||
|
|
||||||
g_return_val_if_fail (META_IS_BACKGROUND_ACTOR (self), NULL);
|
g_return_val_if_fail (META_IS_BACKGROUND_ACTOR (self), NULL);
|
||||||
|
|
||||||
if (!priv->clip_region)
|
if (!priv->visible_region)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
clutter_actor_get_content_box (CLUTTER_ACTOR (self), &content_box);
|
clutter_actor_get_content_box (CLUTTER_ACTOR (self), &content_box);
|
||||||
@@ -209,8 +221,8 @@ meta_background_actor_get_clip_region (MetaBackgroundActor *self)
|
|||||||
content_area.width = content_box.x2 - content_box.x1;
|
content_area.width = content_box.x2 - content_box.x1;
|
||||||
content_area.height = content_box.y2 - content_box.y1;
|
content_area.height = content_box.y2 - content_box.y1;
|
||||||
|
|
||||||
clip_region = cairo_region_create_rectangle (&content_area);
|
visible_region = cairo_region_create_rectangle (&content_area);
|
||||||
cairo_region_intersect (clip_region, priv->clip_region);
|
cairo_region_intersect (visible_region, priv->visible_region);
|
||||||
|
|
||||||
return clip_region;
|
return visible_region;
|
||||||
}
|
}
|
||||||
|
11
src/compositor/meta-background-group-private.h
Normal file
11
src/compositor/meta-background-group-private.h
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
#ifndef META_BACKGROUND_GROUP_PRIVATE_H
|
||||||
|
#define META_BACKGROUND_GROUP_PRIVATE_H
|
||||||
|
|
||||||
|
#include <meta/screen.h>
|
||||||
|
#include <meta/meta-background-group.h>
|
||||||
|
|
||||||
|
void meta_background_group_set_visible_region (MetaBackgroundGroup *self,
|
||||||
|
cairo_region_t *visible_region);
|
||||||
|
#endif /* META_BACKGROUND_GROUP_PRIVATE_H */
|
@@ -16,43 +16,87 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include <meta/meta-background-group.h>
|
#include "compositor-private.h"
|
||||||
#include "meta-cullable.h"
|
#include "clutter-utils.h"
|
||||||
|
#include "meta-background-actor-private.h"
|
||||||
|
#include "meta-background-group-private.h"
|
||||||
|
|
||||||
static void cullable_iface_init (MetaCullableInterface *iface);
|
G_DEFINE_TYPE (MetaBackgroundGroup, meta_background_group, CLUTTER_TYPE_ACTOR);
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (MetaBackgroundGroup, meta_background_group, CLUTTER_TYPE_ACTOR,
|
struct _MetaBackgroundGroupPrivate
|
||||||
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
{
|
||||||
|
gpointer dummy;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_background_group_dispose (GObject *object)
|
||||||
|
{
|
||||||
|
G_OBJECT_CLASS (meta_background_group_parent_class)->dispose (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_background_group_get_paint_volume (ClutterActor *actor,
|
||||||
|
ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
return clutter_paint_volume_set_from_allocation (volume, actor);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_background_group_class_init (MetaBackgroundGroupClass *klass)
|
meta_background_group_class_init (MetaBackgroundGroupClass *klass)
|
||||||
{
|
{
|
||||||
}
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
|
||||||
|
|
||||||
static void
|
actor_class->get_paint_volume = meta_background_group_get_paint_volume;
|
||||||
meta_background_group_cull_out (MetaCullable *cullable,
|
object_class->dispose = meta_background_group_dispose;
|
||||||
cairo_region_t *unobscured_region,
|
|
||||||
cairo_region_t *clip_region)
|
|
||||||
{
|
|
||||||
meta_cullable_cull_out_children (cullable, unobscured_region, clip_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
g_type_class_add_private (klass, sizeof (MetaBackgroundGroupPrivate));
|
||||||
meta_background_group_reset_culling (MetaCullable *cullable)
|
|
||||||
{
|
|
||||||
meta_cullable_reset_culling_children (cullable);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
cullable_iface_init (MetaCullableInterface *iface)
|
|
||||||
{
|
|
||||||
iface->cull_out = meta_background_group_cull_out;
|
|
||||||
iface->reset_culling = meta_background_group_reset_culling;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_background_group_init (MetaBackgroundGroup *self)
|
meta_background_group_init (MetaBackgroundGroup *self)
|
||||||
{
|
{
|
||||||
|
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
||||||
|
META_TYPE_BACKGROUND_GROUP,
|
||||||
|
MetaBackgroundGroupPrivate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_background_group_set_visible_region:
|
||||||
|
* @self: a #MetaBackgroundGroup
|
||||||
|
* @visible_region: (allow-none): the parts of the background to paint
|
||||||
|
*
|
||||||
|
* Sets the area of the backgrounds that is unobscured by overlapping windows.
|
||||||
|
* This is used to optimize and only paint the visible portions.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
meta_background_group_set_visible_region (MetaBackgroundGroup *self,
|
||||||
|
cairo_region_t *region)
|
||||||
|
{
|
||||||
|
GList *children, *l;
|
||||||
|
|
||||||
|
children = clutter_actor_get_children (CLUTTER_ACTOR (self));
|
||||||
|
for (l = children; l; l = l->next)
|
||||||
|
{
|
||||||
|
ClutterActor *actor = l->data;
|
||||||
|
|
||||||
|
if (META_IS_BACKGROUND_ACTOR (actor))
|
||||||
|
{
|
||||||
|
meta_background_actor_set_visible_region (META_BACKGROUND_ACTOR (actor), region);
|
||||||
|
}
|
||||||
|
else if (META_IS_BACKGROUND_GROUP (actor))
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (!meta_actor_is_untransformed (actor, &x, &y))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
cairo_region_translate (region, -x, -y);
|
||||||
|
meta_background_group_set_visible_region (META_BACKGROUND_GROUP (actor), region);
|
||||||
|
cairo_region_translate (region, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_list_free (children);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClutterActor *
|
ClutterActor *
|
||||||
|
@@ -14,7 +14,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -35,7 +37,6 @@
|
|||||||
#include "mutter-enum-types.h"
|
#include "mutter-enum-types.h"
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include <meta/meta-background.h>
|
#include <meta/meta-background.h>
|
||||||
#include "util-private.h"
|
|
||||||
#include "meta-background-actor-private.h"
|
#include "meta-background-actor-private.h"
|
||||||
|
|
||||||
#define FRAGMENT_SHADER_DECLARATIONS \
|
#define FRAGMENT_SHADER_DECLARATIONS \
|
||||||
@@ -411,13 +412,13 @@ meta_background_paint_content (ClutterContent *content,
|
|||||||
*/
|
*/
|
||||||
if (META_IS_BACKGROUND_ACTOR (actor))
|
if (META_IS_BACKGROUND_ACTOR (actor))
|
||||||
{
|
{
|
||||||
cairo_region_t *clip_region;
|
cairo_region_t *visible_region;
|
||||||
clip_region = meta_background_actor_get_clip_region (META_BACKGROUND_ACTOR (actor));
|
visible_region = meta_background_actor_get_visible_region (META_BACKGROUND_ACTOR (actor));
|
||||||
|
|
||||||
if (clip_region != NULL)
|
if (visible_region != NULL)
|
||||||
{
|
{
|
||||||
cairo_region_intersect (paintable_region, clip_region);
|
cairo_region_intersect (paintable_region, visible_region);
|
||||||
cairo_region_destroy (clip_region);
|
cairo_region_destroy (visible_region);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1030,6 +1031,7 @@ meta_background_load_file_finish (MetaBackground *self,
|
|||||||
GAsyncResult *result,
|
GAsyncResult *result,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
|
static CoglUserDataKey key;
|
||||||
GTask *task;
|
GTask *task;
|
||||||
LoadFileTaskData *task_data;
|
LoadFileTaskData *task_data;
|
||||||
CoglTexture *texture;
|
CoglTexture *texture;
|
||||||
@@ -1058,7 +1060,7 @@ meta_background_load_file_finish (MetaBackground *self,
|
|||||||
|
|
||||||
texture = cogl_texture_new_from_data (width,
|
texture = cogl_texture_new_from_data (width,
|
||||||
height,
|
height,
|
||||||
COGL_TEXTURE_NO_ATLAS,
|
COGL_TEXTURE_NO_SLICING,
|
||||||
has_alpha ?
|
has_alpha ?
|
||||||
COGL_PIXEL_FORMAT_RGBA_8888 :
|
COGL_PIXEL_FORMAT_RGBA_8888 :
|
||||||
COGL_PIXEL_FORMAT_RGB_888,
|
COGL_PIXEL_FORMAT_RGB_888,
|
||||||
@@ -1075,6 +1077,12 @@ meta_background_load_file_finish (MetaBackground *self,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cogl_object_set_user_data (COGL_OBJECT (texture),
|
||||||
|
&key,
|
||||||
|
g_object_ref (pixbuf),
|
||||||
|
(CoglUserDataDestroyCallback)
|
||||||
|
g_object_unref);
|
||||||
|
|
||||||
ensure_pipeline (self);
|
ensure_pipeline (self);
|
||||||
unset_texture (self);
|
unset_texture (self);
|
||||||
set_style (self, task_data->style);
|
set_style (self, task_data->style);
|
||||||
|
@@ -1,191 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2013 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Written by:
|
|
||||||
* Owen Taylor <otaylor@redhat.com>
|
|
||||||
* Ray Strode <rstrode@redhat.com>
|
|
||||||
* Jasper St. Pierre <jstpierre@mecheye.net>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "meta-cullable.h"
|
|
||||||
#include "clutter-utils.h"
|
|
||||||
|
|
||||||
G_DEFINE_INTERFACE (MetaCullable, meta_cullable, CLUTTER_TYPE_ACTOR);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SECTION:meta-cullable
|
|
||||||
* @title: MetaCullable
|
|
||||||
* @short_description: CPU culling operations for efficient drawing
|
|
||||||
*
|
|
||||||
* When we are painting a stack of 5-10 large actors, the standard
|
|
||||||
* bottom-to-top method of drawing every actor results in a tremendous
|
|
||||||
* amount of overdraw. If these actors are painting textures like
|
|
||||||
* windows, it can easily max out the available memory bandwidth on a
|
|
||||||
* low-end graphics chipset. It's even worse if window textures are
|
|
||||||
* being accessed over the AGP bus.
|
|
||||||
*
|
|
||||||
* #MetaCullable is our solution. The basic technique applied here is to
|
|
||||||
* do a pre-pass before painting where we walk each actor from top to bottom
|
|
||||||
* and ask each actor to "cull itself out". We pass in a region it can copy
|
|
||||||
* to clip its drawing to, and the actor can subtract its fully opaque pixels
|
|
||||||
* so that actors underneath know not to draw there as well.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_cullable_cull_out_children:
|
|
||||||
* @cullable: The #MetaCullable
|
|
||||||
* @unobscured_region: The unobscured region, as passed into cull_out()
|
|
||||||
* @clip_region: The clip region, as passed into cull_out()
|
|
||||||
*
|
|
||||||
* This is a helper method for actors that want to recurse over their
|
|
||||||
* child actors, and cull them out.
|
|
||||||
*
|
|
||||||
* See #MetaCullable and meta_cullable_cull_out() for more details.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_cullable_cull_out_children (MetaCullable *cullable,
|
|
||||||
cairo_region_t *unobscured_region,
|
|
||||||
cairo_region_t *clip_region)
|
|
||||||
{
|
|
||||||
ClutterActor *actor = CLUTTER_ACTOR (cullable);
|
|
||||||
ClutterActor *child;
|
|
||||||
ClutterActorIter iter;
|
|
||||||
|
|
||||||
clutter_actor_iter_init (&iter, actor);
|
|
||||||
while (clutter_actor_iter_prev (&iter, &child))
|
|
||||||
{
|
|
||||||
float x, y;
|
|
||||||
|
|
||||||
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* If an actor has effects applied, then that can change the area
|
|
||||||
* it paints and the opacity, so we no longer can figure out what
|
|
||||||
* portion of the actor is obscured and what portion of the screen
|
|
||||||
* it obscures, so we skip the actor.
|
|
||||||
*
|
|
||||||
* This has a secondary beneficial effect: if a ClutterOffscreenEffect
|
|
||||||
* is applied to an actor, then our clipped redraws interfere with the
|
|
||||||
* caching of the FBO - even if we only need to draw a small portion
|
|
||||||
* of the window right now, ClutterOffscreenEffect may use other portions
|
|
||||||
* of the FBO later. So, skipping actors with effects applied also
|
|
||||||
* prevents these bugs.
|
|
||||||
*
|
|
||||||
* Theoretically, we should check clutter_actor_get_offscreen_redirect()
|
|
||||||
* as well for the same reason, but omitted for simplicity in the
|
|
||||||
* hopes that no-one will do that.
|
|
||||||
*/
|
|
||||||
if (clutter_actor_has_effects (child))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!META_IS_CULLABLE (child))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!meta_actor_is_untransformed (child, NULL, NULL))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
clutter_actor_get_position (child, &x, &y);
|
|
||||||
|
|
||||||
/* Temporarily move to the coordinate system of the actor */
|
|
||||||
cairo_region_translate (unobscured_region, - x, - y);
|
|
||||||
cairo_region_translate (clip_region, - x, - y);
|
|
||||||
|
|
||||||
meta_cullable_cull_out (META_CULLABLE (child), unobscured_region, clip_region);
|
|
||||||
|
|
||||||
cairo_region_translate (unobscured_region, x, y);
|
|
||||||
cairo_region_translate (clip_region, x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_cullable_reset_culling_children:
|
|
||||||
* @cullable: The #MetaCullable
|
|
||||||
*
|
|
||||||
* This is a helper method for actors that want to recurse over their
|
|
||||||
* child actors, and cull them out.
|
|
||||||
*
|
|
||||||
* See #MetaCullable and meta_cullable_reset_culling() for more details.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_cullable_reset_culling_children (MetaCullable *cullable)
|
|
||||||
{
|
|
||||||
ClutterActor *actor = CLUTTER_ACTOR (cullable);
|
|
||||||
ClutterActor *child;
|
|
||||||
ClutterActorIter iter;
|
|
||||||
|
|
||||||
clutter_actor_iter_init (&iter, actor);
|
|
||||||
while (clutter_actor_iter_next (&iter, &child))
|
|
||||||
{
|
|
||||||
if (!META_IS_CULLABLE (child))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
meta_cullable_reset_culling (META_CULLABLE (child));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_cullable_default_init (MetaCullableInterface *iface)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_cullable_cull_out:
|
|
||||||
* @cullable: The #MetaCullable
|
|
||||||
* @unobscured_region: The unobscured region, in @cullable's space.
|
|
||||||
* @clip_region: The clip region, in @cullable's space.
|
|
||||||
*
|
|
||||||
* When #MetaWindowGroup is painted, we walk over its direct cullable
|
|
||||||
* children from top to bottom and ask themselves to "cull out". Cullables
|
|
||||||
* can use @unobscured_region and @clip_region to clip their drawing. Actors
|
|
||||||
* interested in eliminating overdraw should copy the @clip_region and only
|
|
||||||
* paint those parts, as everything else has been obscured by actors above it.
|
|
||||||
*
|
|
||||||
* Actors that may have fully opaque parts should also subtract out a region
|
|
||||||
* that is fully opaque from @unobscured_region and @clip_region.
|
|
||||||
*
|
|
||||||
* @unobscured_region and @clip_region are extremely similar. The difference
|
|
||||||
* is that @clip_region starts off with the stage's clip, if Clutter detects
|
|
||||||
* that we're doing a clipped redraw. @unobscured_region, however, starts off
|
|
||||||
* with the full stage size, so actors that may want to record what parts of
|
|
||||||
* their window are unobscured for e.g. scheduling repaints can do so.
|
|
||||||
*
|
|
||||||
* Actors that have children can also use the meta_cullable_cull_out_children()
|
|
||||||
* helper method to do a simple cull across all their children.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_cullable_cull_out (MetaCullable *cullable,
|
|
||||||
cairo_region_t *unobscured_region,
|
|
||||||
cairo_region_t *clip_region)
|
|
||||||
{
|
|
||||||
META_CULLABLE_GET_IFACE (cullable)->cull_out (cullable, unobscured_region, clip_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_cullable_reset_culling:
|
|
||||||
* @cullable: The #MetaCullable
|
|
||||||
*
|
|
||||||
* Actors that copied data in their cull_out() implementation can now
|
|
||||||
* reset their data, as the paint is now over. Additional paints may be
|
|
||||||
* done by #ClutterClone or similar, and they should not be affected by
|
|
||||||
* the culling operation.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_cullable_reset_culling (MetaCullable *cullable)
|
|
||||||
{
|
|
||||||
META_CULLABLE_GET_IFACE (cullable)->reset_culling (cullable);
|
|
||||||
}
|
|
@@ -1,66 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2013 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, see <http://www.gnu.org/licenses/>.
|
|
||||||
*
|
|
||||||
* Written by:
|
|
||||||
* Owen Taylor <otaylor@redhat.com>
|
|
||||||
* Ray Strode <rstrode@redhat.com>
|
|
||||||
* Jasper St. Pierre <jstpierre@mecheye.net>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __META_CULLABLE_H__
|
|
||||||
#define __META_CULLABLE_H__
|
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define META_TYPE_CULLABLE (meta_cullable_get_type ())
|
|
||||||
#define META_CULLABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_CULLABLE, MetaCullable))
|
|
||||||
#define META_IS_CULLABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_CULLABLE))
|
|
||||||
#define META_CULLABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), META_TYPE_CULLABLE, MetaCullableInterface))
|
|
||||||
|
|
||||||
typedef struct _MetaCullable MetaCullable;
|
|
||||||
typedef struct _MetaCullableInterface MetaCullableInterface;
|
|
||||||
|
|
||||||
struct _MetaCullableInterface
|
|
||||||
{
|
|
||||||
GTypeInterface g_iface;
|
|
||||||
|
|
||||||
void (* cull_out) (MetaCullable *cullable,
|
|
||||||
cairo_region_t *unobscured_region,
|
|
||||||
cairo_region_t *clip_region);
|
|
||||||
void (* reset_culling) (MetaCullable *cullable);
|
|
||||||
};
|
|
||||||
|
|
||||||
GType meta_cullable_get_type (void);
|
|
||||||
|
|
||||||
void meta_cullable_cull_out (MetaCullable *cullable,
|
|
||||||
cairo_region_t *unobscured_region,
|
|
||||||
cairo_region_t *clip_region);
|
|
||||||
void meta_cullable_reset_culling (MetaCullable *cullable);
|
|
||||||
|
|
||||||
/* Utility methods for implementations */
|
|
||||||
void meta_cullable_cull_out_children (MetaCullable *cullable,
|
|
||||||
cairo_region_t *unobscured_region,
|
|
||||||
cairo_region_t *clip_region);
|
|
||||||
void meta_cullable_reset_culling_children (MetaCullable *cullable);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __META_CULLABLE_H__ */
|
|
||||||
|
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <meta/meta-plugin.h>
|
#include <meta/meta-plugin.h>
|
||||||
@@ -190,7 +192,10 @@ meta_module_class_init (MetaModuleClass *klass)
|
|||||||
static void
|
static void
|
||||||
meta_module_init (MetaModule *self)
|
meta_module_init (MetaModule *self)
|
||||||
{
|
{
|
||||||
self->priv = META_MODULE_GET_PRIVATE (self);
|
MetaModulePrivate *priv;
|
||||||
|
|
||||||
|
self->priv = priv = META_MODULE_GET_PRIVATE (self);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GType
|
GType
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_MODULE_H_
|
#ifndef META_MODULE_H_
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
@@ -83,20 +85,12 @@ meta_plugin_manager_load (const gchar *plugin_name)
|
|||||||
g_free (path);
|
g_free (path);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
on_confirm_display_change (MetaMonitorManager *monitors,
|
|
||||||
MetaPluginManager *plugin_mgr)
|
|
||||||
{
|
|
||||||
meta_plugin_manager_confirm_display_change (plugin_mgr);
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaPluginManager *
|
MetaPluginManager *
|
||||||
meta_plugin_manager_new (MetaScreen *screen)
|
meta_plugin_manager_new (MetaScreen *screen)
|
||||||
{
|
{
|
||||||
MetaPluginManager *plugin_mgr;
|
MetaPluginManager *plugin_mgr;
|
||||||
MetaPluginClass *klass;
|
MetaPluginClass *klass;
|
||||||
MetaPlugin *plugin;
|
MetaPlugin *plugin;
|
||||||
MetaMonitorManager *monitors;
|
|
||||||
|
|
||||||
plugin_mgr = g_new0 (MetaPluginManager, 1);
|
plugin_mgr = g_new0 (MetaPluginManager, 1);
|
||||||
plugin_mgr->screen = screen;
|
plugin_mgr->screen = screen;
|
||||||
@@ -107,10 +101,6 @@ meta_plugin_manager_new (MetaScreen *screen)
|
|||||||
if (klass->start)
|
if (klass->start)
|
||||||
klass->start (plugin);
|
klass->start (plugin);
|
||||||
|
|
||||||
monitors = meta_monitor_manager_get ();
|
|
||||||
g_signal_connect (monitors, "confirm-display-change",
|
|
||||||
G_CALLBACK (on_confirm_display_change), plugin_mgr);
|
|
||||||
|
|
||||||
return plugin_mgr;
|
return plugin_mgr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -304,23 +294,29 @@ meta_plugin_manager_filter_keybinding (MetaPluginManager *plugin_mgr,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The public method that the compositor hooks into for desktop switching.
|
||||||
|
*
|
||||||
|
* Returns TRUE if the plugin handled the event type (i.e.,
|
||||||
|
* if the return value is FALSE, there will be no subsequent call to the
|
||||||
|
* manager completed() callback, and the compositor must ensure that any
|
||||||
|
* appropriate post-effect cleanup is carried out.
|
||||||
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
|
meta_plugin_manager_xevent_filter (MetaPluginManager *plugin_mgr,
|
||||||
XEvent *xev)
|
XEvent *xev)
|
||||||
{
|
|
||||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
|
||||||
|
|
||||||
return _meta_plugin_xevent_filter (plugin, xev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_plugin_manager_confirm_display_change (MetaPluginManager *plugin_mgr)
|
|
||||||
{
|
{
|
||||||
MetaPlugin *plugin = plugin_mgr->plugin;
|
MetaPlugin *plugin = plugin_mgr->plugin;
|
||||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
||||||
|
|
||||||
if (klass->confirm_display_change)
|
/* We need to make sure that clutter gets certain events, like
|
||||||
return klass->confirm_display_change (plugin);
|
* ConfigureNotify on the stage window. If there is a plugin that
|
||||||
|
* provides an xevent_filter function, then it's the responsibility
|
||||||
|
* of that plugin to pass events to Clutter. Otherwise, we send the
|
||||||
|
* event directly to Clutter ourselves.
|
||||||
|
*/
|
||||||
|
if (klass->xevent_filter)
|
||||||
|
return klass->xevent_filter (plugin, xev);
|
||||||
else
|
else
|
||||||
return meta_plugin_complete_display_change (plugin, TRUE);
|
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
||||||
}
|
}
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_PLUGIN_MANAGER_H_
|
#ifndef META_PLUGIN_MANAGER_H_
|
||||||
@@ -70,9 +72,5 @@ gboolean meta_plugin_manager_filter_keybinding (MetaPluginManager *mgr,
|
|||||||
|
|
||||||
gboolean meta_plugin_manager_xevent_filter (MetaPluginManager *mgr,
|
gboolean meta_plugin_manager_xevent_filter (MetaPluginManager *mgr,
|
||||||
XEvent *xev);
|
XEvent *xev);
|
||||||
gboolean _meta_plugin_xevent_filter (MetaPlugin *plugin,
|
|
||||||
XEvent *xev);
|
|
||||||
|
|
||||||
void meta_plugin_manager_confirm_display_change (MetaPluginManager *mgr);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -39,7 +41,6 @@
|
|||||||
|
|
||||||
#include "compositor-private.h"
|
#include "compositor-private.h"
|
||||||
#include "meta-window-actor-private.h"
|
#include "meta-window-actor-private.h"
|
||||||
#include "monitor-private.h"
|
|
||||||
|
|
||||||
G_DEFINE_ABSTRACT_TYPE (MetaPlugin, meta_plugin, G_TYPE_OBJECT);
|
G_DEFINE_ABSTRACT_TYPE (MetaPlugin, meta_plugin, G_TYPE_OBJECT);
|
||||||
|
|
||||||
@@ -136,7 +137,9 @@ meta_plugin_class_init (MetaPluginClass *klass)
|
|||||||
static void
|
static void
|
||||||
meta_plugin_init (MetaPlugin *self)
|
meta_plugin_init (MetaPlugin *self)
|
||||||
{
|
{
|
||||||
self->priv = META_PLUGIN_GET_PRIVATE (self);
|
MetaPluginPrivate *priv;
|
||||||
|
|
||||||
|
self->priv = priv = META_PLUGIN_GET_PRIVATE (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@@ -181,28 +184,6 @@ _meta_plugin_effect_started (MetaPlugin *plugin)
|
|||||||
priv->running++;
|
priv->running++;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
|
||||||
_meta_plugin_xevent_filter (MetaPlugin *plugin,
|
|
||||||
XEvent *xev)
|
|
||||||
{
|
|
||||||
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
|
|
||||||
|
|
||||||
/* When mutter is running as a wayland compositor, things like input
|
|
||||||
* events just come directly from clutter so it won't have disabled
|
|
||||||
* clutter's event retrieval and won't need to forward it events (if
|
|
||||||
* it did it would lead to recursion). Also when running as a
|
|
||||||
* wayland compositor we shouldn't be assuming that we're running
|
|
||||||
* with the clutter x11 backend.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (klass->xevent_filter && klass->xevent_filter (plugin, xev))
|
|
||||||
return TRUE;
|
|
||||||
else if (!meta_is_wayland_compositor ())
|
|
||||||
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
|
||||||
else
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_plugin_switch_workspace_completed (MetaPlugin *plugin)
|
meta_plugin_switch_workspace_completed (MetaPlugin *plugin)
|
||||||
{
|
{
|
||||||
@@ -285,6 +266,10 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
|
|||||||
/**
|
/**
|
||||||
* meta_plugin_begin_modal:
|
* meta_plugin_begin_modal:
|
||||||
* @plugin: a #MetaPlugin
|
* @plugin: a #MetaPlugin
|
||||||
|
* @grab_window: the X window to grab the keyboard and mouse on
|
||||||
|
* @cursor: the cursor to use for the pointer grab, or None,
|
||||||
|
* to use the normal cursor for the grab window and
|
||||||
|
* its descendants.
|
||||||
* @options: flags that modify the behavior of the modal grab
|
* @options: flags that modify the behavior of the modal grab
|
||||||
* @timestamp: the timestamp used for establishing grabs
|
* @timestamp: the timestamp used for establishing grabs
|
||||||
*
|
*
|
||||||
@@ -305,13 +290,15 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
|
|||||||
*/
|
*/
|
||||||
gboolean
|
gboolean
|
||||||
meta_plugin_begin_modal (MetaPlugin *plugin,
|
meta_plugin_begin_modal (MetaPlugin *plugin,
|
||||||
|
Window grab_window,
|
||||||
|
Cursor cursor,
|
||||||
MetaModalOptions options,
|
MetaModalOptions options,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
|
||||||
|
|
||||||
return meta_begin_modal_for_plugin (priv->screen, plugin,
|
return meta_begin_modal_for_plugin (priv->screen, plugin,
|
||||||
options, timestamp);
|
grab_window, cursor, options, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -351,13 +338,3 @@ meta_plugin_get_screen (MetaPlugin *plugin)
|
|||||||
|
|
||||||
return priv->screen;
|
return priv->screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_plugin_complete_display_change (MetaPlugin *plugin,
|
|
||||||
gboolean ok)
|
|
||||||
{
|
|
||||||
MetaMonitorManager *manager;
|
|
||||||
|
|
||||||
manager = meta_monitor_manager_get ();
|
|
||||||
meta_monitor_manager_confirm_configuration (manager, ok);
|
|
||||||
}
|
|
||||||
|
@@ -17,7 +17,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_SHADOW_FACTORY_PRIVATE_H__
|
#ifndef __META_SHADOW_FACTORY_PRIVATE_H__
|
||||||
|
@@ -13,7 +13,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -121,12 +123,12 @@ static guint signals[LAST_SIGNAL] = { 0 };
|
|||||||
/* The first element in this array also defines the default parameters
|
/* The first element in this array also defines the default parameters
|
||||||
* for newly created classes */
|
* for newly created classes */
|
||||||
MetaShadowClassInfo default_shadow_classes[] = {
|
MetaShadowClassInfo default_shadow_classes[] = {
|
||||||
{ "normal", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 3, 32 } },
|
{ "normal", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
|
||||||
{ "dialog", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 3, 32 } },
|
{ "dialog", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
|
||||||
{ "modal_dialog", { 6, -1, 0, 1, 128 }, { 3, -1, 0, 3, 32 } },
|
{ "modal_dialog", { 6, -1, 0, 1, 255 }, { 3, -1, 0, 3, 128 } },
|
||||||
{ "utility", { 3, -1, 0, 1, 128 }, { 3, -1, 0, 1, 32 } },
|
{ "utility", { 3, -1, 0, 1, 255 }, { 3, -1, 0, 1, 128 } },
|
||||||
{ "border", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 3, 32 } },
|
{ "border", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
|
||||||
{ "menu", { 6, -1, 0, 3, 128 }, { 3, -1, 0, 0, 32 } },
|
{ "menu", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 0, 128 } },
|
||||||
|
|
||||||
{ "popup-menu", { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } },
|
{ "popup-menu", { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } },
|
||||||
|
|
||||||
|
@@ -1,36 +0,0 @@
|
|||||||
/*
|
|
||||||
* shaped texture
|
|
||||||
*
|
|
||||||
* An actor to draw a texture clipped to a list of rectangles
|
|
||||||
*
|
|
||||||
* Authored By Neil Roberts <neil@linux.intel.com>
|
|
||||||
*
|
|
||||||
* Copyright (C) 2008 Intel Corporation
|
|
||||||
* 2013 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, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
* 02111-1307, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __META_SHAPED_TEXTURE_PRIVATE_H__
|
|
||||||
#define __META_SHAPED_TEXTURE_PRIVATE_H__
|
|
||||||
|
|
||||||
#include <meta/meta-shaped-texture.h>
|
|
||||||
|
|
||||||
ClutterActor *meta_shaped_texture_new (void);
|
|
||||||
void meta_shaped_texture_set_texture (MetaShapedTexture *stex,
|
|
||||||
CoglTexture *texture);
|
|
||||||
|
|
||||||
#endif
|
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -28,16 +30,12 @@
|
|||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include <meta/meta-shaped-texture.h>
|
#include <meta/meta-shaped-texture.h>
|
||||||
#include <meta/util.h>
|
|
||||||
#include "clutter-utils.h"
|
|
||||||
#include "meta-texture-tower.h"
|
#include "meta-texture-tower.h"
|
||||||
|
|
||||||
#include "meta-shaped-texture-private.h"
|
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include <cogl/cogl.h>
|
#include <cogl/cogl.h>
|
||||||
|
#include <cogl/cogl-texture-pixmap-x11.h>
|
||||||
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
|
||||||
#include "meta-cullable.h"
|
|
||||||
|
|
||||||
static void meta_shaped_texture_dispose (GObject *object);
|
static void meta_shaped_texture_dispose (GObject *object);
|
||||||
|
|
||||||
@@ -57,10 +55,8 @@ static void meta_shaped_texture_get_preferred_height (ClutterActor *self,
|
|||||||
|
|
||||||
static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume);
|
static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume);
|
||||||
|
|
||||||
static void cullable_iface_init (MetaCullableInterface *iface);
|
G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
|
||||||
|
CLUTTER_TYPE_ACTOR);
|
||||||
G_DEFINE_TYPE_WITH_CODE (MetaShapedTexture, meta_shaped_texture, CLUTTER_TYPE_ACTOR,
|
|
||||||
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
|
||||||
|
|
||||||
#define META_SHAPED_TEXTURE_GET_PRIVATE(obj) \
|
#define META_SHAPED_TEXTURE_GET_PRIVATE(obj) \
|
||||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
|
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
|
||||||
@@ -69,13 +65,13 @@ G_DEFINE_TYPE_WITH_CODE (MetaShapedTexture, meta_shaped_texture, CLUTTER_TYPE_AC
|
|||||||
struct _MetaShapedTexturePrivate
|
struct _MetaShapedTexturePrivate
|
||||||
{
|
{
|
||||||
MetaTextureTower *paint_tower;
|
MetaTextureTower *paint_tower;
|
||||||
|
Pixmap pixmap;
|
||||||
CoglTexture *texture;
|
CoglTexturePixmapX11 *texture;
|
||||||
CoglTexture *mask_texture;
|
CoglTexture *mask_texture;
|
||||||
|
CoglPipeline *pipeline;
|
||||||
|
CoglPipeline *pipeline_unshaped;
|
||||||
|
|
||||||
cairo_region_t *clip_region;
|
cairo_region_t *clip_region;
|
||||||
cairo_region_t *input_shape_region;
|
|
||||||
cairo_region_t *opaque_region;
|
|
||||||
|
|
||||||
guint tex_width, tex_height;
|
guint tex_width, tex_height;
|
||||||
|
|
||||||
@@ -107,23 +103,11 @@ meta_shaped_texture_init (MetaShapedTexture *self)
|
|||||||
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
|
||||||
|
|
||||||
priv->paint_tower = meta_texture_tower_new ();
|
priv->paint_tower = meta_texture_tower_new ();
|
||||||
|
|
||||||
priv->texture = NULL;
|
priv->texture = NULL;
|
||||||
priv->mask_texture = NULL;
|
priv->mask_texture = NULL;
|
||||||
priv->create_mipmaps = TRUE;
|
priv->create_mipmaps = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
set_clip_region (MetaShapedTexture *self,
|
|
||||||
cairo_region_t *clip_region)
|
|
||||||
{
|
|
||||||
MetaShapedTexturePrivate *priv = self->priv;
|
|
||||||
|
|
||||||
g_clear_pointer (&priv->clip_region, (GDestroyNotify) cairo_region_destroy);
|
|
||||||
if (clip_region)
|
|
||||||
priv->clip_region = cairo_region_copy (clip_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_shaped_texture_dispose (GObject *object)
|
meta_shaped_texture_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
@@ -134,145 +118,29 @@ meta_shaped_texture_dispose (GObject *object)
|
|||||||
meta_texture_tower_free (priv->paint_tower);
|
meta_texture_tower_free (priv->paint_tower);
|
||||||
priv->paint_tower = NULL;
|
priv->paint_tower = NULL;
|
||||||
|
|
||||||
|
g_clear_pointer (&priv->pipeline, cogl_object_unref);
|
||||||
|
g_clear_pointer (&priv->pipeline_unshaped, cogl_object_unref);
|
||||||
g_clear_pointer (&priv->texture, cogl_object_unref);
|
g_clear_pointer (&priv->texture, cogl_object_unref);
|
||||||
g_clear_pointer (&priv->opaque_region, cairo_region_destroy);
|
|
||||||
|
|
||||||
meta_shaped_texture_set_mask_texture (self, NULL);
|
meta_shaped_texture_set_mask_texture (self, NULL);
|
||||||
set_clip_region (self, NULL);
|
meta_shaped_texture_set_clip_region (self, NULL);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
|
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CoglPipeline *
|
|
||||||
get_unmasked_pipeline (CoglContext *ctx)
|
|
||||||
{
|
|
||||||
return cogl_pipeline_new (ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
static CoglPipeline *
|
|
||||||
get_masked_pipeline (CoglContext *ctx)
|
|
||||||
{
|
|
||||||
static CoglPipeline *template = NULL;
|
|
||||||
if (G_UNLIKELY (template == NULL))
|
|
||||||
{
|
|
||||||
template = cogl_pipeline_new (ctx);
|
|
||||||
cogl_pipeline_set_layer_combine (template, 1,
|
|
||||||
"RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return cogl_pipeline_copy (template);
|
|
||||||
}
|
|
||||||
|
|
||||||
static CoglPipeline *
|
|
||||||
get_unblended_pipeline (CoglContext *ctx)
|
|
||||||
{
|
|
||||||
static CoglPipeline *template = NULL;
|
|
||||||
if (G_UNLIKELY (template == NULL))
|
|
||||||
{
|
|
||||||
CoglColor color;
|
|
||||||
template = cogl_pipeline_new (ctx);
|
|
||||||
cogl_color_init_from_4ub (&color, 255, 255, 255, 255);
|
|
||||||
cogl_pipeline_set_blend (template,
|
|
||||||
"RGBA = ADD (SRC_COLOR, 0)",
|
|
||||||
NULL);
|
|
||||||
cogl_pipeline_set_color (template, &color);
|
|
||||||
}
|
|
||||||
|
|
||||||
return cogl_pipeline_copy (template);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
paint_clipped_rectangle (CoglFramebuffer *fb,
|
|
||||||
CoglPipeline *pipeline,
|
|
||||||
cairo_rectangle_int_t *rect,
|
|
||||||
ClutterActorBox *alloc)
|
|
||||||
{
|
|
||||||
float coords[8];
|
|
||||||
float x1, y1, x2, y2;
|
|
||||||
|
|
||||||
x1 = rect->x;
|
|
||||||
y1 = rect->y;
|
|
||||||
x2 = rect->x + rect->width;
|
|
||||||
y2 = rect->y + rect->height;
|
|
||||||
|
|
||||||
coords[0] = rect->x / (alloc->x2 - alloc->x1);
|
|
||||||
coords[1] = rect->y / (alloc->y2 - alloc->y1);
|
|
||||||
coords[2] = (rect->x + rect->width) / (alloc->x2 - alloc->x1);
|
|
||||||
coords[3] = (rect->y + rect->height) / (alloc->y2 - alloc->y1);
|
|
||||||
|
|
||||||
coords[4] = coords[0];
|
|
||||||
coords[5] = coords[1];
|
|
||||||
coords[6] = coords[2];
|
|
||||||
coords[7] = coords[3];
|
|
||||||
|
|
||||||
cogl_framebuffer_draw_multitextured_rectangle (fb, pipeline,
|
|
||||||
x1, y1, x2, y2,
|
|
||||||
&coords[0], 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_cogl_texture (MetaShapedTexture *stex,
|
|
||||||
CoglTexture *cogl_tex)
|
|
||||||
{
|
|
||||||
MetaShapedTexturePrivate *priv;
|
|
||||||
guint width, height;
|
|
||||||
|
|
||||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
|
||||||
|
|
||||||
priv = stex->priv;
|
|
||||||
|
|
||||||
if (priv->texture)
|
|
||||||
cogl_object_unref (priv->texture);
|
|
||||||
|
|
||||||
priv->texture = cogl_tex;
|
|
||||||
|
|
||||||
if (cogl_tex != NULL)
|
|
||||||
{
|
|
||||||
cogl_object_ref (cogl_tex);
|
|
||||||
width = cogl_texture_get_width (COGL_TEXTURE (cogl_tex));
|
|
||||||
height = cogl_texture_get_height (COGL_TEXTURE (cogl_tex));
|
|
||||||
|
|
||||||
if (width != priv->tex_width ||
|
|
||||||
height != priv->tex_height)
|
|
||||||
{
|
|
||||||
priv->tex_width = width;
|
|
||||||
priv->tex_height = height;
|
|
||||||
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* size changed to 0 going to an invalid handle */
|
|
||||||
priv->tex_width = 0;
|
|
||||||
priv->tex_height = 0;
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* NB: We don't queue a redraw of the actor here because we don't
|
|
||||||
* know how much of the buffer has changed with respect to the
|
|
||||||
* previous buffer. We only queue a redraw in response to surface
|
|
||||||
* damage. */
|
|
||||||
|
|
||||||
if (priv->create_mipmaps)
|
|
||||||
meta_texture_tower_set_base_texture (priv->paint_tower, cogl_tex);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_shaped_texture_paint (ClutterActor *actor)
|
meta_shaped_texture_paint (ClutterActor *actor)
|
||||||
{
|
{
|
||||||
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
||||||
MetaShapedTexturePrivate *priv = stex->priv;
|
MetaShapedTexturePrivate *priv = stex->priv;
|
||||||
guint tex_width, tex_height;
|
|
||||||
guchar opacity;
|
|
||||||
CoglContext *ctx;
|
|
||||||
CoglFramebuffer *fb;
|
|
||||||
CoglPipeline *pipeline = NULL;
|
|
||||||
CoglTexture *paint_tex;
|
CoglTexture *paint_tex;
|
||||||
|
guint tex_width, tex_height;
|
||||||
ClutterActorBox alloc;
|
ClutterActorBox alloc;
|
||||||
cairo_region_t *blended_region = NULL;
|
|
||||||
CoglPipelineFilter filter;
|
static CoglPipeline *pipeline_template = NULL;
|
||||||
|
static CoglPipeline *pipeline_unshaped_template = NULL;
|
||||||
|
|
||||||
|
CoglPipeline *pipeline;
|
||||||
|
|
||||||
if (priv->clip_region && cairo_region_is_empty (priv->clip_region))
|
if (priv->clip_region && cairo_region_is_empty (priv->clip_region))
|
||||||
return;
|
return;
|
||||||
@@ -309,137 +177,105 @@ meta_shaped_texture_paint (ClutterActor *actor)
|
|||||||
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Use nearest-pixel interpolation if the texture is unscaled. This
|
|
||||||
* improves performance, especially with software rendering.
|
|
||||||
*/
|
|
||||||
|
|
||||||
filter = COGL_PIPELINE_FILTER_LINEAR;
|
|
||||||
|
|
||||||
if (!clutter_actor_is_in_clone_paint (actor) && meta_actor_is_untransformed (actor, NULL, NULL))
|
|
||||||
filter = COGL_PIPELINE_FILTER_NEAREST;
|
|
||||||
|
|
||||||
ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
|
||||||
fb = cogl_get_draw_framebuffer ();
|
|
||||||
|
|
||||||
opacity = clutter_actor_get_paint_opacity (actor);
|
|
||||||
clutter_actor_get_allocation_box (actor, &alloc);
|
|
||||||
|
|
||||||
if (priv->opaque_region != NULL && opacity == 255)
|
|
||||||
{
|
|
||||||
CoglPipeline *opaque_pipeline;
|
|
||||||
cairo_region_t *region;
|
|
||||||
int n_rects;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (priv->clip_region != NULL)
|
|
||||||
{
|
|
||||||
region = cairo_region_copy (priv->clip_region);
|
|
||||||
cairo_region_intersect (region, priv->opaque_region);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
region = cairo_region_reference (priv->opaque_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cairo_region_is_empty (region))
|
|
||||||
goto paint_blended;
|
|
||||||
|
|
||||||
opaque_pipeline = get_unblended_pipeline (ctx);
|
|
||||||
cogl_pipeline_set_layer_texture (opaque_pipeline, 0, paint_tex);
|
|
||||||
cogl_pipeline_set_layer_filters (opaque_pipeline, 0, filter, filter);
|
|
||||||
|
|
||||||
n_rects = cairo_region_num_rectangles (region);
|
|
||||||
for (i = 0; i < n_rects; i++)
|
|
||||||
{
|
|
||||||
cairo_rectangle_int_t rect;
|
|
||||||
cairo_region_get_rectangle (region, i, &rect);
|
|
||||||
paint_clipped_rectangle (fb, opaque_pipeline, &rect, &alloc);
|
|
||||||
}
|
|
||||||
|
|
||||||
cogl_object_unref (opaque_pipeline);
|
|
||||||
|
|
||||||
if (priv->clip_region != NULL)
|
|
||||||
{
|
|
||||||
blended_region = cairo_region_copy (priv->clip_region);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cairo_rectangle_int_t rect = { 0, 0, tex_width, tex_height };
|
|
||||||
blended_region = cairo_region_create_rectangle (&rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_region_subtract (blended_region, priv->opaque_region);
|
|
||||||
|
|
||||||
paint_blended:
|
|
||||||
cairo_region_destroy (region);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (blended_region == NULL && priv->clip_region != NULL)
|
|
||||||
blended_region = cairo_region_reference (priv->clip_region);
|
|
||||||
|
|
||||||
if (blended_region != NULL && cairo_region_is_empty (blended_region))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (priv->mask_texture == NULL)
|
if (priv->mask_texture == NULL)
|
||||||
{
|
{
|
||||||
pipeline = get_unmasked_pipeline (ctx);
|
/* Use a single-layer texture if we don't have a mask. */
|
||||||
|
|
||||||
|
if (priv->pipeline_unshaped == NULL)
|
||||||
|
{
|
||||||
|
if (G_UNLIKELY (pipeline_unshaped_template == NULL))
|
||||||
|
{
|
||||||
|
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
|
pipeline_unshaped_template = cogl_pipeline_new (ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->pipeline_unshaped = cogl_pipeline_copy (pipeline_unshaped_template);
|
||||||
|
}
|
||||||
|
pipeline = priv->pipeline_unshaped;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pipeline = get_masked_pipeline (ctx);
|
if (priv->pipeline == NULL)
|
||||||
|
{
|
||||||
|
if (G_UNLIKELY (pipeline_template == NULL))
|
||||||
|
{
|
||||||
|
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
|
pipeline_template = cogl_pipeline_new (ctx);
|
||||||
|
cogl_pipeline_set_layer_combine (pipeline_template, 1,
|
||||||
|
"RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
priv->pipeline = cogl_pipeline_copy (pipeline_template);
|
||||||
|
}
|
||||||
|
pipeline = priv->pipeline;
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
|
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
|
||||||
cogl_pipeline_set_layer_filters (pipeline, 1, filter, filter);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_pipeline_set_layer_texture (pipeline, 0, paint_tex);
|
cogl_pipeline_set_layer_texture (pipeline, 0, paint_tex);
|
||||||
cogl_pipeline_set_layer_filters (pipeline, 0, filter, filter);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
CoglColor color;
|
CoglColor color;
|
||||||
cogl_color_init_from_4ub (&color, opacity, opacity, opacity, opacity);
|
guchar opacity = clutter_actor_get_paint_opacity (actor);
|
||||||
|
cogl_color_set_from_4ub (&color, opacity, opacity, opacity, opacity);
|
||||||
cogl_pipeline_set_color (pipeline, &color);
|
cogl_pipeline_set_color (pipeline, &color);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (blended_region != NULL)
|
cogl_set_source (pipeline);
|
||||||
|
|
||||||
|
clutter_actor_get_allocation_box (actor, &alloc);
|
||||||
|
|
||||||
|
if (priv->clip_region)
|
||||||
{
|
{
|
||||||
int n_rects;
|
int n_rects;
|
||||||
|
int i;
|
||||||
|
cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
|
||||||
|
|
||||||
/* Limit to how many separate rectangles we'll draw; beyond this just
|
/* Limit to how many separate rectangles we'll draw; beyond this just
|
||||||
* fall back and draw the whole thing */
|
* fall back and draw the whole thing */
|
||||||
# define MAX_RECTS 16
|
# define MAX_RECTS 16
|
||||||
|
|
||||||
n_rects = cairo_region_num_rectangles (blended_region);
|
n_rects = cairo_region_num_rectangles (priv->clip_region);
|
||||||
if (n_rects <= MAX_RECTS)
|
if (n_rects <= MAX_RECTS)
|
||||||
{
|
{
|
||||||
int i;
|
float coords[8];
|
||||||
cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
|
float x1, y1, x2, y2;
|
||||||
|
|
||||||
for (i = 0; i < n_rects; i++)
|
for (i = 0; i < n_rects; i++)
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t rect;
|
cairo_rectangle_int_t rect;
|
||||||
|
|
||||||
cairo_region_get_rectangle (blended_region, i, &rect);
|
cairo_region_get_rectangle (priv->clip_region, i, &rect);
|
||||||
|
|
||||||
if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
|
if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
paint_clipped_rectangle (fb, pipeline, &rect, &alloc);
|
x1 = rect.x;
|
||||||
|
y1 = rect.y;
|
||||||
|
x2 = rect.x + rect.width;
|
||||||
|
y2 = rect.y + rect.height;
|
||||||
|
|
||||||
|
coords[0] = rect.x / (alloc.x2 - alloc.x1);
|
||||||
|
coords[1] = rect.y / (alloc.y2 - alloc.y1);
|
||||||
|
coords[2] = (rect.x + rect.width) / (alloc.x2 - alloc.x1);
|
||||||
|
coords[3] = (rect.y + rect.height) / (alloc.y2 - alloc.y1);
|
||||||
|
|
||||||
|
coords[4] = coords[0];
|
||||||
|
coords[5] = coords[1];
|
||||||
|
coords[6] = coords[2];
|
||||||
|
coords[7] = coords[3];
|
||||||
|
|
||||||
|
cogl_rectangle_with_multitexture_coords (x1, y1, x2, y2,
|
||||||
|
&coords[0], 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cogl_framebuffer_draw_rectangle (fb, pipeline,
|
cogl_rectangle (0, 0,
|
||||||
0, 0,
|
alloc.x2 - alloc.x1,
|
||||||
alloc.x2 - alloc.x1,
|
alloc.y2 - alloc.y1);
|
||||||
alloc.y2 - alloc.y1);
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (pipeline != NULL)
|
|
||||||
cogl_object_unref (pipeline);
|
|
||||||
if (blended_region != NULL)
|
|
||||||
cairo_region_destroy (blended_region);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -449,61 +285,38 @@ meta_shaped_texture_pick (ClutterActor *actor,
|
|||||||
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
|
||||||
MetaShapedTexturePrivate *priv = stex->priv;
|
MetaShapedTexturePrivate *priv = stex->priv;
|
||||||
|
|
||||||
if (!clutter_actor_should_pick_paint (actor) ||
|
|
||||||
(priv->clip_region && cairo_region_is_empty (priv->clip_region)))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* If there is no region then use the regular pick */
|
/* If there is no region then use the regular pick */
|
||||||
if (priv->input_shape_region == NULL)
|
if (priv->mask_texture == NULL)
|
||||||
CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)->pick (actor, color);
|
CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)
|
||||||
else
|
->pick (actor, color);
|
||||||
|
else if (clutter_actor_should_pick_paint (actor))
|
||||||
{
|
{
|
||||||
int n_rects;
|
CoglTexture *paint_tex;
|
||||||
float *rectangles;
|
ClutterActorBox alloc;
|
||||||
int i;
|
guint tex_width, tex_height;
|
||||||
CoglPipeline *pipeline;
|
|
||||||
CoglContext *ctx;
|
|
||||||
CoglFramebuffer *fb;
|
|
||||||
CoglColor cogl_color;
|
|
||||||
|
|
||||||
/* Note: We don't bother trying to intersect the pick and clip regions
|
paint_tex = COGL_TEXTURE (priv->texture);
|
||||||
* since needing to copy the region, do the intersection, and probably
|
|
||||||
* increase the number of rectangles seems more likely to have a negative
|
|
||||||
* effect.
|
|
||||||
*
|
|
||||||
* NB: Most of the time when just using rectangles for picking then
|
|
||||||
* picking shouldn't involve any rendering, and minimizing the number of
|
|
||||||
* rectangles has more benefit than reducing the area of the pick
|
|
||||||
* region.
|
|
||||||
*/
|
|
||||||
|
|
||||||
n_rects = cairo_region_num_rectangles (priv->input_shape_region);
|
if (paint_tex == NULL)
|
||||||
rectangles = g_alloca (sizeof (float) * 4 * n_rects);
|
return;
|
||||||
|
|
||||||
for (i = 0; i < n_rects; i++)
|
tex_width = cogl_texture_get_width (paint_tex);
|
||||||
{
|
tex_height = cogl_texture_get_height (paint_tex);
|
||||||
cairo_rectangle_int_t rect;
|
|
||||||
int pos = i * 4;
|
|
||||||
|
|
||||||
cairo_region_get_rectangle (priv->input_shape_region, i, &rect);
|
if (tex_width == 0 || tex_height == 0) /* no contents yet */
|
||||||
|
return;
|
||||||
|
|
||||||
rectangles[pos] = rect.x;
|
cogl_set_source_color4ub (color->red, color->green, color->blue,
|
||||||
rectangles[pos + 1] = rect.y;
|
color->alpha);
|
||||||
rectangles[pos + 2] = rect.x + rect.width;
|
|
||||||
rectangles[pos + 3] = rect.y + rect.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
clutter_actor_get_allocation_box (actor, &alloc);
|
||||||
fb = cogl_get_draw_framebuffer ();
|
|
||||||
|
|
||||||
cogl_color_init_from_4ub (&cogl_color, color->red, color->green, color->blue, color->alpha);
|
/* Paint the mask rectangle in the given color */
|
||||||
|
cogl_set_source_texture (priv->mask_texture);
|
||||||
pipeline = cogl_pipeline_new (ctx);
|
cogl_rectangle_with_texture_coords (0, 0,
|
||||||
cogl_pipeline_set_color (pipeline, &cogl_color);
|
alloc.x2 - alloc.x1,
|
||||||
|
alloc.y2 - alloc.y1,
|
||||||
cogl_framebuffer_draw_rectangles (fb, pipeline,
|
0, 0, 1, 1);
|
||||||
rectangles, n_rects);
|
|
||||||
cogl_object_unref (pipeline);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -552,6 +365,14 @@ meta_shaped_texture_get_paint_volume (ClutterActor *self,
|
|||||||
return clutter_paint_volume_set_from_allocation (volume, self);
|
return clutter_paint_volume_set_from_allocation (volume, self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ClutterActor *
|
||||||
|
meta_shaped_texture_new (void)
|
||||||
|
{
|
||||||
|
ClutterActor *self = g_object_new (META_TYPE_SHAPED_TEXTURE, NULL);
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
||||||
gboolean create_mipmaps)
|
gboolean create_mipmaps)
|
||||||
@@ -568,7 +389,8 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
|
|||||||
{
|
{
|
||||||
CoglTexture *base_texture;
|
CoglTexture *base_texture;
|
||||||
priv->create_mipmaps = create_mipmaps;
|
priv->create_mipmaps = create_mipmaps;
|
||||||
base_texture = create_mipmaps ? priv->texture : NULL;
|
base_texture = create_mipmaps ?
|
||||||
|
COGL_TEXTURE (priv->texture) : NULL;
|
||||||
meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
|
meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -594,137 +416,108 @@ meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
|
|||||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
void
|
||||||
get_clip (MetaShapedTexture *stex,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height,
|
|
||||||
cairo_rectangle_int_t *clip)
|
|
||||||
{
|
|
||||||
ClutterActor *self = CLUTTER_ACTOR (stex);
|
|
||||||
MetaShapedTexturePrivate *priv;
|
|
||||||
ClutterActorBox allocation;
|
|
||||||
float scale_x;
|
|
||||||
float scale_y;
|
|
||||||
|
|
||||||
/* NB: clutter_actor_queue_redraw_with_clip expects a box in the actor's
|
|
||||||
* coordinate space so we need to convert from surface coordinates to
|
|
||||||
* actor coordinates...
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Calling clutter_actor_get_allocation_box() is enormously expensive
|
|
||||||
* if the actor has an out-of-date allocation, since it triggers
|
|
||||||
* a full redraw. clutter_actor_queue_redraw_with_clip() would redraw
|
|
||||||
* the whole stage anyways in that case, so just go ahead and do
|
|
||||||
* it here.
|
|
||||||
*/
|
|
||||||
if (!clutter_actor_has_allocation (self))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
priv = stex->priv;
|
|
||||||
|
|
||||||
if (priv->tex_width == 0 || priv->tex_height == 0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
clutter_actor_get_allocation_box (self, &allocation);
|
|
||||||
|
|
||||||
scale_x = (allocation.x2 - allocation.x1) / priv->tex_width;
|
|
||||||
scale_y = (allocation.y2 - allocation.y1) / priv->tex_height;
|
|
||||||
|
|
||||||
clip->x = x * scale_x;
|
|
||||||
clip->y = y * scale_y;
|
|
||||||
clip->width = width * scale_x;
|
|
||||||
clip->height = height * scale_y;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_shaped_texture_update_area:
|
|
||||||
* @stex: #MetaShapedTexture
|
|
||||||
* @x: the x coordinate of the damaged area
|
|
||||||
* @y: the y coordinate of the damaged area
|
|
||||||
* @width: the width of the damaged area
|
|
||||||
* @height: the height of the damaged area
|
|
||||||
* @unobscured_region: The unobscured region of the window or %NULL if
|
|
||||||
* there is no valid one (like when the actor is transformed or
|
|
||||||
* has a mapped clone)
|
|
||||||
*
|
|
||||||
* Repairs the damaged area indicated by @x, @y, @width and @height
|
|
||||||
* and queues a redraw for the intersection @unobscured_region and
|
|
||||||
* the damage area. If @unobscured_region is %NULL a redraw will always
|
|
||||||
* get queued.
|
|
||||||
*
|
|
||||||
* Return value: Whether a redraw have been queued or not
|
|
||||||
*/
|
|
||||||
gboolean
|
|
||||||
meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
meta_shaped_texture_update_area (MetaShapedTexture *stex,
|
||||||
int x,
|
int x,
|
||||||
int y,
|
int y,
|
||||||
int width,
|
int width,
|
||||||
int height,
|
int height)
|
||||||
cairo_region_t *unobscured_region)
|
|
||||||
{
|
{
|
||||||
MetaShapedTexturePrivate *priv;
|
MetaShapedTexturePrivate *priv;
|
||||||
cairo_rectangle_int_t clip;
|
const cairo_rectangle_int_t clip = { x, y, width, height };
|
||||||
gboolean has_clip;
|
|
||||||
|
|
||||||
priv = stex->priv;
|
priv = stex->priv;
|
||||||
|
|
||||||
if (priv->texture == NULL)
|
if (priv->texture == NULL)
|
||||||
return FALSE;
|
return;
|
||||||
|
|
||||||
|
cogl_texture_pixmap_x11_update_area (priv->texture,
|
||||||
|
x, y, width, height);
|
||||||
|
|
||||||
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
|
||||||
|
|
||||||
has_clip = get_clip (stex, x, y, width, height, &clip);
|
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
|
||||||
|
}
|
||||||
|
|
||||||
if (unobscured_region)
|
static void
|
||||||
|
set_cogl_texture (MetaShapedTexture *stex,
|
||||||
|
CoglTexturePixmapX11 *cogl_tex)
|
||||||
|
{
|
||||||
|
MetaShapedTexturePrivate *priv;
|
||||||
|
guint width, height;
|
||||||
|
|
||||||
|
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||||
|
|
||||||
|
priv = stex->priv;
|
||||||
|
|
||||||
|
if (priv->texture != NULL)
|
||||||
|
cogl_object_unref (priv->texture);
|
||||||
|
|
||||||
|
priv->texture = cogl_tex;
|
||||||
|
|
||||||
|
if (priv->pipeline != NULL)
|
||||||
|
cogl_pipeline_set_layer_texture (priv->pipeline, 0, COGL_TEXTURE (cogl_tex));
|
||||||
|
|
||||||
|
if (priv->pipeline_unshaped != NULL)
|
||||||
|
cogl_pipeline_set_layer_texture (priv->pipeline_unshaped, 0, COGL_TEXTURE (cogl_tex));
|
||||||
|
|
||||||
|
if (cogl_tex != NULL)
|
||||||
{
|
{
|
||||||
cairo_region_t *intersection;
|
width = cogl_texture_get_width (COGL_TEXTURE (cogl_tex));
|
||||||
|
height = cogl_texture_get_height (COGL_TEXTURE (cogl_tex));
|
||||||
|
|
||||||
if (cairo_region_is_empty (unobscured_region))
|
if (width != priv->tex_width ||
|
||||||
return FALSE;
|
height != priv->tex_height)
|
||||||
|
|
||||||
intersection = cairo_region_copy (unobscured_region);
|
|
||||||
if (has_clip)
|
|
||||||
cairo_region_intersect_rectangle (intersection, &clip);
|
|
||||||
|
|
||||||
if (!cairo_region_is_empty (intersection))
|
|
||||||
{
|
{
|
||||||
cairo_rectangle_int_t damage_rect;
|
priv->tex_width = width;
|
||||||
cairo_region_get_extents (intersection, &damage_rect);
|
priv->tex_height = height;
|
||||||
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &damage_rect);
|
|
||||||
cairo_region_destroy (intersection);
|
|
||||||
|
|
||||||
return TRUE;
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
cairo_region_destroy (intersection);
|
else
|
||||||
|
{
|
||||||
return FALSE;
|
/* size changed to 0 going to an inavlid texture */
|
||||||
|
priv->tex_width = 0;
|
||||||
|
priv->tex_height = 0;
|
||||||
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (has_clip)
|
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
||||||
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
|
|
||||||
else
|
|
||||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_shaped_texture_set_texture:
|
* meta_shaped_texture_set_pixmap:
|
||||||
* @stex: The #MetaShapedTexture
|
* @stex: The #MetaShapedTexture
|
||||||
* @pixmap: The #CoglTexture to display
|
* @pixmap: The pixmap you want the stex to assume
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
meta_shaped_texture_set_texture (MetaShapedTexture *stex,
|
meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
|
||||||
CoglTexture *texture)
|
Pixmap pixmap)
|
||||||
{
|
{
|
||||||
|
MetaShapedTexturePrivate *priv;
|
||||||
|
|
||||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
||||||
|
|
||||||
set_cogl_texture (stex, texture);
|
priv = stex->priv;
|
||||||
|
|
||||||
|
if (priv->pixmap == pixmap)
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->pixmap = pixmap;
|
||||||
|
|
||||||
|
if (pixmap != None)
|
||||||
|
{
|
||||||
|
CoglContext *ctx =
|
||||||
|
clutter_backend_get_cogl_context (clutter_get_default_backend ());
|
||||||
|
set_cogl_texture (stex, cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
set_cogl_texture (stex, NULL);
|
||||||
|
|
||||||
|
if (priv->create_mipmaps)
|
||||||
|
meta_texture_tower_set_base_texture (priv->paint_tower,
|
||||||
|
COGL_TEXTURE (priv->texture));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -741,18 +534,22 @@ meta_shaped_texture_get_texture (MetaShapedTexture *stex)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* meta_shaped_texture_set_input_shape_region:
|
* meta_shaped_texture_set_clip_region:
|
||||||
* @stex: a #MetaShapedTexture
|
* @stex: a #MetaShapedTexture
|
||||||
* @shape_region: the region of the texture that should respond to
|
* @clip_region: (transfer full): the region of the texture that
|
||||||
* input.
|
* is visible and should be painted.
|
||||||
*
|
*
|
||||||
* Determines what region of the texture should accept input. For
|
* Provides a hint to the texture about what areas of the texture
|
||||||
* X based windows this is defined by the ShapeInput region of the
|
* are not completely obscured and thus need to be painted. This
|
||||||
* window.
|
* is an optimization and is not supposed to have any effect on
|
||||||
|
* the output.
|
||||||
|
*
|
||||||
|
* Typically a parent container will set the clip region before
|
||||||
|
* painting its children, and then unset it afterwards.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
meta_shaped_texture_set_input_shape_region (MetaShapedTexture *stex,
|
meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
|
||||||
cairo_region_t *shape_region)
|
cairo_region_t *clip_region)
|
||||||
{
|
{
|
||||||
MetaShapedTexturePrivate *priv;
|
MetaShapedTexturePrivate *priv;
|
||||||
|
|
||||||
@@ -760,49 +557,16 @@ meta_shaped_texture_set_input_shape_region (MetaShapedTexture *stex,
|
|||||||
|
|
||||||
priv = stex->priv;
|
priv = stex->priv;
|
||||||
|
|
||||||
if (priv->input_shape_region != NULL)
|
if (priv->clip_region)
|
||||||
{
|
{
|
||||||
cairo_region_destroy (priv->input_shape_region);
|
cairo_region_destroy (priv->clip_region);
|
||||||
priv->input_shape_region = NULL;
|
priv->clip_region = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shape_region != NULL)
|
if (clip_region)
|
||||||
{
|
priv->clip_region = cairo_region_copy (clip_region);
|
||||||
cairo_region_reference (shape_region);
|
|
||||||
priv->input_shape_region = shape_region;
|
|
||||||
}
|
|
||||||
|
|
||||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* meta_shaped_texture_set_opaque_region:
|
|
||||||
* @stex: a #MetaShapedTexture
|
|
||||||
* @opaque_region: (transfer full): the region of the texture that
|
|
||||||
* can have blending turned off.
|
|
||||||
*
|
|
||||||
* As most windows have a large portion that does not require blending,
|
|
||||||
* we can easily turn off blending if we know the areas that do not
|
|
||||||
* require blending. This sets the region where we will not blend for
|
|
||||||
* optimization purposes.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
meta_shaped_texture_set_opaque_region (MetaShapedTexture *stex,
|
|
||||||
cairo_region_t *opaque_region)
|
|
||||||
{
|
|
||||||
MetaShapedTexturePrivate *priv;
|
|
||||||
|
|
||||||
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
|
|
||||||
|
|
||||||
priv = stex->priv;
|
|
||||||
|
|
||||||
if (priv->opaque_region)
|
|
||||||
cairo_region_destroy (priv->opaque_region);
|
|
||||||
|
|
||||||
if (opaque_region)
|
|
||||||
priv->opaque_region = cairo_region_reference (opaque_region);
|
|
||||||
else
|
else
|
||||||
priv->opaque_region = NULL;
|
priv->clip_region = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -902,43 +666,3 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex,
|
|||||||
|
|
||||||
return surface;
|
return surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_shaped_texture_cull_out (MetaCullable *cullable,
|
|
||||||
cairo_region_t *unobscured_region,
|
|
||||||
cairo_region_t *clip_region)
|
|
||||||
{
|
|
||||||
MetaShapedTexture *self = META_SHAPED_TEXTURE (cullable);
|
|
||||||
MetaShapedTexturePrivate *priv = self->priv;
|
|
||||||
|
|
||||||
set_clip_region (self, clip_region);
|
|
||||||
|
|
||||||
if (clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self)) == 0xff)
|
|
||||||
{
|
|
||||||
if (priv->opaque_region)
|
|
||||||
{
|
|
||||||
cairo_region_subtract (unobscured_region, priv->opaque_region);
|
|
||||||
cairo_region_subtract (clip_region, priv->opaque_region);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_shaped_texture_reset_culling (MetaCullable *cullable)
|
|
||||||
{
|
|
||||||
MetaShapedTexture *self = META_SHAPED_TEXTURE (cullable);
|
|
||||||
set_clip_region (self, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
cullable_iface_init (MetaCullableInterface *iface)
|
|
||||||
{
|
|
||||||
iface->cull_out = meta_shaped_texture_cull_out;
|
|
||||||
iface->reset_culling = meta_shaped_texture_reset_culling;
|
|
||||||
}
|
|
||||||
|
|
||||||
ClutterActor *
|
|
||||||
meta_shaped_texture_new (void)
|
|
||||||
{
|
|
||||||
return g_object_new (META_TYPE_SHAPED_TEXTURE, NULL);
|
|
||||||
}
|
|
||||||
|
@@ -1,183 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SECTION:meta-surface-actor
|
|
||||||
* @title: MetaSurfaceActor
|
|
||||||
* @short_description: An actor representing a surface in the scene graph
|
|
||||||
*
|
|
||||||
* A surface can be either a shaped texture, or a group of shaped texture,
|
|
||||||
* used to draw the content of a window.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <clutter/clutter.h>
|
|
||||||
#include <cogl/cogl-wayland-server.h>
|
|
||||||
#include <cogl/cogl-texture-pixmap-x11.h>
|
|
||||||
#include <meta/meta-shaped-texture.h>
|
|
||||||
#include "meta-surface-actor.h"
|
|
||||||
#include "meta-wayland-private.h"
|
|
||||||
#include "meta-cullable.h"
|
|
||||||
|
|
||||||
#include "meta-shaped-texture-private.h"
|
|
||||||
|
|
||||||
struct _MetaSurfaceActorPrivate
|
|
||||||
{
|
|
||||||
MetaShapedTexture *texture;
|
|
||||||
MetaWaylandBuffer *buffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void cullable_iface_init (MetaCullableInterface *iface);
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (MetaSurfaceActor, meta_surface_actor, CLUTTER_TYPE_ACTOR,
|
|
||||||
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_surface_actor_class_init (MetaSurfaceActorClass *klass)
|
|
||||||
{
|
|
||||||
g_type_class_add_private (klass, sizeof (MetaSurfaceActorPrivate));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_surface_actor_cull_out (MetaCullable *cullable,
|
|
||||||
cairo_region_t *unobscured_region,
|
|
||||||
cairo_region_t *clip_region)
|
|
||||||
{
|
|
||||||
meta_cullable_cull_out_children (cullable, unobscured_region, clip_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_surface_actor_reset_culling (MetaCullable *cullable)
|
|
||||||
{
|
|
||||||
meta_cullable_reset_culling_children (cullable);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
cullable_iface_init (MetaCullableInterface *iface)
|
|
||||||
{
|
|
||||||
iface->cull_out = meta_surface_actor_cull_out;
|
|
||||||
iface->reset_culling = meta_surface_actor_reset_culling;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_surface_actor_init (MetaSurfaceActor *self)
|
|
||||||
{
|
|
||||||
MetaSurfaceActorPrivate *priv;
|
|
||||||
|
|
||||||
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
|
|
||||||
META_TYPE_SURFACE_ACTOR,
|
|
||||||
MetaSurfaceActorPrivate);
|
|
||||||
|
|
||||||
priv->texture = META_SHAPED_TEXTURE (meta_shaped_texture_new ());
|
|
||||||
clutter_actor_add_child (CLUTTER_ACTOR (self), CLUTTER_ACTOR (priv->texture));
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_surface_t *
|
|
||||||
meta_surface_actor_get_image (MetaSurfaceActor *self,
|
|
||||||
cairo_rectangle_int_t *clip)
|
|
||||||
{
|
|
||||||
return meta_shaped_texture_get_image (self->priv->texture, clip);
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaShapedTexture *
|
|
||||||
meta_surface_actor_get_texture (MetaSurfaceActor *self)
|
|
||||||
{
|
|
||||||
return self->priv->texture;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_area (MetaSurfaceActor *self,
|
|
||||||
int x, int y, int width, int height)
|
|
||||||
{
|
|
||||||
MetaSurfaceActorPrivate *priv = self->priv;
|
|
||||||
|
|
||||||
if (meta_is_wayland_compositor ())
|
|
||||||
{
|
|
||||||
struct wl_resource *resource = priv->buffer->resource;
|
|
||||||
struct wl_shm_buffer *shm_buffer = wl_shm_buffer_get (resource);
|
|
||||||
|
|
||||||
if (shm_buffer)
|
|
||||||
{
|
|
||||||
CoglTexture2D *texture = COGL_TEXTURE_2D (priv->buffer->texture);
|
|
||||||
cogl_wayland_texture_set_region_from_shm_buffer (texture, x, y, width, height, shm_buffer, x, y, 0, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CoglTexturePixmapX11 *texture = COGL_TEXTURE_PIXMAP_X11 (meta_shaped_texture_get_texture (priv->texture));
|
|
||||||
cogl_texture_pixmap_x11_update_area (texture, x, y, width, height);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_surface_actor_damage_all (MetaSurfaceActor *self,
|
|
||||||
cairo_region_t *unobscured_region)
|
|
||||||
{
|
|
||||||
MetaSurfaceActorPrivate *priv = self->priv;
|
|
||||||
CoglTexture *texture = meta_shaped_texture_get_texture (priv->texture);
|
|
||||||
|
|
||||||
update_area (self, 0, 0, cogl_texture_get_width (texture), cogl_texture_get_height (texture));
|
|
||||||
return meta_shaped_texture_update_area (priv->texture,
|
|
||||||
0, 0,
|
|
||||||
cogl_texture_get_width (texture),
|
|
||||||
cogl_texture_get_height (texture),
|
|
||||||
unobscured_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_surface_actor_damage_area (MetaSurfaceActor *self,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height,
|
|
||||||
cairo_region_t *unobscured_region)
|
|
||||||
{
|
|
||||||
MetaSurfaceActorPrivate *priv = self->priv;
|
|
||||||
|
|
||||||
update_area (self, x, y, width, height);
|
|
||||||
return meta_shaped_texture_update_area (priv->texture,
|
|
||||||
x, y, width, height,
|
|
||||||
unobscured_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_surface_actor_attach_wayland_buffer (MetaSurfaceActor *self,
|
|
||||||
MetaWaylandBuffer *buffer)
|
|
||||||
{
|
|
||||||
MetaSurfaceActorPrivate *priv = self->priv;
|
|
||||||
priv->buffer = buffer;
|
|
||||||
|
|
||||||
if (buffer)
|
|
||||||
meta_shaped_texture_set_texture (priv->texture, buffer->texture);
|
|
||||||
else
|
|
||||||
meta_shaped_texture_set_texture (priv->texture, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_surface_actor_set_texture (MetaSurfaceActor *self,
|
|
||||||
CoglTexture *texture)
|
|
||||||
{
|
|
||||||
MetaSurfaceActorPrivate *priv = self->priv;
|
|
||||||
meta_shaped_texture_set_texture (priv->texture, texture);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_surface_actor_set_input_region (MetaSurfaceActor *self,
|
|
||||||
cairo_region_t *region)
|
|
||||||
{
|
|
||||||
MetaSurfaceActorPrivate *priv = self->priv;
|
|
||||||
meta_shaped_texture_set_input_shape_region (priv->texture, region);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_surface_actor_set_opaque_region (MetaSurfaceActor *self,
|
|
||||||
cairo_region_t *region)
|
|
||||||
{
|
|
||||||
MetaSurfaceActorPrivate *priv = self->priv;
|
|
||||||
meta_shaped_texture_set_opaque_region (priv->texture, region);
|
|
||||||
}
|
|
||||||
|
|
||||||
MetaSurfaceActor *
|
|
||||||
meta_surface_actor_new (void)
|
|
||||||
{
|
|
||||||
return g_object_new (META_TYPE_SURFACE_ACTOR, NULL);
|
|
||||||
}
|
|
@@ -1,67 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
#ifndef META_SURFACE_ACTOR_PRIVATE_H
|
|
||||||
#define META_SURFACE_ACTOR_PRIVATE_H
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <meta/meta-shaped-texture.h>
|
|
||||||
#include "meta-wayland-types.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define META_TYPE_SURFACE_ACTOR (meta_surface_actor_get_type())
|
|
||||||
#define META_SURFACE_ACTOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_SURFACE_ACTOR, MetaSurfaceActor))
|
|
||||||
#define META_SURFACE_ACTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_SURFACE_ACTOR, MetaSurfaceActorClass))
|
|
||||||
#define META_IS_SURFACE_ACTOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_SURFACE_ACTOR))
|
|
||||||
#define META_IS_SURFACE_ACTOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_SURFACE_ACTOR))
|
|
||||||
#define META_SURFACE_ACTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_SURFACE_ACTOR, MetaSurfaceActorClass))
|
|
||||||
|
|
||||||
typedef struct _MetaSurfaceActor MetaSurfaceActor;
|
|
||||||
typedef struct _MetaSurfaceActorClass MetaSurfaceActorClass;
|
|
||||||
typedef struct _MetaSurfaceActorPrivate MetaSurfaceActorPrivate;
|
|
||||||
|
|
||||||
struct _MetaSurfaceActorClass
|
|
||||||
{
|
|
||||||
/*< private >*/
|
|
||||||
ClutterActorClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _MetaSurfaceActor
|
|
||||||
{
|
|
||||||
ClutterActor parent;
|
|
||||||
|
|
||||||
MetaSurfaceActorPrivate *priv;
|
|
||||||
};
|
|
||||||
|
|
||||||
GType meta_surface_actor_get_type (void);
|
|
||||||
|
|
||||||
MetaSurfaceActor *meta_surface_actor_new (void);
|
|
||||||
|
|
||||||
cairo_surface_t *meta_surface_actor_get_image (MetaSurfaceActor *self,
|
|
||||||
cairo_rectangle_int_t *clip);
|
|
||||||
|
|
||||||
MetaShapedTexture *meta_surface_actor_get_texture (MetaSurfaceActor *self);
|
|
||||||
|
|
||||||
gboolean meta_surface_actor_damage_all (MetaSurfaceActor *self,
|
|
||||||
cairo_region_t *unobscured_region);
|
|
||||||
|
|
||||||
gboolean meta_surface_actor_damage_area (MetaSurfaceActor *self,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height,
|
|
||||||
cairo_region_t *unobscured_region);
|
|
||||||
|
|
||||||
void meta_surface_actor_set_texture (MetaSurfaceActor *self,
|
|
||||||
CoglTexture *texture);
|
|
||||||
void meta_surface_actor_attach_wayland_buffer (MetaSurfaceActor *self,
|
|
||||||
MetaWaylandBuffer *buffer);
|
|
||||||
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);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* META_SURFACE_ACTOR_PRIVATE_H */
|
|
@@ -18,7 +18,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -26,6 +28,41 @@
|
|||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include "meta-texture-rectangle.h"
|
#include "meta-texture-rectangle.h"
|
||||||
|
|
||||||
|
CoglTexture *
|
||||||
|
meta_texture_rectangle_new (unsigned int width,
|
||||||
|
unsigned int height,
|
||||||
|
CoglPixelFormat format,
|
||||||
|
CoglPixelFormat internal_format,
|
||||||
|
unsigned int rowstride,
|
||||||
|
const guint8 *data,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
ClutterBackend *backend =
|
||||||
|
clutter_get_default_backend ();
|
||||||
|
CoglContext *context =
|
||||||
|
clutter_backend_get_cogl_context (backend);
|
||||||
|
CoglTextureRectangle *tex_rect;
|
||||||
|
|
||||||
|
tex_rect = cogl_texture_rectangle_new_with_size (context,
|
||||||
|
width, height,
|
||||||
|
internal_format,
|
||||||
|
error);
|
||||||
|
if (tex_rect == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (data)
|
||||||
|
cogl_texture_set_region (COGL_TEXTURE (tex_rect),
|
||||||
|
0, 0, /* src_x/y */
|
||||||
|
0, 0, /* dst_x/y */
|
||||||
|
width, height, /* dst_width/height */
|
||||||
|
width, height, /* width/height */
|
||||||
|
format,
|
||||||
|
rowstride,
|
||||||
|
data);
|
||||||
|
|
||||||
|
return COGL_TEXTURE (tex_rect);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
texture_rectangle_check_cb (CoglTexture *sub_texture,
|
texture_rectangle_check_cb (CoglTexture *sub_texture,
|
||||||
const float *sub_texture_coords,
|
const float *sub_texture_coords,
|
||||||
|
@@ -18,7 +18,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_TEXTURE_RECTANGLE_H__
|
#ifndef __META_TEXTURE_RECTANGLE_H__
|
||||||
@@ -28,6 +30,15 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
CoglTexture *
|
||||||
|
meta_texture_rectangle_new (unsigned int width,
|
||||||
|
unsigned int height,
|
||||||
|
CoglPixelFormat format,
|
||||||
|
CoglPixelFormat internal_format,
|
||||||
|
unsigned int rowstride,
|
||||||
|
const guint8 *data,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_texture_rectangle_check (CoglTexture *texture);
|
meta_texture_rectangle_check (CoglTexture *texture);
|
||||||
|
|
||||||
|
@@ -17,7 +17,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
@@ -355,10 +357,18 @@ texture_tower_create_texture (MetaTextureTower *tower,
|
|||||||
if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
|
if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
|
||||||
meta_texture_rectangle_check (tower->textures[level - 1]))
|
meta_texture_rectangle_check (tower->textures[level - 1]))
|
||||||
{
|
{
|
||||||
ClutterBackend *backend = clutter_get_default_backend ();
|
tower->textures[level] =
|
||||||
CoglContext *context = clutter_backend_get_cogl_context (backend);
|
meta_texture_rectangle_new (width, height,
|
||||||
|
/* data format */
|
||||||
tower->textures[level] = cogl_texture_rectangle_new_with_size (context, width, height);
|
TEXTURE_FORMAT,
|
||||||
|
/* internal cogl format */
|
||||||
|
TEXTURE_FORMAT,
|
||||||
|
/* rowstride */
|
||||||
|
width * 4,
|
||||||
|
/* data */
|
||||||
|
NULL,
|
||||||
|
/* error */
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@@ -17,7 +17,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_TEXTURE_TOWER_H__
|
#ifndef __META_TEXTURE_TOWER_H__
|
||||||
|
@@ -5,12 +5,8 @@
|
|||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include <wayland-server.h>
|
|
||||||
#include <meta-wayland-private.h>
|
|
||||||
|
|
||||||
#include <X11/extensions/Xdamage.h>
|
#include <X11/extensions/Xdamage.h>
|
||||||
#include <meta/compositor-mutter.h>
|
#include <meta/compositor-mutter.h>
|
||||||
#include "meta-surface-actor.h"
|
|
||||||
|
|
||||||
MetaWindowActor *meta_window_actor_new (MetaWindow *window);
|
MetaWindowActor *meta_window_actor_new (MetaWindow *window);
|
||||||
|
|
||||||
@@ -28,8 +24,8 @@ void meta_window_actor_unmaximize (MetaWindowActor *self,
|
|||||||
MetaRectangle *old_rect,
|
MetaRectangle *old_rect,
|
||||||
MetaRectangle *new_rect);
|
MetaRectangle *new_rect);
|
||||||
|
|
||||||
void meta_window_actor_process_x11_damage (MetaWindowActor *self,
|
void meta_window_actor_process_damage (MetaWindowActor *self,
|
||||||
XDamageNotifyEvent *event);
|
XDamageNotifyEvent *event);
|
||||||
|
|
||||||
void meta_window_actor_pre_paint (MetaWindowActor *self);
|
void meta_window_actor_pre_paint (MetaWindowActor *self);
|
||||||
void meta_window_actor_post_paint (MetaWindowActor *self);
|
void meta_window_actor_post_paint (MetaWindowActor *self);
|
||||||
@@ -59,12 +55,15 @@ void meta_window_actor_set_updates_frozen (MetaWindowActor *self,
|
|||||||
void meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
|
void meta_window_actor_queue_frame_drawn (MetaWindowActor *self,
|
||||||
gboolean no_delay_frame);
|
gboolean no_delay_frame);
|
||||||
|
|
||||||
void meta_window_actor_set_unobscured_region (MetaWindowActor *self,
|
cairo_region_t *meta_window_actor_get_obscured_region (MetaWindowActor *self);
|
||||||
cairo_region_t *unobscured_region);
|
|
||||||
|
void meta_window_actor_set_visible_region (MetaWindowActor *self,
|
||||||
|
cairo_region_t *visible_region);
|
||||||
|
void meta_window_actor_set_visible_region_beneath (MetaWindowActor *self,
|
||||||
|
cairo_region_t *beneath_region);
|
||||||
|
void meta_window_actor_reset_visible_regions (MetaWindowActor *self);
|
||||||
|
|
||||||
void meta_window_actor_effect_completed (MetaWindowActor *actor,
|
void meta_window_actor_effect_completed (MetaWindowActor *actor,
|
||||||
gulong event);
|
gulong event);
|
||||||
|
|
||||||
MetaSurfaceActor *meta_window_actor_get_surface (MetaWindowActor *self);
|
|
||||||
|
|
||||||
#endif /* META_WINDOW_ACTOR_PRIVATE_H */
|
#endif /* META_WINDOW_ACTOR_PRIVATE_H */
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -11,8 +11,8 @@
|
|||||||
#include "compositor-private.h"
|
#include "compositor-private.h"
|
||||||
#include "meta-window-actor-private.h"
|
#include "meta-window-actor-private.h"
|
||||||
#include "meta-window-group.h"
|
#include "meta-window-group.h"
|
||||||
#include "window-private.h"
|
#include "meta-background-actor-private.h"
|
||||||
#include "meta-cullable.h"
|
#include "meta-background-group-private.h"
|
||||||
|
|
||||||
struct _MetaWindowGroupClass
|
struct _MetaWindowGroupClass
|
||||||
{
|
{
|
||||||
@@ -26,10 +26,7 @@ struct _MetaWindowGroup
|
|||||||
MetaScreen *screen;
|
MetaScreen *screen;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void cullable_iface_init (MetaCullableInterface *iface);
|
G_DEFINE_TYPE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_ACTOR);
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_CODE (MetaWindowGroup, meta_window_group, CLUTTER_TYPE_ACTOR,
|
|
||||||
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
|
||||||
|
|
||||||
/* Help macros to scale from OpenGL <-1,1> coordinates system to
|
/* Help macros to scale from OpenGL <-1,1> coordinates system to
|
||||||
* window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
|
* window coordinates ranging [0,window-size]. Borrowed from clutter-utils.c
|
||||||
@@ -89,53 +86,19 @@ painting_untransformed (MetaWindowGroup *window_group,
|
|||||||
return meta_actor_vertices_are_untransformed (vertices, width, height, x_origin, y_origin);
|
return meta_actor_vertices_are_untransformed (vertices, width, height, x_origin, y_origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
meta_window_group_cull_out (MetaCullable *cullable,
|
|
||||||
cairo_region_t *unobscured_region,
|
|
||||||
cairo_region_t *clip_region)
|
|
||||||
{
|
|
||||||
meta_cullable_cull_out_children (cullable, unobscured_region, clip_region);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_window_group_reset_culling (MetaCullable *cullable)
|
|
||||||
{
|
|
||||||
meta_cullable_reset_culling_children (cullable);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
cullable_iface_init (MetaCullableInterface *iface)
|
|
||||||
{
|
|
||||||
iface->cull_out = meta_window_group_cull_out;
|
|
||||||
iface->reset_culling = meta_window_group_reset_culling;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_window_group_paint (ClutterActor *actor)
|
meta_window_group_paint (ClutterActor *actor)
|
||||||
{
|
{
|
||||||
cairo_region_t *clip_region;
|
cairo_region_t *visible_region;
|
||||||
cairo_region_t *unobscured_region;
|
ClutterActor *stage;
|
||||||
ClutterActorIter iter;
|
cairo_rectangle_int_t visible_rect;
|
||||||
ClutterActor *child;
|
GList *children, *l;
|
||||||
cairo_rectangle_int_t visible_rect, clip_rect;
|
|
||||||
int paint_x_offset, paint_y_offset;
|
|
||||||
int paint_x_origin, paint_y_origin;
|
int paint_x_origin, paint_y_origin;
|
||||||
int actor_x_origin, actor_y_origin;
|
int actor_x_origin, actor_y_origin;
|
||||||
|
int paint_x_offset, paint_y_offset;
|
||||||
|
|
||||||
MetaWindowGroup *window_group = META_WINDOW_GROUP (actor);
|
MetaWindowGroup *window_group = META_WINDOW_GROUP (actor);
|
||||||
ClutterActor *stage = clutter_actor_get_stage (actor);
|
MetaCompScreen *info = meta_screen_get_compositor_data (window_group->screen);
|
||||||
|
|
||||||
/* Start off by treating all windows as completely unobscured, so damage anywhere
|
|
||||||
* in a window queues redraws, but confine it more below. */
|
|
||||||
clutter_actor_iter_init (&iter, actor);
|
|
||||||
while (clutter_actor_iter_next (&iter, &child))
|
|
||||||
{
|
|
||||||
if (META_IS_WINDOW_ACTOR (child))
|
|
||||||
{
|
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
|
|
||||||
meta_window_actor_set_unobscured_region (window_actor, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Normally we expect an actor to be drawn at it's position on the screen.
|
/* Normally we expect an actor to be drawn at it's position on the screen.
|
||||||
* However, if we're inside the paint of a ClutterClone, that won't be the
|
* However, if we're inside the paint of a ClutterClone, that won't be the
|
||||||
@@ -157,11 +120,15 @@ meta_window_group_paint (ClutterActor *actor)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
visible_rect.x = visible_rect.y = 0;
|
paint_x_offset = paint_x_origin - actor_x_origin;
|
||||||
visible_rect.width = clutter_actor_get_width (CLUTTER_ACTOR (stage));
|
paint_y_offset = paint_y_origin - actor_y_origin;
|
||||||
visible_rect.height = clutter_actor_get_height (CLUTTER_ACTOR (stage));
|
|
||||||
|
|
||||||
unobscured_region = cairo_region_create_rectangle (&visible_rect);
|
/* We walk the list from top to bottom (opposite of painting order),
|
||||||
|
* and subtract the opaque area of each window out of the visible
|
||||||
|
* region that we pass to the windows below.
|
||||||
|
*/
|
||||||
|
children = clutter_actor_get_children (actor);
|
||||||
|
children = g_list_reverse (children);
|
||||||
|
|
||||||
/* Get the clipped redraw bounds from Clutter so that we can avoid
|
/* Get the clipped redraw bounds from Clutter so that we can avoid
|
||||||
* painting shadows on windows that don't need to be painted in this
|
* painting shadows on windows that don't need to be painted in this
|
||||||
@@ -169,63 +136,125 @@ meta_window_group_paint (ClutterActor *actor)
|
|||||||
* sizes, we could intersect this with an accurate union of the
|
* sizes, we could intersect this with an accurate union of the
|
||||||
* monitors to avoid painting shadows that are visible only in the
|
* monitors to avoid painting shadows that are visible only in the
|
||||||
* holes. */
|
* holes. */
|
||||||
|
stage = clutter_actor_get_stage (actor);
|
||||||
clutter_stage_get_redraw_clip_bounds (CLUTTER_STAGE (stage),
|
clutter_stage_get_redraw_clip_bounds (CLUTTER_STAGE (stage),
|
||||||
&clip_rect);
|
&visible_rect);
|
||||||
|
|
||||||
clip_region = cairo_region_create_rectangle (&clip_rect);
|
visible_region = cairo_region_create_rectangle (&visible_rect);
|
||||||
|
|
||||||
paint_x_offset = paint_x_origin - actor_x_origin;
|
if (info->unredirected_window != NULL)
|
||||||
paint_y_offset = paint_y_origin - actor_y_origin;
|
|
||||||
cairo_region_translate (clip_region, -paint_x_offset, -paint_y_offset);
|
|
||||||
|
|
||||||
if (!meta_is_wayland_compositor ())
|
|
||||||
{
|
{
|
||||||
MetaCompScreen *info = meta_screen_get_compositor_data (window_group->screen);
|
cairo_rectangle_int_t unredirected_rect;
|
||||||
if (info->unredirected_window != NULL)
|
MetaWindow *window = meta_window_actor_get_meta_window (info->unredirected_window);
|
||||||
{
|
|
||||||
cairo_rectangle_int_t unredirected_rect;
|
|
||||||
MetaWindow *window = meta_window_actor_get_meta_window (info->unredirected_window);
|
|
||||||
|
|
||||||
meta_window_get_frame_rect (window, (MetaRectangle *)&unredirected_rect);
|
meta_window_get_outer_rect (window, (MetaRectangle *)&unredirected_rect);
|
||||||
cairo_region_subtract_rectangle (unobscured_region, &unredirected_rect);
|
cairo_region_subtract_rectangle (visible_region, &unredirected_rect);
|
||||||
cairo_region_subtract_rectangle (clip_region, &unredirected_rect);
|
}
|
||||||
|
|
||||||
|
for (l = children; l; l = l->next)
|
||||||
|
{
|
||||||
|
if (!CLUTTER_ACTOR_IS_VISIBLE (l->data))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (l->data == info->unredirected_window)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* If an actor has effects applied, then that can change the area
|
||||||
|
* it paints and the opacity, so we no longer can figure out what
|
||||||
|
* portion of the actor is obscured and what portion of the screen
|
||||||
|
* it obscures, so we skip the actor.
|
||||||
|
*
|
||||||
|
* This has a secondary beneficial effect: if a ClutterOffscreenEffect
|
||||||
|
* is applied to an actor, then our clipped redraws interfere with the
|
||||||
|
* caching of the FBO - even if we only need to draw a small portion
|
||||||
|
* of the window right now, ClutterOffscreenEffect may use other portions
|
||||||
|
* of the FBO later. So, skipping actors with effects applied also
|
||||||
|
* prevents these bugs.
|
||||||
|
*
|
||||||
|
* Theoretically, we should check clutter_actor_get_offscreen_redirect()
|
||||||
|
* as well for the same reason, but omitted for simplicity in the
|
||||||
|
* hopes that no-one will do that.
|
||||||
|
*/
|
||||||
|
if (clutter_actor_has_effects (l->data))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (META_IS_WINDOW_ACTOR (l->data))
|
||||||
|
{
|
||||||
|
MetaWindowActor *window_actor = l->data;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (!meta_actor_is_untransformed (CLUTTER_ACTOR (window_actor), &x, &y))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
x += paint_x_offset;
|
||||||
|
y += paint_y_offset;
|
||||||
|
|
||||||
|
/* Temporarily move to the coordinate system of the actor */
|
||||||
|
cairo_region_translate (visible_region, - x, - y);
|
||||||
|
|
||||||
|
meta_window_actor_set_visible_region (window_actor, visible_region);
|
||||||
|
|
||||||
|
if (clutter_actor_get_paint_opacity (CLUTTER_ACTOR (window_actor)) == 0xff)
|
||||||
|
{
|
||||||
|
cairo_region_t *obscured_region = meta_window_actor_get_obscured_region (window_actor);
|
||||||
|
if (obscured_region)
|
||||||
|
cairo_region_subtract (visible_region, obscured_region);
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_window_actor_set_visible_region_beneath (window_actor, visible_region);
|
||||||
|
cairo_region_translate (visible_region, x, y);
|
||||||
|
}
|
||||||
|
else if (META_IS_BACKGROUND_ACTOR (l->data) ||
|
||||||
|
META_IS_BACKGROUND_GROUP (l->data))
|
||||||
|
{
|
||||||
|
ClutterActor *background_actor = l->data;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
if (!meta_actor_is_untransformed (CLUTTER_ACTOR (background_actor), &x, &y))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
x += paint_x_offset;
|
||||||
|
y += paint_y_offset;
|
||||||
|
|
||||||
|
cairo_region_translate (visible_region, - x, - y);
|
||||||
|
|
||||||
|
if (META_IS_BACKGROUND_GROUP (background_actor))
|
||||||
|
meta_background_group_set_visible_region (META_BACKGROUND_GROUP (background_actor), visible_region);
|
||||||
|
else
|
||||||
|
meta_background_actor_set_visible_region (META_BACKGROUND_ACTOR (background_actor), visible_region);
|
||||||
|
cairo_region_translate (visible_region, x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_cullable_cull_out (META_CULLABLE (window_group), unobscured_region, clip_region);
|
cairo_region_destroy (visible_region);
|
||||||
|
|
||||||
cairo_region_destroy (unobscured_region);
|
|
||||||
cairo_region_destroy (clip_region);
|
|
||||||
|
|
||||||
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
|
||||||
|
|
||||||
meta_cullable_reset_culling (META_CULLABLE (window_group));
|
/* Now that we are done painting, unset the visible regions (they will
|
||||||
}
|
* mess up painting clones of our actors)
|
||||||
|
*/
|
||||||
/* Adapted from clutter_actor_update_default_paint_volume() */
|
for (l = children; l; l = l->next)
|
||||||
static gboolean
|
|
||||||
meta_window_group_get_paint_volume (ClutterActor *self,
|
|
||||||
ClutterPaintVolume *volume)
|
|
||||||
{
|
|
||||||
ClutterActorIter iter;
|
|
||||||
ClutterActor *child;
|
|
||||||
|
|
||||||
clutter_actor_iter_init (&iter, self);
|
|
||||||
while (clutter_actor_iter_next (&iter, &child))
|
|
||||||
{
|
{
|
||||||
const ClutterPaintVolume *child_volume;
|
if (META_IS_WINDOW_ACTOR (l->data))
|
||||||
|
{
|
||||||
if (!CLUTTER_ACTOR_IS_MAPPED (child))
|
MetaWindowActor *window_actor = l->data;
|
||||||
continue;
|
meta_window_actor_reset_visible_regions (window_actor);
|
||||||
|
}
|
||||||
child_volume = clutter_actor_get_transformed_paint_volume (child, self);
|
else if (META_IS_BACKGROUND_ACTOR (l->data))
|
||||||
if (child_volume == NULL)
|
{
|
||||||
return FALSE;
|
MetaBackgroundActor *background_actor = l->data;
|
||||||
|
meta_background_actor_set_visible_region (background_actor, NULL);
|
||||||
clutter_paint_volume_union (volume, child_volume);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
g_list_free (children);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_window_group_get_paint_volume (ClutterActor *actor,
|
||||||
|
ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
return clutter_paint_volume_set_from_allocation (volume, actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -11,9 +11,29 @@
|
|||||||
* MetaWindowGroup:
|
* MetaWindowGroup:
|
||||||
*
|
*
|
||||||
* This class is a subclass of ClutterActor with special handling for
|
* This class is a subclass of ClutterActor with special handling for
|
||||||
* #MetaCullable when painting children. It uses code similar to
|
* MetaWindowActor/MetaBackgroundActor/MetaBackgroundGroup when painting
|
||||||
* meta_cullable_cull_out_children(), but also has additional special
|
* children.
|
||||||
* cases for the undirected window, and similar.
|
*
|
||||||
|
* When we are painting a stack of 5-10 maximized windows, the
|
||||||
|
* standard bottom-to-top method of drawing every actor results in a
|
||||||
|
* tremendous amount of overdraw and can easily max out the available
|
||||||
|
* memory bandwidth on a low-end graphics chipset. It's even worse if
|
||||||
|
* window textures are being accessed over the AGP bus.
|
||||||
|
*
|
||||||
|
* The basic technique applied here is to do a pre-pass before painting
|
||||||
|
* where we walk window from top to bottom and compute the visible area
|
||||||
|
* at each step by subtracting out the windows above it. The visible
|
||||||
|
* area is passed to MetaWindowActor which uses it to clip the portion of
|
||||||
|
* the window which drawn and avoid redrawing the shadow if it is completely
|
||||||
|
* obscured.
|
||||||
|
*
|
||||||
|
* A caveat is that this is ineffective if applications are using ARGB
|
||||||
|
* visuals, since we have no way of knowing whether a window obscures
|
||||||
|
* the windows behind it or not. Alternate approaches using the depth
|
||||||
|
* or stencil buffer rather than client side regions might be able to
|
||||||
|
* handle alpha windows, but the combination of glAlphaFunc and stenciling
|
||||||
|
* tends not to be efficient except on newer cards. (And on newer cards
|
||||||
|
* we have lots of memory and bandwidth.)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define META_TYPE_WINDOW_GROUP (meta_window_group_get_type ())
|
#define META_TYPE_WINDOW_GROUP (meta_window_group_get_type ())
|
||||||
|
@@ -17,7 +17,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@@ -17,7 +17,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_WINDOW_SHAPE_H__
|
#ifndef __META_WINDOW_SHAPE_H__
|
||||||
|
@@ -16,17 +16,18 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
|
|
||||||
#include <meta/meta-plugin.h>
|
#include <meta/meta-plugin.h>
|
||||||
#include <meta/window.h>
|
#include <meta/window.h>
|
||||||
#include <meta/meta-background-group.h>
|
|
||||||
#include <meta/meta-background-actor.h>
|
|
||||||
#include <meta/util.h>
|
#include <meta/util.h>
|
||||||
#include <glib/gi18n-lib.h>
|
|
||||||
|
#include <libintl.h>
|
||||||
|
#define _(x) dgettext (GETTEXT_PACKAGE, x)
|
||||||
|
#define N_(x) x
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
#include <gmodule.h>
|
#include <gmodule.h>
|
||||||
@@ -97,8 +98,6 @@ static void kill_window_effects (MetaPlugin *plugin,
|
|||||||
MetaWindowActor *actor);
|
MetaWindowActor *actor);
|
||||||
static void kill_switch_workspace (MetaPlugin *plugin);
|
static void kill_switch_workspace (MetaPlugin *plugin);
|
||||||
|
|
||||||
static void confirm_display_change (MetaPlugin *plugin);
|
|
||||||
|
|
||||||
static const MetaPluginInfo * plugin_info (MetaPlugin *plugin);
|
static const MetaPluginInfo * plugin_info (MetaPlugin *plugin);
|
||||||
|
|
||||||
META_PLUGIN_DECLARE(MetaDefaultPlugin, meta_default_plugin);
|
META_PLUGIN_DECLARE(MetaDefaultPlugin, meta_default_plugin);
|
||||||
@@ -114,8 +113,6 @@ struct _MetaDefaultPluginPrivate
|
|||||||
ClutterActor *desktop1;
|
ClutterActor *desktop1;
|
||||||
ClutterActor *desktop2;
|
ClutterActor *desktop2;
|
||||||
|
|
||||||
ClutterActor *background_group;
|
|
||||||
|
|
||||||
MetaPluginInfo info;
|
MetaPluginInfo info;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -206,7 +203,6 @@ meta_default_plugin_class_init (MetaDefaultPluginClass *klass)
|
|||||||
plugin_class->plugin_info = plugin_info;
|
plugin_class->plugin_info = plugin_info;
|
||||||
plugin_class->kill_window_effects = kill_window_effects;
|
plugin_class->kill_window_effects = kill_window_effects;
|
||||||
plugin_class->kill_switch_workspace = kill_switch_workspace;
|
plugin_class->kill_switch_workspace = kill_switch_workspace;
|
||||||
plugin_class->confirm_display_change = confirm_display_change;
|
|
||||||
|
|
||||||
g_type_class_add_private (gobject_class, sizeof (MetaDefaultPluginPrivate));
|
g_type_class_add_private (gobject_class, sizeof (MetaDefaultPluginPrivate));
|
||||||
}
|
}
|
||||||
@@ -303,58 +299,9 @@ show_stage (MetaPlugin *plugin)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
on_monitors_changed (MetaScreen *screen,
|
|
||||||
MetaPlugin *plugin)
|
|
||||||
{
|
|
||||||
MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin);
|
|
||||||
int i, n;
|
|
||||||
|
|
||||||
clutter_actor_destroy_all_children (self->priv->background_group);
|
|
||||||
|
|
||||||
n = meta_screen_get_n_monitors (screen);
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
MetaRectangle rect;
|
|
||||||
ClutterActor *background;
|
|
||||||
ClutterColor color;
|
|
||||||
|
|
||||||
meta_screen_get_monitor_geometry (screen, i, &rect);
|
|
||||||
|
|
||||||
background = meta_background_actor_new ();
|
|
||||||
|
|
||||||
clutter_actor_set_position (background, rect.x, rect.y);
|
|
||||||
clutter_actor_set_size (background, rect.width, rect.height);
|
|
||||||
|
|
||||||
/* Don't use rand() here, mesa calls srand() internally when
|
|
||||||
parsing the driconf XML, but it's nice if the colors are
|
|
||||||
reproducible.
|
|
||||||
*/
|
|
||||||
clutter_color_init (&color,
|
|
||||||
g_random_int () % 255,
|
|
||||||
g_random_int () % 255,
|
|
||||||
g_random_int () % 255,
|
|
||||||
255);
|
|
||||||
clutter_actor_set_background_color (background, &color);
|
|
||||||
|
|
||||||
clutter_actor_add_child (self->priv->background_group, background);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
start (MetaPlugin *plugin)
|
start (MetaPlugin *plugin)
|
||||||
{
|
{
|
||||||
MetaDefaultPlugin *self = META_DEFAULT_PLUGIN (plugin);
|
|
||||||
MetaScreen *screen = meta_plugin_get_screen (plugin);
|
|
||||||
|
|
||||||
self->priv->background_group = meta_background_group_new ();
|
|
||||||
clutter_actor_insert_child_below (meta_get_window_group_for_screen (screen),
|
|
||||||
self->priv->background_group, NULL);
|
|
||||||
|
|
||||||
g_signal_connect (screen, "monitors-changed",
|
|
||||||
G_CALLBACK (on_monitors_changed), plugin);
|
|
||||||
on_monitors_changed (screen, plugin);
|
|
||||||
|
|
||||||
meta_later_add (META_LATER_BEFORE_REDRAW,
|
meta_later_add (META_LATER_BEFORE_REDRAW,
|
||||||
(GSourceFunc) show_stage,
|
(GSourceFunc) show_stage,
|
||||||
plugin,
|
plugin,
|
||||||
@@ -835,33 +782,3 @@ plugin_info (MetaPlugin *plugin)
|
|||||||
|
|
||||||
return &priv->info;
|
return &priv->info;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
on_dialog_closed (GPid pid,
|
|
||||||
gint status,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaPlugin *plugin = user_data;
|
|
||||||
gboolean ok;
|
|
||||||
|
|
||||||
ok = g_spawn_check_exit_status (status, NULL);
|
|
||||||
meta_plugin_complete_display_change (plugin, ok);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
confirm_display_change (MetaPlugin *plugin)
|
|
||||||
{
|
|
||||||
GPid pid;
|
|
||||||
|
|
||||||
pid = meta_show_dialog ("--question",
|
|
||||||
"Does the display look OK?",
|
|
||||||
"20",
|
|
||||||
NULL,
|
|
||||||
"_Keep This Configuration",
|
|
||||||
"_Restore Previous Configuration",
|
|
||||||
"preferences-desktop-display",
|
|
||||||
0,
|
|
||||||
NULL, NULL);
|
|
||||||
|
|
||||||
g_child_watch_add (pid, on_dialog_closed, plugin);
|
|
||||||
}
|
|
||||||
|
@@ -15,7 +15,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "region-utils.h"
|
#include "region-utils.h"
|
||||||
|
@@ -15,7 +15,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __META_REGION_UTILS_H__
|
#ifndef __META_REGION_UTILS_H__
|
||||||
|
@@ -15,7 +15,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* The standard cycle-windows keybinding should be the key above the
|
/* The standard cycle-windows keybinding should be the key above the
|
||||||
|
@@ -366,25 +366,11 @@ meta_barrier_fire_event (MetaBarrier *barrier,
|
|||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_display_process_barrier_event (MetaDisplay *display,
|
meta_display_process_barrier_event (MetaDisplay *display,
|
||||||
XIEvent *event)
|
XIBarrierEvent *xev)
|
||||||
{
|
{
|
||||||
MetaBarrier *barrier;
|
MetaBarrier *barrier;
|
||||||
XIBarrierEvent *xev;
|
|
||||||
|
|
||||||
if (event == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
switch (event->evtype)
|
|
||||||
{
|
|
||||||
case XI_BarrierHit:
|
|
||||||
case XI_BarrierLeave:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
xev = (XIBarrierEvent *) event;
|
|
||||||
barrier = g_hash_table_lookup (display->xids, &xev->barrier);
|
barrier = g_hash_table_lookup (display->xids, &xev->barrier);
|
||||||
if (barrier != NULL)
|
if (barrier != NULL)
|
||||||
{
|
{
|
||||||
|
@@ -17,7 +17,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -51,7 +53,6 @@
|
|||||||
#include "bell.h"
|
#include "bell.h"
|
||||||
#include "screen-private.h"
|
#include "screen-private.h"
|
||||||
#include "window-private.h"
|
#include "window-private.h"
|
||||||
#include "util-private.h"
|
|
||||||
#include <meta/prefs.h>
|
#include <meta/prefs.h>
|
||||||
#include <meta/compositor.h>
|
#include <meta/compositor.h>
|
||||||
#ifdef HAVE_LIBCANBERRA
|
#ifdef HAVE_LIBCANBERRA
|
||||||
|
@@ -14,7 +14,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_BOXES_PRIVATE_H
|
#ifndef META_BOXES_PRIVATE_H
|
||||||
|
@@ -25,7 +25,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "boxes-private.h"
|
#include "boxes-private.h"
|
||||||
|
@@ -18,7 +18,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -116,6 +118,8 @@ typedef struct
|
|||||||
{
|
{
|
||||||
MetaRectangle orig;
|
MetaRectangle orig;
|
||||||
MetaRectangle current;
|
MetaRectangle current;
|
||||||
|
MetaFrameBorders *borders;
|
||||||
|
gboolean must_free_borders;
|
||||||
ActionType action_type;
|
ActionType action_type;
|
||||||
gboolean is_user_action;
|
gboolean is_user_action;
|
||||||
|
|
||||||
@@ -191,6 +195,7 @@ static gboolean constrain_partially_onscreen (MetaWindow *window,
|
|||||||
|
|
||||||
static void setup_constraint_info (ConstraintInfo *info,
|
static void setup_constraint_info (ConstraintInfo *info,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
|
MetaFrameBorders *orig_borders,
|
||||||
MetaMoveResizeFlags flags,
|
MetaMoveResizeFlags flags,
|
||||||
int resize_gravity,
|
int resize_gravity,
|
||||||
const MetaRectangle *orig,
|
const MetaRectangle *orig,
|
||||||
@@ -199,12 +204,13 @@ static void place_window_if_needed (MetaWindow *window,
|
|||||||
ConstraintInfo *info);
|
ConstraintInfo *info);
|
||||||
static void update_onscreen_requirements (MetaWindow *window,
|
static void update_onscreen_requirements (MetaWindow *window,
|
||||||
ConstraintInfo *info);
|
ConstraintInfo *info);
|
||||||
static void extend_by_frame (MetaWindow *window,
|
static void extend_by_frame (MetaRectangle *rect,
|
||||||
MetaRectangle *rect);
|
const MetaFrameBorders *borders);
|
||||||
static void unextend_by_frame (MetaWindow *window,
|
static void unextend_by_frame (MetaRectangle *rect,
|
||||||
MetaRectangle *rect);
|
const MetaFrameBorders *borders);
|
||||||
static inline void get_size_limits (MetaWindow *window,
|
static inline void get_size_limits (const MetaWindow *window,
|
||||||
gboolean include_frame,
|
const MetaFrameBorders *borders,
|
||||||
|
gboolean include_frame,
|
||||||
MetaRectangle *min_size,
|
MetaRectangle *min_size,
|
||||||
MetaRectangle *max_size);
|
MetaRectangle *max_size);
|
||||||
|
|
||||||
@@ -274,6 +280,7 @@ do_all_constraints (MetaWindow *window,
|
|||||||
|
|
||||||
void
|
void
|
||||||
meta_window_constrain (MetaWindow *window,
|
meta_window_constrain (MetaWindow *window,
|
||||||
|
MetaFrameBorders *orig_borders,
|
||||||
MetaMoveResizeFlags flags,
|
MetaMoveResizeFlags flags,
|
||||||
int resize_gravity,
|
int resize_gravity,
|
||||||
const MetaRectangle *orig,
|
const MetaRectangle *orig,
|
||||||
@@ -296,6 +303,7 @@ meta_window_constrain (MetaWindow *window,
|
|||||||
|
|
||||||
setup_constraint_info (&info,
|
setup_constraint_info (&info,
|
||||||
window,
|
window,
|
||||||
|
orig_borders,
|
||||||
flags,
|
flags,
|
||||||
resize_gravity,
|
resize_gravity,
|
||||||
orig,
|
orig,
|
||||||
@@ -325,11 +333,19 @@ meta_window_constrain (MetaWindow *window,
|
|||||||
* if this was a user move or user move-and-resize operation.
|
* if this was a user move or user move-and-resize operation.
|
||||||
*/
|
*/
|
||||||
update_onscreen_requirements (window, &info);
|
update_onscreen_requirements (window, &info);
|
||||||
|
|
||||||
|
/* Ew, what an ugly way to do things. Destructors (in a real OOP language,
|
||||||
|
* not gobject-style--gobject would be more pain than it's worth) or
|
||||||
|
* smart pointers would be so much nicer here. *shrug*
|
||||||
|
*/
|
||||||
|
if (info.must_free_borders)
|
||||||
|
g_free (info.borders);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup_constraint_info (ConstraintInfo *info,
|
setup_constraint_info (ConstraintInfo *info,
|
||||||
MetaWindow *window,
|
MetaWindow *window,
|
||||||
|
MetaFrameBorders *orig_borders,
|
||||||
MetaMoveResizeFlags flags,
|
MetaMoveResizeFlags flags,
|
||||||
int resize_gravity,
|
int resize_gravity,
|
||||||
const MetaRectangle *orig,
|
const MetaRectangle *orig,
|
||||||
@@ -341,6 +357,18 @@ setup_constraint_info (ConstraintInfo *info,
|
|||||||
info->orig = *orig;
|
info->orig = *orig;
|
||||||
info->current = *new;
|
info->current = *new;
|
||||||
|
|
||||||
|
/* Create a fake frame geometry if none really exists */
|
||||||
|
if (orig_borders && !window->fullscreen)
|
||||||
|
{
|
||||||
|
info->borders = orig_borders;
|
||||||
|
info->must_free_borders = FALSE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
info->borders = g_new0 (MetaFrameBorders, 1);
|
||||||
|
info->must_free_borders = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (flags & META_IS_MOVE_ACTION && flags & META_IS_RESIZE_ACTION)
|
if (flags & META_IS_MOVE_ACTION && flags & META_IS_RESIZE_ACTION)
|
||||||
info->action_type = ACTION_MOVE_AND_RESIZE;
|
info->action_type = ACTION_MOVE_AND_RESIZE;
|
||||||
else if (flags & META_IS_RESIZE_ACTION)
|
else if (flags & META_IS_RESIZE_ACTION)
|
||||||
@@ -419,14 +447,12 @@ setup_constraint_info (ConstraintInfo *info,
|
|||||||
|
|
||||||
/* Workaround braindead legacy apps that don't know how to
|
/* Workaround braindead legacy apps that don't know how to
|
||||||
* fullscreen themselves properly - don't get fooled by
|
* fullscreen themselves properly - don't get fooled by
|
||||||
* windows which hide their titlebar when maximized or which are
|
* windows which hide their titlebar when maximized; that's
|
||||||
* client decorated; that's not the same as fullscreen, even
|
* not the same as fullscreen, even if there are no struts
|
||||||
* if there are no struts making the workarea smaller than
|
* making the workarea smaller than the monitor.
|
||||||
* the monitor.
|
|
||||||
*/
|
*/
|
||||||
if (meta_prefs_get_force_fullscreen() &&
|
if (meta_prefs_get_force_fullscreen() &&
|
||||||
!window->hide_titlebar_when_maximized &&
|
!window->hide_titlebar_when_maximized &&
|
||||||
window->decorated &&
|
|
||||||
meta_rectangle_equal (new, &monitor_info->rect) &&
|
meta_rectangle_equal (new, &monitor_info->rect) &&
|
||||||
window->has_fullscreen_func &&
|
window->has_fullscreen_func &&
|
||||||
!window->fullscreen)
|
!window->fullscreen)
|
||||||
@@ -491,12 +517,11 @@ place_window_if_needed(MetaWindow *window,
|
|||||||
!window->minimized &&
|
!window->minimized &&
|
||||||
!window->fullscreen)
|
!window->fullscreen)
|
||||||
{
|
{
|
||||||
MetaRectangle placed_rect;
|
MetaRectangle placed_rect = info->orig;
|
||||||
MetaWorkspace *cur_workspace;
|
MetaWorkspace *cur_workspace;
|
||||||
const MetaMonitorInfo *monitor_info;
|
const MetaMonitorInfo *monitor_info;
|
||||||
|
|
||||||
meta_window_get_frame_rect (window, &placed_rect);
|
meta_window_place (window, info->borders, info->orig.x, info->orig.y,
|
||||||
meta_window_place (window, info->orig.x, info->orig.y,
|
|
||||||
&placed_rect.x, &placed_rect.y);
|
&placed_rect.x, &placed_rect.y);
|
||||||
did_placement = TRUE;
|
did_placement = TRUE;
|
||||||
|
|
||||||
@@ -514,7 +539,6 @@ place_window_if_needed(MetaWindow *window,
|
|||||||
meta_workspace_get_onmonitor_region (cur_workspace,
|
meta_workspace_get_onmonitor_region (cur_workspace,
|
||||||
monitor_info->number);
|
monitor_info->number);
|
||||||
|
|
||||||
meta_window_frame_rect_to_client_rect (window, &placed_rect, &placed_rect);
|
|
||||||
|
|
||||||
info->current.x = placed_rect.x;
|
info->current.x = placed_rect.x;
|
||||||
info->current.y = placed_rect.y;
|
info->current.y = placed_rect.y;
|
||||||
@@ -560,6 +584,10 @@ place_window_if_needed(MetaWindow *window,
|
|||||||
(window->maximize_vertically_after_placement ?
|
(window->maximize_vertically_after_placement ?
|
||||||
META_MAXIMIZE_VERTICAL : 0), &info->current);
|
META_MAXIMIZE_VERTICAL : 0), &info->current);
|
||||||
|
|
||||||
|
/* maximization may have changed frame geometry */
|
||||||
|
if (!window->fullscreen)
|
||||||
|
meta_frame_calc_borders (window->frame, info->borders);
|
||||||
|
|
||||||
if (window->fullscreen_after_placement)
|
if (window->fullscreen_after_placement)
|
||||||
{
|
{
|
||||||
window->saved_rect = info->current;
|
window->saved_rect = info->current;
|
||||||
@@ -619,7 +647,7 @@ update_onscreen_requirements (MetaWindow *window,
|
|||||||
/* The require onscreen/on-single-monitor and titlebar_visible
|
/* The require onscreen/on-single-monitor and titlebar_visible
|
||||||
* stuff is relative to the outer window, not the inner
|
* stuff is relative to the outer window, not the inner
|
||||||
*/
|
*/
|
||||||
extend_by_frame (window, &info->current);
|
extend_by_frame (&info->current, info->borders);
|
||||||
|
|
||||||
/* Update whether we want future constraint runs to require the
|
/* Update whether we want future constraint runs to require the
|
||||||
* window to be on fully onscreen.
|
* window to be on fully onscreen.
|
||||||
@@ -652,13 +680,10 @@ update_onscreen_requirements (MetaWindow *window,
|
|||||||
*/
|
*/
|
||||||
if (window->frame && window->decorated)
|
if (window->frame && window->decorated)
|
||||||
{
|
{
|
||||||
MetaFrameBorders borders;
|
|
||||||
MetaRectangle titlebar_rect;
|
MetaRectangle titlebar_rect;
|
||||||
|
|
||||||
meta_frame_calc_borders (window->frame, &borders);
|
|
||||||
|
|
||||||
titlebar_rect = info->current;
|
titlebar_rect = info->current;
|
||||||
titlebar_rect.height = borders.visible.top;
|
titlebar_rect.height = info->borders->visible.top;
|
||||||
old = window->require_titlebar_visible;
|
old = window->require_titlebar_visible;
|
||||||
window->require_titlebar_visible =
|
window->require_titlebar_visible =
|
||||||
meta_rectangle_overlaps_with_region (info->usable_screen_region,
|
meta_rectangle_overlaps_with_region (info->usable_screen_region,
|
||||||
@@ -671,33 +696,39 @@ update_onscreen_requirements (MetaWindow *window,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Don't forget to restore the position of the window */
|
/* Don't forget to restore the position of the window */
|
||||||
unextend_by_frame (window, &info->current);
|
unextend_by_frame (&info->current, info->borders);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
extend_by_frame (MetaWindow *window,
|
extend_by_frame (MetaRectangle *rect,
|
||||||
MetaRectangle *rect)
|
const MetaFrameBorders *borders)
|
||||||
{
|
{
|
||||||
meta_window_client_rect_to_frame_rect (window, rect, rect);
|
rect->x -= borders->visible.left;
|
||||||
|
rect->y -= borders->visible.top;
|
||||||
|
rect->width += borders->visible.left + borders->visible.right;
|
||||||
|
rect->height += borders->visible.top + borders->visible.bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
unextend_by_frame (MetaWindow *window,
|
unextend_by_frame (MetaRectangle *rect,
|
||||||
MetaRectangle *rect)
|
const MetaFrameBorders *borders)
|
||||||
{
|
{
|
||||||
meta_window_frame_rect_to_client_rect (window, rect, rect);
|
rect->x += borders->visible.left;
|
||||||
|
rect->y += borders->visible.top;
|
||||||
|
rect->width -= borders->visible.left + borders->visible.right;
|
||||||
|
rect->height -= borders->visible.top + borders->visible.bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
get_size_limits (MetaWindow *window,
|
get_size_limits (const MetaWindow *window,
|
||||||
gboolean include_frame,
|
const MetaFrameBorders *borders,
|
||||||
|
gboolean include_frame,
|
||||||
MetaRectangle *min_size,
|
MetaRectangle *min_size,
|
||||||
MetaRectangle *max_size)
|
MetaRectangle *max_size)
|
||||||
{
|
{
|
||||||
/* We pack the results into MetaRectangle structs just for convienience; we
|
/* We pack the results into MetaRectangle structs just for convienience; we
|
||||||
* don't actually use the position of those rects.
|
* don't actually use the position of those rects.
|
||||||
*/
|
*/
|
||||||
min_size->x = min_size->y = max_size->x = max_size->y = 0;
|
|
||||||
min_size->width = window->size_hints.min_width;
|
min_size->width = window->size_hints.min_width;
|
||||||
min_size->height = window->size_hints.min_height;
|
min_size->height = window->size_hints.min_height;
|
||||||
max_size->width = window->size_hints.max_width;
|
max_size->width = window->size_hints.max_width;
|
||||||
@@ -705,8 +736,22 @@ get_size_limits (MetaWindow *window,
|
|||||||
|
|
||||||
if (include_frame)
|
if (include_frame)
|
||||||
{
|
{
|
||||||
meta_window_client_rect_to_frame_rect (window, min_size, min_size);
|
int fw = borders->visible.left + borders->visible.right;
|
||||||
meta_window_client_rect_to_frame_rect (window, max_size, max_size);
|
int fh = borders->visible.top + borders->visible.bottom;
|
||||||
|
|
||||||
|
min_size->width += fw;
|
||||||
|
min_size->height += fh;
|
||||||
|
/* Do check to avoid overflow (e.g. max_size->width & max_size->height
|
||||||
|
* may be set to G_MAXINT by meta_set_normal_hints()).
|
||||||
|
*/
|
||||||
|
if (max_size->width < (G_MAXINT - fw))
|
||||||
|
max_size->width += fw;
|
||||||
|
else
|
||||||
|
max_size->width = G_MAXINT;
|
||||||
|
if (max_size->height < (G_MAXINT - fh))
|
||||||
|
max_size->height += fh;
|
||||||
|
else
|
||||||
|
max_size->height = G_MAXINT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -718,28 +763,18 @@ constrain_modal_dialog (MetaWindow *window,
|
|||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
MetaWindow *parent = meta_window_get_transient_for (window);
|
MetaWindow *parent = meta_window_get_transient_for (window);
|
||||||
MetaRectangle child_rect, parent_rect;
|
|
||||||
gboolean constraint_already_satisfied;
|
gboolean constraint_already_satisfied;
|
||||||
|
|
||||||
if (!meta_window_is_attached_dialog (window))
|
if (!meta_window_is_attached_dialog (window))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* We want to center the dialog on the parent, including the decorations
|
x = parent->rect.x + (parent->rect.width / 2 - info->current.width / 2);
|
||||||
for both of them. info->current is in client X window coordinates, so we need
|
y = parent->rect.y + (parent->rect.height / 2 - info->current.height / 2);
|
||||||
to convert them to frame coordinates, apply the centering and then
|
if (parent->frame)
|
||||||
convert back to client.
|
{
|
||||||
*/
|
x += parent->frame->rect.x;
|
||||||
|
y += parent->frame->rect.y;
|
||||||
child_rect = info->current;
|
}
|
||||||
extend_by_frame (window, &child_rect);
|
|
||||||
|
|
||||||
meta_window_get_frame_rect (parent, &parent_rect);
|
|
||||||
|
|
||||||
child_rect.x = parent_rect.x + (parent_rect.width / 2 - child_rect.width / 2);
|
|
||||||
child_rect.y = parent_rect.y + (parent_rect.height / 2 - child_rect.height / 2);
|
|
||||||
unextend_by_frame (window, &child_rect);
|
|
||||||
x = child_rect.x;
|
|
||||||
y = child_rect.y;
|
|
||||||
|
|
||||||
constraint_already_satisfied = (x == info->current.x) && (y == info->current.y);
|
constraint_already_satisfied = (x == info->current.x) && (y == info->current.y);
|
||||||
|
|
||||||
@@ -804,19 +839,19 @@ constrain_maximization (MetaWindow *window,
|
|||||||
active_workspace_struts = window->screen->active_workspace->all_struts;
|
active_workspace_struts = window->screen->active_workspace->all_struts;
|
||||||
|
|
||||||
target_size = info->current;
|
target_size = info->current;
|
||||||
extend_by_frame (window, &target_size);
|
extend_by_frame (&target_size, info->borders);
|
||||||
meta_rectangle_expand_to_avoiding_struts (&target_size,
|
meta_rectangle_expand_to_avoiding_struts (&target_size,
|
||||||
&info->entire_monitor,
|
&info->entire_monitor,
|
||||||
direction,
|
direction,
|
||||||
active_workspace_struts);
|
active_workspace_struts);
|
||||||
}
|
}
|
||||||
/* Now make target_size = maximized size of client window */
|
/* Now make target_size = maximized size of client window */
|
||||||
unextend_by_frame (window, &target_size);
|
unextend_by_frame (&target_size, info->borders);
|
||||||
|
|
||||||
/* Check min size constraints; max size constraints are ignored for maximized
|
/* Check min size constraints; max size constraints are ignored for maximized
|
||||||
* windows, as per bug 327543.
|
* windows, as per bug 327543.
|
||||||
*/
|
*/
|
||||||
get_size_limits (window, FALSE, &min_size, &max_size);
|
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
||||||
hminbad = target_size.width < min_size.width && window->maximized_horizontally;
|
hminbad = target_size.width < min_size.width && window->maximized_horizontally;
|
||||||
vminbad = target_size.height < min_size.height && window->maximized_vertically;
|
vminbad = target_size.height < min_size.height && window->maximized_vertically;
|
||||||
if (hminbad || vminbad)
|
if (hminbad || vminbad)
|
||||||
@@ -870,12 +905,12 @@ constrain_tiling (MetaWindow *window,
|
|||||||
* use an external function for the actual calculation
|
* use an external function for the actual calculation
|
||||||
*/
|
*/
|
||||||
meta_window_get_current_tile_area (window, &target_size);
|
meta_window_get_current_tile_area (window, &target_size);
|
||||||
unextend_by_frame (window, &target_size);
|
unextend_by_frame (&target_size, info->borders);
|
||||||
|
|
||||||
/* Check min size constraints; max size constraints are ignored as for
|
/* Check min size constraints; max size constraints are ignored as for
|
||||||
* maximized windows.
|
* maximized windows.
|
||||||
*/
|
*/
|
||||||
get_size_limits (window, FALSE, &min_size, &max_size);
|
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
||||||
hminbad = target_size.width < min_size.width;
|
hminbad = target_size.width < min_size.width;
|
||||||
vminbad = target_size.height < min_size.height;
|
vminbad = target_size.height < min_size.height;
|
||||||
if (hminbad || vminbad)
|
if (hminbad || vminbad)
|
||||||
@@ -918,7 +953,7 @@ constrain_fullscreen (MetaWindow *window,
|
|||||||
|
|
||||||
monitor = info->entire_monitor;
|
monitor = info->entire_monitor;
|
||||||
|
|
||||||
get_size_limits (window, FALSE, &min_size, &max_size);
|
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
||||||
too_big = !meta_rectangle_could_fit_rect (&monitor, &min_size);
|
too_big = !meta_rectangle_could_fit_rect (&monitor, &min_size);
|
||||||
too_small = !meta_rectangle_could_fit_rect (&max_size, &monitor);
|
too_small = !meta_rectangle_could_fit_rect (&max_size, &monitor);
|
||||||
if (too_big || too_small)
|
if (too_big || too_small)
|
||||||
@@ -1027,7 +1062,7 @@ constrain_size_limits (MetaWindow *window,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* Determine whether constraint is already satisfied; exit if it is */
|
/* Determine whether constraint is already satisfied; exit if it is */
|
||||||
get_size_limits (window, FALSE, &min_size, &max_size);
|
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
|
||||||
/* We ignore max-size limits for maximized windows; see #327543 */
|
/* We ignore max-size limits for maximized windows; see #327543 */
|
||||||
if (window->maximized_horizontally)
|
if (window->maximized_horizontally)
|
||||||
max_size.width = MAX (max_size.width, info->current.width);
|
max_size.width = MAX (max_size.width, info->current.width);
|
||||||
@@ -1219,8 +1254,8 @@ do_screen_and_monitor_relative_constraints (
|
|||||||
|
|
||||||
/* Determine whether constraint applies; exit if it doesn't */
|
/* Determine whether constraint applies; exit if it doesn't */
|
||||||
how_far_it_can_be_smushed = info->current;
|
how_far_it_can_be_smushed = info->current;
|
||||||
get_size_limits (window, TRUE, &min_size, &max_size);
|
get_size_limits (window, info->borders, TRUE, &min_size, &max_size);
|
||||||
extend_by_frame (window, &info->current);
|
extend_by_frame (&info->current, info->borders);
|
||||||
|
|
||||||
if (info->action_type != ACTION_MOVE)
|
if (info->action_type != ACTION_MOVE)
|
||||||
{
|
{
|
||||||
@@ -1240,7 +1275,7 @@ do_screen_and_monitor_relative_constraints (
|
|||||||
&info->current);
|
&info->current);
|
||||||
if (exit_early || constraint_satisfied || check_only)
|
if (exit_early || constraint_satisfied || check_only)
|
||||||
{
|
{
|
||||||
unextend_by_frame (window, &info->current);
|
unextend_by_frame (&info->current, info->borders);
|
||||||
return constraint_satisfied;
|
return constraint_satisfied;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1264,7 +1299,7 @@ do_screen_and_monitor_relative_constraints (
|
|||||||
info->fixed_directions,
|
info->fixed_directions,
|
||||||
&info->current);
|
&info->current);
|
||||||
|
|
||||||
unextend_by_frame (window, &info->current);
|
unextend_by_frame (&info->current, info->borders);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1377,11 +1412,8 @@ constrain_titlebar_visible (MetaWindow *window,
|
|||||||
*/
|
*/
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
{
|
{
|
||||||
MetaFrameBorders borders;
|
bottom_amount = info->current.height + info->borders->visible.bottom;
|
||||||
meta_frame_calc_borders (window->frame, &borders);
|
vert_amount_onscreen = info->borders->visible.top;
|
||||||
|
|
||||||
bottom_amount = info->current.height + borders.visible.bottom;
|
|
||||||
vert_amount_onscreen = borders.visible.top;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bottom_amount = vert_amount_offscreen;
|
bottom_amount = vert_amount_offscreen;
|
||||||
@@ -1455,11 +1487,8 @@ constrain_partially_onscreen (MetaWindow *window,
|
|||||||
*/
|
*/
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
{
|
{
|
||||||
MetaFrameBorders borders;
|
bottom_amount = info->current.height + info->borders->visible.bottom;
|
||||||
meta_frame_calc_borders (window->frame, &borders);
|
vert_amount_onscreen = info->borders->visible.top;
|
||||||
|
|
||||||
bottom_amount = info->current.height + borders.visible.bottom;
|
|
||||||
vert_amount_onscreen = borders.visible.top;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
bottom_amount = vert_amount_offscreen;
|
bottom_amount = vert_amount_offscreen;
|
||||||
|
@@ -17,7 +17,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_CONSTRAINTS_H
|
#ifndef META_CONSTRAINTS_H
|
||||||
@@ -33,11 +35,11 @@ typedef enum
|
|||||||
META_DO_GRAVITY_ADJUST = 1 << 1,
|
META_DO_GRAVITY_ADJUST = 1 << 1,
|
||||||
META_IS_USER_ACTION = 1 << 2,
|
META_IS_USER_ACTION = 1 << 2,
|
||||||
META_IS_MOVE_ACTION = 1 << 3,
|
META_IS_MOVE_ACTION = 1 << 3,
|
||||||
META_IS_RESIZE_ACTION = 1 << 4,
|
META_IS_RESIZE_ACTION = 1 << 4
|
||||||
META_IS_WAYLAND_RESIZE = 1 << 5
|
|
||||||
} MetaMoveResizeFlags;
|
} MetaMoveResizeFlags;
|
||||||
|
|
||||||
void meta_window_constrain (MetaWindow *window,
|
void meta_window_constrain (MetaWindow *window,
|
||||||
|
MetaFrameBorders *orig_borders,
|
||||||
MetaMoveResizeFlags flags,
|
MetaMoveResizeFlags flags,
|
||||||
int resize_gravity,
|
int resize_gravity,
|
||||||
const MetaRectangle *orig,
|
const MetaRectangle *orig,
|
||||||
|
@@ -18,7 +18,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -27,7 +29,6 @@
|
|||||||
#include "workspace-private.h"
|
#include "workspace-private.h"
|
||||||
#include <meta/prefs.h>
|
#include <meta/prefs.h>
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "util-private.h"
|
|
||||||
|
|
||||||
/* Looks up the MetaWindow representing the frame of the given X window.
|
/* Looks up the MetaWindow representing the frame of the given X window.
|
||||||
* Used as a helper function by a bunch of the functions below.
|
* Used as a helper function by a bunch of the functions below.
|
||||||
@@ -88,7 +89,7 @@ meta_core_get (Display *xdisplay,
|
|||||||
if (request != META_CORE_WINDOW_HAS_FRAME &&
|
if (request != META_CORE_WINDOW_HAS_FRAME &&
|
||||||
(window == NULL || window->frame == NULL)) {
|
(window == NULL || window->frame == NULL)) {
|
||||||
meta_bug ("No such frame window 0x%lx!\n", xwindow);
|
meta_bug ("No such frame window 0x%lx!\n", xwindow);
|
||||||
goto out;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (request != META_CORE_GET_END) {
|
while (request != META_CORE_GET_END) {
|
||||||
@@ -98,7 +99,7 @@ meta_core_get (Display *xdisplay,
|
|||||||
switch (request) {
|
switch (request) {
|
||||||
case META_CORE_WINDOW_HAS_FRAME:
|
case META_CORE_WINDOW_HAS_FRAME:
|
||||||
*((gboolean*)answer) = window != NULL && window->frame != NULL;
|
*((gboolean*)answer) = window != NULL && window->frame != NULL;
|
||||||
if (!*((gboolean*)answer)) goto out; /* see above */
|
if (!*((gboolean*)answer)) return; /* see above */
|
||||||
break;
|
break;
|
||||||
case META_CORE_GET_CLIENT_WIDTH:
|
case META_CORE_GET_CLIENT_WIDTH:
|
||||||
*((gint*)answer) = window->rect.width;
|
*((gint*)answer) = window->rect.width;
|
||||||
@@ -153,13 +154,12 @@ meta_core_get (Display *xdisplay,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
meta_warning("Unknown window information request: %d\n", request);
|
meta_warning(_("Unknown window information request: %d"), request);
|
||||||
}
|
}
|
||||||
|
|
||||||
request = va_arg (args, MetaCoreGetType);
|
request = va_arg (args, MetaCoreGetType);
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
|
||||||
va_end (args);
|
va_end (args);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,7 +170,6 @@ meta_core_queue_frame_resize (Display *xdisplay,
|
|||||||
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
MetaWindow *window = get_window (xdisplay, frame_xwindow);
|
||||||
|
|
||||||
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
||||||
meta_window_frame_size_changed (window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -270,8 +269,6 @@ meta_core_lower_beneath_grab_window (Display *xdisplay,
|
|||||||
MetaDisplay *display;
|
MetaDisplay *display;
|
||||||
MetaScreen *screen;
|
MetaScreen *screen;
|
||||||
MetaWindow *grab_window;
|
MetaWindow *grab_window;
|
||||||
MetaStackWindow stack_window;
|
|
||||||
MetaStackWindow stack_sibling;
|
|
||||||
|
|
||||||
display = meta_display_for_x_display (xdisplay);
|
display = meta_display_for_x_display (xdisplay);
|
||||||
screen = meta_display_screen_for_xwindow (display, xwindow);
|
screen = meta_display_screen_for_xwindow (display, xwindow);
|
||||||
@@ -281,15 +278,12 @@ meta_core_lower_beneath_grab_window (Display *xdisplay,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
changes.stack_mode = Below;
|
changes.stack_mode = Below;
|
||||||
changes.sibling = meta_window_get_toplevel_xwindow (grab_window);
|
changes.sibling = grab_window->frame ? grab_window->frame->xwindow
|
||||||
|
: grab_window->xwindow;
|
||||||
|
|
||||||
stack_window.any.type = META_WINDOW_CLIENT_TYPE_X11;
|
|
||||||
stack_window.x11.xwindow = xwindow;
|
|
||||||
stack_sibling.any.type = META_WINDOW_CLIENT_TYPE_X11;
|
|
||||||
stack_sibling.x11.xwindow = changes.sibling;
|
|
||||||
meta_stack_tracker_record_lower_below (screen->stack_tracker,
|
meta_stack_tracker_record_lower_below (screen->stack_tracker,
|
||||||
&stack_window,
|
xwindow,
|
||||||
&stack_sibling,
|
changes.sibling,
|
||||||
XNextRequest (screen->display->xdisplay));
|
XNextRequest (screen->display->xdisplay));
|
||||||
|
|
||||||
meta_error_trap_push (display);
|
meta_error_trap_push (display);
|
||||||
@@ -474,6 +468,26 @@ meta_core_change_workspace (Display *xdisplay,
|
|||||||
new_workspace));
|
new_workspace));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
meta_core_get_num_workspaces (Screen *xscreen)
|
||||||
|
{
|
||||||
|
MetaScreen *screen;
|
||||||
|
|
||||||
|
screen = meta_screen_for_x_screen (xscreen);
|
||||||
|
|
||||||
|
return meta_screen_get_n_workspaces (screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
meta_core_get_active_workspace (Screen *xscreen)
|
||||||
|
{
|
||||||
|
MetaScreen *screen;
|
||||||
|
|
||||||
|
screen = meta_screen_for_x_screen (xscreen);
|
||||||
|
|
||||||
|
return meta_workspace_index (screen->active_workspace);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_core_show_window_menu (Display *xdisplay,
|
meta_core_show_window_menu (Display *xdisplay,
|
||||||
Window frame_xwindow,
|
Window frame_xwindow,
|
||||||
|
@@ -17,7 +17,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_CORE_H
|
#ifndef META_CORE_H
|
||||||
@@ -151,6 +153,8 @@ void meta_core_change_workspace (Display *xdisplay,
|
|||||||
Window frame_xwindow,
|
Window frame_xwindow,
|
||||||
int new_workspace);
|
int new_workspace);
|
||||||
|
|
||||||
|
int meta_core_get_num_workspaces (Screen *xscreen);
|
||||||
|
int meta_core_get_active_workspace (Screen *xscreen);
|
||||||
int meta_core_get_frame_workspace (Display *xdisplay,
|
int meta_core_get_frame_workspace (Display *xdisplay,
|
||||||
Window frame_xwindow);
|
Window frame_xwindow);
|
||||||
const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
|
const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
|
||||||
|
@@ -17,13 +17,15 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _XOPEN_SOURCE /* for kill() */
|
#define _XOPEN_SOURCE /* for kill() */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include "util-private.h"
|
#include <meta/util.h>
|
||||||
#include "window-private.h"
|
#include "window-private.h"
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include <meta/workspace.h>
|
#include <meta/workspace.h>
|
||||||
@@ -41,11 +43,14 @@ static void meta_window_present_delete_dialog (MetaWindow *window,
|
|||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
delete_ping_reply_func (MetaWindow *window,
|
delete_ping_reply_func (MetaDisplay *display,
|
||||||
|
Window xwindow,
|
||||||
guint32 timestamp,
|
guint32 timestamp,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_PING, "Got reply to delete ping for %s\n", window->desc);
|
meta_topic (META_DEBUG_PING,
|
||||||
|
"Got reply to delete ping for %s\n",
|
||||||
|
((MetaWindow*)user_data)->desc);
|
||||||
|
|
||||||
/* we do nothing */
|
/* we do nothing */
|
||||||
}
|
}
|
||||||
@@ -63,10 +68,12 @@ dialog_exited (GPid pid, int status, gpointer user_data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
delete_ping_timeout_func (MetaWindow *window,
|
delete_ping_timeout_func (MetaDisplay *display,
|
||||||
|
Window xwindow,
|
||||||
guint32 timestamp,
|
guint32 timestamp,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
{
|
{
|
||||||
|
MetaWindow *window = user_data;
|
||||||
char *window_title;
|
char *window_title;
|
||||||
gchar *window_content, *tmp;
|
gchar *window_content, *tmp;
|
||||||
GPid dialog_pid;
|
GPid dialog_pid;
|
||||||
@@ -130,11 +137,12 @@ void
|
|||||||
meta_window_check_alive (MetaWindow *window,
|
meta_window_check_alive (MetaWindow *window,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
meta_window_ping (window,
|
meta_display_ping_window (window->display,
|
||||||
timestamp,
|
window,
|
||||||
delete_ping_reply_func,
|
timestamp,
|
||||||
delete_ping_timeout_func,
|
delete_ping_reply_func,
|
||||||
NULL);
|
delete_ping_timeout_func,
|
||||||
|
window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -19,7 +19,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_DISPLAY_PRIVATE_H
|
#ifndef META_DISPLAY_PRIVATE_H
|
||||||
@@ -37,7 +39,6 @@
|
|||||||
#include "keybindings-private.h"
|
#include "keybindings-private.h"
|
||||||
#include <meta/prefs.h>
|
#include <meta/prefs.h>
|
||||||
#include <meta/barrier.h>
|
#include <meta/barrier.h>
|
||||||
#include <clutter/clutter.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_STARTUP_NOTIFICATION
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||||
#include <libsn/sn.h>
|
#include <libsn/sn.h>
|
||||||
@@ -55,6 +56,11 @@ typedef struct _MetaWindowPropHooks MetaWindowPropHooks;
|
|||||||
|
|
||||||
typedef struct MetaEdgeResistanceData MetaEdgeResistanceData;
|
typedef struct MetaEdgeResistanceData MetaEdgeResistanceData;
|
||||||
|
|
||||||
|
typedef void (* MetaWindowPingFunc) (MetaDisplay *display,
|
||||||
|
Window xwindow,
|
||||||
|
guint32 timestamp,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
META_LIST_DEFAULT = 0, /* normal windows */
|
META_LIST_DEFAULT = 0, /* normal windows */
|
||||||
META_LIST_INCLUDE_OVERRIDE_REDIRECT = 1 << 0, /* normal and O-R */
|
META_LIST_INCLUDE_OVERRIDE_REDIRECT = 1 << 0, /* normal and O-R */
|
||||||
@@ -80,14 +86,6 @@ typedef enum {
|
|||||||
META_TILE_MAXIMIZED
|
META_TILE_MAXIMIZED
|
||||||
} MetaTileMode;
|
} MetaTileMode;
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
META_FOCUS_NONE = 0,
|
|
||||||
META_FOCUS_X_CLIENT = 1,
|
|
||||||
META_FOCUS_WAYLAND_CLIENT = 2,
|
|
||||||
META_FOCUS_NO_FOCUS_WINDOW = 3,
|
|
||||||
META_FOCUS_STAGE = 4
|
|
||||||
} MetaFocusType;
|
|
||||||
|
|
||||||
struct _MetaDisplay
|
struct _MetaDisplay
|
||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
@@ -95,8 +93,6 @@ struct _MetaDisplay
|
|||||||
char *name;
|
char *name;
|
||||||
Display *xdisplay;
|
Display *xdisplay;
|
||||||
|
|
||||||
int clutter_event_filter;
|
|
||||||
|
|
||||||
Window leader_window;
|
Window leader_window;
|
||||||
Window timestamp_pinging_window;
|
Window timestamp_pinging_window;
|
||||||
|
|
||||||
@@ -107,21 +103,19 @@ struct _MetaDisplay
|
|||||||
#include <meta/atomnames.h>
|
#include <meta/atomnames.h>
|
||||||
#undef item
|
#undef item
|
||||||
|
|
||||||
/* The window and serial of the most recent FocusIn event. */
|
/* This is the actual window from focus events,
|
||||||
Window server_focus_window;
|
* not the one we last set
|
||||||
gulong server_focus_serial;
|
|
||||||
|
|
||||||
/* Our best guess as to the "currently" focused window (that is, the
|
|
||||||
* window that we expect will be focused at the point when the X
|
|
||||||
* server processes our next request), and the serial of the request
|
|
||||||
* or event that caused this.
|
|
||||||
*/
|
*/
|
||||||
MetaWindow *focus_window;
|
MetaWindow *focus_window;
|
||||||
/* For windows we've focused that don't necessarily have an X window,
|
|
||||||
* like the no_focus_window or the stage X window. */
|
/* window we are expecting a FocusIn event for or the current focus
|
||||||
Window focus_xwindow;
|
* window if we are not expecting any FocusIn/FocusOut events; not
|
||||||
gulong focus_serial;
|
* perfect because applications can call XSetInputFocus directly.
|
||||||
MetaFocusType focus_type;
|
* (It could also be messed up if a timestamp later than current
|
||||||
|
* time is sent to meta_display_set_input_focus_window, though that
|
||||||
|
* would be a programming error). See bug 154598 for more info.
|
||||||
|
*/
|
||||||
|
MetaWindow *expected_focus_window;
|
||||||
|
|
||||||
/* last timestamp passed to XSetInputFocus */
|
/* last timestamp passed to XSetInputFocus */
|
||||||
guint32 last_focus_time;
|
guint32 last_focus_time;
|
||||||
@@ -143,14 +137,6 @@ struct _MetaDisplay
|
|||||||
*/
|
*/
|
||||||
guint allow_terminal_deactivation : 1;
|
guint allow_terminal_deactivation : 1;
|
||||||
|
|
||||||
/* If true, server->focus_serial refers to us changing the focus; in
|
|
||||||
* this case, we can ignore focus events that have exactly focus_serial,
|
|
||||||
* since we take care to make another request immediately afterwards.
|
|
||||||
* But if focus is being changed by another client, we have to accept
|
|
||||||
* multiple events with the same serial.
|
|
||||||
*/
|
|
||||||
guint focused_by_us : 1;
|
|
||||||
|
|
||||||
guint static_gravity_works : 1;
|
guint static_gravity_works : 1;
|
||||||
|
|
||||||
/*< private-ish >*/
|
/*< private-ish >*/
|
||||||
@@ -158,7 +144,6 @@ struct _MetaDisplay
|
|||||||
GSList *screens;
|
GSList *screens;
|
||||||
MetaScreen *active_screen;
|
MetaScreen *active_screen;
|
||||||
GHashTable *xids;
|
GHashTable *xids;
|
||||||
GHashTable *wayland_windows;
|
|
||||||
int error_traps;
|
int error_traps;
|
||||||
int (* error_trap_handler) (Display *display,
|
int (* error_trap_handler) (Display *display,
|
||||||
XErrorEvent *error);
|
XErrorEvent *error);
|
||||||
@@ -183,7 +168,7 @@ struct _MetaDisplay
|
|||||||
guint32 window_sequence_counter;
|
guint32 window_sequence_counter;
|
||||||
|
|
||||||
/* Pings which we're waiting for a reply from */
|
/* Pings which we're waiting for a reply from */
|
||||||
GHashTable *pending_pings;
|
GSList *pending_pings;
|
||||||
|
|
||||||
/* Pending focus change */
|
/* Pending focus change */
|
||||||
guint focus_timeout_id;
|
guint focus_timeout_id;
|
||||||
@@ -193,7 +178,7 @@ struct _MetaDisplay
|
|||||||
MetaWindow* autoraise_window;
|
MetaWindow* autoraise_window;
|
||||||
|
|
||||||
/* Alt+click button grabs */
|
/* Alt+click button grabs */
|
||||||
ClutterModifierType window_grab_modifiers;
|
unsigned int window_grab_modifiers;
|
||||||
|
|
||||||
/* current window operation */
|
/* current window operation */
|
||||||
MetaGrabOp grab_op;
|
MetaGrabOp grab_op;
|
||||||
@@ -254,8 +239,6 @@ struct _MetaDisplay
|
|||||||
unsigned int meta_mask;
|
unsigned int meta_mask;
|
||||||
MetaKeyCombo overlay_key_combo;
|
MetaKeyCombo overlay_key_combo;
|
||||||
gboolean overlay_key_only_pressed;
|
gboolean overlay_key_only_pressed;
|
||||||
MetaKeyCombo *iso_next_group_combos;
|
|
||||||
int n_iso_next_group_combos;
|
|
||||||
|
|
||||||
/* Monitor cache */
|
/* Monitor cache */
|
||||||
unsigned int monitor_cache_invalidated : 1;
|
unsigned int monitor_cache_invalidated : 1;
|
||||||
@@ -385,11 +368,6 @@ void meta_display_register_x_window (MetaDisplay *display,
|
|||||||
void meta_display_unregister_x_window (MetaDisplay *display,
|
void meta_display_unregister_x_window (MetaDisplay *display,
|
||||||
Window xwindow);
|
Window xwindow);
|
||||||
|
|
||||||
void meta_display_register_wayland_window (MetaDisplay *display,
|
|
||||||
MetaWindow *window);
|
|
||||||
void meta_display_unregister_wayland_window (MetaDisplay *display,
|
|
||||||
MetaWindow *window);
|
|
||||||
|
|
||||||
#ifdef HAVE_XSYNC
|
#ifdef HAVE_XSYNC
|
||||||
MetaWindow* meta_display_lookup_sync_alarm (MetaDisplay *display,
|
MetaWindow* meta_display_lookup_sync_alarm (MetaDisplay *display,
|
||||||
XSyncAlarm alarm);
|
XSyncAlarm alarm);
|
||||||
@@ -449,6 +427,15 @@ void meta_display_retheme_all (void);
|
|||||||
void meta_display_set_cursor_theme (const char *theme,
|
void meta_display_set_cursor_theme (const char *theme,
|
||||||
int size);
|
int size);
|
||||||
|
|
||||||
|
void meta_display_ping_window (MetaDisplay *display,
|
||||||
|
MetaWindow *window,
|
||||||
|
guint32 timestamp,
|
||||||
|
MetaWindowPingFunc ping_reply_func,
|
||||||
|
MetaWindowPingFunc ping_timeout_func,
|
||||||
|
void *user_data);
|
||||||
|
gboolean meta_display_window_has_pending_pings (MetaDisplay *display,
|
||||||
|
MetaWindow *window);
|
||||||
|
|
||||||
int meta_resize_gravity_from_grab_op (MetaGrabOp op);
|
int meta_resize_gravity_from_grab_op (MetaGrabOp op);
|
||||||
|
|
||||||
gboolean meta_grab_op_is_moving (MetaGrabOp op);
|
gboolean meta_grab_op_is_moving (MetaGrabOp op);
|
||||||
@@ -468,23 +455,16 @@ void meta_display_queue_autoraise_callback (MetaDisplay *display,
|
|||||||
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
||||||
|
|
||||||
void meta_display_overlay_key_activate (MetaDisplay *display);
|
void meta_display_overlay_key_activate (MetaDisplay *display);
|
||||||
void meta_display_accelerator_activate (MetaDisplay *display,
|
void meta_display_accelerator_activate (MetaDisplay *display,
|
||||||
guint action,
|
guint action,
|
||||||
ClutterKeyEvent *event);
|
guint deviceid);
|
||||||
gboolean meta_display_modifiers_accelerator_activate (MetaDisplay *display);
|
|
||||||
|
|
||||||
/* In above-tab-keycode.c */
|
/* In above-tab-keycode.c */
|
||||||
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
|
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
|
||||||
|
|
||||||
#ifdef HAVE_XI23
|
#ifdef HAVE_XI23
|
||||||
gboolean meta_display_process_barrier_event (MetaDisplay *display,
|
gboolean meta_display_process_barrier_event (MetaDisplay *display,
|
||||||
XIEvent *event);
|
XIBarrierEvent *event);
|
||||||
#endif /* HAVE_XI23 */
|
#endif /* HAVE_XI23 */
|
||||||
|
|
||||||
void meta_display_set_input_focus_xwindow (MetaDisplay *display,
|
|
||||||
MetaScreen *screen,
|
|
||||||
MetaFocusType type,
|
|
||||||
Window window,
|
|
||||||
guint32 timestamp);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
3558
src/core/display.c
3558
src/core/display.c
File diff suppressed because it is too large
Load Diff
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -983,7 +985,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
|
|||||||
{
|
{
|
||||||
MetaRectangle *new_rect;
|
MetaRectangle *new_rect;
|
||||||
new_rect = g_new (MetaRectangle, 1);
|
new_rect = g_new (MetaRectangle, 1);
|
||||||
meta_window_get_frame_rect (cur_window, new_rect);
|
meta_window_get_outer_rect (cur_window, new_rect);
|
||||||
obscuring_windows = g_slist_prepend (obscuring_windows, new_rect);
|
obscuring_windows = g_slist_prepend (obscuring_windows, new_rect);
|
||||||
window_stacking =
|
window_stacking =
|
||||||
g_slist_prepend (window_stacking, GINT_TO_POINTER (stack_position));
|
g_slist_prepend (window_stacking, GINT_TO_POINTER (stack_position));
|
||||||
@@ -1008,7 +1010,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
|
|||||||
{
|
{
|
||||||
MetaRectangle cur_rect;
|
MetaRectangle cur_rect;
|
||||||
MetaWindow *cur_window = cur_window_iter->data;
|
MetaWindow *cur_window = cur_window_iter->data;
|
||||||
meta_window_get_frame_rect (cur_window, &cur_rect);
|
meta_window_get_outer_rect (cur_window, &cur_rect);
|
||||||
|
|
||||||
/* Check if we want to use this window's edges for edge
|
/* Check if we want to use this window's edges for edge
|
||||||
* resistance (note that dock edges are considered screen edges
|
* resistance (note that dock edges are considered screen edges
|
||||||
@@ -1149,7 +1151,7 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
|
|||||||
MetaRectangle old_outer, proposed_outer, new_outer;
|
MetaRectangle old_outer, proposed_outer, new_outer;
|
||||||
gboolean is_resize;
|
gboolean is_resize;
|
||||||
|
|
||||||
meta_window_get_frame_rect (window, &old_outer);
|
meta_window_get_outer_rect (window, &old_outer);
|
||||||
|
|
||||||
proposed_outer = old_outer;
|
proposed_outer = old_outer;
|
||||||
proposed_outer.x += (*new_x - old_x);
|
proposed_outer.x += (*new_x - old_x);
|
||||||
@@ -1235,7 +1237,7 @@ meta_window_edge_resistance_for_resize (MetaWindow *window,
|
|||||||
int proposed_outer_width, proposed_outer_height;
|
int proposed_outer_width, proposed_outer_height;
|
||||||
gboolean is_resize;
|
gboolean is_resize;
|
||||||
|
|
||||||
meta_window_get_frame_rect (window, &old_outer);
|
meta_window_get_outer_rect (window, &old_outer);
|
||||||
proposed_outer_width = old_outer.width + (*new_width - old_width);
|
proposed_outer_width = old_outer.width + (*new_width - old_width);
|
||||||
proposed_outer_height = old_outer.height + (*new_height - old_height);
|
proposed_outer_height = old_outer.height + (*new_height - old_height);
|
||||||
meta_rectangle_resize_with_gravity (&old_outer,
|
meta_rectangle_resize_with_gravity (&old_outer,
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_EDGE_RESISTANCE_H
|
#ifndef META_EDGE_RESISTANCE_H
|
||||||
|
@@ -1,539 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2007 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
|
||||||
* to deal in the Software without restriction, including without limitation
|
|
||||||
* on the rights to use, copy, modify, merge, publish, distribute, sub
|
|
||||||
* license, and/or sell copies of the Software, and to permit persons to whom
|
|
||||||
* the Software is furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice (including the next
|
|
||||||
* paragraph) shall be included in all copies or substantial portions of the
|
|
||||||
* Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Author: Soren Sandmann <sandmann@redhat.com> */
|
|
||||||
|
|
||||||
#include "edid.h"
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <glib.h>
|
|
||||||
|
|
||||||
static int
|
|
||||||
get_bit (int in, int bit)
|
|
||||||
{
|
|
||||||
return (in & (1 << bit)) >> bit;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
get_bits (int in, int begin, int end)
|
|
||||||
{
|
|
||||||
int mask = (1 << (end - begin + 1)) - 1;
|
|
||||||
|
|
||||||
return (in >> begin) & mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
decode_header (const uchar *edid)
|
|
||||||
{
|
|
||||||
if (memcmp (edid, "\x00\xff\xff\xff\xff\xff\xff\x00", 8) == 0)
|
|
||||||
return TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
decode_vendor_and_product_identification (const uchar *edid, MonitorInfo *info)
|
|
||||||
{
|
|
||||||
int is_model_year;
|
|
||||||
|
|
||||||
/* Manufacturer Code */
|
|
||||||
info->manufacturer_code[0] = get_bits (edid[0x08], 2, 6);
|
|
||||||
info->manufacturer_code[1] = get_bits (edid[0x08], 0, 1) << 3;
|
|
||||||
info->manufacturer_code[1] |= get_bits (edid[0x09], 5, 7);
|
|
||||||
info->manufacturer_code[2] = get_bits (edid[0x09], 0, 4);
|
|
||||||
info->manufacturer_code[3] = '\0';
|
|
||||||
|
|
||||||
info->manufacturer_code[0] += 'A' - 1;
|
|
||||||
info->manufacturer_code[1] += 'A' - 1;
|
|
||||||
info->manufacturer_code[2] += 'A' - 1;
|
|
||||||
|
|
||||||
/* Product Code */
|
|
||||||
info->product_code = edid[0x0b] << 8 | edid[0x0a];
|
|
||||||
|
|
||||||
/* Serial Number */
|
|
||||||
info->serial_number =
|
|
||||||
edid[0x0c] | edid[0x0d] << 8 | edid[0x0e] << 16 | edid[0x0f] << 24;
|
|
||||||
|
|
||||||
/* Week and Year */
|
|
||||||
is_model_year = FALSE;
|
|
||||||
switch (edid[0x10])
|
|
||||||
{
|
|
||||||
case 0x00:
|
|
||||||
info->production_week = -1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 0xff:
|
|
||||||
info->production_week = -1;
|
|
||||||
is_model_year = TRUE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
info->production_week = edid[0x10];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_model_year)
|
|
||||||
{
|
|
||||||
info->production_year = -1;
|
|
||||||
info->model_year = 1990 + edid[0x11];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->production_year = 1990 + edid[0x11];
|
|
||||||
info->model_year = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
decode_edid_version (const uchar *edid, MonitorInfo *info)
|
|
||||||
{
|
|
||||||
info->major_version = edid[0x12];
|
|
||||||
info->minor_version = edid[0x13];
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
decode_display_parameters (const uchar *edid, MonitorInfo *info)
|
|
||||||
{
|
|
||||||
/* Digital vs Analog */
|
|
||||||
info->is_digital = get_bit (edid[0x14], 7);
|
|
||||||
|
|
||||||
if (info->is_digital)
|
|
||||||
{
|
|
||||||
int bits;
|
|
||||||
|
|
||||||
static const int bit_depth[8] =
|
|
||||||
{
|
|
||||||
-1, 6, 8, 10, 12, 14, 16, -1
|
|
||||||
};
|
|
||||||
|
|
||||||
static const Interface interfaces[6] =
|
|
||||||
{
|
|
||||||
UNDEFINED, DVI, HDMI_A, HDMI_B, MDDI, DISPLAY_PORT
|
|
||||||
};
|
|
||||||
|
|
||||||
bits = get_bits (edid[0x14], 4, 6);
|
|
||||||
info->connector.digital.bits_per_primary = bit_depth[bits];
|
|
||||||
|
|
||||||
bits = get_bits (edid[0x14], 0, 3);
|
|
||||||
|
|
||||||
if (bits <= 5)
|
|
||||||
info->connector.digital.interface = interfaces[bits];
|
|
||||||
else
|
|
||||||
info->connector.digital.interface = UNDEFINED;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int bits = get_bits (edid[0x14], 5, 6);
|
|
||||||
|
|
||||||
static const double levels[][3] =
|
|
||||||
{
|
|
||||||
{ 0.7, 0.3, 1.0 },
|
|
||||||
{ 0.714, 0.286, 1.0 },
|
|
||||||
{ 1.0, 0.4, 1.4 },
|
|
||||||
{ 0.7, 0.0, 0.7 },
|
|
||||||
};
|
|
||||||
|
|
||||||
info->connector.analog.video_signal_level = levels[bits][0];
|
|
||||||
info->connector.analog.sync_signal_level = levels[bits][1];
|
|
||||||
info->connector.analog.total_signal_level = levels[bits][2];
|
|
||||||
|
|
||||||
info->connector.analog.blank_to_black = get_bit (edid[0x14], 4);
|
|
||||||
|
|
||||||
info->connector.analog.separate_hv_sync = get_bit (edid[0x14], 3);
|
|
||||||
info->connector.analog.composite_sync_on_h = get_bit (edid[0x14], 2);
|
|
||||||
info->connector.analog.composite_sync_on_green = get_bit (edid[0x14], 1);
|
|
||||||
|
|
||||||
info->connector.analog.serration_on_vsync = get_bit (edid[0x14], 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Screen Size / Aspect Ratio */
|
|
||||||
if (edid[0x15] == 0 && edid[0x16] == 0)
|
|
||||||
{
|
|
||||||
info->width_mm = -1;
|
|
||||||
info->height_mm = -1;
|
|
||||||
info->aspect_ratio = -1.0;
|
|
||||||
}
|
|
||||||
else if (edid[0x16] == 0)
|
|
||||||
{
|
|
||||||
info->width_mm = -1;
|
|
||||||
info->height_mm = -1;
|
|
||||||
info->aspect_ratio = 100.0 / (edid[0x15] + 99);
|
|
||||||
}
|
|
||||||
else if (edid[0x15] == 0)
|
|
||||||
{
|
|
||||||
info->width_mm = -1;
|
|
||||||
info->height_mm = -1;
|
|
||||||
info->aspect_ratio = 100.0 / (edid[0x16] + 99);
|
|
||||||
info->aspect_ratio = 1/info->aspect_ratio; /* portrait */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
info->width_mm = 10 * edid[0x15];
|
|
||||||
info->height_mm = 10 * edid[0x16];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Gamma */
|
|
||||||
if (edid[0x17] == 0xFF)
|
|
||||||
info->gamma = -1.0;
|
|
||||||
else
|
|
||||||
info->gamma = (edid[0x17] + 100.0) / 100.0;
|
|
||||||
|
|
||||||
/* Features */
|
|
||||||
info->standby = get_bit (edid[0x18], 7);
|
|
||||||
info->suspend = get_bit (edid[0x18], 6);
|
|
||||||
info->active_off = get_bit (edid[0x18], 5);
|
|
||||||
|
|
||||||
if (info->is_digital)
|
|
||||||
{
|
|
||||||
info->connector.digital.rgb444 = TRUE;
|
|
||||||
if (get_bit (edid[0x18], 3))
|
|
||||||
info->connector.digital.ycrcb444 = 1;
|
|
||||||
if (get_bit (edid[0x18], 4))
|
|
||||||
info->connector.digital.ycrcb422 = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int bits = get_bits (edid[0x18], 3, 4);
|
|
||||||
ColorType color_type[4] =
|
|
||||||
{
|
|
||||||
MONOCHROME, RGB, OTHER_COLOR, UNDEFINED_COLOR
|
|
||||||
};
|
|
||||||
|
|
||||||
info->connector.analog.color_type = color_type[bits];
|
|
||||||
}
|
|
||||||
|
|
||||||
info->srgb_is_standard = get_bit (edid[0x18], 2);
|
|
||||||
|
|
||||||
/* In 1.3 this is called "has preferred timing" */
|
|
||||||
info->preferred_timing_includes_native = get_bit (edid[0x18], 1);
|
|
||||||
|
|
||||||
/* FIXME: In 1.3 this indicates whether the monitor accepts GTF */
|
|
||||||
info->continuous_frequency = get_bit (edid[0x18], 0);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static double
|
|
||||||
decode_fraction (int high, int low)
|
|
||||||
{
|
|
||||||
double result = 0.0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
high = (high << 2) | low;
|
|
||||||
|
|
||||||
for (i = 0; i < 10; ++i)
|
|
||||||
result += get_bit (high, i) * pow (2, i - 10);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
decode_color_characteristics (const uchar *edid, MonitorInfo *info)
|
|
||||||
{
|
|
||||||
info->red_x = decode_fraction (edid[0x1b], get_bits (edid[0x19], 6, 7));
|
|
||||||
info->red_y = decode_fraction (edid[0x1c], get_bits (edid[0x19], 5, 4));
|
|
||||||
info->green_x = decode_fraction (edid[0x1d], get_bits (edid[0x19], 2, 3));
|
|
||||||
info->green_y = decode_fraction (edid[0x1e], get_bits (edid[0x19], 0, 1));
|
|
||||||
info->blue_x = decode_fraction (edid[0x1f], get_bits (edid[0x1a], 6, 7));
|
|
||||||
info->blue_y = decode_fraction (edid[0x20], get_bits (edid[0x1a], 4, 5));
|
|
||||||
info->white_x = decode_fraction (edid[0x21], get_bits (edid[0x1a], 2, 3));
|
|
||||||
info->white_y = decode_fraction (edid[0x22], get_bits (edid[0x1a], 0, 1));
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
decode_established_timings (const uchar *edid, MonitorInfo *info)
|
|
||||||
{
|
|
||||||
static const Timing established[][8] =
|
|
||||||
{
|
|
||||||
{
|
|
||||||
{ 800, 600, 60 },
|
|
||||||
{ 800, 600, 56 },
|
|
||||||
{ 640, 480, 75 },
|
|
||||||
{ 640, 480, 72 },
|
|
||||||
{ 640, 480, 67 },
|
|
||||||
{ 640, 480, 60 },
|
|
||||||
{ 720, 400, 88 },
|
|
||||||
{ 720, 400, 70 }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ 1280, 1024, 75 },
|
|
||||||
{ 1024, 768, 75 },
|
|
||||||
{ 1024, 768, 70 },
|
|
||||||
{ 1024, 768, 60 },
|
|
||||||
{ 1024, 768, 87 },
|
|
||||||
{ 832, 624, 75 },
|
|
||||||
{ 800, 600, 75 },
|
|
||||||
{ 800, 600, 72 }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
{ 0, 0, 0 },
|
|
||||||
{ 0, 0, 0 },
|
|
||||||
{ 0, 0, 0 },
|
|
||||||
{ 0, 0, 0 },
|
|
||||||
{ 0, 0, 0 },
|
|
||||||
{ 0, 0, 0 },
|
|
||||||
{ 0, 0, 0 },
|
|
||||||
{ 1152, 870, 75 }
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
int i, j, idx;
|
|
||||||
|
|
||||||
idx = 0;
|
|
||||||
for (i = 0; i < 3; ++i)
|
|
||||||
{
|
|
||||||
for (j = 0; j < 8; ++j)
|
|
||||||
{
|
|
||||||
int byte = edid[0x23 + i];
|
|
||||||
|
|
||||||
if (get_bit (byte, j) && established[i][j].frequency != 0)
|
|
||||||
info->established[idx++] = established[i][j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
decode_standard_timings (const uchar *edid, MonitorInfo *info)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
int first = edid[0x26 + 2 * i];
|
|
||||||
int second = edid[0x27 + 2 * i];
|
|
||||||
|
|
||||||
if (first != 0x01 && second != 0x01)
|
|
||||||
{
|
|
||||||
int w = 8 * (first + 31);
|
|
||||||
int h = 0;
|
|
||||||
|
|
||||||
switch (get_bits (second, 6, 7))
|
|
||||||
{
|
|
||||||
case 0x00: h = (w / 16) * 10; break;
|
|
||||||
case 0x01: h = (w / 4) * 3; break;
|
|
||||||
case 0x02: h = (w / 5) * 4; break;
|
|
||||||
case 0x03: h = (w / 16) * 9; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
info->standard[i].width = w;
|
|
||||||
info->standard[i].height = h;
|
|
||||||
info->standard[i].frequency = get_bits (second, 0, 5) + 60;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
decode_lf_string (const uchar *s, int n_chars, char *result)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < n_chars; ++i)
|
|
||||||
{
|
|
||||||
if (s[i] == 0x0a)
|
|
||||||
{
|
|
||||||
*result++ = '\0';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (s[i] == 0x00)
|
|
||||||
{
|
|
||||||
/* Convert embedded 0's to spaces */
|
|
||||||
*result++ = ' ';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*result++ = s[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
decode_display_descriptor (const uchar *desc,
|
|
||||||
MonitorInfo *info)
|
|
||||||
{
|
|
||||||
switch (desc[0x03])
|
|
||||||
{
|
|
||||||
case 0xFC:
|
|
||||||
decode_lf_string (desc + 5, 13, info->dsc_product_name);
|
|
||||||
break;
|
|
||||||
case 0xFF:
|
|
||||||
decode_lf_string (desc + 5, 13, info->dsc_serial_number);
|
|
||||||
break;
|
|
||||||
case 0xFE:
|
|
||||||
decode_lf_string (desc + 5, 13, info->dsc_string);
|
|
||||||
break;
|
|
||||||
case 0xFD:
|
|
||||||
/* Range Limits */
|
|
||||||
break;
|
|
||||||
case 0xFB:
|
|
||||||
/* Color Point */
|
|
||||||
break;
|
|
||||||
case 0xFA:
|
|
||||||
/* Timing Identifications */
|
|
||||||
break;
|
|
||||||
case 0xF9:
|
|
||||||
/* Color Management */
|
|
||||||
break;
|
|
||||||
case 0xF8:
|
|
||||||
/* Timing Codes */
|
|
||||||
break;
|
|
||||||
case 0xF7:
|
|
||||||
/* Established Timings */
|
|
||||||
break;
|
|
||||||
case 0x10:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
decode_detailed_timing (const uchar *timing,
|
|
||||||
DetailedTiming *detailed)
|
|
||||||
{
|
|
||||||
int bits;
|
|
||||||
StereoType stereo[] =
|
|
||||||
{
|
|
||||||
NO_STEREO, NO_STEREO, FIELD_RIGHT, FIELD_LEFT,
|
|
||||||
TWO_WAY_RIGHT_ON_EVEN, TWO_WAY_LEFT_ON_EVEN,
|
|
||||||
FOUR_WAY_INTERLEAVED, SIDE_BY_SIDE
|
|
||||||
};
|
|
||||||
|
|
||||||
detailed->pixel_clock = (timing[0x00] | timing[0x01] << 8) * 10000;
|
|
||||||
detailed->h_addr = timing[0x02] | ((timing[0x04] & 0xf0) << 4);
|
|
||||||
detailed->h_blank = timing[0x03] | ((timing[0x04] & 0x0f) << 8);
|
|
||||||
detailed->v_addr = timing[0x05] | ((timing[0x07] & 0xf0) << 4);
|
|
||||||
detailed->v_blank = timing[0x06] | ((timing[0x07] & 0x0f) << 8);
|
|
||||||
detailed->h_front_porch = timing[0x08] | get_bits (timing[0x0b], 6, 7) << 8;
|
|
||||||
detailed->h_sync = timing[0x09] | get_bits (timing[0x0b], 4, 5) << 8;
|
|
||||||
detailed->v_front_porch =
|
|
||||||
get_bits (timing[0x0a], 4, 7) | get_bits (timing[0x0b], 2, 3) << 4;
|
|
||||||
detailed->v_sync =
|
|
||||||
get_bits (timing[0x0a], 0, 3) | get_bits (timing[0x0b], 0, 1) << 4;
|
|
||||||
detailed->width_mm = timing[0x0c] | get_bits (timing[0x0e], 4, 7) << 8;
|
|
||||||
detailed->height_mm = timing[0x0d] | get_bits (timing[0x0e], 0, 3) << 8;
|
|
||||||
detailed->right_border = timing[0x0f];
|
|
||||||
detailed->top_border = timing[0x10];
|
|
||||||
|
|
||||||
detailed->interlaced = get_bit (timing[0x11], 7);
|
|
||||||
|
|
||||||
/* Stereo */
|
|
||||||
bits = get_bits (timing[0x11], 5, 6) << 1 | get_bit (timing[0x11], 0);
|
|
||||||
detailed->stereo = stereo[bits];
|
|
||||||
|
|
||||||
/* Sync */
|
|
||||||
bits = timing[0x11];
|
|
||||||
|
|
||||||
detailed->digital_sync = get_bit (bits, 4);
|
|
||||||
if (detailed->digital_sync)
|
|
||||||
{
|
|
||||||
detailed->connector.digital.composite = !get_bit (bits, 3);
|
|
||||||
|
|
||||||
if (detailed->connector.digital.composite)
|
|
||||||
{
|
|
||||||
detailed->connector.digital.serrations = get_bit (bits, 2);
|
|
||||||
detailed->connector.digital.negative_vsync = FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
detailed->connector.digital.serrations = FALSE;
|
|
||||||
detailed->connector.digital.negative_vsync = !get_bit (bits, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
detailed->connector.digital.negative_hsync = !get_bit (bits, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
detailed->connector.analog.bipolar = get_bit (bits, 3);
|
|
||||||
detailed->connector.analog.serrations = get_bit (bits, 2);
|
|
||||||
detailed->connector.analog.sync_on_green = !get_bit (bits, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
decode_descriptors (const uchar *edid, MonitorInfo *info)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int timing_idx;
|
|
||||||
|
|
||||||
timing_idx = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 4; ++i)
|
|
||||||
{
|
|
||||||
int index = 0x36 + i * 18;
|
|
||||||
|
|
||||||
if (edid[index + 0] == 0x00 && edid[index + 1] == 0x00)
|
|
||||||
{
|
|
||||||
decode_display_descriptor (edid + index, info);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
decode_detailed_timing (edid + index, &(info->detailed_timings[timing_idx++]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
info->n_detailed_timings = timing_idx;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
decode_check_sum (const uchar *edid,
|
|
||||||
MonitorInfo *info)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
uchar check = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 128; ++i)
|
|
||||||
check += edid[i];
|
|
||||||
|
|
||||||
info->checksum = check;
|
|
||||||
}
|
|
||||||
|
|
||||||
MonitorInfo *
|
|
||||||
decode_edid (const uchar *edid)
|
|
||||||
{
|
|
||||||
MonitorInfo *info = g_new0 (MonitorInfo, 1);
|
|
||||||
|
|
||||||
decode_check_sum (edid, info);
|
|
||||||
|
|
||||||
if (decode_header (edid)
|
|
||||||
&& decode_vendor_and_product_identification (edid, info)
|
|
||||||
&& decode_edid_version (edid, info)
|
|
||||||
&& decode_display_parameters (edid, info)
|
|
||||||
&& decode_color_characteristics (edid, info)
|
|
||||||
&& decode_established_timings (edid, info)
|
|
||||||
&& decode_standard_timings (edid, info)
|
|
||||||
&& decode_descriptors (edid, info))
|
|
||||||
{
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_free (info);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
195
src/core/edid.h
195
src/core/edid.h
@@ -1,195 +0,0 @@
|
|||||||
/* edid.h
|
|
||||||
*
|
|
||||||
* Copyright 2007, 2008, Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This file is part of the Gnome Library.
|
|
||||||
*
|
|
||||||
* The Gnome Library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Library General Public License as
|
|
||||||
* published by the Free Software Foundation; either version 2 of the
|
|
||||||
* License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* The Gnome Library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Library General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Library General Public
|
|
||||||
* License along with the Gnome Library; see the file COPYING.LIB. If not,
|
|
||||||
* write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
||||||
* Boston, MA 02110-1301, USA.
|
|
||||||
*
|
|
||||||
* Author: Soren Sandmann <sandmann@redhat.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef EDID_H
|
|
||||||
#define EDID_H
|
|
||||||
|
|
||||||
typedef unsigned char uchar;
|
|
||||||
typedef struct MonitorInfo MonitorInfo;
|
|
||||||
typedef struct Timing Timing;
|
|
||||||
typedef struct DetailedTiming DetailedTiming;
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
UNDEFINED,
|
|
||||||
DVI,
|
|
||||||
HDMI_A,
|
|
||||||
HDMI_B,
|
|
||||||
MDDI,
|
|
||||||
DISPLAY_PORT
|
|
||||||
} Interface;
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
UNDEFINED_COLOR,
|
|
||||||
MONOCHROME,
|
|
||||||
RGB,
|
|
||||||
OTHER_COLOR
|
|
||||||
} ColorType;
|
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
NO_STEREO,
|
|
||||||
FIELD_RIGHT,
|
|
||||||
FIELD_LEFT,
|
|
||||||
TWO_WAY_RIGHT_ON_EVEN,
|
|
||||||
TWO_WAY_LEFT_ON_EVEN,
|
|
||||||
FOUR_WAY_INTERLEAVED,
|
|
||||||
SIDE_BY_SIDE
|
|
||||||
} StereoType;
|
|
||||||
|
|
||||||
struct Timing
|
|
||||||
{
|
|
||||||
int width;
|
|
||||||
int height;
|
|
||||||
int frequency;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct DetailedTiming
|
|
||||||
{
|
|
||||||
int pixel_clock;
|
|
||||||
int h_addr;
|
|
||||||
int h_blank;
|
|
||||||
int h_sync;
|
|
||||||
int h_front_porch;
|
|
||||||
int v_addr;
|
|
||||||
int v_blank;
|
|
||||||
int v_sync;
|
|
||||||
int v_front_porch;
|
|
||||||
int width_mm;
|
|
||||||
int height_mm;
|
|
||||||
int right_border;
|
|
||||||
int top_border;
|
|
||||||
int interlaced;
|
|
||||||
StereoType stereo;
|
|
||||||
|
|
||||||
int digital_sync;
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
int bipolar;
|
|
||||||
int serrations;
|
|
||||||
int sync_on_green;
|
|
||||||
} analog;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
int composite;
|
|
||||||
int serrations;
|
|
||||||
int negative_vsync;
|
|
||||||
int negative_hsync;
|
|
||||||
} digital;
|
|
||||||
} connector;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MonitorInfo
|
|
||||||
{
|
|
||||||
int checksum;
|
|
||||||
char manufacturer_code[4];
|
|
||||||
int product_code;
|
|
||||||
unsigned int serial_number;
|
|
||||||
|
|
||||||
int production_week; /* -1 if not specified */
|
|
||||||
int production_year; /* -1 if not specified */
|
|
||||||
int model_year; /* -1 if not specified */
|
|
||||||
|
|
||||||
int major_version;
|
|
||||||
int minor_version;
|
|
||||||
|
|
||||||
int is_digital;
|
|
||||||
|
|
||||||
union
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
int bits_per_primary;
|
|
||||||
Interface interface;
|
|
||||||
int rgb444;
|
|
||||||
int ycrcb444;
|
|
||||||
int ycrcb422;
|
|
||||||
} digital;
|
|
||||||
|
|
||||||
struct
|
|
||||||
{
|
|
||||||
double video_signal_level;
|
|
||||||
double sync_signal_level;
|
|
||||||
double total_signal_level;
|
|
||||||
|
|
||||||
int blank_to_black;
|
|
||||||
|
|
||||||
int separate_hv_sync;
|
|
||||||
int composite_sync_on_h;
|
|
||||||
int composite_sync_on_green;
|
|
||||||
int serration_on_vsync;
|
|
||||||
ColorType color_type;
|
|
||||||
} analog;
|
|
||||||
} connector;
|
|
||||||
|
|
||||||
int width_mm; /* -1 if not specified */
|
|
||||||
int height_mm; /* -1 if not specified */
|
|
||||||
double aspect_ratio; /* -1.0 if not specififed */
|
|
||||||
|
|
||||||
double gamma; /* -1.0 if not specified */
|
|
||||||
|
|
||||||
int standby;
|
|
||||||
int suspend;
|
|
||||||
int active_off;
|
|
||||||
|
|
||||||
int srgb_is_standard;
|
|
||||||
int preferred_timing_includes_native;
|
|
||||||
int continuous_frequency;
|
|
||||||
|
|
||||||
double red_x;
|
|
||||||
double red_y;
|
|
||||||
double green_x;
|
|
||||||
double green_y;
|
|
||||||
double blue_x;
|
|
||||||
double blue_y;
|
|
||||||
double white_x;
|
|
||||||
double white_y;
|
|
||||||
|
|
||||||
Timing established[24]; /* Terminated by 0x0x0 */
|
|
||||||
Timing standard[8];
|
|
||||||
|
|
||||||
int n_detailed_timings;
|
|
||||||
DetailedTiming detailed_timings[4]; /* If monitor has a preferred
|
|
||||||
* mode, it is the first one
|
|
||||||
* (whether it has, is
|
|
||||||
* determined by the
|
|
||||||
* preferred_timing_includes
|
|
||||||
* bit.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Optional product description */
|
|
||||||
char dsc_serial_number[14];
|
|
||||||
char dsc_product_name[14];
|
|
||||||
char dsc_string[14]; /* Unspecified ASCII data */
|
|
||||||
};
|
|
||||||
|
|
||||||
MonitorInfo *decode_edid (const uchar *data);
|
|
||||||
char *make_display_name (const MonitorInfo *info);
|
|
||||||
char *make_display_size_string (int width_mm, int height_mm);
|
|
||||||
|
|
||||||
#endif
|
|
@@ -15,7 +15,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -18,7 +18,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
@@ -45,11 +47,13 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
XSetWindowAttributes attrs;
|
XSetWindowAttributes attrs;
|
||||||
Visual *visual;
|
Visual *visual;
|
||||||
gulong create_serial;
|
gulong create_serial;
|
||||||
MetaStackWindow stack_window;
|
|
||||||
|
|
||||||
if (window->frame)
|
if (window->frame)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* See comment below for why this is required. */
|
||||||
|
meta_display_grab (window->display);
|
||||||
|
|
||||||
frame = g_new (MetaFrame, 1);
|
frame = g_new (MetaFrame, 1);
|
||||||
|
|
||||||
frame->window = window;
|
frame->window = window;
|
||||||
@@ -64,7 +68,6 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
|
|
||||||
frame->mapped = FALSE;
|
frame->mapped = FALSE;
|
||||||
frame->is_flashing = FALSE;
|
frame->is_flashing = FALSE;
|
||||||
frame->borders_cached = FALSE;
|
|
||||||
|
|
||||||
meta_verbose ("Framing window %s: visual %s default, depth %d default depth %d\n",
|
meta_verbose ("Framing window %s: visual %s default, depth %d default depth %d\n",
|
||||||
window->desc,
|
window->desc,
|
||||||
@@ -102,10 +105,8 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
frame->rect.height,
|
frame->rect.height,
|
||||||
frame->window->screen->number,
|
frame->window->screen->number,
|
||||||
&create_serial);
|
&create_serial);
|
||||||
stack_window.any.type = META_WINDOW_CLIENT_TYPE_X11;
|
|
||||||
stack_window.x11.xwindow = frame->xwindow;
|
|
||||||
meta_stack_tracker_record_add (window->screen->stack_tracker,
|
meta_stack_tracker_record_add (window->screen->stack_tracker,
|
||||||
&stack_window,
|
frame->xwindow,
|
||||||
create_serial);
|
create_serial);
|
||||||
|
|
||||||
meta_verbose ("Frame for %s is 0x%lx\n", frame->window->desc, frame->xwindow);
|
meta_verbose ("Frame for %s is 0x%lx\n", frame->window->desc, frame->xwindow);
|
||||||
@@ -115,6 +116,14 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
|
|
||||||
meta_display_register_x_window (window->display, &frame->xwindow, window);
|
meta_display_register_x_window (window->display, &frame->xwindow, window);
|
||||||
|
|
||||||
|
/* Reparent the client window; it may be destroyed,
|
||||||
|
* thus the error trap. We'll get a destroy notify later
|
||||||
|
* and free everything. Comment in FVWM source code says
|
||||||
|
* we need a server grab or the child can get its MapNotify
|
||||||
|
* before we've finished reparenting and getting the decoration
|
||||||
|
* window onscreen, so ensure_frame must be called with
|
||||||
|
* a grab.
|
||||||
|
*/
|
||||||
meta_error_trap_push (window->display);
|
meta_error_trap_push (window->display);
|
||||||
if (window->mapped)
|
if (window->mapped)
|
||||||
{
|
{
|
||||||
@@ -129,9 +138,8 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
window->rect.x = 0;
|
window->rect.x = 0;
|
||||||
window->rect.y = 0;
|
window->rect.y = 0;
|
||||||
|
|
||||||
stack_window.x11.xwindow = window->xwindow;
|
|
||||||
meta_stack_tracker_record_remove (window->screen->stack_tracker,
|
meta_stack_tracker_record_remove (window->screen->stack_tracker,
|
||||||
&stack_window,
|
window->xwindow,
|
||||||
XNextRequest (window->display->xdisplay));
|
XNextRequest (window->display->xdisplay));
|
||||||
XReparentWindow (window->display->xdisplay,
|
XReparentWindow (window->display->xdisplay,
|
||||||
window->xwindow,
|
window->xwindow,
|
||||||
@@ -157,6 +165,8 @@ meta_window_ensure_frame (MetaWindow *window)
|
|||||||
|
|
||||||
/* Move keybindings to frame instead of window */
|
/* Move keybindings to frame instead of window */
|
||||||
meta_window_grab_keys (window);
|
meta_window_grab_keys (window);
|
||||||
|
|
||||||
|
meta_display_ungrab (window->display);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -164,7 +174,6 @@ meta_window_destroy_frame (MetaWindow *window)
|
|||||||
{
|
{
|
||||||
MetaFrame *frame;
|
MetaFrame *frame;
|
||||||
MetaFrameBorders borders;
|
MetaFrameBorders borders;
|
||||||
MetaStackWindow stack_window;
|
|
||||||
|
|
||||||
if (window->frame == NULL)
|
if (window->frame == NULL)
|
||||||
return;
|
return;
|
||||||
@@ -191,10 +200,8 @@ meta_window_destroy_frame (MetaWindow *window)
|
|||||||
"Incrementing unmaps_pending on %s for reparent back to root\n", window->desc);
|
"Incrementing unmaps_pending on %s for reparent back to root\n", window->desc);
|
||||||
window->unmaps_pending += 1;
|
window->unmaps_pending += 1;
|
||||||
}
|
}
|
||||||
stack_window.any.type = META_WINDOW_CLIENT_TYPE_X11;
|
|
||||||
stack_window.x11.xwindow = window->xwindow;
|
|
||||||
meta_stack_tracker_record_add (window->screen->stack_tracker,
|
meta_stack_tracker_record_add (window->screen->stack_tracker,
|
||||||
&stack_window,
|
window->xwindow,
|
||||||
XNextRequest (window->display->xdisplay));
|
XNextRequest (window->display->xdisplay));
|
||||||
XReparentWindow (window->display->xdisplay,
|
XReparentWindow (window->display->xdisplay,
|
||||||
window->xwindow,
|
window->xwindow,
|
||||||
@@ -320,23 +327,22 @@ meta_frame_calc_borders (MetaFrame *frame,
|
|||||||
if (frame == NULL)
|
if (frame == NULL)
|
||||||
meta_frame_borders_clear (borders);
|
meta_frame_borders_clear (borders);
|
||||||
else
|
else
|
||||||
{
|
meta_ui_get_frame_borders (frame->window->screen->ui,
|
||||||
if (!frame->borders_cached)
|
frame->xwindow,
|
||||||
{
|
borders);
|
||||||
meta_ui_get_frame_borders (frame->window->screen->ui,
|
|
||||||
frame->xwindow,
|
|
||||||
&frame->cached_borders);
|
|
||||||
frame->borders_cached = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
*borders = frame->cached_borders;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_frame_clear_cached_borders (MetaFrame *frame)
|
meta_frame_get_corner_radiuses (MetaFrame *frame,
|
||||||
|
float *top_left,
|
||||||
|
float *top_right,
|
||||||
|
float *bottom_left,
|
||||||
|
float *bottom_right)
|
||||||
{
|
{
|
||||||
frame->borders_cached = FALSE;
|
meta_ui_get_corner_radiuses (frame->window->screen->ui,
|
||||||
|
frame->xwindow,
|
||||||
|
top_left, top_right,
|
||||||
|
bottom_left, bottom_right);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@@ -394,14 +400,6 @@ meta_frame_get_frame_bounds (MetaFrame *frame)
|
|||||||
frame->rect.height);
|
frame->rect.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_frame_get_mask (MetaFrame *frame,
|
|
||||||
cairo_t *cr)
|
|
||||||
{
|
|
||||||
meta_ui_get_frame_mask (frame->window->screen->ui, frame->xwindow,
|
|
||||||
frame->rect.width, frame->rect.height, cr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_frame_queue_draw (MetaFrame *frame)
|
meta_frame_queue_draw (MetaFrame *frame)
|
||||||
{
|
{
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_FRAME_PRIVATE_H
|
#ifndef META_FRAME_PRIVATE_H
|
||||||
@@ -39,8 +41,6 @@ struct _MetaFrame
|
|||||||
*/
|
*/
|
||||||
MetaRectangle rect;
|
MetaRectangle rect;
|
||||||
|
|
||||||
MetaFrameBorders cached_borders; /* valid if borders_cached is set */
|
|
||||||
|
|
||||||
/* position of client, size of frame */
|
/* position of client, size of frame */
|
||||||
int child_x;
|
int child_x;
|
||||||
int child_y;
|
int child_y;
|
||||||
@@ -50,7 +50,6 @@ struct _MetaFrame
|
|||||||
guint mapped : 1;
|
guint mapped : 1;
|
||||||
guint need_reapply_frame_shape : 1;
|
guint need_reapply_frame_shape : 1;
|
||||||
guint is_flashing : 1; /* used by the visual bell flash */
|
guint is_flashing : 1; /* used by the visual bell flash */
|
||||||
guint borders_cached : 1;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void meta_window_ensure_frame (MetaWindow *window);
|
void meta_window_ensure_frame (MetaWindow *window);
|
||||||
@@ -64,18 +63,19 @@ Window meta_frame_get_xwindow (MetaFrame *frame);
|
|||||||
void meta_frame_calc_borders (MetaFrame *frame,
|
void meta_frame_calc_borders (MetaFrame *frame,
|
||||||
MetaFrameBorders *borders);
|
MetaFrameBorders *borders);
|
||||||
|
|
||||||
|
void meta_frame_get_corner_radiuses (MetaFrame *frame,
|
||||||
|
float *top_left,
|
||||||
|
float *top_right,
|
||||||
|
float *bottom_left,
|
||||||
|
float *bottom_right);
|
||||||
|
|
||||||
gboolean meta_frame_sync_to_window (MetaFrame *frame,
|
gboolean meta_frame_sync_to_window (MetaFrame *frame,
|
||||||
int gravity,
|
int gravity,
|
||||||
gboolean need_move,
|
gboolean need_move,
|
||||||
gboolean need_resize);
|
gboolean need_resize);
|
||||||
|
|
||||||
void meta_frame_clear_cached_borders (MetaFrame *frame);
|
|
||||||
|
|
||||||
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
|
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
|
||||||
|
|
||||||
void meta_frame_get_mask (MetaFrame *frame,
|
|
||||||
cairo_t *cr);
|
|
||||||
|
|
||||||
void meta_frame_set_screen_cursor (MetaFrame *frame,
|
void meta_frame_set_screen_cursor (MetaFrame *frame,
|
||||||
MetaCursor cursor);
|
MetaCursor cursor);
|
||||||
|
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_GROUP_PRIVATE_H
|
#ifndef META_GROUP_PRIVATE_H
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef META_GROUP_PROPS_H
|
#ifndef META_GROUP_PROPS_H
|
||||||
|
@@ -15,7 +15,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -16,7 +16,9 @@
|
|||||||
* General Public License for more details.
|
* General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user