Compare commits

..

41 Commits

Author SHA1 Message Date
Cédric Valmary
b05e592d16 Update Occitan translation 2016-10-11 18:50:33 +00:00
Cédric Valmary
a57740648a Update Occitan translation 2016-10-11 18:40:01 +00:00
Cédric Valmary
dd7b3f6d8d Update Occitan translation 2016-10-11 17:54:16 +00:00
Pedro Albuquerque
d8d8d36ffb Updated Portuguese translation 2015-10-07 09:06:50 +00:00
Adel Gadllah
72ec20e48f background: Do not assume GLSL is available
Some hardware does not support it causing crashes in cogl during paint.

https://bugzilla.gnome.org/show_bug.cgi?id=733623
2014-07-24 16:58:06 +02:00
Alberto Milone
3d1d155561 xrandr: ignore the error if setting the primary output fails
Some drivers which support RandR 1.4 may not support setting
or getting the primary output, therefore mutter should trap
and ignore any relevant errors.

The modesetting driver exposes this problem when used in
combination with the nvidia binary driver using RandR 1.4
offloading.

Also use a local display variable instead of calling
meta_get_display () every time.
2014-04-22 11:05:30 +02:00
Florian Müllner
7943cf50d4 window-actor: Guard against %NULL frame mask
Creating a new cogl texture may fail, in which case the intent to
free it will crash. While something is clearly wrong (insanely
large window, oom, ...), crashing the WM is harsh and we should
try to avoid it if at all possible, so carry on.

https://bugzilla.gnome.org/show_bug.cgi?id=722266
2014-04-10 15:03:19 +02:00
Florian Müllner
489ad9e978 Bump version to 3.10.4
Update NEWS.
2014-02-19 19:40:16 +01:00
Ryan Lortie
a3f3c60a6c idle-monitor: avoid XSyncBadAlarm X error
If we fail to find the IDLETIME counter, then the alarm variable will be
uninitialised.  Most code paths are careful to check this before
submitting XSync calls, but there is one check missing.

https://bugzilla.gnome.org/show_bug.cgi?id=724364
2014-02-15 13:14:29 +01:00
Giovanni Campagna
b39ef6a961 window: don't set _NET_WM_FULLSCREEN_MONITORS to bogus values
Prior to the DisplayConfig merge, we would set _NET_WM_FULLSCREEN_MONITORS
to (unsigned)-1 when unset. After that, we would have invalid
reads inside meta_screen_monitor_index_to_xinerama_index() (called
with -1).
The way I read the specification, the proper way to indicate
that the window is back to fullscreen on all monitors is to
remove the property, so do that.

Also, add an assertion that meta_screne_monitor_index_to_xinerama_index()
is doing the right thing.

https://bugzilla.gnome.org/show_bug.cgi?id=724258
2014-02-13 13:19:32 +01:00
Khaled Hosny
14dbe8ac8a Update Arabic translation 2014-02-06 15:37:28 +02:00
Shankar Prasad
d158e19133 updated kn.po 2014-02-05 16:27:18 +05:30
Robert Ancell
c2dadecab8 xrandr: Use specified output property name for backlight control
Backlight controls are set using the "BACKLIGHT" XRANDR output property.
This should be "Backlight" according to the XRANDR spec [1].

Some drivers (Intel) export both properties and some only the specified property (nvidia).
Users of drivers that only export the specified property cannot change their backlight using XRANDR.

[1] http://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt section 9.1

https://bugzilla.gnome.org/show_bug.cgi?id=723606
2014-02-05 09:48:01 +01:00
Adel Gadllah
099059c930 monitorManager: Fix logic bug in make_logical_config
The code that prevents the creation of multiple MonitorInfos for clones
wasn't working due to using the wrong index when getting the already
created info so fix that to use the correct one.

https://bugzilla.gnome.org/show_bug.cgi?id=710610
2014-02-02 15:16:04 +01:00
Adel Gadllah
24f5b37d6b window_actor: Remove the frame_messages timeout in destroy
Otherwise it might fire off later and cause a crash.

https://bugzilla.gnome.org/show_bug.cgi?id=723468
2014-02-02 15:16:02 +01:00
Adel Gadllah
2958b15a61 window-actor: Fix unobscured_region handling when computing paint volume
We currently ignore the unobscured region when we have mapped clones in
meta_window_actor_process_damage and meta_window_actor_damage_all but
use it unconditionally when computing the paint volume.

This is wrong. We should ignore it there as well or we will end up with
empty clones if the cloned window is completly obscured
(like the tray icons in gnome-shell).

https://bugzilla.gnome.org/show_bug.cgi?id=721596
2014-01-31 15:27:20 +01:00
Jasper St. Pierre
fd263d8457 window-actor: Fix optimization in get_paint_volume
We need to clip the paint volume to the unobscured region, not the
other way around...

https://bugzilla.gnome.org/show_bug.cgi?id=720630
2014-01-31 15:27:04 +01:00
Florian Müllner
47758f0f5f window: Add "skip-taskbar" property
We currently only have a method to query the skip-taskbar hint.
Add a corresponding property to allow listening for change
notifications.

https://bugzilla.gnome.org/show_bug.cgi?id=723307
2014-01-31 10:09:36 +01:00
Jasper St. Pierre
477eb1afed constraints: CSD windows need to have their titlebar kept onscreen too
GTK+ CSD windows are considered undecorated by the code, so we should
not force ourselves to only run on decorated windows.

https://bugzilla.gnome.org/show_bug.cgi?id=719772
2014-01-29 12:26:41 -05:00
Florian Müllner
3b8b05518c Bump version to 3.10.3
Update NEWS.
2014-01-15 15:21:39 +01:00
Daniel Drake
0bd30696b1 window: don't grab server during calc_showing
This grab was added in commit caf43a123f
https://bugzilla.gnome.org/show_bug.cgi?id=381127
to minimize window flickering when switching workspaces.

While this grab is held, some signals are emitted to the shell,
which can lead to deadlocks (reproduced under Mali binary OpenGLESv2
drivers).

Now that we are a compositing window manager, we do not have to
worry about flickers, this grab should no longer be necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=721709
2014-01-07 14:26:35 -06:00
Daniel Drake
fb4e9d2232 Reduce server grabs during window creation
Remove some obvious server grabs from the window creation codepath,
also ones that are taken at startup.

During startup, there is no need to grab: we install the event handlers
before querying for the already-existing windows, so there is no danger
that we will 'lose' some window. We might try to create a window twice
(if it comes back in the original query and then we get an event for it)
but the code is already protected against such conditions.

When windows are created later, we also do not need grabs, we just need
appropriate error checking as the window may be destroyed at any time
(or it may have already been destroyed).

The stack tracker is unaffected here - as it listens to CreateNotify and
DestroyNotify events and responds directly, the internal stack
representation will always be consistent even if the window goes away while
we are processing MapRequest or similar.

https://bugzilla.gnome.org/show_bug.cgi?id=721345
2014-01-06 16:16:31 -06:00
Daniel Drake
e072295395 meta_window_new: clean up error handling
The return code of XGetWindowAttributes() indicates whether an error
was encountered or not. There is no need to specifically check the error
trap.

The trap around XAddToSaveSet() was superfluous. We have a global error
trap to ignore any errors here, and there is no need to XSync() as GDK
will later ignore the error asynchronously if one is raised.

Also move common error exit path to an error label.

https://bugzilla.gnome.org/show_bug.cgi?id=721345
2014-01-06 16:16:23 -06:00
Daniel Drake
1066c19e67 screen: use stack tracker for initial window query
In meta_screen_manage_all_windows() we can use our own stack
tracker to get the list of windows - no need to query X again.

A copy is needed because the stack gets modified as part of the loop.
Specifically, meta_stack_tracker_get_stack() at this time returns the
predicted stack, and meta_window_new() performs a few operations
(e.g. framing) which cause immediate changes to the predicted stack.

https://bugzilla.gnome.org/show_bug.cgi?id=721345
2014-01-06 16:16:15 -06:00
Daniel Drake
d654c93ed2 frame: remove unnecessary server grab
meta_window_ensure_frame() creates its own grab and has a comment
claiming that it must be called under a grab too.

But the reasoning given in the comment does not seem relevant here.
We only frame non-override-redirect windows, so we are creating
the frame in response to MapRequest. There is no way that the child
could receive a MapNotify at this point, since that only happens
much later, once we go through the CALC_SHOWING queue and call
XMapWindow() from meta_window_show().

Remove the unnecessary grab.

https://bugzilla.gnome.org/show_bug.cgi?id=721345
2014-01-06 16:16:07 -06:00
Daniel Drake
7d1611f666 Discourage server grabs
Server grabs are not as evil as you might expect, but there is agreement
in that their usage should be limited.

Server grabs can cause things to go rather wrong when mutter emits
a signal while it has grabbed the server. If the receiver of that signal
waits for a synchronous action performed by another client, then you
have a deadlock. This happens with Mali binary GLESv2 drivers :(

https://bugzilla.gnome.org/show_bug.cgi?id=721345
2014-01-06 16:15:58 -06:00
Daniel Drake
2579e48f21 Remove meta_window_new_with_attrs
The compositor code used to handle X windows that didn't have a
corresponding MetaWindow (see commit d538690b), which is why the
attribute query is separated.

As that doesn't happen any more, we can clean up. No functional changes.

Suggested by Owen Taylor.

https://bugzilla.gnome.org/show_bug.cgi?id=721345
2014-01-06 16:15:50 -06:00
Owen W. Taylor
7278f9bd6b display: Don't leave focus on a window we are unmanaging when sending WM_TAKE_FOCUS
When we move focus elsewhere when unmanaging a window, we *need* to move
the focus, so if the target is globally active, move the focus to the
no-focus-window in anticipation that the focus will normally get moved
to the right window when the target window responds to WM_TAKE_FOCUS.

If the window doesn't respond to WM_TAKE_FOCUS, then focus will be left
on the no-focus-window, but there's no way to distinguish whether the
app will respond or not.

https://bugzilla.gnome.org/show_bug.cgi?id=711618
2013-12-24 11:30:04 -05:00
Owen W. Taylor
da55e27c3b Be willing to unfocus the grab window when we are unmanaging it
When we are unmanaging the grab window, we /need/ to unfocus it,
so we shouldn't bail out early from meta_window_focus().

https://bugzilla.gnome.org/show_bug.cgi?id=711618
2013-12-24 11:29:53 -05:00
Owen W. Taylor
f3196e356b Fix problems with focus tracking
When a client spontaneously focuses their window, perhaps in response
to WM_TAKE_FOCUS we'll get a FocusOut/FocusIn pair with same serial.
Updating display->focus_serial in response to FocusOut then was causing
us to ignore FocusIn and think that the focus was not on any window.

We need to distinguish this spontaneous case from the case where we
set the focus ourselves - when we set the focus ourselves, we're careful
to combine the SetFocus with a property change so that we know definitively
what focus events we have already accounted for.

https://bugzilla.gnome.org/show_bug.cgi?id=720558
2013-12-18 09:41:49 -05:00
Jasper St. Pierre
491b17af19 display: Fix checks for KeyPress/ButtonPress
https://bugzilla.gnome.org/show_bug.cgi?id=720545
2013-12-16 15:13:25 -05:00
Owen W. Taylor
01e0eaf1fc MetaWindowGroup: fix paint volume
In the past, MetaWindowGroup was allocated the size of the screen and
painted the size of the screen because it contained the screen background,
but now we also have the "top window group" which contains only popup
windows, so the allocation doesn't properly reflect the paint bounds
of the window group. Compute the paint bounds accurately from the
children.

https://bugzilla.gnome.org/show_bug.cgi?id=719669
2013-12-09 15:29:33 -05:00
甘露(Gan Lu)
f679ce7017 Update Chinese simplified translation 2013-12-07 15:03:56 +08:00
Jasper St. Pierre
844f4e9348 display: Don't focus the no-focus-window when sending WM_TAKE_FOCUS to a globally active window
Clients like on-screen keyboards try not to take focus when the user clicks
on their window by setting the Input hint to false. However, due to GTK+ and
GDK bugs, the public API for setting the Input hint to false don't remove
WM_TAKE_FOCUS from WM_PROTOCOLS, unintentionally putting them into Globally
Active mode.

These clients also expect that since they don't want to take focus, they want
the focus to remain on the existing window. In this case, for clients like
on-screen keyboards, it's so they can send synthesized keyboard events to the
focused window.

https://bugzilla.gnome.org/show_bug.cgi?id=710296
2013-12-04 11:09:57 -05:00
Marc-André Lureau
5cfc1461a1 xrandr: use "hotplug_mode_update" property
Use the "hotplug_mode_update" connector property indicating that the
screen settings should be updated: get a new preferred mode on hotplug
events to handle dynamic guest resizing (where you resize the host
window and the guest resizes with it).

https://bugzilla.gnome.org/show_bug.cgi?id=711216
2013-11-14 14:57:23 +01:00
Florian Müllner
323e1aba59 Bump version to 3.10.2
Update NEWS.
2013-11-14 12:28:08 +00:00
Lionel Landwerlin
992b97d565 window: don't ignore resize button release event for move/resize actions
https://bugzilla.gnome.org/show_bug.cgi?id=710251
2013-11-04 13:53:21 +00:00
Reinout van Schouwen
da5b9f3255 Updated Dutch translation 2013-10-25 00:24:34 +02:00
Efstathios Iosifidis
6c1eff0dc2 Updated Greek translation 2013-10-24 11:05:09 +03:00
Florian Müllner
1ff986e227 Bump version to 3.10.1.1
Update NEWS.
2013-10-15 23:42:40 +02:00
Giovanni Campagna
b86a289ee3 monitor-config: prevent assert that at least one output is connected
Apparently some connector technologies don't distinguish between
on and off, and there might be valid use cases for running without
any connected monitor.
In that case, just avoid any configuration at all.

https://bugzilla.gnome.org/show_bug.cgi?id=709009
2013-10-15 23:22:05 +02:00
58 changed files with 2769 additions and 6686 deletions

View File

@@ -8,5 +8,3 @@ 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}

63
NEWS
View File

@@ -1,47 +1,52 @@
3.11.3 3.10.4
======
* Fix CSD titlebars being placed off-screen [Jasper; #719772]
* Expose MetaWindow:skip-taskbar property [Florian; #723307]
* Fix legacy tray icons showing up blank [Adel; #721596]
* Fix configuration of cloned monitors [Adel; #710610]
* Use correct output property for backlight control [Robert; #723606]
* Misc. bug fixes [Jasper, Adel, Giovanni, Ryan; #720630, #723468, #724258,
#724364]
Contributors:
Robert Ancell, Giovanni Campagna, Adel Gadllah, Ryan Lortie, Florian Müllner,
Jasper St. Pierre
Translations:
Shankar Prasad [kn], Khaled Hosny [ar]
3.10.3
====== ======
* xrandr: Use "hotplug_mode_update" property [Marc-André; #711216] * xrandr: Use "hotplug_mode_update" property [Marc-André; #711216]
* Fix position of attached dialogs for CSD windows [Giovanni, Owen; #707194] * Don't focus the no-focus-window for globally active windows [Jasper; #710296]
* Fix focus issues with external OSKs [Jasper; #715030]
* Add a MetaCullable interface [Jasper; #714706]
* Fix window group paint volume [Owen; #719669] * Fix window group paint volume [Owen; #719669]
* Fix frame extents problems [Owen; #714707] * Fix checks for KeyPress/ButtonPress [Jasper; #720545]
* Add shortcut to move windows between monitors [Florian; #671054]
* Fix problems with focus tracking [Owen; #720558] * Fix problems with focus tracking [Owen; #720558]
* Misc. bug fixes and cleanups [Rui, Jasper, Owen; #712833, #678989, #720106, * Don't leave focus on windows that are being unmanaged [Owen; #711618]
#720417, #720630] * Reduce server grabs [Daniel; #721345, #721709]
Contributors: Contributors:
Robert Bragg, Giovanni Campagna, Marc-André Lureau, Rui Matos, Alberto Milone, Daniel Drake, Marc-André Lureau, Jasper St. Pierre, Owen W. Taylor
Florian Müllner, Sindhu S, Jasper St. Pierre, Rico Tzschichholz,
Owen W. Taylor
Translations: Translations:
甘露(Gan Lu) [zh_CN], Khaled Hosny [ar] 甘露(Gan Lu) [zh_CN]
3.11.2 3.10.2
====== ======
* Fix resize operations using mouse-button-modifier [Lionel; #710251] * Fix resize operations using mouse-button-modifier [Lionel; #710251]
* Misc. fixes and cleanups [Jasper, Rico, Florian; #711731]
Contributors: Contributors:
Lionel Landwerlin, Florian Müllner, Jasper St. Pierre, Rico Tzschichholz Lionel Landwerlin
3.11.1
======
* Don't require at least one output device to be connected [Giovanni; #709009]
* Name the guard window [Andrew; #710346]
* Use new UPower API [Bastien]
* Expose min-backlight-step [Asad; #710380]
* Don't focus the no-focus-window for globally active windows [Jasper; #710296]
* Misc. fixes and cleanups [Jasper, Rico, Olav, Magdalen; #709776]
Contributors:
Magdalen Berns, Giovanni Campagna, Asad Mehmood, Bastien Nocera,
Jasper St. Pierre, Rico Tzschichholz, Olav Vitters, Andrew Walton
Translations: Translations:
Reinout van Schouwen [nl] Efstathios Iosifidis [el], Reinout van Schouwen [nl]
3.10.1.1
========
* Don't assert that at least one output is connected [Giovanni; #709009]
Contributors:
Giovanni Campagna
3.10.1 3.10.1
====== ======

View File

@@ -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], [10])
m4_define([mutter_micro_version], [3]) m4_define([mutter_micro_version], [4])
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])
@@ -77,7 +76,7 @@ MUTTER_PC_MODULES="
xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0 xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0
$CLUTTER_PACKAGE >= 1.15.90 $CLUTTER_PACKAGE >= 1.15.90
cogl-1.0 >= 1.15.6 cogl-1.0 >= 1.15.6
upower-glib >= 0.99.0 upower-glib > 0.9.11
gnome-desktop-3.0 gnome-desktop-3.0
" "

View File

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

View File

@@ -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
@@ -558,10 +542,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

View File

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

View File

@@ -4,14 +4,14 @@
# Arafat Medini <lumina@silverpen.de>, 2003. # Arafat Medini <lumina@silverpen.de>, 2003.
# Abdulaziz Al-Arfaj <alarfaj0@yahoo.com>, 2004. # Abdulaziz Al-Arfaj <alarfaj0@yahoo.com>, 2004.
# Djihed Afifi <djihed@gmail.com>, 2006. # Djihed Afifi <djihed@gmail.com>, 2006.
# Khaled Hosny <khaledhosny@eglug.org>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013. # Khaled Hosny <khaledhosny@eglug.org>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014.
# Anas Afif Emad <anas.e87@gmail.com>, 2008. # Anas Afif Emad <anas.e87@gmail.com>, 2008.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: metacity.HEAD\n" "Project-Id-Version: metacity.HEAD\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-12-11 06:55+0200\n" "POT-Creation-Date: 2014-02-06 15:37+0200\n"
"PO-Revision-Date: 2013-12-11 06:57+0200\n" "PO-Revision-Date: 2014-02-06 15:37+0200\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n" "Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n" "Language-Team: Arabic <doc@arabeyes.org>\n"
"Language: ar\n" "Language: ar\n"
@@ -212,7 +212,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:571 #: ../src/compositor/compositor.c:596
#, 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"
@@ -255,12 +255,12 @@ msgstr "ا_نتظر"
msgid "_Force Quit" msgid "_Force Quit"
msgstr "أ_جبر الإنهاء" msgstr "أ_جبر الإنهاء"
#: ../src/core/display.c:415 #: ../src/core/display.c:422
#, 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:507 #: ../src/core/display.c:514
#, 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 "فشل فتح عرض نظام نوافذ إكس '%s'\n" msgstr "فشل فتح عرض نظام نوافذ إكس '%s'\n"
@@ -382,12 +382,12 @@ msgstr ""
msgid "Workspace %d" msgid "Workspace %d"
msgstr "مساحة العمل %d" msgstr "مساحة العمل %d"
#: ../src/core/screen.c:540 #: ../src/core/screen.c:537
#, 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:556 #: ../src/core/screen.c:553
#, 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 --"
@@ -396,18 +396,18 @@ msgstr ""
"الشاشة %d على العرض \"%s\" لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل " "الشاشة %d على العرض \"%s\" لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل "
"--replace لتحُلّ محلّ مدير النوافذ الحالي.\n" "--replace لتحُلّ محلّ مدير النوافذ الحالي.\n"
#: ../src/core/screen.c:583 #: ../src/core/screen.c:580
#, 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 "لا يمكن الحصول على اختيار مدير النوافذ على الشاشة %d العرض \"%s\"\n" msgstr "لا يمكن الحصول على اختيار مدير النوافذ على الشاشة %d العرض \"%s\"\n"
#: ../src/core/screen.c:661 #: ../src/core/screen.c:658
#, 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:853 #: ../src/core/screen.c:850
#, 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"
@@ -503,7 +503,7 @@ msgid "Window manager error: "
msgstr "خطأ مدير النوافذ: " msgstr "خطأ مدير النوافذ: "
#. first time through #. first time through
#: ../src/core/window.c:7615 #: ../src/core/window.c:7497
#, 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 "
@@ -519,7 +519,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:8537 #: ../src/core/window.c:8329
#, 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 "
@@ -528,22 +528,22 @@ msgstr ""
"ضبطت النافذة %s تلميحة MWM يدل على انه لا يمكن تحجيمها، لكنها تضبط الحجم " "ضبطت النافذة %s تلميحة MWM يدل على انه لا يمكن تحجيمها، لكنها تضبط الحجم "
"الأدنى %d x %d و الحجم الأقصى %d x %d، هذا ليس له أي معنى.\n" "الأدنى %d x %d و الحجم الأقصى %d x %d، هذا ليس له أي معنى.\n"
#: ../src/core/window-props.c:350 #: ../src/core/window-props.c:347
#, 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:466 #: ../src/core/window-props.c:463
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (على %s)" msgstr "%s (على %s)"
#: ../src/core/window-props.c:1549 #: ../src/core/window-props.c:1546
#, 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 0x%lx غير صحيحة ل %s.\n" msgstr "نافذة WM_TRANSIENT_FOR 0x%lx غير صحيحة ل %s.\n"
#: ../src/core/window-props.c:1560 #: ../src/core/window-props.c:1557
#, fuzzy, c-format #, fuzzy, 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"
@@ -929,8 +929,8 @@ msgid ""
"GTK custom color specification must have color name and fallback in " "GTK custom color specification must have color name and fallback in "
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\"" "parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
msgstr "" msgstr ""
"يحب أن يكون لتخصيص حالة ألوان جتك قوس غلق قائم بعد الحالة/ مثال " "يحب أن يكون لتخصيص حالة ألوان جتك قوس غلق قائم بعد الحالة/ مثال gtk:"
"gtk:fg[NORMAL]، NORMAL هنا هو الحالة، لا يمكن تحليل \"%s\"" "fg[NORMAL]، NORMAL هنا هو الحالة، لا يمكن تحليل \"%s\""
#: ../src/ui/theme.c:1219 #: ../src/ui/theme.c:1219
#, c-format #, c-format

View File

@@ -12,22 +12,23 @@
# kostas: 29Dec2002, updated translation # kostas: 29Dec2002, updated translation
# Nikos: 07Sep2003, Review translation. # Nikos: 07Sep2003, Review translation.
# Marios Zindilis <m.zindilis@dmajor.org>, 2011. # Marios Zindilis <m.zindilis@dmajor.org>, 2011.
# Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>, 2013, 2014. # Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>, 2013.
# Efstathios Iosifidis <iosifidis@opensuse.org>, 2013.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: metacity.gnome-2-26\n" "Project-Id-Version: metacity.gnome-2-26\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"
"product=mutter&keywords=I18N+L10N&component=general\n" "&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-01-06 20:28+0000\n" "POT-Creation-Date: 2013-10-15 21:47+0000\n"
"PO-Revision-Date: 2014-01-04 10:38+0300\n" "PO-Revision-Date: 2013-10-24 10:59+0300\n"
"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>\n"
"Language-Team: team@lists.gnome.gr\n" "Language-Team: team@gnome.gr\n"
"Language: el\n" "Language: el\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"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Virtaal 0.7.0\n" "X-Generator: Virtaal 0.7.1\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
#: ../src/50-mutter-navigation.xml.in.h:1 #: ../src/50-mutter-navigation.xml.in.h:1
@@ -220,7 +221,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:571 #: ../src/compositor/compositor.c:596
#, 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"
@@ -266,18 +267,18 @@ msgstr "_Αναμονή"
msgid "_Force Quit" msgid "_Force Quit"
msgstr "_Εξαναγκασμός σε τερματισμό" msgstr "_Εξαναγκασμός σε τερματισμό"
#: ../src/core/display.c:415 #: ../src/core/display.c:422
#, c-format #, c-format
msgid "Missing %s extension required for compositing" msgid "Missing %s extension required for compositing"
msgstr "Λείπει η επέκταση %s που απαιτείται για compositing" msgstr "Λείπει η επέκταση %s που απαιτείται για compositing"
# gconf/gconf-internals.c:2416 # gconf/gconf-internals.c:2416
#: ../src/core/display.c:507 #: ../src/core/display.c:514
#, 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 "Αποτυχία ανοίγματος οθόνης του συστήματος παραθύρων Χ '%s'\n" msgstr "Αποτυχία ανοίγματος οθόνης του συστήματος παραθύρων Χ '%s'\n"
#: ../src/core/keybindings.c:1137 #: ../src/core/keybindings.c:1136
#, 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 "
@@ -286,7 +287,7 @@ msgstr ""
"Κάποιο άλλο πρόγραμμα χρησιμοποιεί ήδη το κλειδί %s με μετατροπείς %x ώς " "Κάποιο άλλο πρόγραμμα χρησιμοποιεί ήδη το κλειδί %s με μετατροπείς %x ώς "
"δεσμό\n" "δεσμό\n"
#: ../src/core/keybindings.c:1334 #: ../src/core/keybindings.c:1333
#, 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"
@@ -339,7 +340,7 @@ msgstr "Ενσωματωμένη οθόνη"
#: ../src/core/monitor.c:724 #: ../src/core/monitor.c:724
#, c-format #, c-format
msgid "Unknown %s" msgid "Unknown %s"
msgstr "Άγνωστη οθόνη %s" msgstr "Άγνωστο %s"
#: ../src/core/mutter.c:40 #: ../src/core/mutter.c:40
#, c-format #, c-format
@@ -402,12 +403,12 @@ msgstr ""
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Χώρος εργασίας %d" msgstr "Χώρος εργασίας %d"
#: ../src/core/screen.c:540 #: ../src/core/screen.c:537
#, 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:556 #: ../src/core/screen.c:553
#, 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 --"
@@ -417,19 +418,19 @@ msgstr ""
"προσπαθήστε να χρησιμοποιήσετε την επιλογή --replace για να αντικαταστήσετε " "προσπαθήστε να χρησιμοποιήσετε την επιλογή --replace για να αντικαταστήσετε "
"τον τρέχων διαχειριστή παραθύρων.\n" "τον τρέχων διαχειριστή παραθύρων.\n"
#: ../src/core/screen.c:583 #: ../src/core/screen.c:580
#, 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:661 #: ../src/core/screen.c:658
#, 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:853 #: ../src/core/screen.c:850
#, 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"
@@ -533,7 +534,7 @@ msgid "Window manager error: "
msgstr "Σφάλμα διαχειριστή παραθύρων: " msgstr "Σφάλμα διαχειριστή παραθύρων: "
#. first time through #. first time through
#: ../src/core/window.c:7597 #: ../src/core/window.c:7515
#, 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 "
@@ -549,7 +550,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:8519 #: ../src/core/window.c:8345
#, 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 "
@@ -559,22 +560,22 @@ msgstr ""
"μεγέθους, αλλά όρισε ελάχιστο μέγεθος %d x %d και μέγιστο μέγεθος %d x %d; " "μεγέθους, αλλά όρισε ελάχιστο μέγεθος %d x %d και μέγιστο μέγεθος %d x %d; "
"αυτό είναι ακατανόητο.\n" "αυτό είναι ακατανόητο.\n"
#: ../src/core/window-props.c:350 #: ../src/core/window-props.c:347
#, 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:466 #: ../src/core/window-props.c:463
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (σε %s)" msgstr "%s (σε %s)"
#: ../src/core/window-props.c:1549 #: ../src/core/window-props.c:1546
#, 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 παράθυρο 0x%lx που καθορίστηκε για %s.\n" msgstr "Άκυρο WM_TRANSIENT_FOR παράθυρο 0x%lx που καθορίστηκε για %s.\n"
#: ../src/core/window-props.c:1560 #: ../src/core/window-props.c:1557
#, 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 "" msgstr ""
@@ -606,9 +607,8 @@ msgstr "Η ιδιότητα %s στο παράθυρο 0x%lx περιείχε μ
#, 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 "" msgstr "Η ιδιότητα %s στο παράθυρο 0x%lx περιείχε μη έγκυρο UTF-8 για το αντικείμενο "
"Η ιδιότητα %s στο παράθυρο 0x%lx περιείχε μη έγκυρο UTF-8 για το " "%d στη λίστα\n"
"αντικείμενο %d στη λίστα\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"

224
po/es.po
View File

@@ -7,23 +7,23 @@
# Pablo Gonzalo del Campo <pablodc@bigfoot.com>,2002,2003. # Pablo Gonzalo del Campo <pablodc@bigfoot.com>,2002,2003.
# Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2004, 2005, 2006. # Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2004, 2005, 2006.
# Jorge González <jorgegonz@svn.gnome.org>, 2007, 2008, 2009, 2010, 2011. # Jorge González <jorgegonz@svn.gnome.org>, 2007, 2008, 2009, 2010, 2011.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2011, 2012, 2013, 2014. # Daniel Mustieles <daniel.mustieles@gmail.com>, 2011, 2012, 2013.
# #
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: 2014-01-07 17:48+0000\n" "POT-Creation-Date: 2013-08-20 15:46+0000\n"
"PO-Revision-Date: 2014-01-08 10:37+0100\n" "PO-Revision-Date: 2013-08-27 18:27+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n" "Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n"
"Language: \n" "Language: \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"
"Plural-Forms: nplurals=2; plural=(n!=1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Gtranslator 2.91.5\n" "X-Generator: Gtranslator 2.91.6\n"
#: ../src/50-mutter-navigation.xml.in.h:1 #: ../src/50-mutter-navigation.xml.in.h:1
msgid "Navigation" msgid "Navigation"
@@ -215,7 +215,7 @@ msgstr "Ver división a la derecha"
#. 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:571 #: ../src/compositor/compositor.c:596
#, 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"
@@ -224,7 +224,7 @@ msgstr ""
"Ya existe un gestor de composición ejecutándose en la monitor %i, pantalla " "Ya existe un gestor de composición ejecutándose en la monitor %i, pantalla "
"«%s»." "«%s»."
#: ../src/compositor/meta-background.c:1075 #: ../src/compositor/meta-background.c:1076
msgid "background texture could not be created from file" msgid "background texture could not be created from file"
msgstr "no se pudo crear la textura de fondo a partir de archivo" msgstr "no se pudo crear la textura de fondo a partir de archivo"
@@ -262,17 +262,17 @@ msgstr "_Esperar"
msgid "_Force Quit" msgid "_Force Quit"
msgstr "_Forzar la salida" msgstr "_Forzar la salida"
#: ../src/core/display.c:415 #: ../src/core/display.c:421
#, c-format #, c-format
msgid "Missing %s extension required for compositing" msgid "Missing %s extension required for compositing"
msgstr "Falta la extensión %s requerida para la composición" msgstr "Falta la extensión %s requerida para la composición"
#: ../src/core/display.c:507 #: ../src/core/display.c:513
#, 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 "Ocurrió un error al abrir la pantalla de X Window System «%s»\n" msgstr "Ocurrió un error al abrir la pantalla de X Window System «%s»\n"
#: ../src/core/keybindings.c:1137 #: ../src/core/keybindings.c:1136
#, 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 "
@@ -281,7 +281,7 @@ msgstr ""
"Algún otro programa ya está usando la clave %s con el modificador %x como " "Algún otro programa ya está usando la clave %s con el modificador %x como "
"una vinculación\n" "una vinculación\n"
#: ../src/core/keybindings.c:1334 #: ../src/core/keybindings.c:1333
#, c-format #, c-format
msgid "\"%s\" is not a valid accelerator\n" msgid "\"%s\" is not a valid accelerator\n"
msgstr "«%s» no es un acelerador válido\n" msgstr "«%s» no es un acelerador válido\n"
@@ -327,23 +327,15 @@ msgstr ""
msgid "Built-in display" msgid "Built-in display"
msgstr "Pantalla integrada" msgstr "Pantalla integrada"
#: ../src/core/monitor.c:727 #. TRANSLATORS: this is a monitor name (in case we don't know
#| msgid "Unknown %s" #. the vendor), it's Unknown followed by a size in inches,
msgid "Unknown" #. like 'Unknown 15"'
msgstr "Desconocida"
#: ../src/core/monitor.c:729
#| msgid "Unknown %s"
msgid "Unknown Display"
msgstr "Pantalla desconocida"
#. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"'
#. #.
#: ../src/core/monitor.c:737 #: ../src/core/monitor.c:730
#, c-format #, c-format
msgid "%s %s" #| msgid "Unknown element %s"
msgstr "%s %s" msgid "Unknown %s"
msgstr "Pantalla de %s desconocida"
#: ../src/core/mutter.c:40 #: ../src/core/mutter.c:40
#, c-format #, c-format
@@ -406,12 +398,12 @@ msgstr ""
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Área de trabajo %d" msgstr "Área de trabajo %d"
#: ../src/core/screen.c:540 #: ../src/core/screen.c:535
#, c-format #, c-format
msgid "Screen %d on display '%s' is invalid\n" msgid "Screen %d on display '%s' is invalid\n"
msgstr "La ventana %d en la pantalla «%s» no es válida\n" msgstr "La ventana %d en la pantalla «%s» no es válida\n"
#: ../src/core/screen.c:556 #: ../src/core/screen.c:551
#, 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 --"
@@ -420,7 +412,7 @@ msgstr ""
"La ventana %d en la pantalla «%s» ya tiene un gestor de ventanas, intente " "La ventana %d en la pantalla «%s» ya tiene un gestor de ventanas, intente "
"usar la opción «--replace» para reemplazar el gestor de ventanas activo.\n" "usar la opción «--replace» para reemplazar el gestor de ventanas activo.\n"
#: ../src/core/screen.c:583 #: ../src/core/screen.c:578
#, 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"
@@ -428,12 +420,12 @@ msgstr ""
"No se ha podido obtener la selección del gestor de ventanas en la ventana %d " "No se ha podido obtener la selección del gestor de ventanas en la ventana %d "
"en la pantalla «%s»\n" "en la pantalla «%s»\n"
#: ../src/core/screen.c:661 #: ../src/core/screen.c:656
#, 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 "La ventana %d en la pantalla «%s» ya tiene un gestor de ventanas\n" msgstr "La ventana %d en la pantalla «%s» ya tiene un gestor de ventanas\n"
#: ../src/core/screen.c:853 #: ../src/core/screen.c:848
#, 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 "No se ha podido liberar el monitor %d en la pantalla «%s»\n" msgstr "No se ha podido liberar el monitor %d en la pantalla «%s»\n"
@@ -531,7 +523,7 @@ msgid "Window manager error: "
msgstr "Error del gestor de ventanas: " msgstr "Error del gestor de ventanas: "
#. first time through #. first time through
#: ../src/core/window.c:7597 #: ../src/core/window.c:7533
#, 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 "
@@ -547,7 +539,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:8519 #: ../src/core/window.c:8257
#, 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 "
@@ -557,23 +549,23 @@ msgstr ""
"redimensionable, pero configuró el tamaño mínimo a %d x %d y el tamaño " "redimensionable, pero configuró el tamaño mínimo a %d x %d y el tamaño "
"máximo a %d x %d ; esto no tiene mucho sentido.\n" "máximo a %d x %d ; esto no tiene mucho sentido.\n"
#: ../src/core/window-props.c:350 #: ../src/core/window-props.c:347
#, 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 "La aplicación establecio un _NET_WM_PID %lu erróneo\n" msgstr "La aplicación establecio un _NET_WM_PID %lu erróneo\n"
#: ../src/core/window-props.c:466 #: ../src/core/window-props.c:463
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (on %s)" msgstr "%s (on %s)"
#: ../src/core/window-props.c:1549 #: ../src/core/window-props.c:1546
#, 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 "" msgstr ""
"WM_TRANSIENT_FOR no válido para la ventana 0x%lx especificada para %s.\n" "WM_TRANSIENT_FOR no válido para la ventana 0x%lx especificada para %s.\n"
#: ../src/core/window-props.c:1560 #: ../src/core/window-props.c:1557
#, 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 ventana 0x%lx para %s crearía un bucle.\n" msgstr "WM_TRANSIENT_FOR ventana 0x%lx para %s crearía un bucle.\n"
@@ -1264,59 +1256,59 @@ msgstr "El atributo «%s» no está definido en el elemento <%s>"
msgid "Line %d character %d: %s" msgid "Line %d character %d: %s"
msgstr "Línea %d carácter %d: %s" msgstr "Línea %d carácter %d: %s"
#: ../src/ui/theme-parser.c:483 #: ../src/ui/theme-parser.c:479
#, c-format #, c-format
msgid "Attribute \"%s\" repeated twice on the same <%s> element" msgid "Attribute \"%s\" repeated twice on the same <%s> element"
msgstr "El atributo «%s» se ha repetido dos veces en el mismo elemento <%s>" msgstr "El atributo «%s» se ha repetido dos veces en el mismo elemento <%s>"
#: ../src/ui/theme-parser.c:507 ../src/ui/theme-parser.c:556 #: ../src/ui/theme-parser.c:503 ../src/ui/theme-parser.c:552
#, c-format #, c-format
msgid "Attribute \"%s\" is invalid on <%s> element in this context" msgid "Attribute \"%s\" is invalid on <%s> element in this context"
msgstr "El atributo «%s» es no válido en el elemento <%s> en este contexto" msgstr "El atributo «%s» es no válido en el elemento <%s> en este contexto"
#: ../src/ui/theme-parser.c:598 #: ../src/ui/theme-parser.c:594
#, c-format #, c-format
msgid "Could not parse \"%s\" as an integer" msgid "Could not parse \"%s\" as an integer"
msgstr "No se ha podido interpretar «%s» como un entero" msgstr "No se ha podido interpretar «%s» como un entero"
#: ../src/ui/theme-parser.c:607 ../src/ui/theme-parser.c:662 #: ../src/ui/theme-parser.c:603 ../src/ui/theme-parser.c:658
#, c-format #, c-format
msgid "Did not understand trailing characters \"%s\" in string \"%s\"" msgid "Did not understand trailing characters \"%s\" in string \"%s\""
msgstr "No se comprenden los caracteres sobrantes «%s» en la cadena «%s»" msgstr "No se comprenden los caracteres sobrantes «%s» en la cadena «%s»"
#: ../src/ui/theme-parser.c:617 #: ../src/ui/theme-parser.c:613
#, c-format #, c-format
msgid "Integer %ld must be positive" msgid "Integer %ld must be positive"
msgstr "El entero %ld debe ser positivo" msgstr "El entero %ld debe ser positivo"
#: ../src/ui/theme-parser.c:625 #: ../src/ui/theme-parser.c:621
#, c-format #, c-format
msgid "Integer %ld is too large, current max is %d" msgid "Integer %ld is too large, current max is %d"
msgstr "El entero %ld es demasiado grande, el máximo actual es %d" msgstr "El entero %ld es demasiado grande, el máximo actual es %d"
#: ../src/ui/theme-parser.c:653 ../src/ui/theme-parser.c:769 #: ../src/ui/theme-parser.c:649 ../src/ui/theme-parser.c:765
#, c-format #, c-format
msgid "Could not parse \"%s\" as a floating point number" msgid "Could not parse \"%s\" as a floating point number"
msgstr "No se ha podido interpretar «%s» como un número de coma flotante" msgstr "No se ha podido interpretar «%s» como un número de coma flotante"
#: ../src/ui/theme-parser.c:684 ../src/ui/theme-parser.c:712 #: ../src/ui/theme-parser.c:680 ../src/ui/theme-parser.c:708
#, c-format #, c-format
msgid "Boolean values must be \"true\" or \"false\" not \"%s\"" msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
msgstr "Los valores booleanos deben ser «true» o «false» no «%s»" msgstr "Los valores booleanos deben ser «true» o «false» no «%s»"
#: ../src/ui/theme-parser.c:739 #: ../src/ui/theme-parser.c:735
#, c-format #, c-format
msgid "Angle must be between 0.0 and 360.0, was %g\n" msgid "Angle must be between 0.0 and 360.0, was %g\n"
msgstr "El ángulo debe estar entre 0.0 y 360.0, fue %g\n" msgstr "El ángulo debe estar entre 0.0 y 360.0, fue %g\n"
#: ../src/ui/theme-parser.c:802 #: ../src/ui/theme-parser.c:798
#, c-format #, c-format
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n" msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
msgstr "" msgstr ""
"El valor de alfa debe estar entre 0.0 (invisible) y 1.0 (completamente " "El valor de alfa debe estar entre 0.0 (invisible) y 1.0 (completamente "
"opaco), fue %g\n" "opaco), fue %g\n"
#: ../src/ui/theme-parser.c:867 #: ../src/ui/theme-parser.c:863
#, c-format #, c-format
msgid "" msgid ""
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium," "Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
@@ -1325,59 +1317,59 @@ msgstr ""
"Escala de título no válida «%s» (debe ser una de xx-small,x-small,small," "Escala de título no válida «%s» (debe ser una de xx-small,x-small,small,"
"medium,large,x-large,xx-large)\n" "medium,large,x-large,xx-large)\n"
#: ../src/ui/theme-parser.c:1023 ../src/ui/theme-parser.c:1086 #: ../src/ui/theme-parser.c:1019 ../src/ui/theme-parser.c:1082
#: ../src/ui/theme-parser.c:1120 ../src/ui/theme-parser.c:1223 #: ../src/ui/theme-parser.c:1116 ../src/ui/theme-parser.c:1219
#, c-format #, c-format
msgid "<%s> name \"%s\" used a second time" msgid "<%s> name \"%s\" used a second time"
msgstr "<%s> nombre «%s» usado una segunda vez" msgstr "<%s> nombre «%s» usado una segunda vez"
#: ../src/ui/theme-parser.c:1035 ../src/ui/theme-parser.c:1132 #: ../src/ui/theme-parser.c:1031 ../src/ui/theme-parser.c:1128
#: ../src/ui/theme-parser.c:1235 #: ../src/ui/theme-parser.c:1231
#, c-format #, c-format
msgid "<%s> parent \"%s\" has not been defined" msgid "<%s> parent \"%s\" has not been defined"
msgstr "El <%s> padre «%s» no ha sido definido" msgstr "El <%s> padre «%s» no ha sido definido"
#: ../src/ui/theme-parser.c:1145 #: ../src/ui/theme-parser.c:1141
#, c-format #, c-format
msgid "<%s> geometry \"%s\" has not been defined" msgid "<%s> geometry \"%s\" has not been defined"
msgstr "La <%s> geometría «%s» no ha sido definida" msgstr "La <%s> geometría «%s» no ha sido definida"
#: ../src/ui/theme-parser.c:1158 #: ../src/ui/theme-parser.c:1154
#, c-format #, c-format
msgid "<%s> must specify either a geometry or a parent that has a geometry" msgid "<%s> must specify either a geometry or a parent that has a geometry"
msgstr "" msgstr ""
"<%s> debe especificar o una geometría o un padre para tenga una geometría" "<%s> debe especificar o una geometría o un padre para tenga una geometría"
#: ../src/ui/theme-parser.c:1200 #: ../src/ui/theme-parser.c:1196
msgid "You must specify a background for an alpha value to be meaningful" msgid "You must specify a background for an alpha value to be meaningful"
msgstr "Debe especificar un fondo para un valor alfa para que tenga sentido" msgstr "Debe especificar un fondo para un valor alfa para que tenga sentido"
#: ../src/ui/theme-parser.c:1268 #: ../src/ui/theme-parser.c:1264
#, c-format #, c-format
msgid "Unknown type \"%s\" on <%s> element" msgid "Unknown type \"%s\" on <%s> element"
msgstr "Tipo «%s» desconocido en el elemento <%s>" msgstr "Tipo «%s» desconocido en el elemento <%s>"
#: ../src/ui/theme-parser.c:1279 #: ../src/ui/theme-parser.c:1275
#, c-format #, c-format
msgid "Unknown style_set \"%s\" on <%s> element" msgid "Unknown style_set \"%s\" on <%s> element"
msgstr "style_set «%s» desconocido en el elemento <%s>" msgstr "style_set «%s» desconocido en el elemento <%s>"
#: ../src/ui/theme-parser.c:1287 #: ../src/ui/theme-parser.c:1283
#, c-format #, c-format
msgid "Window type \"%s\" has already been assigned a style set" msgid "Window type \"%s\" has already been assigned a style set"
msgstr "El tipo de ventana «%s» ya ha sido asignado a un conjunto de estilo" msgstr "El tipo de ventana «%s» ya ha sido asignado a un conjunto de estilo"
#: ../src/ui/theme-parser.c:1317 ../src/ui/theme-parser.c:1381 #: ../src/ui/theme-parser.c:1313 ../src/ui/theme-parser.c:1377
#: ../src/ui/theme-parser.c:1607 ../src/ui/theme-parser.c:2842 #: ../src/ui/theme-parser.c:1603 ../src/ui/theme-parser.c:2838
#: ../src/ui/theme-parser.c:2888 ../src/ui/theme-parser.c:3038 #: ../src/ui/theme-parser.c:2884 ../src/ui/theme-parser.c:3034
#: ../src/ui/theme-parser.c:3274 ../src/ui/theme-parser.c:3312 #: ../src/ui/theme-parser.c:3273 ../src/ui/theme-parser.c:3311
#: ../src/ui/theme-parser.c:3350 ../src/ui/theme-parser.c:3388 #: ../src/ui/theme-parser.c:3349 ../src/ui/theme-parser.c:3387
#, c-format #, c-format
msgid "Element <%s> is not allowed below <%s>" msgid "Element <%s> is not allowed below <%s>"
msgstr "El elemento <%s> no está permitido debajo de <%s>" msgstr "El elemento <%s> no está permitido debajo de <%s>"
#: ../src/ui/theme-parser.c:1431 ../src/ui/theme-parser.c:1445 #: ../src/ui/theme-parser.c:1427 ../src/ui/theme-parser.c:1441
#: ../src/ui/theme-parser.c:1490 #: ../src/ui/theme-parser.c:1486
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"
@@ -1385,123 +1377,123 @@ msgstr ""
"No se puede especificar ambos «button_width»/«button_height» y «aspect " "No se puede especificar ambos «button_width»/«button_height» y «aspect "
"ratio» para los botones" "ratio» para los botones"
#: ../src/ui/theme-parser.c:1454 #: ../src/ui/theme-parser.c:1450
#, c-format #, c-format
msgid "Distance \"%s\" is unknown" msgid "Distance \"%s\" is unknown"
msgstr "La distancia «%s» es desconocida" msgstr "La distancia «%s» es desconocida"
#: ../src/ui/theme-parser.c:1499 #: ../src/ui/theme-parser.c:1495
#, c-format #, c-format
msgid "Aspect ratio \"%s\" is unknown" msgid "Aspect ratio \"%s\" is unknown"
msgstr "La proporción «%s» es desconocido" msgstr "La proporción «%s» es desconocido"
#: ../src/ui/theme-parser.c:1561 #: ../src/ui/theme-parser.c:1557
#, c-format #, c-format
msgid "Border \"%s\" is unknown" msgid "Border \"%s\" is unknown"
msgstr "El borde «%s» es desconocido" msgstr "El borde «%s» es desconocido"
#: ../src/ui/theme-parser.c:1872 #: ../src/ui/theme-parser.c:1868
#, c-format #, c-format
msgid "No \"start_angle\" or \"from\" attribute on element <%s>" msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
msgstr "No hay atributo «start_angle» o «from» en el elemento <%s>" msgstr "No hay atributo «start_angle» o «from» en el elemento <%s>"
#: ../src/ui/theme-parser.c:1879 #: ../src/ui/theme-parser.c:1875
#, c-format #, c-format
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>" msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
msgstr "No hay atributo «extent_angle» o «to» en el elemento <%s>" msgstr "No hay atributo «extent_angle» o «to» en el elemento <%s>"
#: ../src/ui/theme-parser.c:2119 #: ../src/ui/theme-parser.c:2115
#, c-format #, c-format
msgid "Did not understand value \"%s\" for type of gradient" msgid "Did not understand value \"%s\" for type of gradient"
msgstr "No se entendió el valor «%s» para el tipo de degradado" msgstr "No se entendió el valor «%s» para el tipo de degradado"
#: ../src/ui/theme-parser.c:2197 ../src/ui/theme-parser.c:2572 #: ../src/ui/theme-parser.c:2193 ../src/ui/theme-parser.c:2568
#, c-format #, c-format
msgid "Did not understand fill type \"%s\" for <%s> element" msgid "Did not understand fill type \"%s\" for <%s> element"
msgstr "No se entendió en tipo de relleno «%s» para el elemento <%s>" msgstr "No se entendió en tipo de relleno «%s» para el elemento <%s>"
#: ../src/ui/theme-parser.c:2364 ../src/ui/theme-parser.c:2447 #: ../src/ui/theme-parser.c:2360 ../src/ui/theme-parser.c:2443
#: ../src/ui/theme-parser.c:2510 #: ../src/ui/theme-parser.c:2506
#, c-format #, c-format
msgid "Did not understand state \"%s\" for <%s> element" msgid "Did not understand state \"%s\" for <%s> element"
msgstr "No se entendió estado «%s» para el elemento <%s>" msgstr "No se entendió estado «%s» para el elemento <%s>"
#: ../src/ui/theme-parser.c:2374 ../src/ui/theme-parser.c:2457 #: ../src/ui/theme-parser.c:2370 ../src/ui/theme-parser.c:2453
#, c-format #, c-format
msgid "Did not understand shadow \"%s\" for <%s> element" msgid "Did not understand shadow \"%s\" for <%s> element"
msgstr "No se entendió enrollar «%s» para el elemento <%s>" msgstr "No se entendió enrollar «%s» para el elemento <%s>"
#: ../src/ui/theme-parser.c:2384 #: ../src/ui/theme-parser.c:2380
#, c-format #, c-format
msgid "Did not understand arrow \"%s\" for <%s> element" msgid "Did not understand arrow \"%s\" for <%s> element"
msgstr "No se entendió la flecha «%s» para el elemento <%s>" msgstr "No se entendió la flecha «%s» para el elemento <%s>"
#: ../src/ui/theme-parser.c:2698 ../src/ui/theme-parser.c:2794 #: ../src/ui/theme-parser.c:2694 ../src/ui/theme-parser.c:2790
#, c-format #, c-format
msgid "No <draw_ops> called \"%s\" has been defined" msgid "No <draw_ops> called \"%s\" has been defined"
msgstr "No se ha definido una <draw_ops> llamada «%s»" msgstr "No se ha definido una <draw_ops> llamada «%s»"
#: ../src/ui/theme-parser.c:2710 ../src/ui/theme-parser.c:2806 #: ../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 "Incluir el draw_ops «%s» aquí podría crear una referencia circular" msgstr "Incluir el draw_ops «%s» aquí podría crear una referencia circular"
#: ../src/ui/theme-parser.c:2921 #: ../src/ui/theme-parser.c:2917
#, c-format #, c-format
msgid "Unknown position \"%s\" for frame piece" msgid "Unknown position \"%s\" for frame piece"
msgstr "Posición desconocida «%s» para la pieza del marco" msgstr "Posición desconocida «%s» para la pieza del marco"
#: ../src/ui/theme-parser.c:2929 #: ../src/ui/theme-parser.c:2925
#, c-format #, c-format
msgid "Frame style already has a piece at position %s" msgid "Frame style already has a piece at position %s"
msgstr "El estilo del marco ya tiene una pieza en la posición %s" msgstr "El estilo del marco ya tiene una pieza en la posición %s"
#: ../src/ui/theme-parser.c:2946 ../src/ui/theme-parser.c:3023 #: ../src/ui/theme-parser.c:2942 ../src/ui/theme-parser.c:3019
#, c-format #, c-format
msgid "No <draw_ops> with the name \"%s\" has been defined" msgid "No <draw_ops> with the name \"%s\" has been defined"
msgstr "No se ha definido ninguna <draw_ops> con el nombre «%s»" msgstr "No se ha definido ninguna <draw_ops> con el nombre «%s»"
#: ../src/ui/theme-parser.c:2976 #: ../src/ui/theme-parser.c:2972
#, c-format #, c-format
msgid "Unknown function \"%s\" for button" msgid "Unknown function \"%s\" for button"
msgstr "Función desconocida «%s» para el botón" msgstr "Función desconocida «%s» para el botón"
#: ../src/ui/theme-parser.c:2986 #: ../src/ui/theme-parser.c:2982
#, c-format #, c-format
msgid "Button function \"%s\" does not exist in this version (%d, need %d)" msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
msgstr "La función del botón «%s» no existe en esta versión (%d, necesita %d)" msgstr "La función del botón «%s» no existe en esta versión (%d, necesita %d)"
#: ../src/ui/theme-parser.c:2998 #: ../src/ui/theme-parser.c:2994
#, c-format #, c-format
msgid "Unknown state \"%s\" for button" msgid "Unknown state \"%s\" for button"
msgstr "Estado desconocido «%s» para el botón" msgstr "Estado desconocido «%s» para el botón"
#: ../src/ui/theme-parser.c:3006 #: ../src/ui/theme-parser.c:3002
#, c-format #, c-format
msgid "Frame style already has a button for function %s state %s" msgid "Frame style already has a button for function %s state %s"
msgstr "El estilo del marcos ya tiene un botón para la función %s estado %s" msgstr "El estilo del marcos ya tiene un botón para la función %s estado %s"
#: ../src/ui/theme-parser.c:3077 #: ../src/ui/theme-parser.c:3073
#, c-format #, c-format
msgid "\"%s\" is not a valid value for focus attribute" msgid "\"%s\" is not a valid value for focus attribute"
msgstr "«%s» no es valor válido para el atributo foco" msgstr "«%s» no es valor válido para el atributo foco"
#: ../src/ui/theme-parser.c:3086 #: ../src/ui/theme-parser.c:3082
#, c-format #, c-format
msgid "\"%s\" is not a valid value for state attribute" msgid "\"%s\" is not a valid value for state attribute"
msgstr "«%s» no es un valor válido para el atributo estado" msgstr "«%s» no es un valor válido para el atributo estado"
#: ../src/ui/theme-parser.c:3096 #: ../src/ui/theme-parser.c:3092
#, c-format #, c-format
msgid "A style called \"%s\" has not been defined" msgid "A style called \"%s\" has not been defined"
msgstr "No se ha definido ningún estilo llamado «%s»" msgstr "No se ha definido ningún estilo llamado «%s»"
#: ../src/ui/theme-parser.c:3117 ../src/ui/theme-parser.c:3140 #: ../src/ui/theme-parser.c:3113 ../src/ui/theme-parser.c:3136
#, c-format #, c-format
msgid "\"%s\" is not a valid value for resize attribute" msgid "\"%s\" is not a valid value for resize attribute"
msgstr "«%s» no es un estado válido para el atributo resize" msgstr "«%s» no es un estado válido para el atributo resize"
#: ../src/ui/theme-parser.c:3151 #: ../src/ui/theme-parser.c:3147
#, c-format #, c-format
msgid "" msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized/shaded " "Should not have \"resize\" attribute on <%s> element for maximized/shaded "
@@ -1510,7 +1502,7 @@ msgstr ""
"No debería tener un atributo «resize» en el elemento <%s> para los estados " "No debería tener un atributo «resize» en el elemento <%s> para los estados "
"maximizado/enrollado" "maximizado/enrollado"
#: ../src/ui/theme-parser.c:3165 #: ../src/ui/theme-parser.c:3161
#, c-format #, c-format
msgid "" msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized states" "Should not have \"resize\" attribute on <%s> element for maximized states"
@@ -1518,20 +1510,20 @@ msgstr ""
"No debería tener un atributo «resize» en el elemento <%s> para los estados " "No debería tener un atributo «resize» en el elemento <%s> para los estados "
"maximizados." "maximizados."
#: ../src/ui/theme-parser.c:3179 ../src/ui/theme-parser.c:3223 #: ../src/ui/theme-parser.c:3175 ../src/ui/theme-parser.c:3222
#, c-format #, c-format
msgid "Style has already been specified for state %s resize %s focus %s" msgid "Style has already been specified for state %s resize %s focus %s"
msgstr "" msgstr ""
"El estilo ya ha sido especificado para estado %s redimensionado %s foco %s" "El estilo ya ha sido especificado para estado %s redimensionado %s foco %s"
#: ../src/ui/theme-parser.c:3190 ../src/ui/theme-parser.c:3201 #: ../src/ui/theme-parser.c:3186 ../src/ui/theme-parser.c:3197
#: ../src/ui/theme-parser.c:3212 ../src/ui/theme-parser.c:3234 #: ../src/ui/theme-parser.c:3208 ../src/ui/theme-parser.c:3233
#: ../src/ui/theme-parser.c:3245 ../src/ui/theme-parser.c:3256 #: ../src/ui/theme-parser.c:3244 ../src/ui/theme-parser.c:3255
#, c-format #, c-format
msgid "Style has already been specified for state %s focus %s" msgid "Style has already been specified for state %s focus %s"
msgstr "El estilo ya ha sido especificado para estado %s foco %s" msgstr "El estilo ya ha sido especificado para estado %s foco %s"
#: ../src/ui/theme-parser.c:3295 #: ../src/ui/theme-parser.c:3294
msgid "" msgid ""
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops " "Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)" "attribute and also a <draw_ops> element, or specified two elements)"
@@ -1540,7 +1532,7 @@ msgstr ""
"especificado un atributo draw_ops y también un elemento <draw_ops> o ha " "especificado un atributo draw_ops y también un elemento <draw_ops> o ha "
"especificado los dos elementos)" "especificado los dos elementos)"
#: ../src/ui/theme-parser.c:3333 #: ../src/ui/theme-parser.c:3332
msgid "" msgid ""
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops " "Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)" "attribute and also a <draw_ops> element, or specified two elements)"
@@ -1549,7 +1541,7 @@ msgstr ""
"especificado un atributo draw_ops y también un elemento <draw_ops> o ha " "especificado un atributo draw_ops y también un elemento <draw_ops> o ha "
"especificado los dos elementos)" "especificado los dos elementos)"
#: ../src/ui/theme-parser.c:3371 #: ../src/ui/theme-parser.c:3370
msgid "" msgid ""
"Can't have a two draw_ops for a <menu_icon> element (theme specified a " "Can't have a two draw_ops for a <menu_icon> element (theme specified a "
"draw_ops attribute and also a <draw_ops> element, or specified two elements)" "draw_ops attribute and also a <draw_ops> element, or specified two elements)"
@@ -1558,12 +1550,12 @@ msgstr ""
"especificado un atributo draw_ops y también un elemento <draw_ops> o ha " "especificado un atributo draw_ops y también un elemento <draw_ops> o ha "
"especificado los dos elementos)" "especificado los dos elementos)"
#: ../src/ui/theme-parser.c:3435 #: ../src/ui/theme-parser.c:3434
#, c-format #, c-format
msgid "Bad version specification '%s'" msgid "Bad version specification '%s'"
msgstr "Especificación de versión «%s» errónea" msgstr "Especificación de versión «%s» errónea"
#: ../src/ui/theme-parser.c:3508 #: ../src/ui/theme-parser.c:3507
msgid "" msgid ""
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-" "\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
"theme-2.xml" "theme-2.xml"
@@ -1571,19 +1563,19 @@ msgstr ""
"No se puede usar el atributo «version» con metacity-theme-1.xml o metacity-" "No se puede usar el atributo «version» con metacity-theme-1.xml o metacity-"
"theme-2.xml" "theme-2.xml"
#: ../src/ui/theme-parser.c:3531 #: ../src/ui/theme-parser.c:3530
#, c-format #, c-format
msgid "Theme requires version %s but latest supported theme version is %d.%d" msgid "Theme requires version %s but latest supported theme version is %d.%d"
msgstr "" msgstr ""
"El tema requiere la versión %s pero la última versión soportada del tema es " "El tema requiere la versión %s pero la última versión soportada del tema es "
"la %d.%d" "la %d.%d"
#: ../src/ui/theme-parser.c:3563 #: ../src/ui/theme-parser.c:3562
#, c-format #, c-format
msgid "Outermost element in theme must be <metacity_theme> not <%s>" msgid "Outermost element in theme must be <metacity_theme> not <%s>"
msgstr "El elemento mas externo en un tema debe ser <metacity_theme> no <%s>" msgstr "El elemento mas externo en un tema debe ser <metacity_theme> no <%s>"
#: ../src/ui/theme-parser.c:3583 #: ../src/ui/theme-parser.c:3582
#, c-format #, c-format
msgid "" msgid ""
"Element <%s> is not allowed inside a name/author/date/description element" "Element <%s> is not allowed inside a name/author/date/description element"
@@ -1591,12 +1583,12 @@ msgstr ""
"El elemento <%s> no esta permitido dentro de un elemento name/author/date/" "El elemento <%s> no esta permitido dentro de un elemento name/author/date/"
"description" "description"
#: ../src/ui/theme-parser.c:3588 #: ../src/ui/theme-parser.c:3587
#, c-format #, c-format
msgid "Element <%s> is not allowed inside a <constant> element" msgid "Element <%s> is not allowed inside a <constant> element"
msgstr "El elemento <%s> no esta permitido dentro de un elemento <constant>" msgstr "El elemento <%s> no esta permitido dentro de un elemento <constant>"
#: ../src/ui/theme-parser.c:3600 #: ../src/ui/theme-parser.c:3599
#, c-format #, c-format
msgid "" msgid ""
"Element <%s> is not allowed inside a distance/border/aspect_ratio element" "Element <%s> is not allowed inside a distance/border/aspect_ratio element"
@@ -1604,40 +1596,40 @@ msgstr ""
"El elemento <%s> no esta permitido dentro de un elemento distance/border/" "El elemento <%s> no esta permitido dentro de un elemento distance/border/"
"aspect_ratio" "aspect_ratio"
#: ../src/ui/theme-parser.c:3622 #: ../src/ui/theme-parser.c:3621
#, c-format #, c-format
msgid "Element <%s> is not allowed inside a draw operation element" msgid "Element <%s> is not allowed inside a draw operation element"
msgstr "" msgstr ""
"El elemento <%s> no esta permitido dentro de un elemento de operación de " "El elemento <%s> no esta permitido dentro de un elemento de operación de "
"dibujo" "dibujo"
#: ../src/ui/theme-parser.c:3632 ../src/ui/theme-parser.c:3662 #: ../src/ui/theme-parser.c:3631 ../src/ui/theme-parser.c:3661
#: ../src/ui/theme-parser.c:3667 ../src/ui/theme-parser.c:3672 #: ../src/ui/theme-parser.c:3666 ../src/ui/theme-parser.c:3671
#, c-format #, c-format
msgid "Element <%s> is not allowed inside a <%s> element" msgid "Element <%s> is not allowed inside a <%s> element"
msgstr "El elemento <%s> no esta permitido dentro del elemento <%s>" msgstr "El elemento <%s> no esta permitido dentro del elemento <%s>"
#: ../src/ui/theme-parser.c:3900 #: ../src/ui/theme-parser.c:3899
msgid "No draw_ops provided for frame piece" msgid "No draw_ops provided for frame piece"
msgstr "No se dio draw_ops para la pieza del cuadro" msgstr "No se dio draw_ops para la pieza del cuadro"
#: ../src/ui/theme-parser.c:3915 #: ../src/ui/theme-parser.c:3914
msgid "No draw_ops provided for button" msgid "No draw_ops provided for button"
msgstr "No se dio draw_ops para botón" msgstr "No se dio draw_ops para botón"
#: ../src/ui/theme-parser.c:3969 #: ../src/ui/theme-parser.c:3968
#, c-format #, c-format
msgid "No text is allowed inside element <%s>" msgid "No text is allowed inside element <%s>"
msgstr "No se permite texto dentro del elemento <%s>" msgstr "No se permite texto dentro del elemento <%s>"
#: ../src/ui/theme-parser.c:4027 ../src/ui/theme-parser.c:4039 #: ../src/ui/theme-parser.c:4026 ../src/ui/theme-parser.c:4038
#: ../src/ui/theme-parser.c:4051 ../src/ui/theme-parser.c:4063 #: ../src/ui/theme-parser.c:4050 ../src/ui/theme-parser.c:4062
#: ../src/ui/theme-parser.c:4075 #: ../src/ui/theme-parser.c:4074
#, c-format #, c-format
msgid "<%s> specified twice for this theme" msgid "<%s> specified twice for this theme"
msgstr "<%s> especificado dos veces para este tema" msgstr "<%s> especificado dos veces para este tema"
#: ../src/ui/theme-parser.c:4337 #: ../src/ui/theme-parser.c:4336
#, 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 "Falló al encontrar un archivo válido para el tema%s\n" msgstr "Falló al encontrar un archivo válido para el tema%s\n"

220
po/it.po
View File

@@ -1,18 +1,19 @@
# Italian translation for Mutter. # Italian translation for Mutter.
# Based on Italian translation for Metacity # Based on Italian translation for Metacity
# This file is distributed under the same license as metacity package # This file is distributed under the same license as metacity package
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 Free Software Foundation, Inc. # Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
# Copyright (C) 2012 the mutter's copyright holder.
# Pier Luigi Fiorini <plfiorini@libero.it>, 2002. # Pier Luigi Fiorini <plfiorini@libero.it>, 2002.
# Lapo Calamandrei <lapo.calamandrei@virgilio.it>, 2003. # Lapo Calamandrei <lapo.calamandrei@virgilio.it>, 2003.
# Luca Ferretti <lferrett@gnome.org>, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012. # Luca Ferretti <lferrett@gnome.org>, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012.
# Milo Casagrande <milo@ubuntu.com>, 2012, 2013, 2014. # Milo Casagrande <milo@ubuntu.com>, 2012, 2013.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter\n" "Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-01-10 08:54+0100\n" "POT-Creation-Date: 2013-08-24 19:11+0200\n"
"PO-Revision-Date: 2014-01-10 08:54+0100\n" "PO-Revision-Date: 2013-08-24 19:11+0200\n"
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n" "Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
"Language-Team: Italian <tp@lists.linux.it>\n" "Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n" "Language: it\n"
@@ -216,7 +217,7 @@ msgstr "Massimizza a destra"
#. 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:571 #: ../src/compositor/compositor.c:596
#, 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"
@@ -225,7 +226,7 @@ msgstr ""
"Un altro compositing manager è già in esecuzione sullo schermo %i sul " "Un altro compositing manager è già in esecuzione sullo schermo %i sul "
"display «%s»." "display «%s»."
#: ../src/compositor/meta-background.c:1075 #: ../src/compositor/meta-background.c:1076
msgid "background texture could not be created from file" msgid "background texture could not be created from file"
msgstr "La texture dello sfondo non può essere creata dal file" msgstr "La texture dello sfondo non può essere creata dal file"
@@ -265,17 +266,17 @@ msgstr "_Attendi"
msgid "_Force Quit" msgid "_Force Quit"
msgstr "_Forza uscita" msgstr "_Forza uscita"
#: ../src/core/display.c:415 #: ../src/core/display.c:422
#, c-format #, c-format
msgid "Missing %s extension required for compositing" msgid "Missing %s extension required for compositing"
msgstr "Estensione %s richiesta per il compositing mancante" msgstr "Estensione %s richiesta per il compositing mancante"
#: ../src/core/display.c:507 #: ../src/core/display.c:514
#, 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 "Apertura del display «%s» di X Window System non riuscita\n" msgstr "Apertura del display «%s» di X Window System non riuscita\n"
#: ../src/core/keybindings.c:1137 #: ../src/core/keybindings.c:1136
#, 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 "
@@ -284,7 +285,7 @@ msgstr ""
"Qualche altro programma sta già usando il tasto %s con i modificatori %x " "Qualche altro programma sta già usando il tasto %s con i modificatori %x "
"come una associazione di tasti\n" "come una associazione di tasti\n"
#: ../src/core/keybindings.c:1334 #: ../src/core/keybindings.c:1333
#, c-format #, c-format
msgid "\"%s\" is not a valid accelerator\n" msgid "\"%s\" is not a valid accelerator\n"
msgstr "«%s» non è una scorciatoia valida\n" msgstr "«%s» non è una scorciatoia valida\n"
@@ -326,25 +327,18 @@ msgstr ""
"Non è stato trovato alcun tema. Assicurarsi che %s esista e contenga i temi " "Non è stato trovato alcun tema. Assicurarsi che %s esista e contenga i temi "
"standard.\n" "standard.\n"
#: ../src/core/monitor.c:701 #: ../src/core/monitor.c:702
msgid "Built-in display" msgid "Built-in display"
msgstr "Display integrato" msgstr "Display integrato"
#: ../src/core/monitor.c:726 #. TRANSLATORS: this is a monitor name (in case we don't know
msgid "Unknown" #. the vendor), it's Unknown followed by a size in inches,
msgstr "Sconosciuto" #. like 'Unknown 15"'
#: ../src/core/monitor.c:728
msgid "Unknown Display"
msgstr "Display sconosciuto"
#. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"'
#. #.
#: ../src/core/monitor.c:736 #: ../src/core/monitor.c:730
#, c-format #, c-format
msgid "%s %s" msgid "Unknown %s"
msgstr "%s %s" msgstr "Sconosciuto %s"
#: ../src/core/mutter.c:40 #: ../src/core/mutter.c:40
#, c-format #, c-format
@@ -407,12 +401,12 @@ msgstr ""
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Spazio di lavoro %d" msgstr "Spazio di lavoro %d"
#: ../src/core/screen.c:540 #: ../src/core/screen.c:537
#, c-format #, c-format
msgid "Screen %d on display '%s' is invalid\n" msgid "Screen %d on display '%s' is invalid\n"
msgstr "Lo schermo %d nel display «%s» non è valido\n" msgstr "Lo schermo %d nel display «%s» non è valido\n"
#: ../src/core/screen.c:556 #: ../src/core/screen.c:553
#, 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 --"
@@ -421,7 +415,7 @@ msgstr ""
"Lo schermo %d sul display «%s» ha già un window manager; provare a " "Lo schermo %d sul display «%s» ha già un window manager; provare a "
"utilizzare l'opzione --replace per sostituirlo.\n" "utilizzare l'opzione --replace per sostituirlo.\n"
#: ../src/core/screen.c:583 #: ../src/core/screen.c:580
#, 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"
@@ -429,12 +423,12 @@ msgstr ""
"Impossibile acquisire la selezione del window manager per lo schermo %d nel " "Impossibile acquisire la selezione del window manager per lo schermo %d nel "
"display «%s»\n" "display «%s»\n"
#: ../src/core/screen.c:661 #: ../src/core/screen.c:658
#, 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 "Lo schermo %d sul display «%s» ha già un window manager\n" msgstr "Lo schermo %d sul display «%s» ha già un window manager\n"
#: ../src/core/screen.c:853 #: ../src/core/screen.c:850
#, 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 "Impossibile rilasciare lo schermo %d sul display «%s»\n" msgstr "Impossibile rilasciare lo schermo %d sul display «%s»\n"
@@ -533,7 +527,7 @@ msgid "Window manager error: "
msgstr "Errore del window manager: " msgstr "Errore del window manager: "
#. first time through #. first time through
#: ../src/core/window.c:7590 #: ../src/core/window.c:7533
#, 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 "
@@ -549,7 +543,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:8512 #: ../src/core/window.c:8257
#, 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 "
@@ -559,26 +553,26 @@ msgstr ""
"ridimensionabile, ma ha impostato la dimensione minima %d x %d e la " "ridimensionabile, ma ha impostato la dimensione minima %d x %d e la "
"dimensione massima %d x %d; ciò non ha senso.\n" "dimensione massima %d x %d; ciò non ha senso.\n"
#: ../src/core/window-props.c:350 #: ../src/core/window-props.c:347
#, 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 "L'applicazione ha impostato un _NET_WM_PID errato %lu\n" msgstr "L'applicazione ha impostato un _NET_WM_PID errato %lu\n"
#: ../src/core/window-props.c:466 #: ../src/core/window-props.c:463
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (su %s)" msgstr "%s (su %s)"
# Sì, direi che è oscuro -Luca # Sì, direi che è oscuro -Luca
# #
#: ../src/core/window-props.c:1549 #: ../src/core/window-props.c:1546
#, 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 "Specificato un WM_TRANSIENT_FOR finestra 0x%lx non valido per %s.\n" msgstr "Specificato un WM_TRANSIENT_FOR finestra 0x%lx non valido per %s.\n"
# Sì, direi che è oscuro -Luca # Sì, direi che è oscuro -Luca
# #
#: ../src/core/window-props.c:1560 #: ../src/core/window-props.c:1557
#, 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 finestra 0x%lx per %s potrebbe creare un loop.\n" msgstr "WM_TRANSIENT_FOR finestra 0x%lx per %s potrebbe creare un loop.\n"
@@ -1290,60 +1284,60 @@ msgstr "Nessun attributo «%s» nell'elemento <%s>"
msgid "Line %d character %d: %s" msgid "Line %d character %d: %s"
msgstr "Riga %d carattere %d: %s" msgstr "Riga %d carattere %d: %s"
#: ../src/ui/theme-parser.c:483 #: ../src/ui/theme-parser.c:479
#, c-format #, c-format
msgid "Attribute \"%s\" repeated twice on the same <%s> element" msgid "Attribute \"%s\" repeated twice on the same <%s> element"
msgstr "L'attributo «%s» è ripetuto due volte nello stesso elemento <%s>" msgstr "L'attributo «%s» è ripetuto due volte nello stesso elemento <%s>"
#: ../src/ui/theme-parser.c:507 ../src/ui/theme-parser.c:556 #: ../src/ui/theme-parser.c:503 ../src/ui/theme-parser.c:552
#, c-format #, c-format
msgid "Attribute \"%s\" is invalid on <%s> element in this context" msgid "Attribute \"%s\" is invalid on <%s> element in this context"
msgstr "L'attributo «%s» non è valido nell'elemento <%s> in questo contesto" msgstr "L'attributo «%s» non è valido nell'elemento <%s> in questo contesto"
#: ../src/ui/theme-parser.c:598 #: ../src/ui/theme-parser.c:594
#, c-format #, c-format
msgid "Could not parse \"%s\" as an integer" msgid "Could not parse \"%s\" as an integer"
msgstr "Impossibile analizzare «%s» come un intero" msgstr "Impossibile analizzare «%s» come un intero"
#: ../src/ui/theme-parser.c:607 ../src/ui/theme-parser.c:662 #: ../src/ui/theme-parser.c:603 ../src/ui/theme-parser.c:658
#, c-format #, c-format
msgid "Did not understand trailing characters \"%s\" in string \"%s\"" msgid "Did not understand trailing characters \"%s\" in string \"%s\""
msgstr "" msgstr ""
"Non sono stati compresi i caratteri di chiusura «%s» nella stringa «%s»" "Non sono stati compresi i caratteri di chiusura «%s» nella stringa «%s»"
#: ../src/ui/theme-parser.c:617 #: ../src/ui/theme-parser.c:613
#, c-format #, c-format
msgid "Integer %ld must be positive" msgid "Integer %ld must be positive"
msgstr "L'intero %ld deve essere positivo" msgstr "L'intero %ld deve essere positivo"
#: ../src/ui/theme-parser.c:625 #: ../src/ui/theme-parser.c:621
#, c-format #, c-format
msgid "Integer %ld is too large, current max is %d" msgid "Integer %ld is too large, current max is %d"
msgstr "L'intero %ld è troppo grande, il massimo corrente è %d" msgstr "L'intero %ld è troppo grande, il massimo corrente è %d"
#: ../src/ui/theme-parser.c:653 ../src/ui/theme-parser.c:769 #: ../src/ui/theme-parser.c:649 ../src/ui/theme-parser.c:765
#, c-format #, c-format
msgid "Could not parse \"%s\" as a floating point number" msgid "Could not parse \"%s\" as a floating point number"
msgstr "Impossibile analizzare «%s» come numero in virgola mobile" msgstr "Impossibile analizzare «%s» come numero in virgola mobile"
#: ../src/ui/theme-parser.c:684 ../src/ui/theme-parser.c:712 #: ../src/ui/theme-parser.c:680 ../src/ui/theme-parser.c:708
#, c-format #, c-format
msgid "Boolean values must be \"true\" or \"false\" not \"%s\"" msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
msgstr "I valori booleani devono essere «true» o «false», non «%s»" msgstr "I valori booleani devono essere «true» o «false», non «%s»"
# cambiato il finale, ma se è errore, vuol dire che %g è sbagliato.. # cambiato il finale, ma se è errore, vuol dire che %g è sbagliato..
#: ../src/ui/theme-parser.c:739 #: ../src/ui/theme-parser.c:735
#, c-format #, c-format
msgid "Angle must be between 0.0 and 360.0, was %g\n" msgid "Angle must be between 0.0 and 360.0, was %g\n"
msgstr "L'angolo deve essere tra 0.0 e 360.0, non %g\n" msgstr "L'angolo deve essere tra 0.0 e 360.0, non %g\n"
# come sopra # come sopra
#: ../src/ui/theme-parser.c:802 #: ../src/ui/theme-parser.c:798
#, c-format #, c-format
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n" msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
msgstr "Alpha deve essere tra 0.0 (trasparente) e 1.0 (opaco), non %g\n" msgstr "Alpha deve essere tra 0.0 (trasparente) e 1.0 (opaco), non %g\n"
#: ../src/ui/theme-parser.c:867 #: ../src/ui/theme-parser.c:863
#, c-format #, c-format
msgid "" msgid ""
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium," "Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
@@ -1353,64 +1347,64 @@ msgstr ""
"medium,large, x-large, o xx-large)\n" "medium,large, x-large, o xx-large)\n"
# element_name, name # element_name, name
#: ../src/ui/theme-parser.c:1023 ../src/ui/theme-parser.c:1086 #: ../src/ui/theme-parser.c:1019 ../src/ui/theme-parser.c:1082
#: ../src/ui/theme-parser.c:1120 ../src/ui/theme-parser.c:1223 #: ../src/ui/theme-parser.c:1116 ../src/ui/theme-parser.c:1219
#, c-format #, c-format
msgid "<%s> name \"%s\" used a second time" msgid "<%s> name \"%s\" used a second time"
msgstr "Nome «%2$s» di <%1$s> usato una seconda volta" msgstr "Nome «%2$s» di <%1$s> usato una seconda volta"
# element_name, parent # element_name, parent
#: ../src/ui/theme-parser.c:1035 ../src/ui/theme-parser.c:1132 #: ../src/ui/theme-parser.c:1031 ../src/ui/theme-parser.c:1128
#: ../src/ui/theme-parser.c:1235 #: ../src/ui/theme-parser.c:1231
#, c-format #, c-format
msgid "<%s> parent \"%s\" has not been defined" msgid "<%s> parent \"%s\" has not been defined"
msgstr "Il genitore «%2$s» di <%1$s> non è stato definito" msgstr "Il genitore «%2$s» di <%1$s> non è stato definito"
# element_name, geometry # element_name, geometry
#: ../src/ui/theme-parser.c:1145 #: ../src/ui/theme-parser.c:1141
#, c-format #, c-format
msgid "<%s> geometry \"%s\" has not been defined" msgid "<%s> geometry \"%s\" has not been defined"
msgstr "La geometria «%2$s» di <%1$s> non è stata definita" msgstr "La geometria «%2$s» di <%1$s> non è stata definita"
#: ../src/ui/theme-parser.c:1158 #: ../src/ui/theme-parser.c:1154
#, c-format #, c-format
msgid "<%s> must specify either a geometry or a parent that has a geometry" msgid "<%s> must specify either a geometry or a parent that has a geometry"
msgstr "<%s> deve specificare una geometria o un genitore che ha una geometria" msgstr "<%s> deve specificare una geometria o un genitore che ha una geometria"
#: ../src/ui/theme-parser.c:1200 #: ../src/ui/theme-parser.c:1196
msgid "You must specify a background for an alpha value to be meaningful" msgid "You must specify a background for an alpha value to be meaningful"
msgstr "" msgstr ""
"È necessario specificare uno sfondo per un valore alpha affinché sia " "È necessario specificare uno sfondo per un valore alpha affinché sia "
"significativo" "significativo"
# in base al successivo, type dovrebbe essere parola chiave.... # in base al successivo, type dovrebbe essere parola chiave....
#: ../src/ui/theme-parser.c:1268 #: ../src/ui/theme-parser.c:1264
#, c-format #, c-format
msgid "Unknown type \"%s\" on <%s> element" msgid "Unknown type \"%s\" on <%s> element"
msgstr "type «%s» sconosciuto nell'elemento <%s>" msgstr "type «%s» sconosciuto nell'elemento <%s>"
#: ../src/ui/theme-parser.c:1279 #: ../src/ui/theme-parser.c:1275
#, c-format #, c-format
msgid "Unknown style_set \"%s\" on <%s> element" msgid "Unknown style_set \"%s\" on <%s> element"
msgstr "style_set «%s» sconosciuto nell'elemento <%s>" msgstr "style_set «%s» sconosciuto nell'elemento <%s>"
#: ../src/ui/theme-parser.c:1287 #: ../src/ui/theme-parser.c:1283
#, c-format #, c-format
msgid "Window type \"%s\" has already been assigned a style set" msgid "Window type \"%s\" has already been assigned a style set"
msgstr "" msgstr ""
"Al tipo di finestra «%s» è stata già assegnata una impostazione di stile" "Al tipo di finestra «%s» è stata già assegnata una impostazione di stile"
#: ../src/ui/theme-parser.c:1317 ../src/ui/theme-parser.c:1381 #: ../src/ui/theme-parser.c:1313 ../src/ui/theme-parser.c:1377
#: ../src/ui/theme-parser.c:1607 ../src/ui/theme-parser.c:2842 #: ../src/ui/theme-parser.c:1603 ../src/ui/theme-parser.c:2838
#: ../src/ui/theme-parser.c:2888 ../src/ui/theme-parser.c:3038 #: ../src/ui/theme-parser.c:2884 ../src/ui/theme-parser.c:3034
#: ../src/ui/theme-parser.c:3274 ../src/ui/theme-parser.c:3312 #: ../src/ui/theme-parser.c:3273 ../src/ui/theme-parser.c:3311
#: ../src/ui/theme-parser.c:3350 ../src/ui/theme-parser.c:3388 #: ../src/ui/theme-parser.c:3349 ../src/ui/theme-parser.c:3387
#, c-format #, c-format
msgid "Element <%s> is not allowed below <%s>" msgid "Element <%s> is not allowed below <%s>"
msgstr "L'elemento <%s> non è consentito all'interno di <%s>" msgstr "L'elemento <%s> non è consentito all'interno di <%s>"
#: ../src/ui/theme-parser.c:1431 ../src/ui/theme-parser.c:1445 #: ../src/ui/theme-parser.c:1427 ../src/ui/theme-parser.c:1441
#: ../src/ui/theme-parser.c:1490 #: ../src/ui/theme-parser.c:1486
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"
@@ -1418,128 +1412,128 @@ msgstr ""
"Non è possibile specificare sia \"button_width\"/\"button_height\" che " "Non è possibile specificare sia \"button_width\"/\"button_height\" che "
"\"aspect_ratio\" per i pulsanti" "\"aspect_ratio\" per i pulsanti"
#: ../src/ui/theme-parser.c:1454 #: ../src/ui/theme-parser.c:1450
#, c-format #, c-format
msgid "Distance \"%s\" is unknown" msgid "Distance \"%s\" is unknown"
msgstr "La distanza «%s» è sconosciuta" msgstr "La distanza «%s» è sconosciuta"
#: ../src/ui/theme-parser.c:1499 #: ../src/ui/theme-parser.c:1495
#, c-format #, c-format
msgid "Aspect ratio \"%s\" is unknown" msgid "Aspect ratio \"%s\" is unknown"
msgstr "Le proporzioni «%s» sono sconosciute" msgstr "Le proporzioni «%s» sono sconosciute"
#: ../src/ui/theme-parser.c:1561 #: ../src/ui/theme-parser.c:1557
#, c-format #, c-format
msgid "Border \"%s\" is unknown" msgid "Border \"%s\" is unknown"
msgstr "Il bordo «%s» è sconosciuto" msgstr "Il bordo «%s» è sconosciuto"
#: ../src/ui/theme-parser.c:1872 #: ../src/ui/theme-parser.c:1868
#, c-format #, c-format
msgid "No \"start_angle\" or \"from\" attribute on element <%s>" msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
msgstr "Nessun attributo «start_angle» o «from» nell'elemento <%s>" msgstr "Nessun attributo «start_angle» o «from» nell'elemento <%s>"
#: ../src/ui/theme-parser.c:1879 #: ../src/ui/theme-parser.c:1875
#, c-format #, c-format
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>" msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
msgstr "Nessun attributo «extent_angle» o «to» nell'elemento <%s>" msgstr "Nessun attributo «extent_angle» o «to» nell'elemento <%s>"
#: ../src/ui/theme-parser.c:2119 #: ../src/ui/theme-parser.c:2115
#, c-format #, c-format
msgid "Did not understand value \"%s\" for type of gradient" msgid "Did not understand value \"%s\" for type of gradient"
msgstr "Valore «%s» incomprensibile per il tipo di gradiente" msgstr "Valore «%s» incomprensibile per il tipo di gradiente"
#: ../src/ui/theme-parser.c:2197 ../src/ui/theme-parser.c:2572 #: ../src/ui/theme-parser.c:2193 ../src/ui/theme-parser.c:2568
#, c-format #, c-format
msgid "Did not understand fill type \"%s\" for <%s> element" msgid "Did not understand fill type \"%s\" for <%s> element"
msgstr "Tipo di riempimento «%s» incomprensibile per l'elemento <%s>" msgstr "Tipo di riempimento «%s» incomprensibile per l'elemento <%s>"
#: ../src/ui/theme-parser.c:2364 ../src/ui/theme-parser.c:2447 #: ../src/ui/theme-parser.c:2360 ../src/ui/theme-parser.c:2443
#: ../src/ui/theme-parser.c:2510 #: ../src/ui/theme-parser.c:2506
#, c-format #, c-format
msgid "Did not understand state \"%s\" for <%s> element" msgid "Did not understand state \"%s\" for <%s> element"
msgstr "Stato «%s» incomprensibile per l'elemento <%s>" msgstr "Stato «%s» incomprensibile per l'elemento <%s>"
#: ../src/ui/theme-parser.c:2374 ../src/ui/theme-parser.c:2457 #: ../src/ui/theme-parser.c:2370 ../src/ui/theme-parser.c:2453
#, c-format #, c-format
msgid "Did not understand shadow \"%s\" for <%s> element" msgid "Did not understand shadow \"%s\" for <%s> element"
msgstr "Ombra «%s» incomprensibile per l'elemento <%s>" msgstr "Ombra «%s» incomprensibile per l'elemento <%s>"
#: ../src/ui/theme-parser.c:2384 #: ../src/ui/theme-parser.c:2380
#, c-format #, c-format
msgid "Did not understand arrow \"%s\" for <%s> element" msgid "Did not understand arrow \"%s\" for <%s> element"
msgstr "Freccia «%s» incomprensibile per l'elemento <%s>" msgstr "Freccia «%s» incomprensibile per l'elemento <%s>"
#: ../src/ui/theme-parser.c:2698 ../src/ui/theme-parser.c:2794 #: ../src/ui/theme-parser.c:2694 ../src/ui/theme-parser.c:2790
#, c-format #, c-format
msgid "No <draw_ops> called \"%s\" has been defined" msgid "No <draw_ops> called \"%s\" has been defined"
msgstr "Non è stato definito alcun <draw_ops> di nome «%s»" msgstr "Non è stato definito alcun <draw_ops> di nome «%s»"
#: ../src/ui/theme-parser.c:2710 ../src/ui/theme-parser.c:2806 #: ../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 "" msgstr ""
"Includendo draw_ops «%s» qui si potrebbe creare un riferimento circolare" "Includendo draw_ops «%s» qui si potrebbe creare un riferimento circolare"
# piece dovrebbe essere parola chiave # piece dovrebbe essere parola chiave
#: ../src/ui/theme-parser.c:2921 #: ../src/ui/theme-parser.c:2917
#, c-format #, c-format
msgid "Unknown position \"%s\" for frame piece" msgid "Unknown position \"%s\" for frame piece"
msgstr "Posizione «%s» sconosciuta per il piece di cornice" msgstr "Posizione «%s» sconosciuta per il piece di cornice"
# piece dovrebbe essere parola chiave # piece dovrebbe essere parola chiave
#: ../src/ui/theme-parser.c:2929 #: ../src/ui/theme-parser.c:2925
#, c-format #, c-format
msgid "Frame style already has a piece at position %s" msgid "Frame style already has a piece at position %s"
msgstr "Lo stile della cornice ha già una piece alla posizione %s" msgstr "Lo stile della cornice ha già una piece alla posizione %s"
#: ../src/ui/theme-parser.c:2946 ../src/ui/theme-parser.c:3023 #: ../src/ui/theme-parser.c:2942 ../src/ui/theme-parser.c:3019
#, c-format #, c-format
msgid "No <draw_ops> with the name \"%s\" has been defined" msgid "No <draw_ops> with the name \"%s\" has been defined"
msgstr "Non è stato definito alcun <draw_ops> con il nome «%s»" msgstr "Non è stato definito alcun <draw_ops> con il nome «%s»"
#: ../src/ui/theme-parser.c:2976 #: ../src/ui/theme-parser.c:2972
#, c-format #, c-format
msgid "Unknown function \"%s\" for button" msgid "Unknown function \"%s\" for button"
msgstr "Funzione «%s» sconosciuta per il pulsante" msgstr "Funzione «%s» sconosciuta per il pulsante"
#: ../src/ui/theme-parser.c:2986 #: ../src/ui/theme-parser.c:2982
#, c-format #, c-format
msgid "Button function \"%s\" does not exist in this version (%d, need %d)" msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
msgstr "" msgstr ""
"La funzione di pulsante «%s» non esiste in questa versione (%d, necessaria " "La funzione di pulsante «%s» non esiste in questa versione (%d, necessaria "
"%d)" "%d)"
#: ../src/ui/theme-parser.c:2998 #: ../src/ui/theme-parser.c:2994
#, c-format #, c-format
msgid "Unknown state \"%s\" for button" msgid "Unknown state \"%s\" for button"
msgstr "Stato «%s» sconosciuto per il pulsate" msgstr "Stato «%s» sconosciuto per il pulsate"
#: ../src/ui/theme-parser.c:3006 #: ../src/ui/theme-parser.c:3002
#, c-format #, c-format
msgid "Frame style already has a button for function %s state %s" msgid "Frame style already has a button for function %s state %s"
msgstr "Lo stile della cornice ha già un pulsante per la funzione %s stato %s" msgstr "Lo stile della cornice ha già un pulsante per la funzione %s stato %s"
#: ../src/ui/theme-parser.c:3077 #: ../src/ui/theme-parser.c:3073
#, c-format #, c-format
msgid "\"%s\" is not a valid value for focus attribute" msgid "\"%s\" is not a valid value for focus attribute"
msgstr "«%s» non è un valore valido per l'attributo focus" msgstr "«%s» non è un valore valido per l'attributo focus"
#: ../src/ui/theme-parser.c:3086 #: ../src/ui/theme-parser.c:3082
#, c-format #, c-format
msgid "\"%s\" is not a valid value for state attribute" msgid "\"%s\" is not a valid value for state attribute"
msgstr "«%s» non è un valore valido per l'attributo state" msgstr "«%s» non è un valore valido per l'attributo state"
#: ../src/ui/theme-parser.c:3096 #: ../src/ui/theme-parser.c:3092
#, c-format #, c-format
msgid "A style called \"%s\" has not been defined" msgid "A style called \"%s\" has not been defined"
msgstr "Uno stile chiamato «%s» non è stato definito" msgstr "Uno stile chiamato «%s» non è stato definito"
#: ../src/ui/theme-parser.c:3117 ../src/ui/theme-parser.c:3140 #: ../src/ui/theme-parser.c:3113 ../src/ui/theme-parser.c:3136
#, c-format #, c-format
msgid "\"%s\" is not a valid value for resize attribute" msgid "\"%s\" is not a valid value for resize attribute"
msgstr "«%s» non è un valore valido per l'attributo resize" msgstr "«%s» non è un valore valido per l'attributo resize"
#: ../src/ui/theme-parser.c:3151 #: ../src/ui/theme-parser.c:3147
#, c-format #, c-format
msgid "" msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized/shaded " "Should not have \"resize\" attribute on <%s> element for maximized/shaded "
@@ -1548,7 +1542,7 @@ msgstr ""
"Non si dovrebbe avere l'attributo «resize» nell'elemento <%s> per gli stati " "Non si dovrebbe avere l'attributo «resize» nell'elemento <%s> per gli stati "
"maximized/shaded" "maximized/shaded"
#: ../src/ui/theme-parser.c:3165 #: ../src/ui/theme-parser.c:3161
#, c-format #, c-format
msgid "" msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized states" "Should not have \"resize\" attribute on <%s> element for maximized states"
@@ -1556,19 +1550,19 @@ msgstr ""
"Non si dovrebbe avere l'attributo «resize» nell'elemento <%s> per gli stati " "Non si dovrebbe avere l'attributo «resize» nell'elemento <%s> per gli stati "
"maximized" "maximized"
#: ../src/ui/theme-parser.c:3179 ../src/ui/theme-parser.c:3223 #: ../src/ui/theme-parser.c:3175 ../src/ui/theme-parser.c:3222
#, c-format #, c-format
msgid "Style has already been specified for state %s resize %s focus %s" msgid "Style has already been specified for state %s resize %s focus %s"
msgstr "Lo stile è stato già specificato per lo stato %s resize %s focus %s" msgstr "Lo stile è stato già specificato per lo stato %s resize %s focus %s"
#: ../src/ui/theme-parser.c:3190 ../src/ui/theme-parser.c:3201 #: ../src/ui/theme-parser.c:3186 ../src/ui/theme-parser.c:3197
#: ../src/ui/theme-parser.c:3212 ../src/ui/theme-parser.c:3234 #: ../src/ui/theme-parser.c:3208 ../src/ui/theme-parser.c:3233
#: ../src/ui/theme-parser.c:3245 ../src/ui/theme-parser.c:3256 #: ../src/ui/theme-parser.c:3244 ../src/ui/theme-parser.c:3255
#, c-format #, c-format
msgid "Style has already been specified for state %s focus %s" msgid "Style has already been specified for state %s focus %s"
msgstr "Lo stile è stato già specificato per lo stato %s focus %s" msgstr "Lo stile è stato già specificato per lo stato %s focus %s"
#: ../src/ui/theme-parser.c:3295 #: ../src/ui/theme-parser.c:3294
msgid "" msgid ""
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops " "Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)" "attribute and also a <draw_ops> element, or specified two elements)"
@@ -1577,7 +1571,7 @@ msgstr ""
"specificato un attributo draw_ops e anche un elemento <draw_ops>, o ha " "specificato un attributo draw_ops e anche un elemento <draw_ops>, o ha "
"specificato due elementi)" "specificato due elementi)"
#: ../src/ui/theme-parser.c:3333 #: ../src/ui/theme-parser.c:3332
msgid "" msgid ""
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops " "Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)" "attribute and also a <draw_ops> element, or specified two elements)"
@@ -1586,7 +1580,7 @@ msgstr ""
"specificato un attributo draw_ops e anche un elemento <draw_ops>, o ha " "specificato un attributo draw_ops e anche un elemento <draw_ops>, o ha "
"specificato due elementi)" "specificato due elementi)"
#: ../src/ui/theme-parser.c:3371 #: ../src/ui/theme-parser.c:3370
msgid "" msgid ""
"Can't have a two draw_ops for a <menu_icon> element (theme specified a " "Can't have a two draw_ops for a <menu_icon> element (theme specified a "
"draw_ops attribute and also a <draw_ops> element, or specified two elements)" "draw_ops attribute and also a <draw_ops> element, or specified two elements)"
@@ -1595,12 +1589,12 @@ msgstr ""
"specificato un attributo draw_ops e anche un elemento <draw_ops>, o ha " "specificato un attributo draw_ops e anche un elemento <draw_ops>, o ha "
"specificato due elementi)" "specificato due elementi)"
#: ../src/ui/theme-parser.c:3435 #: ../src/ui/theme-parser.c:3434
#, c-format #, c-format
msgid "Bad version specification '%s'" msgid "Bad version specification '%s'"
msgstr "Specificazione di versione «%s» errata" msgstr "Specificazione di versione «%s» errata"
#: ../src/ui/theme-parser.c:3508 #: ../src/ui/theme-parser.c:3507
msgid "" msgid ""
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-" "\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
"theme-2.xml" "theme-2.xml"
@@ -1608,19 +1602,19 @@ msgstr ""
"L'attributo «version» non può essere usato in metacity-theme-1.xml o " "L'attributo «version» non può essere usato in metacity-theme-1.xml o "
"metacity-theme-2.xml" "metacity-theme-2.xml"
#: ../src/ui/theme-parser.c:3531 #: ../src/ui/theme-parser.c:3530
#, c-format #, c-format
msgid "Theme requires version %s but latest supported theme version is %d.%d" msgid "Theme requires version %s but latest supported theme version is %d.%d"
msgstr "" msgstr ""
"Il tema richiede la versione %s, ma la versione di tema supportata più " "Il tema richiede la versione %s, ma la versione di tema supportata più "
"recente è la %d.%d" "recente è la %d.%d"
#: ../src/ui/theme-parser.c:3563 #: ../src/ui/theme-parser.c:3562
#, c-format #, c-format
msgid "Outermost element in theme must be <metacity_theme> not <%s>" msgid "Outermost element in theme must be <metacity_theme> not <%s>"
msgstr "L'elemento più esterno nel tema deve essere <metacity_theme> not <%s>" msgstr "L'elemento più esterno nel tema deve essere <metacity_theme> not <%s>"
#: ../src/ui/theme-parser.c:3583 #: ../src/ui/theme-parser.c:3582
#, c-format #, c-format
msgid "" msgid ""
"Element <%s> is not allowed inside a name/author/date/description element" "Element <%s> is not allowed inside a name/author/date/description element"
@@ -1628,12 +1622,12 @@ msgstr ""
"L'elemento <%s> non è consentito all'interno di un elemento name/author/date/" "L'elemento <%s> non è consentito all'interno di un elemento name/author/date/"
"description" "description"
#: ../src/ui/theme-parser.c:3588 #: ../src/ui/theme-parser.c:3587
#, c-format #, c-format
msgid "Element <%s> is not allowed inside a <constant> element" msgid "Element <%s> is not allowed inside a <constant> element"
msgstr "L'elemento <%s> non è consentito all'interno di un elemento <constant>" msgstr "L'elemento <%s> non è consentito all'interno di un elemento <constant>"
#: ../src/ui/theme-parser.c:3600 #: ../src/ui/theme-parser.c:3599
#, c-format #, c-format
msgid "" msgid ""
"Element <%s> is not allowed inside a distance/border/aspect_ratio element" "Element <%s> is not allowed inside a distance/border/aspect_ratio element"
@@ -1641,41 +1635,41 @@ msgstr ""
"L'elemento <%s> non è consentito all'interno di un elemento distance/border/" "L'elemento <%s> non è consentito all'interno di un elemento distance/border/"
"aspect_ratio" "aspect_ratio"
#: ../src/ui/theme-parser.c:3622 #: ../src/ui/theme-parser.c:3621
#, c-format #, c-format
msgid "Element <%s> is not allowed inside a draw operation element" msgid "Element <%s> is not allowed inside a draw operation element"
msgstr "" msgstr ""
"L'elemento <%s> non è consentito all'interno di un elemento relativo " "L'elemento <%s> non è consentito all'interno di un elemento relativo "
"un'operazione di disegno" "un'operazione di disegno"
#: ../src/ui/theme-parser.c:3632 ../src/ui/theme-parser.c:3662 #: ../src/ui/theme-parser.c:3631 ../src/ui/theme-parser.c:3661
#: ../src/ui/theme-parser.c:3667 ../src/ui/theme-parser.c:3672 #: ../src/ui/theme-parser.c:3666 ../src/ui/theme-parser.c:3671
#, c-format #, c-format
msgid "Element <%s> is not allowed inside a <%s> element" msgid "Element <%s> is not allowed inside a <%s> element"
msgstr "L'elemento <%s> non è consentito all'interno di un elemento <%s>" msgstr "L'elemento <%s> non è consentito all'interno di un elemento <%s>"
# piece dovrebbe essere parola chiave # piece dovrebbe essere parola chiave
#: ../src/ui/theme-parser.c:3900 #: ../src/ui/theme-parser.c:3899
msgid "No draw_ops provided for frame piece" msgid "No draw_ops provided for frame piece"
msgstr "Nessun draw_ops fornito per il piece di cornice" msgstr "Nessun draw_ops fornito per il piece di cornice"
#: ../src/ui/theme-parser.c:3915 #: ../src/ui/theme-parser.c:3914
msgid "No draw_ops provided for button" msgid "No draw_ops provided for button"
msgstr "Nessun draw_ops fornito per il pulsante" msgstr "Nessun draw_ops fornito per il pulsante"
#: ../src/ui/theme-parser.c:3969 #: ../src/ui/theme-parser.c:3968
#, c-format #, c-format
msgid "No text is allowed inside element <%s>" msgid "No text is allowed inside element <%s>"
msgstr "Il testo non è consentito all'interno dell'elemento <%s>" msgstr "Il testo non è consentito all'interno dell'elemento <%s>"
#: ../src/ui/theme-parser.c:4027 ../src/ui/theme-parser.c:4039 #: ../src/ui/theme-parser.c:4026 ../src/ui/theme-parser.c:4038
#: ../src/ui/theme-parser.c:4051 ../src/ui/theme-parser.c:4063 #: ../src/ui/theme-parser.c:4050 ../src/ui/theme-parser.c:4062
#: ../src/ui/theme-parser.c:4075 #: ../src/ui/theme-parser.c:4074
#, c-format #, c-format
msgid "<%s> specified twice for this theme" msgid "<%s> specified twice for this theme"
msgstr "<%s> specificato due volte per questo tema" msgstr "<%s> specificato due volte per questo tema"
#: ../src/ui/theme-parser.c:4337 #: ../src/ui/theme-parser.c:4336
#, 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 "Ricerca di un file valido per il tema «%s» non riuscita\n" msgstr "Ricerca di un file valido per il tema «%s» non riuscita\n"

2012
po/kn.po

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: mutter\n" "Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-10-25 00:25+0200\n" "POT-Creation-Date: 2013-10-25 00:15+0200\n"
"PO-Revision-Date: 2013-10-25 00:23+0200\n" "PO-Revision-Date: 2013-10-25 00:23+0200\n"
"Last-Translator: Reinout van Schouwen <reinouts@gnome.org>\n" "Last-Translator: Reinout van Schouwen <reinouts@gnome.org>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n" "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
@@ -256,12 +256,12 @@ msgstr "_Wachten"
msgid "_Force Quit" msgid "_Force Quit"
msgstr "Ge_forceerd afsluiten" msgstr "Ge_forceerd afsluiten"
#: ../src/core/display.c:421 #: ../src/core/display.c:422
#, c-format #, c-format
msgid "Missing %s extension required for compositing" msgid "Missing %s extension required for compositing"
msgstr "Benodigde extensie %s voor compositing ontbreekt" msgstr "Benodigde extensie %s voor compositing ontbreekt"
#: ../src/core/display.c:513 #: ../src/core/display.c:514
#, 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 "Openen van X Window System display %s mislukt\n" msgstr "Openen van X Window System display %s mislukt\n"
@@ -389,12 +389,12 @@ msgstr ""
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Werkblad %d" msgstr "Werkblad %d"
#: ../src/core/screen.c:540 #: ../src/core/screen.c:537
#, c-format #, c-format
msgid "Screen %d on display '%s' is invalid\n" msgid "Screen %d on display '%s' is invalid\n"
msgstr "Scherm %d op display '%s' is ongeldig\n" msgstr "Scherm %d op display '%s' is ongeldig\n"
#: ../src/core/screen.c:556 #: ../src/core/screen.c:553
#, 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 --"
@@ -403,19 +403,19 @@ msgstr ""
"Scherm %d op display %s heeft al een window manager; probeer de optie: --" "Scherm %d op display %s heeft al een window manager; probeer de optie: --"
"replace te gebruiken om de huidige window manager te vervangen.\n" "replace te gebruiken om de huidige window manager te vervangen.\n"
#: ../src/core/screen.c:583 #: ../src/core/screen.c:580
#, 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 ""
"Kon window manager-selectie niet verkrijgen op scherm %d display %s\n" "Kon window manager-selectie niet verkrijgen op scherm %d display %s\n"
#: ../src/core/screen.c:661 #: ../src/core/screen.c:658
#, 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 "Scherm %d op display %s heeft al een window manager\n" msgstr "Scherm %d op display %s heeft al een window manager\n"
#: ../src/core/screen.c:853 #: ../src/core/screen.c:850
#, 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 "Kon scherm %d op display %s niet vrijmaken\n" msgstr "Kon scherm %d op display %s niet vrijmaken\n"
@@ -511,7 +511,7 @@ msgid "Window manager error: "
msgstr "Fout van vensterbeheer:" msgstr "Fout van vensterbeheer:"
#. first time through #. first time through
#: ../src/core/window.c:7510 #: ../src/core/window.c:7515
#, 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 +527,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:8340 #: ../src/core/window.c:8345
#, 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 "
@@ -683,9 +683,9 @@ msgid ""
"the focus will not be changed immediately when entering a window, but only " "the focus will not be changed immediately when entering a window, but only "
"after the pointer stops moving." "after the pointer stops moving."
msgstr "" msgstr ""
"Indien op true ingesteld en de aandachtsmodus is ofwel sloppy of " "Indien op true ingesteld en de aandachtsmodus is ofwel sloppy of mouse, "
"mouse, dan zal de aandacht niet direct veranderd worden bij het binnengaan " "dan zal de aandacht niet direct veranderd worden bij het binnengaan van een "
"van een venster, maar slechts wanneer de muispijl stopt met bewegen." "venster, maar slechts wanneer de muispijl stopt met bewegen."
#: ../src/org.gnome.mutter.gschema.xml.in.h:15 #: ../src/org.gnome.mutter.gschema.xml.in.h:15
msgid "Draggable border width" msgid "Draggable border width"
@@ -697,8 +697,8 @@ msgid ""
"not enough, invisible borders will be added to meet this value." "not enough, invisible borders will be added to meet this value."
msgstr "" msgstr ""
"Het totaal aantal sleepbare randen. Als de zichtbare randen in het thema " "Het totaal aantal sleepbare randen. Als de zichtbare randen in het thema "
"onvoldoende zijn, worden onzichtbare randen toegevoegd om deze waarde te " "onvoldoende zijn, worden onzichtbare randen toegevoegd om deze waarde "
"bereiken." "te bereiken."
#: ../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"
@@ -968,8 +968,8 @@ msgid ""
"GTK custom color specification must have color name and fallback in " "GTK custom color specification must have color name and fallback in "
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\"" "parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
msgstr "" msgstr ""
"Aangepaste GTK-kleurspecificatie moet een kleurnaam en terugvaloptie hebben " "Aangepaste GTK-kleurspecificatie moet een kleurnaam en terugvaloptie "
"tussen haakjes, dus: gtk:custom(foo,bar); kon %s niet verwerken" "hebben tussen haakjes, dus: gtk:custom(foo,bar); kon %s niet verwerken"
#: ../src/ui/theme.c:1219 #: ../src/ui/theme.c:1219
#, c-format #, c-format
@@ -977,8 +977,8 @@ 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-"
"_ are valid" "_ are valid"
msgstr "" msgstr ""
"Ongeldig teken %c in color_name-parameter van gtk:custom, alleen A-Za-z0-9-" "Ongeldig teken %c in color_name-parameter van gtk:custom, alleen A-Za-z0-9-_ "
"_ zijn geldig" "zijn geldig"
#: ../src/ui/theme.c:1233 #: ../src/ui/theme.c:1233
#, c-format #, c-format
@@ -986,8 +986,8 @@ 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 "
"fit the format" "fit the format"
msgstr "" msgstr ""
"Gtk:custom-formaat is gtk:custom(color_name,fallback), %s voldoet niet " "Gtk:custom-formaat is gtk:custom(color_name,fallback), %s voldoet "
"aan dit formaat" "niet aan dit formaat"
#: ../src/ui/theme.c:1278 #: ../src/ui/theme.c:1278
#, c-format #, c-format

3642
po/oc.po

File diff suppressed because it is too large Load Diff

222
po/pt.po
View File

@@ -1,20 +1,24 @@
# mutter's Portuguese Translation # mutter's Portuguese Translation
# Copyright © 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 metacity/mutter # Copyright © 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 metacity/mutter
# Distributed under the same licence as the metacity package # Distributed under the same licence as the metacity package
# Duarte Loreto <happyguy_pt@hotmail.com>, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013. # Duarte Loreto <happyguy_pt@hotmail.com>, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
# # Pedro Albuquerque <palbuquerque73@gmail.com>, 2015.
#
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 3.10\n" "Project-Id-Version: 3.10\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"POT-Creation-Date: 2013-09-23 00:17+0100\n" "product=mutter&keywords=I18N+L10N&component=general\n"
"PO-Revision-Date: 2013-09-23 00:20+0000\n" "POT-Creation-Date: 2015-09-28 23:51+0000\n"
"Last-Translator: Duarte Loreto <happyguy_pt@hotmail.com>\n" "PO-Revision-Date: 2015-10-07 09:55+0100\n"
"Language-Team: Portuguese <gnome_pt@yahoogroups.com>\n" "Last-Translator: Pedro Albuquerque <palbuquerque73@gmail.com>\n"
"Language-Team: Português <palbuquerque73@gmail.com>\n"
"Language: pt\n" "Language: pt\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"
"Plural-Forms: nplurals=2; plural=(n != 1);\\n\n"
"X-Generator: Gtranslator 2.91.6\n"
#: ../src/50-mutter-navigation.xml.in.h:1 #: ../src/50-mutter-navigation.xml.in.h:1
msgid "Navigation" msgid "Navigation"
@@ -54,11 +58,11 @@ msgstr "Mover a janela uma área de trabalho abaixo"
#: ../src/50-mutter-navigation.xml.in.h:10 #: ../src/50-mutter-navigation.xml.in.h:10
msgid "Switch applications" msgid "Switch applications"
msgstr "Alternar entre aplicações" msgstr "Mudar de aplicações"
#: ../src/50-mutter-navigation.xml.in.h:11 #: ../src/50-mutter-navigation.xml.in.h:11
msgid "Switch windows" msgid "Switch windows"
msgstr "Alternar entre janelas" msgstr "Mudar de janelas"
#: ../src/50-mutter-navigation.xml.in.h:12 #: ../src/50-mutter-navigation.xml.in.h:12
msgid "Switch windows of an application" msgid "Switch windows of an application"
@@ -82,23 +86,23 @@ msgstr "Alternar diretamente entre controlos de sistema"
#: ../src/50-mutter-navigation.xml.in.h:17 #: ../src/50-mutter-navigation.xml.in.h:17
msgid "Hide all normal windows" msgid "Hide all normal windows"
msgstr "Esconder todas as janelas normais" msgstr "Ocultar todas as janelas normais"
#: ../src/50-mutter-navigation.xml.in.h:18 #: ../src/50-mutter-navigation.xml.in.h:18
msgid "Switch to workspace 1" msgid "Switch to workspace 1"
msgstr "Alternar para a área de trabalho 1" msgstr "Mudar para a área de trabalho 1"
#: ../src/50-mutter-navigation.xml.in.h:19 #: ../src/50-mutter-navigation.xml.in.h:19
msgid "Switch to workspace 2" msgid "Switch to workspace 2"
msgstr "Alternar para a área de trabalho 2" msgstr "Mudar para a área de trabalho 2"
#: ../src/50-mutter-navigation.xml.in.h:20 #: ../src/50-mutter-navigation.xml.in.h:20
msgid "Switch to workspace 3" msgid "Switch to workspace 3"
msgstr "Alternar para a área de trabalho 3" msgstr "Mudar para a área de trabalho 3"
#: ../src/50-mutter-navigation.xml.in.h:21 #: ../src/50-mutter-navigation.xml.in.h:21
msgid "Switch to workspace 4" msgid "Switch to workspace 4"
msgstr "Alternar para a área de trabalho 4" msgstr "Mudar para a área de trabalho 4"
#: ../src/50-mutter-navigation.xml.in.h:22 #: ../src/50-mutter-navigation.xml.in.h:22
msgid "Move to workspace left" msgid "Move to workspace left"
@@ -122,11 +126,11 @@ msgstr "Sistema"
#: ../src/50-mutter-system.xml.in.h:2 #: ../src/50-mutter-system.xml.in.h:2
msgid "Show the run command prompt" msgid "Show the run command prompt"
msgstr "Apresentar a linha de comando de execução" msgstr "Mostrar a linha de comando de execução"
#: ../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 "Apresentar o resumo de atividades" msgstr "Mostrar o resumo de atividades"
#: ../src/50-mutter-windows.xml.in.h:1 #: ../src/50-mutter-windows.xml.in.h:1
msgid "Windows" msgid "Windows"
@@ -162,7 +166,7 @@ msgstr "Fechar a janela"
#: ../src/50-mutter-windows.xml.in.h:9 #: ../src/50-mutter-windows.xml.in.h:9
msgid "Hide window" msgid "Hide window"
msgstr "Esconder a janela" msgstr "Ocultar a janela"
#: ../src/50-mutter-windows.xml.in.h:10 #: ../src/50-mutter-windows.xml.in.h:10
msgid "Move window" msgid "Move window"
@@ -174,7 +178,7 @@ msgstr "Redimensionar a janela"
#: ../src/50-mutter-windows.xml.in.h:12 #: ../src/50-mutter-windows.xml.in.h:12
msgid "Toggle window on all workspaces or one" msgid "Toggle window on all workspaces or one"
msgstr "Alternar janela em todas as áreas de trabalho ou apenas numa" msgstr "Alternar janela em todas as áreas de trabalho ou só numa"
#: ../src/50-mutter-windows.xml.in.h:13 #: ../src/50-mutter-windows.xml.in.h:13
msgid "Raise window if covered, otherwise lower it" msgid "Raise window if covered, otherwise lower it"
@@ -198,11 +202,11 @@ msgstr "Maximizar janela horizontalmente"
#: ../src/50-mutter-windows.xml.in.h:18 #: ../src/50-mutter-windows.xml.in.h:18
msgid "View split on left" msgid "View split on left"
msgstr "Visualizar a divisão à esquerda" msgstr "Ver a divisão à esquerda"
#: ../src/50-mutter-windows.xml.in.h:19 #: ../src/50-mutter-windows.xml.in.h:19
msgid "View split on right" msgid "View split on right"
msgstr "Visualizar a divisão à direita" msgstr "Ver a divisão à direita"
#. 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
@@ -215,9 +219,9 @@ msgstr ""
"Já se encontra em execução outro gestor de janelas no ecrã %i do monitor \"%s" "Já se encontra em execução outro gestor de janelas no ecrã %i do monitor \"%s"
"\"." "\"."
#: ../src/compositor/meta-background.c:1075 #: ../src/compositor/meta-background.c:1090
msgid "background texture could not be created from file" msgid "background texture could not be created from file"
msgstr "incapaz de criar de ficheiro a textura de fundo" msgstr "impossível criar de ficheiro a textura de fundo"
#: ../src/core/bell.c:322 #: ../src/core/bell.c:322
msgid "Bell event" msgid "Bell event"
@@ -231,7 +235,7 @@ msgstr "Pedido de informação de janela desconhecido: %d"
#: ../src/core/delete.c:111 #: ../src/core/delete.c:111
#, c-format #, c-format
msgid "“%s” is not responding." msgid "“%s” is not responding."
msgstr "“%s” não está a responder." msgstr "\"%s\" não está a responder."
#: ../src/core/delete.c:113 #: ../src/core/delete.c:113
msgid "Application is not responding." msgid "Application is not responding."
@@ -251,17 +255,17 @@ msgstr "_Aguardar"
#: ../src/core/delete.c:125 #: ../src/core/delete.c:125
msgid "_Force Quit" msgid "_Force Quit"
msgstr "_Forçar Terminar" msgstr "_Forçar terminar"
#: ../src/core/display.c:422 #: ../src/core/display.c:422
#, c-format #, c-format
msgid "Missing %s extension required for compositing" msgid "Missing %s extension required for compositing"
msgstr "Incapaz de encontrar a extensão %s, necessária para a composição" msgstr "Impossível encontrar a extensão %s, necessária para a composição"
#: ../src/core/display.c:514 #: ../src/core/display.c:514
#, 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 "Falha ao abrir ecrã '%s' do Sistema Janelas X\n" msgstr "Falha ao abrir ecrã \"%s\" do sistema Janelas X\n"
#: ../src/core/keybindings.c:1136 #: ../src/core/keybindings.c:1136
#, c-format #, c-format
@@ -287,7 +291,7 @@ msgstr "Substituir o gestor de janelas em execução"
#: ../src/core/main.c:209 #: ../src/core/main.c:209
msgid "Specify session management ID" msgid "Specify session management ID"
msgstr "Especificar o ID de gestão de sessão" msgstr "Especificar a ID de gestão de sessão"
#: ../src/core/main.c:214 #: ../src/core/main.c:214
msgid "X Display to use" msgid "X Display to use"
@@ -299,19 +303,19 @@ msgstr "Inicializar a sessão a partir de um ficheiro de gravação de sessão"
#: ../src/core/main.c:226 #: ../src/core/main.c:226
msgid "Make X calls synchronous" msgid "Make X calls synchronous"
msgstr "Realizar as invocações X sincronamente" msgstr "Fazer as chamadas X sincronamente"
#: ../src/core/main.c:534 #: ../src/core/main.c:534
#, c-format #, c-format
msgid "Failed to scan themes directory: %s\n" msgid "Failed to scan themes directory: %s\n"
msgstr "Falha ao analizar diretório de temas: %s\n" msgstr "Falha ao analizar pasta de temas: %s\n"
#: ../src/core/main.c:550 #: ../src/core/main.c:550
#, 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"
msgstr "" msgstr ""
"Incapaz de encontrar um tema! Certifique-se que %s existe e contém os temas " "Impossível encontrar um tema! Certifique-se que %s existe e contém os temas "
"normais.\n" "normais.\n"
#: ../src/core/monitor.c:696 #: ../src/core/monitor.c:696
@@ -349,21 +353,21 @@ msgstr "Imprimir a versão"
#: ../src/core/mutter.c:60 #: ../src/core/mutter.c:60
msgid "Mutter plugin to use" msgid "Mutter plugin to use"
msgstr "Plugin Mutter a utilizar" msgstr "Extensão Mutter a utilizar"
#: ../src/core/prefs.c:1202 #: ../src/core/prefs.c:1202
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 ""
"Recursos para aplicações problemáticas inativos. Algumas aplicações poderão " "Recursos inativos para aplicações problemáticas. Algumas aplicações poderão "
"não funcionar corretamente.\n" "não funcionar corretamente.\n"
#: ../src/core/prefs.c:1277 #: ../src/core/prefs.c:1277
#, 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 "" msgstr ""
"Incapaz de processar a descrição de fonte \"%s\" da chave GSettings %s\n" "Impossível processar a descrição de letra \"%s\" da chave GSettings %s\n"
#: ../src/core/prefs.c:1343 #: ../src/core/prefs.c:1343
#, c-format #, c-format
@@ -386,14 +390,14 @@ msgstr ""
#: ../src/core/prefs.c:1999 #: ../src/core/prefs.c:1999
#, c-format #, c-format
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Área de Trabalho %d" msgstr "Área de trabalho %d"
#: ../src/core/screen.c:537 #: ../src/core/screen.c:539
#, c-format #, c-format
msgid "Screen %d on display '%s' is invalid\n" msgid "Screen %d on display '%s' is invalid\n"
msgstr "Ecrã %d no monitor '%s' é inválido\n" msgstr "Ecrã %d no monitor \"%s\" é inválido\n"
#: ../src/core/screen.c:553 #: ../src/core/screen.c:555
#, 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 --"
@@ -402,42 +406,42 @@ msgstr ""
"Ecrã %d no monitor \"%s\" já tem um gestor de janelas; tente utilizar a " "Ecrã %d no monitor \"%s\" já tem um gestor de janelas; tente utilizar a "
"opção --replace para substituir o gestor de janelas atual.\n" "opção --replace para substituir o gestor de janelas atual.\n"
#: ../src/core/screen.c:580 #: ../src/core/screen.c:582
#, 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 ""
"Incapaz de obter seleção do gestor de janelas no ecrã %d monitor \"%s\"\n" "Impossível obter seleção do gestor de janelas no ecrã %d monitor \"%s\"\n"
#: ../src/core/screen.c:658 #: ../src/core/screen.c:660
#, 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 "Ecrã %d no monitor \"%s\" já tem um gestor de janelas\n" msgstr "Ecrã %d no monitor \"%s\" já tem um gestor de janelas\n"
#: ../src/core/screen.c:850 #: ../src/core/screen.c:852
#, 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 "Incapaz libertar ecrã %d no monitor \"%s\"\n" msgstr "Impossível libertar ecrã %d no monitor \"%s\"\n"
#: ../src/core/session.c:843 ../src/core/session.c:850 #: ../src/core/session.c:843 ../src/core/session.c:850
#, c-format #, c-format
msgid "Could not create directory '%s': %s\n" msgid "Could not create directory '%s': %s\n"
msgstr "Incapaz de criar diretório '%s': %s\n" msgstr "Impossível criar pasta \"%s\": %s\n"
#: ../src/core/session.c:860 #: ../src/core/session.c:860
#, c-format #, c-format
msgid "Could not open session file '%s' for writing: %s\n" msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Incapaz de abrir ficheiro de sessão '%s' para escrita: %s\n" msgstr "Impossível abrir ficheiro de sessão \"%s\" para escrita: %s\n"
#: ../src/core/session.c:1001 #: ../src/core/session.c:1001
#, c-format #, c-format
msgid "Error writing session file '%s': %s\n" msgid "Error writing session file '%s': %s\n"
msgstr "Erro ao escrever ficheiro de sessão '%s': %s\n" msgstr "Erro ao escrever ficheiro de sessão \"%s\": %s\n"
#: ../src/core/session.c:1006 #: ../src/core/session.c:1006
#, c-format #, c-format
msgid "Error closing session file '%s': %s\n" msgid "Error closing session file '%s': %s\n"
msgstr "Erro ao fechar ficheiro de sessão '%s': %s\n" msgstr "Erro ao fechar ficheiro de sessão \"%s\": %s\n"
#: ../src/core/session.c:1136 #: ../src/core/session.c:1136
#, c-format #, c-format
@@ -459,7 +463,7 @@ msgstr "Atributo %s desconhecido no elemento <%s>"
#: ../src/core/session.c:1215 #: ../src/core/session.c:1215
#, c-format #, c-format
msgid "nested <window> tag" msgid "nested <window> tag"
msgstr "etiqueta de <window> encadeada" msgstr "etiqueta de <window> aninhada"
#: ../src/core/session.c:1457 #: ../src/core/session.c:1457
#, c-format #, c-format
@@ -471,8 +475,8 @@ msgid ""
"These windows do not support &quot;save current setup&quot; and will have to " "These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in." "be restarted manually next time you log in."
msgstr "" msgstr ""
"Estas janelas não suportam &quot;gravar configuração atual&quot; e terão de " "Estas janelas não suportam \"Gravar configuração atual\" e terão de ser "
"ser reiniciadas manualmente da próxima vez que iniciar sessão." "reiniciadas manualmente da próxima vez que iniciar sessão."
#: ../src/core/util.c:84 #: ../src/core/util.c:84
#, c-format #, c-format
@@ -492,7 +496,7 @@ msgstr "Ficheiro de registo %s aberto\n"
#: ../src/core/util.c:119 #: ../src/core/util.c:119
msgid "Mutter was compiled without support for verbose mode\n" msgid "Mutter was compiled without support for verbose mode\n"
msgstr "" msgstr ""
"Mutter foi compilado sem suporte para modo de registo detalhado (verbose)\n" "Mutter foi compilado sem suporte para modo de registo detalhado (verboso)\n"
#: ../src/core/util.c:264 #: ../src/core/util.c:264
msgid "Window manager: " msgid "Window manager: "
@@ -511,7 +515,7 @@ msgid "Window manager error: "
msgstr "Erro do gestor de janelas: " msgstr "Erro do gestor de janelas: "
#. first time through #. first time through
#: ../src/core/window.c:7515 #: ../src/core/window.c:7509
#, 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 +531,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:8345 #: ../src/core/window.c:8341
#, 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 "
@@ -602,10 +606,10 @@ msgid ""
"\"Windows key\" on PC hardware. It's expected that this binding either the " "\"Windows key\" on PC hardware. It's expected that this binding either the "
"default or set to the empty string." "default or set to the empty string."
msgstr "" msgstr ""
"Esta chave irá iniciar a \"sobreposição\", que é um sistema de visão " "Esta tecla iniciará a \"sobreposição\", que é um sistema de visão combinada "
"combinada de janelas e arranque de aplicações. Por omissão é a \"tecla " "de janelas e arranque de aplicações. Por predefinição é a \"tecla Windows\" "
"Windows\" em computadores PC. Espera-se que esta associação esteja para a " "em computadores PC. Espera-se que esta associação seja a predefinição ou uma "
"omissão ou uma expressão vazia." "cadeia vazia."
#: ../src/org.gnome.mutter.gschema.xml.in.h:3 #: ../src/org.gnome.mutter.gschema.xml.in.h:3
msgid "Attach modal dialogs" msgid "Attach modal dialogs"
@@ -618,8 +622,8 @@ msgid ""
"the parent window." "the parent window."
msgstr "" msgstr ""
"Quando verdadeiro, em vez de terem barras de título independentes, os " "Quando verdadeiro, em vez de terem barras de título independentes, os "
"diálogos modais surgem anexados à barra de título da janela pai e são " "diálogos modais surgem anexados à barra de título da janela-mãe e são "
"movidos juntamente com a janela pai." "movidos juntamente com a janela-mãe."
#: ../src/org.gnome.mutter.gschema.xml.in.h:5 #: ../src/org.gnome.mutter.gschema.xml.in.h:5
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
@@ -724,17 +728,17 @@ msgstr "Cancelar o popup de tabulador"
#. 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:67
msgid "Mi_nimize" msgid "Mi_nimize"
msgstr "Mi_nimizar" msgstr "Mi_Nimizar"
#. 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:69
msgid "Ma_ximize" msgid "Ma_ximize"
msgstr "Ma_ximizar" msgstr "Ma_Ximizar"
#. 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:71
msgid "Unma_ximize" msgid "Unma_ximize"
msgstr "Resta_urar" msgstr "Resta_Urar"
#. 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:73
@@ -744,7 +748,7 @@ msgstr "_Enrolar"
#. 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:75
msgid "_Unroll" msgid "_Unroll"
msgstr "D_esenrolar" msgstr "D_Esenrolar"
#. 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:77
@@ -759,7 +763,7 @@ msgstr "_Redimensionar"
#. 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:81
msgid "Move Titlebar On_screen" msgid "Move Titlebar On_screen"
msgstr "Mover a _Barra de Títulos no Ecrã" msgstr "Mover a _Barra de títulos no ecrã"
#. 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!
@@ -770,32 +774,32 @@ msgstr "Sempre no _Topo"
#. 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:88
msgid "_Always on Visible Workspace" msgid "_Always on Visible Workspace"
msgstr "_Sempre na Área de Trabalho Visível" msgstr "_Sempre na área de trabalho visível"
#. 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:90
msgid "_Only on This Workspace" msgid "_Only on This Workspace"
msgstr "_Apenas nesta Área de Trabalho" msgstr "_ nesta área de trabalho"
#. 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:92
msgid "Move to Workspace _Left" msgid "Move to Workspace _Left"
msgstr "Mover para a Área de Trabalho à _Esquerda" msgstr "Mover para a área de trabalho à _Esquerda"
#. 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:94
msgid "Move to Workspace R_ight" msgid "Move to Workspace R_ight"
msgstr "Mover para a Área de Trabalho à _Direita" msgstr "Mover para a área de trabalho à _Direita"
#. 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:96
msgid "Move to Workspace _Up" msgid "Move to Workspace _Up"
msgstr "Mover para a Área de Trabalho _Acima" msgstr "Mover para a área de trabalho _Acima"
#. 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:98
msgid "Move to Workspace _Down" msgid "Move to Workspace _Down"
msgstr "Mover para a Área de Trabalho A_baixo" msgstr "Mover para a área de trabalho a_Baixo"
#. 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!
@@ -806,21 +810,21 @@ msgstr "_Fechar"
#: ../src/ui/menu.c:202 #: ../src/ui/menu.c:202
#, c-format #, c-format
msgid "Workspace %d%n" msgid "Workspace %d%n"
msgstr "Área de Trabalho %d%n" msgstr "Área de trabalho %d%n"
#: ../src/ui/menu.c:212 #: ../src/ui/menu.c:212
#, c-format #, c-format
msgid "Workspace 1_0" msgid "Workspace 1_0"
msgstr "Área de Trabalho 1_0" msgstr "Área de trabalho 1_0"
#: ../src/ui/menu.c:214 #: ../src/ui/menu.c:214
#, c-format #, c-format
msgid "Workspace %s%d" msgid "Workspace %s%d"
msgstr "Área de Trabalho %s%d" msgstr "Área de trabalho %s%d"
#: ../src/ui/menu.c:384 #: ../src/ui/menu.c:384
msgid "Move to Another _Workspace" msgid "Move to Another _Workspace"
msgstr "Mover para Outra Área de _Trabalho" msgstr "Mover para outra área de _Trabalho"
#. This is the text that should appear next to menu accelerators #. This is the text that should appear next to menu accelerators
#. * that use the shift key. If the text on this key isn't typically #. * that use the shift key. If the text on this key isn't typically
@@ -949,7 +953,7 @@ msgstr "geometria de moldura não especifica dimensão \"%s\" para margem \"%s\"
#: ../src/ui/theme.c:326 #: ../src/ui/theme.c:326
#, c-format #, c-format
msgid "Button aspect ratio %g is not reasonable" msgid "Button aspect ratio %g is not reasonable"
msgstr "Rácio de aparência de botão %g não é um valor razoável" msgstr "Proporção do botão %g não é um valor razoável"
#: ../src/ui/theme.c:338 #: ../src/ui/theme.c:338
#, c-format #, c-format
@@ -968,7 +972,7 @@ msgid ""
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\"" "parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
msgstr "" msgstr ""
"Especificação de cor GTK tem de ter o nome da cor e o recurso entre " "Especificação de cor GTK tem de ter o nome da cor e o recurso entre "
"parentesis, por ex. gtk:custom(foo,bar); incapaz de processar \"%s\"" "parentesis, por ex. gtk:custom(foo,bar); impossível processar \"%s\""
#: ../src/ui/theme.c:1219 #: ../src/ui/theme.c:1219
#, c-format #, c-format
@@ -976,8 +980,8 @@ 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-"
"_ are valid" "_ are valid"
msgstr "" msgstr ""
"Caracter '%c' inválido no parâmetro color_name de gtk:custom, apenas são " "Carácter \"%c\" inválido no parâmetro color_name de gtk:custom, apenas são "
"válidos os carateres A-Za-z0-9-_" "válidos os caracteres A-Za-z0-9-_"
#: ../src/ui/theme.c:1233 #: ../src/ui/theme.c:1233
#, c-format #, c-format
@@ -994,8 +998,8 @@ 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] "
"where NORMAL is the state; could not parse \"%s\"" "where NORMAL is the state; could not parse \"%s\""
msgstr "" msgstr ""
"Especificação de cor GTK tem de ter o estado entre parentesis retos, por ex. " "Especificação de cor GTK tem de ter o estado entre parênteses retos, por ex. "
"gtk:fg[NORMAL] em que NORMAL é o estado; incapaz de processar \"%s\"" "gtk:fg[NORMAL] em que NORMAL é o estado; impossível processar \"%s\""
#: ../src/ui/theme.c:1292 #: ../src/ui/theme.c:1292
#, c-format #, c-format
@@ -1003,20 +1007,20 @@ 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:"
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\"" "fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
msgstr "" msgstr ""
"Especificação de cor GTK tem de ter um parentesis reto de fecho após o " "Especificação de cor GTK tem de ter um parênteses reto de fecho após o "
"estado, por ex. gtk:fg[NORMAL] em que NORMAL é o estado; incapaz de " "estado, por ex. gtk:fg[NORMAL] em que NORMAL é o estado; impossível "
"processar \"%s\"" "processar \"%s\""
#: ../src/ui/theme.c:1303 #: ../src/ui/theme.c:1303
#, c-format #, c-format
msgid "Did not understand state \"%s\" in color specification" msgid "Did not understand state \"%s\" in color specification"
msgstr "Incapaz de compreender o estado \"%s\" na especificação de cor" msgstr "Impossível compreender o estado \"%s\" na especificação de cor"
#: ../src/ui/theme.c:1316 #: ../src/ui/theme.c:1316
#, 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 "" msgstr ""
"Incapaz de compreender componente de cor \"%s\" na especificação de cor" "Impossível compreender componente de cor \"%s\" na especificação de cor"
#: ../src/ui/theme.c:1345 #: ../src/ui/theme.c:1345
#, c-format #, c-format
@@ -1030,7 +1034,7 @@ msgstr ""
#: ../src/ui/theme.c:1356 #: ../src/ui/theme.c:1356
#, 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 "Incapaz de processar o valor alfa \"%s\" na mistura de cor" msgstr "Impossível processar o valor alfa \"%s\" na mistura de cor"
#: ../src/ui/theme.c:1366 #: ../src/ui/theme.c:1366
#, c-format #, c-format
@@ -1048,7 +1052,7 @@ msgstr ""
#, 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 "" msgstr ""
"Incapaz de processar o valor de fator de sombra \"%s\" na cor sombreada" "Impossível processar o valor de fator de sombra \"%s\" na cor sombreada"
#: ../src/ui/theme.c:1434 #: ../src/ui/theme.c:1434
#, c-format #, c-format
@@ -1058,12 +1062,12 @@ msgstr "Fator de sombreado \"%s\" na cor sombreada é negativo"
#: ../src/ui/theme.c:1463 #: ../src/ui/theme.c:1463
#, c-format #, c-format
msgid "Could not parse color \"%s\"" msgid "Could not parse color \"%s\""
msgstr "Incapaz de processar cor \"%s\"" msgstr "Impossível processar cor \"%s\""
#: ../src/ui/theme.c:1780 #: ../src/ui/theme.c:1780
#, 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 "Expressão de coordenada contém caracter '%s' que não é permitido" msgstr "Expressão de coordenada contém carácter \"%s\" que não é permitido"
#: ../src/ui/theme.c:1807 #: ../src/ui/theme.c:1807
#, c-format #, c-format
@@ -1071,14 +1075,14 @@ 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 "" msgstr ""
"Expressão de coordenada contém número decimal '%s' que não pode ser " "Expressão de coordenada contém número decimal \"%s\" que não pode ser "
"processado" "processado"
#: ../src/ui/theme.c:1821 #: ../src/ui/theme.c:1821
#, 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 "" msgstr ""
"Expressão de coordenada contém número inteiro '%s' que não pode ser " "Expressão de coordenada contém número inteiro \"%s\" que não pode ser "
"processado" "processado"
#: ../src/ui/theme.c:1942 #: ../src/ui/theme.c:1942
@@ -1147,13 +1151,13 @@ msgstr "O processador de expressão de coordenada transbordou o seu buffer."
#, 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 ""
"Expressão de coordenada tem um fecho de parentesis sem a respetiva abertura" "Expressão de coordenada tem um fecho de parênteses sem a respetiva abertura"
#: ../src/ui/theme.c:2590 #: ../src/ui/theme.c:2590
#, 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 ""
"Expressão de coordenada tem uma abertura de parentesis sem o respetivo fecho" "Expressão de coordenada tem uma abertura de parênteses sem o respetivo fecho"
#: ../src/ui/theme.c:2601 #: ../src/ui/theme.c:2601
#, c-format #, c-format
@@ -1185,7 +1189,7 @@ msgstr ""
#: ../src/ui/theme.c:5082 #: ../src/ui/theme.c:5082
#, c-format #, c-format
msgid "Failed to load theme \"%s\": %s\n" msgid "Failed to load theme \"%s\": %s\n"
msgstr "Falha ao ler tema \"%s\": %s\n" msgstr "Falha ao carregar tema \"%s\": %s\n"
#: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232 #: ../src/ui/theme.c:5218 ../src/ui/theme.c:5225 ../src/ui/theme.c:5232
#: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246 #: ../src/ui/theme.c:5239 ../src/ui/theme.c:5246
@@ -1226,7 +1230,7 @@ msgstr "Nenhum atributo \"%s\" no elemento <%s>"
#: ../src/ui/theme-parser.c:265 ../src/ui/theme-parser.c:283 #: ../src/ui/theme-parser.c:265 ../src/ui/theme-parser.c:283
#, c-format #, c-format
msgid "Line %d character %d: %s" msgid "Line %d character %d: %s"
msgstr "Linha %d caracter %d: %s" msgstr "Linha %d, carácter %d: %s"
#: ../src/ui/theme-parser.c:483 #: ../src/ui/theme-parser.c:483
#, c-format #, c-format
@@ -1241,12 +1245,12 @@ msgstr "Atributo \"%s\" é inválido no elemento <%s> neste contexto"
#: ../src/ui/theme-parser.c:598 #: ../src/ui/theme-parser.c:598
#, c-format #, c-format
msgid "Could not parse \"%s\" as an integer" msgid "Could not parse \"%s\" as an integer"
msgstr "Incapaz de processar \"%s\" como um inteiro" msgstr "Impossível processar \"%s\" como um inteiro"
#: ../src/ui/theme-parser.c:607 ../src/ui/theme-parser.c:662 #: ../src/ui/theme-parser.c:607 ../src/ui/theme-parser.c:662
#, c-format #, c-format
msgid "Did not understand trailing characters \"%s\" in string \"%s\"" msgid "Did not understand trailing characters \"%s\" in string \"%s\""
msgstr "Incapaz de compreender últimos carateres \"%s\" na expressão \"%s\"" msgstr "Impossível compreender últimos caracteres \"%s\" na expressão \"%s\""
#: ../src/ui/theme-parser.c:617 #: ../src/ui/theme-parser.c:617
#, c-format #, c-format
@@ -1256,17 +1260,17 @@ msgstr "Inteiro %ld tem de ser positivo"
#: ../src/ui/theme-parser.c:625 #: ../src/ui/theme-parser.c:625
#, c-format #, c-format
msgid "Integer %ld is too large, current max is %d" msgid "Integer %ld is too large, current max is %d"
msgstr "Inteiro %ld é demasiado grande, máx atual é %d" msgstr "Inteiro %ld é demasiado grande, máximo atual é %d"
#: ../src/ui/theme-parser.c:653 ../src/ui/theme-parser.c:769 #: ../src/ui/theme-parser.c:653 ../src/ui/theme-parser.c:769
#, c-format #, c-format
msgid "Could not parse \"%s\" as a floating point number" msgid "Could not parse \"%s\" as a floating point number"
msgstr "Incapaz de processar \"%s\" como um númerico decimal" msgstr "Impossível processar \"%s\" como um número decimal"
#: ../src/ui/theme-parser.c:684 ../src/ui/theme-parser.c:712 #: ../src/ui/theme-parser.c:684 ../src/ui/theme-parser.c:712
#, c-format #, c-format
msgid "Boolean values must be \"true\" or \"false\" not \"%s\"" msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
msgstr "Valores boleanos têm de ser \"true\" ou \"false\" não \"%s\"" msgstr "Valores boolianos têm de ser \"true\" ou \"false\" não \"%s\""
#: ../src/ui/theme-parser.c:739 #: ../src/ui/theme-parser.c:739
#, c-format #, c-format
@@ -1356,7 +1360,7 @@ msgstr "Distância \"%s\" é desconhecida"
#: ../src/ui/theme-parser.c:1499 #: ../src/ui/theme-parser.c:1499
#, c-format #, c-format
msgid "Aspect ratio \"%s\" is unknown" msgid "Aspect ratio \"%s\" is unknown"
msgstr "Rácio de aparência \"%s\" é desconhecido" msgstr "Proporção \"%s\" é desconhecida"
#: ../src/ui/theme-parser.c:1561 #: ../src/ui/theme-parser.c:1561
#, c-format #, c-format
@@ -1376,28 +1380,28 @@ msgstr "Nenhum atributo \"extent_angle\" ou \"to\" no elemento <%s>"
#: ../src/ui/theme-parser.c:2119 #: ../src/ui/theme-parser.c:2119
#, c-format #, c-format
msgid "Did not understand value \"%s\" for type of gradient" msgid "Did not understand value \"%s\" for type of gradient"
msgstr "Incapaz de compreender valor \"%s\" para tipo de gradiente" msgstr "Impossível compreender valor \"%s\" para tipo de gradiente"
#: ../src/ui/theme-parser.c:2197 ../src/ui/theme-parser.c:2572 #: ../src/ui/theme-parser.c:2197 ../src/ui/theme-parser.c:2572
#, c-format #, c-format
msgid "Did not understand fill type \"%s\" for <%s> element" msgid "Did not understand fill type \"%s\" for <%s> element"
msgstr "Incapaz de compreender tipo de enchimento \"%s\" para elemento <%s>" msgstr "Impossível compreender tipo de enchimento \"%s\" para elemento <%s>"
#: ../src/ui/theme-parser.c:2364 ../src/ui/theme-parser.c:2447 #: ../src/ui/theme-parser.c:2364 ../src/ui/theme-parser.c:2447
#: ../src/ui/theme-parser.c:2510 #: ../src/ui/theme-parser.c:2510
#, c-format #, c-format
msgid "Did not understand state \"%s\" for <%s> element" msgid "Did not understand state \"%s\" for <%s> element"
msgstr "Incapaz de compreender estado \"%s\" para elemento <%s>" msgstr "Impossível compreender estado \"%s\" para elemento <%s>"
#: ../src/ui/theme-parser.c:2374 ../src/ui/theme-parser.c:2457 #: ../src/ui/theme-parser.c:2374 ../src/ui/theme-parser.c:2457
#, c-format #, c-format
msgid "Did not understand shadow \"%s\" for <%s> element" msgid "Did not understand shadow \"%s\" for <%s> element"
msgstr "Incapaz de compreender sombra \"%s\" para elemento <%s>" msgstr "Impossível compreender sombra \"%s\" para elemento <%s>"
#: ../src/ui/theme-parser.c:2384 #: ../src/ui/theme-parser.c:2384
#, c-format #, c-format
msgid "Did not understand arrow \"%s\" for <%s> element" msgid "Did not understand arrow \"%s\" for <%s> element"
msgstr "Incapaz de compreender seta \"%s\" para elemento <%s>" msgstr "Impossível compreender seta \"%s\" para elemento <%s>"
#: ../src/ui/theme-parser.c:2698 ../src/ui/theme-parser.c:2794 #: ../src/ui/theme-parser.c:2698 ../src/ui/theme-parser.c:2794
#, c-format #, c-format
@@ -1407,7 +1411,7 @@ msgstr "Não foi definido nenhum <draw_ops> chamado \"%s\""
#: ../src/ui/theme-parser.c:2710 ../src/ui/theme-parser.c:2806 #: ../src/ui/theme-parser.c:2710 ../src/ui/theme-parser.c:2806
#, 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 "Incluir aqui draw_ops \"%s\" iria criar uma referência circular" msgstr "Incluir aqui draw_ops \"%s\" criaria uma referência circular"
#: ../src/ui/theme-parser.c:2921 #: ../src/ui/theme-parser.c:2921
#, c-format #, c-format
@@ -1524,7 +1528,7 @@ msgstr ""
#: ../src/ui/theme-parser.c:3435 #: ../src/ui/theme-parser.c:3435
#, c-format #, c-format
msgid "Bad version specification '%s'" msgid "Bad version specification '%s'"
msgstr "Especificação de versão '%s' inválida" msgstr "Especificação de versão \"%s\" inválida"
#: ../src/ui/theme-parser.c:3508 #: ../src/ui/theme-parser.c:3508
msgid "" msgid ""

View File

@@ -1,5 +1,5 @@
# Brazilian Portuguese translation of mutter. # Brazilian Portuguese translation of mutter.
# Copyright (C) 2002-2014 Free Software Foundation, Inc. # Copyright (C) 2002-2012 Free Software Foundation, Inc.
# This file is distributed under the same license as the mutter package. # This file is distributed under the same license as the mutter package.
# Sun G11n <gnome_int_l10n@ireland.sun.com>, 2002. # Sun G11n <gnome_int_l10n@ireland.sun.com>, 2002.
# Evandro Fernandes Giovanini <evandrofg@ig.com.br>, 2002, 2003, 2006. # Evandro Fernandes Giovanini <evandrofg@ig.com.br>, 2002, 2003, 2006.
@@ -14,15 +14,15 @@
# Antonio Fernandes C. Neto <fernandes@pelivre.org>, 2010. # Antonio Fernandes C. Neto <fernandes@pelivre.org>, 2010.
# Rodrigo Padula de Oliveira <contato@rodrigopadula.com>, 2011. # Rodrigo Padula de Oliveira <contato@rodrigopadula.com>, 2011.
# Enrico Nicoletto <liverig@gmail.com>, 2012. # Enrico Nicoletto <liverig@gmail.com>, 2012.
# Rafael Ferreira <rafael.f.f1@gmail.co>, 2013, 2014. # Rafael Ferreira <rafael.f.f1@gmail.co>, 2013.
# #
msgid "" msgid ""
msgstr "" 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-12-19 15:30+0000\n" "POT-Creation-Date: 2013-08-20 12:22+0000\n"
"PO-Revision-Date: 2014-01-05 03:08-0300\n" "PO-Revision-Date: 2013-08-18 21:39-0300\n"
"Last-Translator: Rafael Ferreira <rafael.f.f1@gmail.com>\n" "Last-Translator: Rafael Ferreira <rafael.f.f1@gmail.com>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n" "Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n" "Language: pt_BR\n"
@@ -30,7 +30,7 @@ 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.6.3\n" "X-Generator: Poedit 1.5.7\n"
#: ../src/50-mutter-navigation.xml.in.h:1 #: ../src/50-mutter-navigation.xml.in.h:1
msgid "Navigation" msgid "Navigation"
@@ -222,7 +222,7 @@ msgstr "Visualizar divisão à direita"
#. 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:571 #: ../src/compositor/compositor.c:596
#, 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"
@@ -230,7 +230,7 @@ msgid ""
msgstr "" msgstr ""
"Outro compositor de janelas está em execução na tela %i na área \"%s\"." "Outro compositor de janelas está em execução na tela %i na área \"%s\"."
#: ../src/compositor/meta-background.c:1075 #: ../src/compositor/meta-background.c:1076
msgid "background texture could not be created from file" msgid "background texture could not be created from file"
msgstr "textura de plano de fundo não pôde ser criado de arquivo" msgstr "textura de plano de fundo não pôde ser criado de arquivo"
@@ -268,17 +268,17 @@ msgstr "_Esperar"
msgid "_Force Quit" msgid "_Force Quit"
msgstr "_Forçar sair" msgstr "_Forçar sair"
#: ../src/core/display.c:415 #: ../src/core/display.c:421
#, c-format #, c-format
msgid "Missing %s extension required for compositing" msgid "Missing %s extension required for compositing"
msgstr "Faltando extensão %s necessária para composição" msgstr "Faltando extensão %s necessária para composição"
#: ../src/core/display.c:507 #: ../src/core/display.c:513
#, 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 "Falha ao abrir a exibição \"%s\" do X Window System\n" msgstr "Falha ao abrir a exibição \"%s\" do X Window System\n"
#: ../src/core/keybindings.c:1137 #: ../src/core/keybindings.c:1136
#, 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 "
@@ -287,7 +287,7 @@ msgstr ""
"Algum outro programa já está usando a chave %s com modificadores %x como uma " "Algum outro programa já está usando a chave %s com modificadores %x como uma "
"tecla de atalho\n" "tecla de atalho\n"
#: ../src/core/keybindings.c:1334 #: ../src/core/keybindings.c:1333
#, c-format #, c-format
msgid "\"%s\" is not a valid accelerator\n" msgid "\"%s\" is not a valid accelerator\n"
msgstr "\"%s\" não é um acelerador válido\n" msgstr "\"%s\" não é um acelerador válido\n"
@@ -329,7 +329,7 @@ msgstr ""
"Não foi possível localizar um tema! Verifique se %s existe e contém os temas " "Não foi possível localizar um tema! Verifique se %s existe e contém os temas "
"comuns.\n" "comuns.\n"
#: ../src/core/monitor.c:696 #: ../src/core/monitor.c:702
msgid "Built-in display" msgid "Built-in display"
msgstr "Tela embutida" msgstr "Tela embutida"
@@ -337,7 +337,7 @@ msgstr "Tela embutida"
#. the vendor), it's Unknown followed by a size in inches, #. the vendor), it's Unknown followed by a size in inches,
#. like 'Unknown 15"' #. like 'Unknown 15"'
#. #.
#: ../src/core/monitor.c:724 #: ../src/core/monitor.c:730
#, c-format #, c-format
msgid "Unknown %s" msgid "Unknown %s"
msgstr "%s desconhecido" msgstr "%s desconhecido"
@@ -404,12 +404,12 @@ msgstr ""
msgid "Workspace %d" msgid "Workspace %d"
msgstr "Espaço de trabalho %d" msgstr "Espaço de trabalho %d"
#: ../src/core/screen.c:540 #: ../src/core/screen.c:535
#, c-format #, c-format
msgid "Screen %d on display '%s' is invalid\n" msgid "Screen %d on display '%s' is invalid\n"
msgstr "A tela %d na exibição \"%s\" é inválida\n" msgstr "A tela %d na exibição \"%s\" é inválida\n"
#: ../src/core/screen.c:556 #: ../src/core/screen.c:551
#, 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 --"
@@ -418,7 +418,7 @@ msgstr ""
"A tela %d na exibição \"%s\" já possui um gerenciador de janelas; tente usar " "A tela %d na exibição \"%s\" já possui um gerenciador de janelas; tente usar "
"a opção --replace para substituir o gerenciador de janelas atual.\n" "a opção --replace para substituir o gerenciador de janelas atual.\n"
#: ../src/core/screen.c:583 #: ../src/core/screen.c:578
#, 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"
@@ -426,12 +426,12 @@ msgstr ""
"Não foi possível obter a seleção do gerenciador de janelas na exibição \"%2$s" "Não foi possível obter a seleção do gerenciador de janelas na exibição \"%2$s"
"\" da tela %1$d\n" "\" da tela %1$d\n"
#: ../src/core/screen.c:661 #: ../src/core/screen.c:656
#, 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 "A tela %d na exibição \"%s\" já possui um gerenciador de janelas\n" msgstr "A tela %d na exibição \"%s\" já possui um gerenciador de janelas\n"
#: ../src/core/screen.c:853 #: ../src/core/screen.c:848
#, 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 "Não foi possível liberar a tela %d na exibição \"%s\"\n" msgstr "Não foi possível liberar a tela %d na exibição \"%s\"\n"
@@ -528,7 +528,7 @@ msgid "Window manager error: "
msgstr "Erro do gerenciador de janelas: " msgstr "Erro do gerenciador de janelas: "
#. first time through #. first time through
#: ../src/core/window.c:7620 #: ../src/core/window.c:7533
#, 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 "
@@ -544,7 +544,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:8542 #: ../src/core/window.c:8257
#, 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 "
@@ -554,22 +554,22 @@ msgstr ""
"define o tamanho mínimo %d x %d e máximo %d x %d; isso não faz muito " "define o tamanho mínimo %d x %d e máximo %d x %d; isso não faz muito "
"sentido.\n" "sentido.\n"
#: ../src/core/window-props.c:350 #: ../src/core/window-props.c:347
#, 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 "O aplicativo definiu um _NET_WM_PID %lu inválido\n" msgstr "O aplicativo definiu um _NET_WM_PID %lu inválido\n"
#: ../src/core/window-props.c:466 #: ../src/core/window-props.c:463
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (em %s)" msgstr "%s (em %s)"
#: ../src/core/window-props.c:1549 #: ../src/core/window-props.c:1546
#, 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 "Janela WM_TRANSIENT_FOR inválida 0x%lx especificada para %s.\n" msgstr "Janela WM_TRANSIENT_FOR inválida 0x%lx especificada para %s.\n"
#: ../src/core/window-props.c:1560 #: ../src/core/window-props.c:1557
#, 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 "Janela WM_TRANSIENT_FOR 0x%lx especificada para %s iriar criar loop.\n" msgstr "Janela WM_TRANSIENT_FOR 0x%lx especificada para %s iriar criar loop.\n"
@@ -977,7 +977,7 @@ msgstr "A geometria do quadro não especifica o tamanho dos botões"
#: ../src/ui/theme.c:1051 #: ../src/ui/theme.c:1051
#, c-format #, c-format
msgid "Gradients should have at least two colors" msgid "Gradients should have at least two colors"
msgstr "Os degradês devem ter pelo menos duas cores" msgstr "Os gradientes devem ter pelo menos duas cores"
#: ../src/ui/theme.c:1203 #: ../src/ui/theme.c:1203
#, c-format #, c-format
@@ -1252,59 +1252,59 @@ msgstr "Nenhum atributo \"%s\" no elemento <%s>"
msgid "Line %d character %d: %s" msgid "Line %d character %d: %s"
msgstr "Caractere %d da linha %d: %s" msgstr "Caractere %d da linha %d: %s"
#: ../src/ui/theme-parser.c:483 #: ../src/ui/theme-parser.c:479
#, c-format #, c-format
msgid "Attribute \"%s\" repeated twice on the same <%s> element" msgid "Attribute \"%s\" repeated twice on the same <%s> element"
msgstr "O atributo \"%s\" foi repetido duas vezes no mesmo elemento <%s>" msgstr "O atributo \"%s\" foi repetido duas vezes no mesmo elemento <%s>"
#: ../src/ui/theme-parser.c:507 ../src/ui/theme-parser.c:556 #: ../src/ui/theme-parser.c:503 ../src/ui/theme-parser.c:552
#, c-format #, c-format
msgid "Attribute \"%s\" is invalid on <%s> element in this context" msgid "Attribute \"%s\" is invalid on <%s> element in this context"
msgstr "O atributo \"%s\" é inválido no elemento <%s> neste contexto" msgstr "O atributo \"%s\" é inválido no elemento <%s> neste contexto"
#: ../src/ui/theme-parser.c:598 #: ../src/ui/theme-parser.c:594
#, c-format #, c-format
msgid "Could not parse \"%s\" as an integer" msgid "Could not parse \"%s\" as an integer"
msgstr "Não foi possível analisar \"%s\" como um inteiro" msgstr "Não foi possível analisar \"%s\" como um inteiro"
#: ../src/ui/theme-parser.c:607 ../src/ui/theme-parser.c:662 #: ../src/ui/theme-parser.c:603 ../src/ui/theme-parser.c:658
#, c-format #, c-format
msgid "Did not understand trailing characters \"%s\" in string \"%s\"" msgid "Did not understand trailing characters \"%s\" in string \"%s\""
msgstr "" msgstr ""
"Os caracteres à direita \"%s\" na string \"%s\" não foram compreendidos" "Os caracteres à direita \"%s\" na string \"%s\" não foram compreendidos"
#: ../src/ui/theme-parser.c:617 #: ../src/ui/theme-parser.c:613
#, c-format #, c-format
msgid "Integer %ld must be positive" msgid "Integer %ld must be positive"
msgstr "O inteiro %ld deve ser positivo" msgstr "O inteiro %ld deve ser positivo"
#: ../src/ui/theme-parser.c:625 #: ../src/ui/theme-parser.c:621
#, c-format #, c-format
msgid "Integer %ld is too large, current max is %d" msgid "Integer %ld is too large, current max is %d"
msgstr "O inteiro %ld é muito grande; o valor máximo atual é %d" msgstr "O inteiro %ld é muito grande; o valor máximo atual é %d"
#: ../src/ui/theme-parser.c:653 ../src/ui/theme-parser.c:769 #: ../src/ui/theme-parser.c:649 ../src/ui/theme-parser.c:765
#, c-format #, c-format
msgid "Could not parse \"%s\" as a floating point number" msgid "Could not parse \"%s\" as a floating point number"
msgstr "Não foi possível analisar \"%s\" como um número de ponto flutuante" msgstr "Não foi possível analisar \"%s\" como um número de ponto flutuante"
#: ../src/ui/theme-parser.c:684 ../src/ui/theme-parser.c:712 #: ../src/ui/theme-parser.c:680 ../src/ui/theme-parser.c:708
#, c-format #, c-format
msgid "Boolean values must be \"true\" or \"false\" not \"%s\"" msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
msgstr "Os valores booleanos devem ser \"true\" ou \"false\" e não \"%s\"" msgstr "Os valores booleanos devem ser \"true\" ou \"false\" e não \"%s\""
#: ../src/ui/theme-parser.c:739 #: ../src/ui/theme-parser.c:735
#, c-format #, c-format
msgid "Angle must be between 0.0 and 360.0, was %g\n" msgid "Angle must be between 0.0 and 360.0, was %g\n"
msgstr "O ângulo deve estar entre 0,0 e 360,0 e era %g\n" msgstr "O ângulo deve estar entre 0,0 e 360,0 e era %g\n"
#: ../src/ui/theme-parser.c:802 #: ../src/ui/theme-parser.c:798
#, c-format #, c-format
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n" msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
msgstr "" msgstr ""
"Alfa deve estar entre 0,0 (invisível) e 1,0 (totalmente opaco) e era %g\n" "Alfa deve estar entre 0,0 (invisível) e 1,0 (totalmente opaco) e era %g\n"
#: ../src/ui/theme-parser.c:867 #: ../src/ui/theme-parser.c:863
#, c-format #, c-format
msgid "" msgid ""
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium," "Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
@@ -1313,59 +1313,59 @@ msgstr ""
"Escala de título \"%s\" inválida (deve ser super pequena, extra pequena, " "Escala de título \"%s\" inválida (deve ser super pequena, extra pequena, "
"pequena, média, grande, extra grande ou super grande)\n" "pequena, média, grande, extra grande ou super grande)\n"
#: ../src/ui/theme-parser.c:1023 ../src/ui/theme-parser.c:1086 #: ../src/ui/theme-parser.c:1019 ../src/ui/theme-parser.c:1082
#: ../src/ui/theme-parser.c:1120 ../src/ui/theme-parser.c:1223 #: ../src/ui/theme-parser.c:1116 ../src/ui/theme-parser.c:1219
#, c-format #, c-format
msgid "<%s> name \"%s\" used a second time" msgid "<%s> name \"%s\" used a second time"
msgstr "<%s> nome \"%s\" usado uma segunda vez" msgstr "<%s> nome \"%s\" usado uma segunda vez"
#: ../src/ui/theme-parser.c:1035 ../src/ui/theme-parser.c:1132 #: ../src/ui/theme-parser.c:1031 ../src/ui/theme-parser.c:1128
#: ../src/ui/theme-parser.c:1235 #: ../src/ui/theme-parser.c:1231
#, c-format #, c-format
msgid "<%s> parent \"%s\" has not been defined" msgid "<%s> parent \"%s\" has not been defined"
msgstr "<%s> pai \"%s\" não foi definido" msgstr "<%s> pai \"%s\" não foi definido"
#: ../src/ui/theme-parser.c:1145 #: ../src/ui/theme-parser.c:1141
#, c-format #, c-format
msgid "<%s> geometry \"%s\" has not been defined" msgid "<%s> geometry \"%s\" has not been defined"
msgstr "<%s> geometria \"%s\" não foi definida" msgstr "<%s> geometria \"%s\" não foi definida"
#: ../src/ui/theme-parser.c:1158 #: ../src/ui/theme-parser.c:1154
#, c-format #, c-format
msgid "<%s> must specify either a geometry or a parent that has a geometry" msgid "<%s> must specify either a geometry or a parent that has a geometry"
msgstr "<%s> deve especificar uma geometria ou um pai que tenha uma geometria" msgstr "<%s> deve especificar uma geometria ou um pai que tenha uma geometria"
#: ../src/ui/theme-parser.c:1200 #: ../src/ui/theme-parser.c:1196
msgid "You must specify a background for an alpha value to be meaningful" msgid "You must specify a background for an alpha value to be meaningful"
msgstr "" msgstr ""
"Você pode especificar um plano de fundo para que um valor alfa faça sentido" "Você pode especificar um plano de fundo para que um valor alfa faça sentido"
#: ../src/ui/theme-parser.c:1268 #: ../src/ui/theme-parser.c:1264
#, c-format #, c-format
msgid "Unknown type \"%s\" on <%s> element" msgid "Unknown type \"%s\" on <%s> element"
msgstr "Tipo \"%s\" desconhecido no elemento <%s>" msgstr "Tipo \"%s\" desconhecido no elemento <%s>"
#: ../src/ui/theme-parser.c:1279 #: ../src/ui/theme-parser.c:1275
#, c-format #, c-format
msgid "Unknown style_set \"%s\" on <%s> element" msgid "Unknown style_set \"%s\" on <%s> element"
msgstr "conjunto_de_estilo \"%s\" desconhecido no elemento <%s>" msgstr "conjunto_de_estilo \"%s\" desconhecido no elemento <%s>"
#: ../src/ui/theme-parser.c:1287 #: ../src/ui/theme-parser.c:1283
#, c-format #, c-format
msgid "Window type \"%s\" has already been assigned a style set" msgid "Window type \"%s\" has already been assigned a style set"
msgstr "O tipo de janela \"%s\" já foi atribuído a um estilo definido" msgstr "O tipo de janela \"%s\" já foi atribuído a um estilo definido"
#: ../src/ui/theme-parser.c:1317 ../src/ui/theme-parser.c:1381 #: ../src/ui/theme-parser.c:1313 ../src/ui/theme-parser.c:1377
#: ../src/ui/theme-parser.c:1607 ../src/ui/theme-parser.c:2842 #: ../src/ui/theme-parser.c:1603 ../src/ui/theme-parser.c:2838
#: ../src/ui/theme-parser.c:2888 ../src/ui/theme-parser.c:3038 #: ../src/ui/theme-parser.c:2884 ../src/ui/theme-parser.c:3034
#: ../src/ui/theme-parser.c:3274 ../src/ui/theme-parser.c:3312 #: ../src/ui/theme-parser.c:3273 ../src/ui/theme-parser.c:3311
#: ../src/ui/theme-parser.c:3350 ../src/ui/theme-parser.c:3388 #: ../src/ui/theme-parser.c:3349 ../src/ui/theme-parser.c:3387
#, c-format #, c-format
msgid "Element <%s> is not allowed below <%s>" msgid "Element <%s> is not allowed below <%s>"
msgstr "O elemento <%s> não é permitido abaixo de <%s>" msgstr "O elemento <%s> não é permitido abaixo de <%s>"
#: ../src/ui/theme-parser.c:1431 ../src/ui/theme-parser.c:1445 #: ../src/ui/theme-parser.c:1427 ../src/ui/theme-parser.c:1441
#: ../src/ui/theme-parser.c:1490 #: ../src/ui/theme-parser.c:1486
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"
@@ -1373,124 +1373,124 @@ msgstr ""
"Não foi possível especificar \"button_width\"/\"button_height\" e " "Não foi possível especificar \"button_width\"/\"button_height\" e "
"\"aspect_ratio\" para os botões" "\"aspect_ratio\" para os botões"
#: ../src/ui/theme-parser.c:1454 #: ../src/ui/theme-parser.c:1450
#, c-format #, c-format
msgid "Distance \"%s\" is unknown" msgid "Distance \"%s\" is unknown"
msgstr "A distância \"%s\" é desconhecida" msgstr "A distância \"%s\" é desconhecida"
#: ../src/ui/theme-parser.c:1499 #: ../src/ui/theme-parser.c:1495
#, c-format #, c-format
msgid "Aspect ratio \"%s\" is unknown" msgid "Aspect ratio \"%s\" is unknown"
msgstr "A taxa de proporção \"%s\" é desconhecida" msgstr "A taxa de proporção \"%s\" é desconhecida"
#: ../src/ui/theme-parser.c:1561 #: ../src/ui/theme-parser.c:1557
#, c-format #, c-format
msgid "Border \"%s\" is unknown" msgid "Border \"%s\" is unknown"
msgstr "A borda \"%s\" é desconhecida" msgstr "A borda \"%s\" é desconhecida"
#: ../src/ui/theme-parser.c:1872 #: ../src/ui/theme-parser.c:1868
#, c-format #, c-format
msgid "No \"start_angle\" or \"from\" attribute on element <%s>" msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
msgstr "Nenhum atributo \"start_angle\" ou \"from\" no elemento <%s>" msgstr "Nenhum atributo \"start_angle\" ou \"from\" no elemento <%s>"
#: ../src/ui/theme-parser.c:1879 #: ../src/ui/theme-parser.c:1875
#, c-format #, c-format
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>" msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
msgstr "Nenhum atributo \"extent_angle\" ou \"to\" no elemento <%s>" msgstr "Nenhum atributo \"extent_angle\" ou \"to\" no elemento <%s>"
#: ../src/ui/theme-parser.c:2119 #: ../src/ui/theme-parser.c:2115
#, c-format #, c-format
msgid "Did not understand value \"%s\" for type of gradient" msgid "Did not understand value \"%s\" for type of gradient"
msgstr "O valor \"%s\" não foi compreendido para o tipo de degradê" msgstr "O valor \"%s\" não foi compreendido para o tipo de gradiente"
#: ../src/ui/theme-parser.c:2197 ../src/ui/theme-parser.c:2572 #: ../src/ui/theme-parser.c:2193 ../src/ui/theme-parser.c:2568
#, c-format #, c-format
msgid "Did not understand fill type \"%s\" for <%s> element" msgid "Did not understand fill type \"%s\" for <%s> element"
msgstr "" msgstr ""
"O tipo de preenchimento \"%s\" não foi compreendido para o elemento <%s>" "O tipo de preenchimento \"%s\" não foi compreendido para o elemento <%s>"
#: ../src/ui/theme-parser.c:2364 ../src/ui/theme-parser.c:2447 #: ../src/ui/theme-parser.c:2360 ../src/ui/theme-parser.c:2443
#: ../src/ui/theme-parser.c:2510 #: ../src/ui/theme-parser.c:2506
#, c-format #, c-format
msgid "Did not understand state \"%s\" for <%s> element" msgid "Did not understand state \"%s\" for <%s> element"
msgstr "O estado \"%s\" não foi compreendido para o elemento <%s>" msgstr "O estado \"%s\" não foi compreendido para o elemento <%s>"
#: ../src/ui/theme-parser.c:2374 ../src/ui/theme-parser.c:2457 #: ../src/ui/theme-parser.c:2370 ../src/ui/theme-parser.c:2453
#, c-format #, c-format
msgid "Did not understand shadow \"%s\" for <%s> element" msgid "Did not understand shadow \"%s\" for <%s> element"
msgstr "A sombra \"%s\" não foi compreendida para o elemento <%s>" msgstr "A sombra \"%s\" não foi compreendida para o elemento <%s>"
#: ../src/ui/theme-parser.c:2384 #: ../src/ui/theme-parser.c:2380
#, c-format #, c-format
msgid "Did not understand arrow \"%s\" for <%s> element" msgid "Did not understand arrow \"%s\" for <%s> element"
msgstr "A seta \"%s\" não foi compreendida para o elemento <%s>" msgstr "A seta \"%s\" não foi compreendida para o elemento <%s>"
#: ../src/ui/theme-parser.c:2698 ../src/ui/theme-parser.c:2794 #: ../src/ui/theme-parser.c:2694 ../src/ui/theme-parser.c:2790
#, c-format #, c-format
msgid "No <draw_ops> called \"%s\" has been defined" msgid "No <draw_ops> called \"%s\" has been defined"
msgstr "Nenhum <draw_ops> chamado \"%s\" foi definido" msgstr "Nenhum <draw_ops> chamado \"%s\" foi definido"
#: ../src/ui/theme-parser.c:2710 ../src/ui/theme-parser.c:2806 #: ../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 "A inclusão do draw_ops \"%s\" aqui criaria uma referência circular" msgstr "A inclusão do draw_ops \"%s\" aqui criaria uma referência circular"
#: ../src/ui/theme-parser.c:2921 #: ../src/ui/theme-parser.c:2917
#, c-format #, c-format
msgid "Unknown position \"%s\" for frame piece" msgid "Unknown position \"%s\" for frame piece"
msgstr "Posição \"%s\" desconhecida para a parte do quadro" msgstr "Posição \"%s\" desconhecida para a parte do quadro"
#: ../src/ui/theme-parser.c:2929 #: ../src/ui/theme-parser.c:2925
#, c-format #, c-format
msgid "Frame style already has a piece at position %s" msgid "Frame style already has a piece at position %s"
msgstr "O estilo de quadro já tem uma parte na posição %s" msgstr "O estilo de quadro já tem uma parte na posição %s"
#: ../src/ui/theme-parser.c:2946 ../src/ui/theme-parser.c:3023 #: ../src/ui/theme-parser.c:2942 ../src/ui/theme-parser.c:3019
#, c-format #, c-format
msgid "No <draw_ops> with the name \"%s\" has been defined" msgid "No <draw_ops> with the name \"%s\" has been defined"
msgstr "Nenhum <draw_ops> com o nome \"%s\" foi definido" msgstr "Nenhum <draw_ops> com o nome \"%s\" foi definido"
#: ../src/ui/theme-parser.c:2976 #: ../src/ui/theme-parser.c:2972
#, c-format #, c-format
msgid "Unknown function \"%s\" for button" msgid "Unknown function \"%s\" for button"
msgstr "Função \"%s\" desconhecida para o botão" msgstr "Função \"%s\" desconhecida para o botão"
#: ../src/ui/theme-parser.c:2986 #: ../src/ui/theme-parser.c:2982
#, c-format #, c-format
msgid "Button function \"%s\" does not exist in this version (%d, need %d)" msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
msgstr "A função \"%s\" de botão não existe nesta versão (%d, necessário %d)" msgstr "A função \"%s\" de botão não existe nesta versão (%d, necessário %d)"
#: ../src/ui/theme-parser.c:2998 #: ../src/ui/theme-parser.c:2994
#, c-format #, c-format
msgid "Unknown state \"%s\" for button" msgid "Unknown state \"%s\" for button"
msgstr "Estado \"%s\" desconhecido para o botão" msgstr "Estado \"%s\" desconhecido para o botão"
#: ../src/ui/theme-parser.c:3006 #: ../src/ui/theme-parser.c:3002
#, c-format #, c-format
msgid "Frame style already has a button for function %s state %s" msgid "Frame style already has a button for function %s state %s"
msgstr "O estilo de quadro já possui um botão para o estado %s da função %s" msgstr "O estilo de quadro já possui um botão para o estado %s da função %s"
#: ../src/ui/theme-parser.c:3077 #: ../src/ui/theme-parser.c:3073
#, c-format #, c-format
msgid "\"%s\" is not a valid value for focus attribute" msgid "\"%s\" is not a valid value for focus attribute"
msgstr "\"%s\" não é um valor válido para o atributo de foco" msgstr "\"%s\" não é um valor válido para o atributo de foco"
#: ../src/ui/theme-parser.c:3086 #: ../src/ui/theme-parser.c:3082
#, c-format #, c-format
msgid "\"%s\" is not a valid value for state attribute" msgid "\"%s\" is not a valid value for state attribute"
msgstr "\"%s\" não é um valor válido para o atributo de estado" msgstr "\"%s\" não é um valor válido para o atributo de estado"
#: ../src/ui/theme-parser.c:3096 #: ../src/ui/theme-parser.c:3092
#, c-format #, c-format
msgid "A style called \"%s\" has not been defined" msgid "A style called \"%s\" has not been defined"
msgstr "Um estilo chamado \"%s\" não foi definido" msgstr "Um estilo chamado \"%s\" não foi definido"
#: ../src/ui/theme-parser.c:3117 ../src/ui/theme-parser.c:3140 #: ../src/ui/theme-parser.c:3113 ../src/ui/theme-parser.c:3136
#, c-format #, c-format
msgid "\"%s\" is not a valid value for resize attribute" msgid "\"%s\" is not a valid value for resize attribute"
msgstr "\"%s\" não é um valor válido para o atributo de redimensionamento" msgstr "\"%s\" não é um valor válido para o atributo de redimensionamento"
#: ../src/ui/theme-parser.c:3151 #: ../src/ui/theme-parser.c:3147
#, c-format #, c-format
msgid "" msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized/shaded " "Should not have \"resize\" attribute on <%s> element for maximized/shaded "
@@ -1499,7 +1499,7 @@ msgstr ""
"Não deve haver o atributo \"resize\" no elemento <%s> para os estados " "Não deve haver o atributo \"resize\" no elemento <%s> para os estados "
"maximizado/sombreado" "maximizado/sombreado"
#: ../src/ui/theme-parser.c:3165 #: ../src/ui/theme-parser.c:3161
#, c-format #, c-format
msgid "" msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized states" "Should not have \"resize\" attribute on <%s> element for maximized states"
@@ -1507,21 +1507,21 @@ msgstr ""
"Não deve haver o atributo \"resize\" no elemento <%s> para os estados " "Não deve haver o atributo \"resize\" no elemento <%s> para os estados "
"maximizados" "maximizados"
#: ../src/ui/theme-parser.c:3179 ../src/ui/theme-parser.c:3223 #: ../src/ui/theme-parser.c:3175 ../src/ui/theme-parser.c:3222
#, c-format #, c-format
msgid "Style has already been specified for state %s resize %s focus %s" msgid "Style has already been specified for state %s resize %s focus %s"
msgstr "" msgstr ""
"O estilo já foi especificado para o foco %s de redimensionamento %s do " "O estilo já foi especificado para o foco %s de redimensionamento %s do "
"estado %s" "estado %s"
#: ../src/ui/theme-parser.c:3190 ../src/ui/theme-parser.c:3201 #: ../src/ui/theme-parser.c:3186 ../src/ui/theme-parser.c:3197
#: ../src/ui/theme-parser.c:3212 ../src/ui/theme-parser.c:3234 #: ../src/ui/theme-parser.c:3208 ../src/ui/theme-parser.c:3233
#: ../src/ui/theme-parser.c:3245 ../src/ui/theme-parser.c:3256 #: ../src/ui/theme-parser.c:3244 ../src/ui/theme-parser.c:3255
#, c-format #, c-format
msgid "Style has already been specified for state %s focus %s" msgid "Style has already been specified for state %s focus %s"
msgstr "O estilo já foi especificado para o foco %s do estado %s" msgstr "O estilo já foi especificado para o foco %s do estado %s"
#: ../src/ui/theme-parser.c:3295 #: ../src/ui/theme-parser.c:3294
msgid "" msgid ""
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops " "Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)" "attribute and also a <draw_ops> element, or specified two elements)"
@@ -1530,7 +1530,7 @@ msgstr ""
"especificou um atributo draw_ops e um elemento <draw_ops> ou especificou " "especificou um atributo draw_ops e um elemento <draw_ops> ou especificou "
"dois elementos)" "dois elementos)"
#: ../src/ui/theme-parser.c:3333 #: ../src/ui/theme-parser.c:3332
msgid "" msgid ""
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops " "Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)" "attribute and also a <draw_ops> element, or specified two elements)"
@@ -1539,7 +1539,7 @@ msgstr ""
"especificou um atributo draw_ops e um elemento <draw_ops> ou especificou " "especificou um atributo draw_ops e um elemento <draw_ops> ou especificou "
"dois elementos)" "dois elementos)"
#: ../src/ui/theme-parser.c:3371 #: ../src/ui/theme-parser.c:3370
msgid "" msgid ""
"Can't have a two draw_ops for a <menu_icon> element (theme specified a " "Can't have a two draw_ops for a <menu_icon> element (theme specified a "
"draw_ops attribute and also a <draw_ops> element, or specified two elements)" "draw_ops attribute and also a <draw_ops> element, or specified two elements)"
@@ -1548,12 +1548,12 @@ msgstr ""
"especificou um atributo draw_ops e um elemento <draw_ops> ou especificou " "especificou um atributo draw_ops e um elemento <draw_ops> ou especificou "
"dois elementos)" "dois elementos)"
#: ../src/ui/theme-parser.c:3435 #: ../src/ui/theme-parser.c:3434
#, c-format #, c-format
msgid "Bad version specification '%s'" msgid "Bad version specification '%s'"
msgstr "Especificação da versão inválida \"%s\"" msgstr "Especificação da versão inválida \"%s\""
#: ../src/ui/theme-parser.c:3508 #: ../src/ui/theme-parser.c:3507
msgid "" msgid ""
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-" "\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
"theme-2.xml" "theme-2.xml"
@@ -1561,29 +1561,29 @@ msgstr ""
"O atributo \"versão\" não pode ser usado em metacity-theme-1.xml ou metacity-" "O atributo \"versão\" não pode ser usado em metacity-theme-1.xml ou metacity-"
"theme-2.xml" "theme-2.xml"
#: ../src/ui/theme-parser.c:3531 #: ../src/ui/theme-parser.c:3530
#, c-format #, c-format
msgid "Theme requires version %s but latest supported theme version is %d.%d" msgid "Theme requires version %s but latest supported theme version is %d.%d"
msgstr "Tema requer versão %s, mas a última versão que o tema suporta é %d.%d" msgstr "Tema requer versão %s, mas a última versão que o tema suporta é %d.%d"
#: ../src/ui/theme-parser.c:3563 #: ../src/ui/theme-parser.c:3562
#, c-format #, c-format
msgid "Outermost element in theme must be <metacity_theme> not <%s>" msgid "Outermost element in theme must be <metacity_theme> not <%s>"
msgstr "O elemento mais externo no tema deve ser <metacity_theme> e não <%s>" msgstr "O elemento mais externo no tema deve ser <metacity_theme> e não <%s>"
#: ../src/ui/theme-parser.c:3583 #: ../src/ui/theme-parser.c:3582
#, c-format #, c-format
msgid "" msgid ""
"Element <%s> is not allowed inside a name/author/date/description element" "Element <%s> is not allowed inside a name/author/date/description element"
msgstr "" msgstr ""
"O elemento <%s> não é permitido em um elemento nome/autor/data/descrição" "O elemento <%s> não é permitido em um elemento nome/autor/data/descrição"
#: ../src/ui/theme-parser.c:3588 #: ../src/ui/theme-parser.c:3587
#, c-format #, c-format
msgid "Element <%s> is not allowed inside a <constant> element" msgid "Element <%s> is not allowed inside a <constant> element"
msgstr "O elemento <%s> não é permitido em um elemento <constant>" msgstr "O elemento <%s> não é permitido em um elemento <constant>"
#: ../src/ui/theme-parser.c:3600 #: ../src/ui/theme-parser.c:3599
#, c-format #, c-format
msgid "" msgid ""
"Element <%s> is not allowed inside a distance/border/aspect_ratio element" "Element <%s> is not allowed inside a distance/border/aspect_ratio element"
@@ -1591,38 +1591,38 @@ msgstr ""
"O elemento <%s> não é permitido em um elemento distância/borda/" "O elemento <%s> não é permitido em um elemento distância/borda/"
"taxa_de_proporção" "taxa_de_proporção"
#: ../src/ui/theme-parser.c:3622 #: ../src/ui/theme-parser.c:3621
#, c-format #, c-format
msgid "Element <%s> is not allowed inside a draw operation element" msgid "Element <%s> is not allowed inside a draw operation element"
msgstr "O elemento <%s> não é permitido em um elemento de operação de desenho" msgstr "O elemento <%s> não é permitido em um elemento de operação de desenho"
#: ../src/ui/theme-parser.c:3632 ../src/ui/theme-parser.c:3662 #: ../src/ui/theme-parser.c:3631 ../src/ui/theme-parser.c:3661
#: ../src/ui/theme-parser.c:3667 ../src/ui/theme-parser.c:3672 #: ../src/ui/theme-parser.c:3666 ../src/ui/theme-parser.c:3671
#, c-format #, c-format
msgid "Element <%s> is not allowed inside a <%s> element" msgid "Element <%s> is not allowed inside a <%s> element"
msgstr "O elemento <%s> não é permitido em um elemento <%s>" msgstr "O elemento <%s> não é permitido em um elemento <%s>"
#: ../src/ui/theme-parser.c:3900 #: ../src/ui/theme-parser.c:3899
msgid "No draw_ops provided for frame piece" msgid "No draw_ops provided for frame piece"
msgstr "Nenhum draw_ops foi fornecido para a parte do quadro" msgstr "Nenhum draw_ops foi fornecido para a parte do quadro"
#: ../src/ui/theme-parser.c:3915 #: ../src/ui/theme-parser.c:3914
msgid "No draw_ops provided for button" msgid "No draw_ops provided for button"
msgstr "Nenhum draw_ops foi fornecido para o botão" msgstr "Nenhum draw_ops foi fornecido para o botão"
#: ../src/ui/theme-parser.c:3969 #: ../src/ui/theme-parser.c:3968
#, c-format #, c-format
msgid "No text is allowed inside element <%s>" msgid "No text is allowed inside element <%s>"
msgstr "Nenhum texto é permitido no elemento <%s>" msgstr "Nenhum texto é permitido no elemento <%s>"
#: ../src/ui/theme-parser.c:4027 ../src/ui/theme-parser.c:4039 #: ../src/ui/theme-parser.c:4026 ../src/ui/theme-parser.c:4038
#: ../src/ui/theme-parser.c:4051 ../src/ui/theme-parser.c:4063 #: ../src/ui/theme-parser.c:4050 ../src/ui/theme-parser.c:4062
#: ../src/ui/theme-parser.c:4075 #: ../src/ui/theme-parser.c:4074
#, c-format #, c-format
msgid "<%s> specified twice for this theme" msgid "<%s> specified twice for this theme"
msgstr "<%s> especificado duas vezes para este tema" msgstr "<%s> especificado duas vezes para este tema"
#: ../src/ui/theme-parser.c:4337 #: ../src/ui/theme-parser.c:4336
#, 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 "Falha ao localizar um arquivo válido para o tema %s\n" msgstr "Falha ao localizar um arquivo válido para o tema %s\n"

View File

@@ -16,7 +16,7 @@ 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-12-05 16:15+0000\n" "POT-Creation-Date: 2013-12-04 16:17+0000\n"
"PO-Revision-Date: 2013-11-30 17:50+0800\n" "PO-Revision-Date: 2013-11-30 17:50+0800\n"
"Last-Translator: 甘露(Gan Lu) <rhythm.gan@gmail.com>\n" "Last-Translator: 甘露(Gan Lu) <rhythm.gan@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n" "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -260,12 +260,12 @@ msgstr "等待(_W)"
msgid "_Force Quit" msgid "_Force Quit"
msgstr "强制退出(_F)" msgstr "强制退出(_F)"
#: ../src/core/display.c:415 #: ../src/core/display.c:422
#, 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:507 #: ../src/core/display.c:514
#, 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"
@@ -382,12 +382,12 @@ msgstr "在配置数据库中找到的“%s”不是按键组合“%s”的有
msgid "Workspace %d" msgid "Workspace %d"
msgstr "工作区 %d" msgstr "工作区 %d"
#: ../src/core/screen.c:540 #: ../src/core/screen.c:537
#, 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:556 #: ../src/core/screen.c:553
#, 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 --"
@@ -396,18 +396,18 @@ msgstr ""
"显示“%2$s”上的屏幕 %1$d 已经有一个窗口管理器;请尝试使用 --replace 选项替换当" "显示“%2$s”上的屏幕 %1$d 已经有一个窗口管理器;请尝试使用 --replace 选项替换当"
"前的窗口管理器。\n" "前的窗口管理器。\n"
#: ../src/core/screen.c:583 #: ../src/core/screen.c:580
#, 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:661 #: ../src/core/screen.c:658
#, 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 "在显示“%2$s”上的 %1$d 屏幕已经有一个窗口管理器\n" msgstr "在显示“%2$s”上的 %1$d 屏幕已经有一个窗口管理器\n"
#: ../src/core/screen.c:853 #: ../src/core/screen.c:850
#, 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"
@@ -503,7 +503,7 @@ msgid "Window manager error: "
msgstr "窗口管理器错误:" msgstr "窗口管理器错误:"
#. first time through #. first time through
#: ../src/core/window.c:7613 #: ../src/core/window.c:7515
#, 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 "
@@ -519,7 +519,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:8535 #: ../src/core/window.c:8345
#, 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 "
@@ -528,22 +528,22 @@ msgstr ""
"窗口 %s 设置了一个 MWM 提示,表明它是不可改变大小的,但设置最小尺寸为 %d x " "窗口 %s 设置了一个 MWM 提示,表明它是不可改变大小的,但设置最小尺寸为 %d x "
"%d最大尺寸为 %d x %d这没有任何意义。\n" "%d最大尺寸为 %d x %d这没有任何意义。\n"
#: ../src/core/window-props.c:350 #: ../src/core/window-props.c:347
#, 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:466 #: ../src/core/window-props.c:463
#, c-format #, c-format
msgid "%s (on %s)" msgid "%s (on %s)"
msgstr "%s (于 %s)" msgstr "%s (于 %s)"
#: ../src/core/window-props.c:1549 #: ../src/core/window-props.c:1546
#, 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:1560 #: ../src/core/window-props.c:1557
#, 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"

View File

@@ -55,8 +55,7 @@ libmutter_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 \
@@ -169,9 +168,7 @@ libmutter_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 \
nodist_libmutter_la_SOURCES = \
$(mutter_built_sources) $(mutter_built_sources)
libmutter_la_LDFLAGS = -no-undefined libmutter_la_LDFLAGS = -no-undefined
@@ -252,7 +249,7 @@ Meta-$(api_version).gir: 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_la_SOURCES) $(nodist_libmutter_la_SOURCES)) $(filter %.c,$(libmutter_la_SOURCES))
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error @META_GIR@_SCANNERFLAGS = --warn-all --warn-error
endif endif

View File

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

View File

@@ -175,6 +175,31 @@ process_damage (MetaCompositor *compositor,
meta_window_actor_process_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
get_output_window (MetaScreen *screen) get_output_window (MetaScreen *screen)
{ {
@@ -660,6 +685,15 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
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);
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); info->output = get_output_window (screen);
XReparentWindow (xdisplay, xwin, info->output, 0, 0); XReparentWindow (xdisplay, xwin, info->output, 0, 0);
@@ -680,8 +714,6 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
info->pending_input_region = None; info->pending_input_region = None;
} }
info->plugin_mgr = meta_plugin_manager_new (screen);
/* Map overlay window before redirecting windows offscreen so we catch their /* Map overlay window before redirecting windows offscreen so we catch their
* contents until we show the stage. * contents until we show the stage.
*/ */
@@ -724,7 +756,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;
@@ -852,18 +884,6 @@ 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
@@ -970,19 +990,28 @@ meta_compositor_process_event (MetaCompositor *compositor,
} }
} }
if (event->type == meta_display_get_damage_event_base (compositor->display) + XDamageNotify) switch (event->type)
{ {
/* 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
@@ -1486,7 +1515,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;
@@ -1498,11 +1533,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);

View File

@@ -6,6 +6,9 @@
#include <meta/screen.h> #include <meta/screen.h>
#include <meta/meta-background-actor.h> #include <meta/meta-background-actor.h>
void meta_background_actor_set_clip_region (MetaBackgroundActor *self,
cairo_region_t *clip_region);
cairo_region_t *meta_background_actor_get_clip_region (MetaBackgroundActor *self); cairo_region_t *meta_background_actor_get_clip_region (MetaBackgroundActor *self);
#endif /* META_BACKGROUND_ACTOR_PRIVATE_H */ #endif /* META_BACKGROUND_ACTOR_PRIVATE_H */

View File

@@ -41,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 *clip_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_clip_region (self, NULL);
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object); G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
} }
@@ -119,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)
{ {
@@ -131,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
@@ -160,27 +166,31 @@ 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_clip_region:
cairo_region_t *unobscured_region, * @self: a #MetaBackgroundActor
cairo_region_t *clip_region) * @clip_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_clip_region (MetaBackgroundActor *self,
cairo_region_t *clip_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->clip_region,
iface->cull_out = meta_background_actor_cull_out; (GDestroyNotify)
iface->reset_culling = meta_background_actor_reset_culling; cairo_region_destroy);
if (clip_region)
priv->clip_region = cairo_region_copy (clip_region);
} }
/** /**

View 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_clip_region (MetaBackgroundGroup *self,
cairo_region_t *visible_region);
#endif /* META_BACKGROUND_GROUP_PRIVATE_H */

View File

@@ -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_clip_region:
* @self: a #MetaBackgroundGroup
* @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_clip_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_clip_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_clip_region (META_BACKGROUND_GROUP (actor), region);
cairo_region_translate (region, x, y);
}
}
g_list_free (children);
} }
ClutterActor * ClutterActor *

View File

@@ -501,7 +501,8 @@ set_brightness (MetaBackground *self,
priv->brightness = brightness; priv->brightness = brightness;
if (priv->effects & META_BACKGROUND_EFFECTS_VIGNETTE) if (clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL) &&
priv->effects & META_BACKGROUND_EFFECTS_VIGNETTE)
{ {
ensure_pipeline (self); ensure_pipeline (self);
cogl_pipeline_set_uniform_1f (priv->pipeline, cogl_pipeline_set_uniform_1f (priv->pipeline,
@@ -509,6 +510,14 @@ set_brightness (MetaBackground *self,
"brightness"), "brightness"),
priv->brightness); priv->brightness);
} }
else
{
ensure_pipeline (self);
CoglColor blend_color;
cogl_color_init_from_4f (&blend_color, brightness, brightness, brightness, 1.0);
cogl_pipeline_set_layer_combine (priv->pipeline, 1, "RGB=MODULATE(PREVIOUS, CONSTANT) A=REPLACE(PREVIOUS)", NULL);
cogl_pipeline_set_layer_combine_constant (priv->pipeline, 1, &blend_color);
}
clutter_content_invalidate (CLUTTER_CONTENT (self)); clutter_content_invalidate (CLUTTER_CONTENT (self));
@@ -526,6 +535,9 @@ set_vignette_sharpness (MetaBackground *self,
priv->vignette_sharpness = sharpness; priv->vignette_sharpness = sharpness;
if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
return;
if (priv->effects & META_BACKGROUND_EFFECTS_VIGNETTE) if (priv->effects & META_BACKGROUND_EFFECTS_VIGNETTE)
{ {
ensure_pipeline (self); ensure_pipeline (self);
@@ -546,6 +558,9 @@ add_vignette (MetaBackground *self)
MetaBackgroundPrivate *priv = self->priv; MetaBackgroundPrivate *priv = self->priv;
static CoglSnippet *snippet = NULL; static CoglSnippet *snippet = NULL;
if (!clutter_feature_available (CLUTTER_FEATURE_SHADERS_GLSL))
return;
ensure_pipeline (self); ensure_pipeline (self);
/* Cogl automatically caches pipelines with no eviction policy, /* Cogl automatically caches pipelines with no eviction policy,

View File

@@ -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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* 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))
{
int 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, &x, &y))
continue;
/* 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);
}

View File

@@ -1,68 +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, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* 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__ */

View File

@@ -72,7 +72,6 @@ struct _MetaShapedTexturePrivate
cairo_region_t *clip_region; cairo_region_t *clip_region;
cairo_region_t *opaque_region; cairo_region_t *opaque_region;
cairo_region_t *input_shape_region;
guint tex_width, tex_height; guint tex_width, tex_height;
@@ -395,60 +394,45 @@ 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)->pick (actor, color);
else 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; CoglPipeline *pipeline;
CoglContext *ctx; CoglContext *ctx;
CoglFramebuffer *fb; CoglFramebuffer *fb;
CoglColor cogl_color; 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;
rectangles[pos + 1] = rect.y;
rectangles[pos + 2] = rect.x + rect.width;
rectangles[pos + 3] = rect.y + rect.height;
}
ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
fb = cogl_get_draw_framebuffer (); fb = cogl_get_draw_framebuffer ();
cogl_color_init_from_4ub (&cogl_color, color->red, color->green, color->blue, color->alpha); cogl_color_init_from_4ub (&cogl_color, color->red, color->green, color->blue, color->alpha);
pipeline = cogl_pipeline_new (ctx); pipeline = get_masked_pipeline (ctx);
cogl_pipeline_set_layer_texture (pipeline, 1, priv->mask_texture);
cogl_pipeline_set_color (pipeline, &cogl_color); cogl_pipeline_set_color (pipeline, &cogl_color);
cogl_framebuffer_draw_rectangles (fb, pipeline, clutter_actor_get_allocation_box (actor, &alloc);
rectangles, n_rects);
cogl_framebuffer_draw_rectangle (fb, pipeline,
0, 0,
alloc.x2 - alloc.x1,
alloc.y2 - alloc.y1);
cogl_object_unref (pipeline); cogl_object_unref (pipeline);
} }
} }
@@ -707,41 +691,6 @@ meta_shaped_texture_get_texture (MetaShapedTexture *stex)
return COGL_TEXTURE (stex->priv->texture); return COGL_TEXTURE (stex->priv->texture);
} }
/**
* meta_shaped_texture_set_input_shape_region:
* @stex: a #MetaShapedTexture
* @shape_region: the region of the texture that should respond to
* input.
*
* Determines what region of the texture should accept input. For
* X based windows this is defined by the ShapeInput region of the
* window.
*/
void
meta_shaped_texture_set_input_shape_region (MetaShapedTexture *stex,
cairo_region_t *shape_region)
{
MetaShapedTexturePrivate *priv;
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
priv = stex->priv;
if (priv->input_shape_region != NULL)
{
cairo_region_destroy (priv->input_shape_region);
priv->input_shape_region = NULL;
}
if (shape_region != NULL)
{
cairo_region_reference (shape_region);
priv->input_shape_region = shape_region;
}
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
}
/** /**
* meta_shaped_texture_set_clip_region: * meta_shaped_texture_set_clip_region:
* @stex: a #MetaShapedTexture * @stex: a #MetaShapedTexture

View File

@@ -55,6 +55,14 @@ 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);
cairo_region_t *meta_window_actor_get_obscured_region (MetaWindowActor *self);
void meta_window_actor_set_clip_region (MetaWindowActor *self,
cairo_region_t *clip_region);
void meta_window_actor_set_clip_region_beneath (MetaWindowActor *self,
cairo_region_t *beneath_region);
void meta_window_actor_reset_clip_regions (MetaWindowActor *self);
void meta_window_actor_set_unobscured_region (MetaWindowActor *self, void meta_window_actor_set_unobscured_region (MetaWindowActor *self,
cairo_region_t *unobscured_region); cairo_region_t *unobscured_region);

View File

@@ -32,7 +32,6 @@
#include "meta-texture-rectangle.h" #include "meta-texture-rectangle.h"
#include "region-utils.h" #include "region-utils.h"
#include "monitor-private.h" #include "monitor-private.h"
#include "meta-cullable.h"
enum { enum {
POSITION_CHANGED, POSITION_CHANGED,
@@ -46,6 +45,7 @@ static guint signals[LAST_SIGNAL] = {0};
struct _MetaWindowActorPrivate struct _MetaWindowActorPrivate
{ {
MetaWindow *window; MetaWindow *window;
Window xwindow;
MetaScreen *screen; MetaScreen *screen;
ClutterActor *actor; ClutterActor *actor;
@@ -68,10 +68,10 @@ struct _MetaWindowActorPrivate
Damage damage; Damage damage;
guint8 opacity;
/* A region that matches the shape of the window, including frame bounds */ /* A region that matches the shape of the window, including frame bounds */
cairo_region_t *shape_region; cairo_region_t *shape_region;
/* If the window has an input shape, a region that matches the shape */
cairo_region_t *input_region;
/* The opaque region, from _NET_WM_OPAQUE_REGION, intersected with /* The opaque region, from _NET_WM_OPAQUE_REGION, intersected with
* the shape region. */ * the shape region. */
cairo_region_t *opaque_region; cairo_region_t *opaque_region;
@@ -152,6 +152,8 @@ struct _FrameData
enum enum
{ {
PROP_META_WINDOW = 1, PROP_META_WINDOW = 1,
PROP_META_SCREEN,
PROP_X_WINDOW,
PROP_NO_SHADOW, PROP_NO_SHADOW,
PROP_SHADOW_CLASS PROP_SHADOW_CLASS
}; };
@@ -187,10 +189,7 @@ static void do_send_frame_timings (MetaWindowActor *self,
gint refresh_interval, gint refresh_interval,
gint64 presentation_time); gint64 presentation_time);
static void cullable_iface_init (MetaCullableInterface *iface); G_DEFINE_TYPE (MetaWindowActor, meta_window_actor, CLUTTER_TYPE_ACTOR);
G_DEFINE_TYPE_WITH_CODE (MetaWindowActor, meta_window_actor, CLUTTER_TYPE_ACTOR,
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
static void static void
frame_data_free (FrameData *frame) frame_data_free (FrameData *frame)
@@ -220,12 +219,33 @@ meta_window_actor_class_init (MetaWindowActorClass *klass)
"MetaWindow", "MetaWindow",
"The displayed MetaWindow", "The displayed MetaWindow",
META_TYPE_WINDOW, META_TYPE_WINDOW,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_META_WINDOW, PROP_META_WINDOW,
pspec); pspec);
pspec = g_param_spec_pointer ("meta-screen",
"MetaScreen",
"MetaScreen",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
g_object_class_install_property (object_class,
PROP_META_SCREEN,
pspec);
pspec = g_param_spec_ulong ("x-window",
"Window",
"Window",
0,
G_MAXULONG,
0,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
g_object_class_install_property (object_class,
PROP_X_WINDOW,
pspec);
pspec = g_param_spec_boolean ("no-shadow", pspec = g_param_spec_boolean ("no-shadow",
"No shadow", "No shadow",
"Do not add shaddow to this window", "Do not add shaddow to this window",
@@ -268,6 +288,7 @@ meta_window_actor_init (MetaWindowActor *self)
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
META_TYPE_WINDOW_ACTOR, META_TYPE_WINDOW_ACTOR,
MetaWindowActorPrivate); MetaWindowActorPrivate);
priv->opacity = 0xff;
priv->shadow_class = NULL; priv->shadow_class = NULL;
} }
@@ -278,9 +299,11 @@ window_decorated_notify (MetaWindow *mw,
{ {
MetaWindowActor *self = META_WINDOW_ACTOR (data); MetaWindowActor *self = META_WINDOW_ACTOR (data);
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
MetaFrame *frame = meta_window_get_frame (mw);
MetaScreen *screen = priv->screen; MetaScreen *screen = priv->screen;
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 new_xwindow;
/* /*
* Basically, we have to reconstruct the the internals of this object * Basically, we have to reconstruct the the internals of this object
@@ -288,6 +311,11 @@ window_decorated_notify (MetaWindow *mw,
*/ */
priv->redecorating = TRUE; priv->redecorating = TRUE;
if (frame)
new_xwindow = meta_frame_get_xwindow (frame);
else
new_xwindow = meta_window_get_xwindow (mw);
meta_window_actor_detach (self); meta_window_actor_detach (self);
/* /*
@@ -302,6 +330,8 @@ window_decorated_notify (MetaWindow *mw,
priv->damage = None; priv->damage = None;
} }
priv->xwindow = new_xwindow;
/* /*
* Recreate the contents. * Recreate the contents.
*/ */
@@ -316,30 +346,18 @@ window_appears_focused_notify (MetaWindow *mw,
clutter_actor_queue_redraw (CLUTTER_ACTOR (data)); clutter_actor_queue_redraw (CLUTTER_ACTOR (data));
} }
static gboolean
is_non_opaque (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;
MetaWindow *window = priv->window;
return priv->argb32 || (window->opacity != 0xFF);
}
static void static void
meta_window_actor_constructed (GObject *object) meta_window_actor_constructed (GObject *object)
{ {
MetaWindowActor *self = META_WINDOW_ACTOR (object); MetaWindowActor *self = META_WINDOW_ACTOR (object);
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
MetaWindow *window = priv->window; MetaScreen *screen = priv->screen;
MetaScreen *screen = meta_window_get_screen (window);
MetaDisplay *display = meta_screen_get_display (screen); MetaDisplay *display = meta_screen_get_display (screen);
Window xwindow = priv->xwindow;
MetaWindow *window = priv->window;
Display *xdisplay = meta_display_get_xdisplay (display); Display *xdisplay = meta_display_get_xdisplay (display);
XRenderPictFormat *format; XRenderPictFormat *format;
Window xwindow;
xwindow = meta_window_get_toplevel_xwindow (window);
priv->screen = screen;
priv->damage = XDamageCreate (xdisplay, xwindow, priv->damage = XDamageCreate (xdisplay, xwindow,
XDamageReportBoundingBox); XDamageReportBoundingBox);
@@ -362,6 +380,19 @@ meta_window_actor_constructed (GObject *object)
* We will release it in dispose(). * We will release it in dispose().
*/ */
g_object_ref (priv->actor); g_object_ref (priv->actor);
g_signal_connect_object (window, "notify::decorated",
G_CALLBACK (window_decorated_notify), self, 0);
g_signal_connect_object (window, "notify::appears-focused",
G_CALLBACK (window_appears_focused_notify), self, 0);
}
else
{
/*
* This is the case where existing window is gaining/loosing frame.
* Just ensure the actor is top most (i.e., above shadow).
*/
clutter_actor_set_child_above_sibling (CLUTTER_ACTOR (self), priv->actor, NULL);
} }
meta_window_actor_update_opacity (self); meta_window_actor_update_opacity (self);
@@ -401,7 +432,6 @@ meta_window_actor_dispose (GObject *object)
g_clear_pointer (&priv->unobscured_region, cairo_region_destroy); g_clear_pointer (&priv->unobscured_region, cairo_region_destroy);
g_clear_pointer (&priv->shape_region, cairo_region_destroy); g_clear_pointer (&priv->shape_region, cairo_region_destroy);
g_clear_pointer (&priv->input_region, cairo_region_destroy);
g_clear_pointer (&priv->opaque_region, cairo_region_destroy); g_clear_pointer (&priv->opaque_region, cairo_region_destroy);
g_clear_pointer (&priv->shadow_clip, cairo_region_destroy); g_clear_pointer (&priv->shadow_clip, cairo_region_destroy);
@@ -454,12 +484,17 @@ meta_window_actor_set_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_META_WINDOW: case PROP_META_WINDOW:
priv->window = g_value_dup_object (value); {
if (priv->window)
g_signal_connect_object (priv->window, "notify::decorated", g_object_unref (priv->window);
G_CALLBACK (window_decorated_notify), self, 0); priv->window = g_value_dup_object (value);
g_signal_connect_object (priv->window, "notify::appears-focused", }
G_CALLBACK (window_appears_focused_notify), self, 0); break;
case PROP_META_SCREEN:
priv->screen = g_value_get_pointer (value);
break;
case PROP_X_WINDOW:
priv->xwindow = g_value_get_ulong (value);
break; break;
case PROP_NO_SHADOW: case PROP_NO_SHADOW:
{ {
@@ -505,6 +540,12 @@ meta_window_actor_get_property (GObject *object,
case PROP_META_WINDOW: case PROP_META_WINDOW:
g_value_set_object (value, priv->window); g_value_set_object (value, priv->window);
break; break;
case PROP_META_SCREEN:
g_value_set_pointer (value, priv->screen);
break;
case PROP_X_WINDOW:
g_value_set_ulong (value, priv->xwindow);
break;
case PROP_NO_SHADOW: case PROP_NO_SHADOW:
g_value_set_boolean (value, priv->no_shadow); g_value_set_boolean (value, priv->no_shadow);
break; break;
@@ -602,7 +643,7 @@ clip_shadow_under_window (MetaWindowActor *self)
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
return is_non_opaque (self) && priv->window->frame; return (priv->argb32 || priv->opacity != 0xff) && priv->window->frame;
} }
static void static void
@@ -628,7 +669,6 @@ meta_window_actor_paint (ClutterActor *actor)
MetaShadowParams params; MetaShadowParams params;
cairo_rectangle_int_t shape_bounds; cairo_rectangle_int_t shape_bounds;
cairo_region_t *clip = priv->shadow_clip; cairo_region_t *clip = priv->shadow_clip;
MetaWindow *window = priv->window;
meta_window_actor_get_shape_bounds (self, &shape_bounds); meta_window_actor_get_shape_bounds (self, &shape_bounds);
meta_window_actor_get_shadow_params (self, appears_focused, &params); meta_window_actor_get_shadow_params (self, appears_focused, &params);
@@ -652,7 +692,7 @@ meta_window_actor_paint (ClutterActor *actor)
params.y_offset + shape_bounds.y, params.y_offset + shape_bounds.y,
shape_bounds.width, shape_bounds.width,
shape_bounds.height, shape_bounds.height,
(clutter_actor_get_paint_opacity (actor) * params.opacity * window->opacity) / (255 * 255), (clutter_actor_get_paint_opacity (actor) * params.opacity * priv->opacity) / (255 * 255),
clip, clip,
clip_shadow_under_window (self)); /* clip_strictly - not just as an optimization */ clip_shadow_under_window (self)); /* clip_strictly - not just as an optimization */
@@ -694,7 +734,7 @@ meta_window_actor_get_paint_volume (ClutterActor *actor,
gdk_rectangle_union (&bounds, &shadow_bounds, &bounds); gdk_rectangle_union (&bounds, &shadow_bounds, &bounds);
} }
if (priv->unobscured_region) if (priv->unobscured_region && !clutter_actor_has_mapped_clones (actor))
{ {
cairo_rectangle_int_t unobscured_bounds; cairo_rectangle_int_t unobscured_bounds;
cairo_region_get_extents (priv->unobscured_region, &unobscured_bounds); cairo_region_get_extents (priv->unobscured_region, &unobscured_bounds);
@@ -743,10 +783,10 @@ meta_window_actor_has_shadow (MetaWindowActor *self)
return TRUE; return TRUE;
/* /*
* Do not add shadows to non-opaque windows; eventually we should generate * Do not add shadows to ARGB windows; eventually we should generate a
* a shadow from the input shape for such windows. * shadow from the input shape for such windows.
*/ */
if (is_non_opaque (self)) if (priv->argb32 || priv->opacity != 0xff)
return FALSE; return FALSE;
/* /*
@@ -777,6 +817,20 @@ meta_window_actor_has_shadow (MetaWindowActor *self)
return FALSE; return FALSE;
} }
/**
* meta_window_actor_get_x_window: (skip)
* @self: a #MetaWindowActor
*
*/
Window
meta_window_actor_get_x_window (MetaWindowActor *self)
{
if (!self)
return None;
return self->priv->xwindow;
}
/** /**
* meta_window_actor_get_meta_window: * meta_window_actor_get_meta_window:
* @self: a #MetaWindowActor * @self: a #MetaWindowActor
@@ -1281,7 +1335,7 @@ meta_window_actor_should_unredirect (MetaWindowActor *self)
if (meta_window_requested_dont_bypass_compositor (metaWindow)) if (meta_window_requested_dont_bypass_compositor (metaWindow))
return FALSE; return FALSE;
if (metaWindow->opacity != 0xFF) if (priv->opacity != 0xff)
return FALSE; return FALSE;
if (metaWindow->shape_region != NULL) if (metaWindow->shape_region != NULL)
@@ -1312,7 +1366,7 @@ meta_window_actor_set_redirected (MetaWindowActor *self, gboolean state)
MetaDisplay *display = meta_window_get_display (metaWindow); MetaDisplay *display = meta_window_get_display (metaWindow);
Display *xdisplay = meta_display_get_xdisplay (display); Display *xdisplay = meta_display_get_xdisplay (display);
Window xwin = meta_window_get_toplevel_xwindow (metaWindow); Window xwin = meta_window_actor_get_x_window (self);
if (state) if (state)
{ {
@@ -1345,6 +1399,12 @@ meta_window_actor_destroy (MetaWindowActor *self)
window_type = meta_window_get_window_type (window); window_type = meta_window_get_window_type (window);
meta_window_set_compositor_private (window, NULL); meta_window_set_compositor_private (window, NULL);
if (priv->send_frame_messages_timer != 0)
{
g_source_remove (priv->send_frame_messages_timer);
priv->send_frame_messages_timer = 0;
}
/* /*
* We remove the window from internal lookup hashes and thus any other * We remove the window from internal lookup hashes and thus any other
* unmap events etc fail * unmap events etc fail
@@ -1566,10 +1626,22 @@ meta_window_actor_new (MetaWindow *window)
MetaCompScreen *info = meta_screen_get_compositor_data (screen); MetaCompScreen *info = meta_screen_get_compositor_data (screen);
MetaWindowActor *self; MetaWindowActor *self;
MetaWindowActorPrivate *priv; MetaWindowActorPrivate *priv;
MetaFrame *frame;
Window top_window;
ClutterActor *window_group; ClutterActor *window_group;
frame = meta_window_get_frame (window);
if (frame)
top_window = meta_frame_get_xwindow (frame);
else
top_window = meta_window_get_xwindow (window);
meta_verbose ("add window: Meta %p, xwin 0x%x\n", window, (guint)top_window);
self = g_object_new (META_TYPE_WINDOW_ACTOR, self = g_object_new (META_TYPE_WINDOW_ACTOR,
"meta-window", window, "meta-window", window,
"x-window", top_window,
"meta-screen", screen,
NULL); NULL);
priv = self->priv; priv = self->priv;
@@ -1652,13 +1724,12 @@ meta_window_actor_unmapped (MetaWindowActor *self)
* Return value: (transfer none): the area obscured by the window, * Return value: (transfer none): the area obscured by the window,
* %NULL is the same as an empty region. * %NULL is the same as an empty region.
*/ */
static cairo_region_t * cairo_region_t *
meta_window_actor_get_obscured_region (MetaWindowActor *self) meta_window_actor_get_obscured_region (MetaWindowActor *self)
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
MetaWindow *window = priv->window;
if (priv->back_pixmap && window->opacity != 0xFF && !priv->window->shaded) if (priv->back_pixmap && priv->opacity == 0xff && !priv->window->shaded)
return priv->opaque_region; return priv->opaque_region;
else else
return NULL; return NULL;
@@ -1742,7 +1813,7 @@ meta_window_actor_set_unobscured_region (MetaWindowActor *self,
* not drawn in this frame. * not drawn in this frame.
* This will be set before painting then unset afterwards. * This will be set before painting then unset afterwards.
*/ */
static void void
meta_window_actor_set_clip_region (MetaWindowActor *self, meta_window_actor_set_clip_region (MetaWindowActor *self,
cairo_region_t *clip_region) cairo_region_t *clip_region)
{ {
@@ -1764,7 +1835,7 @@ meta_window_actor_set_clip_region (MetaWindowActor *self,
* shadow hid by the window itself. This will be set before painting * shadow hid by the window itself. This will be set before painting
* then unset afterwards. * then unset afterwards.
*/ */
static void void
meta_window_actor_set_clip_region_beneath (MetaWindowActor *self, meta_window_actor_set_clip_region_beneath (MetaWindowActor *self,
cairo_region_t *beneath_region) cairo_region_t *beneath_region)
{ {
@@ -1784,38 +1855,16 @@ meta_window_actor_set_clip_region_beneath (MetaWindowActor *self,
} }
} }
static void /**
meta_window_actor_cull_out (MetaCullable *cullable, * meta_window_actor_reset_clip_regions:
cairo_region_t *unobscured_region, * @self: a #MetaWindowActor
cairo_region_t *clip_region) *
* Unsets the regions set by meta_window_actor_set_clip_region() and
* meta_window_actor_set_clip_region_beneath()
*/
void
meta_window_actor_reset_clip_regions (MetaWindowActor *self)
{ {
MetaWindowActor *self = META_WINDOW_ACTOR (cullable);
MetaCompScreen *info = meta_screen_get_compositor_data (self->priv->screen);
/* Don't do any culling for the unredirected window */
if (self == info->unredirected_window)
return;
meta_window_actor_set_unobscured_region (self, unobscured_region);
meta_window_actor_set_clip_region (self, clip_region);
if (clutter_actor_get_paint_opacity (CLUTTER_ACTOR (self)) == 0xff)
{
cairo_region_t *obscured_region = meta_window_actor_get_obscured_region (self);
if (obscured_region)
{
cairo_region_subtract (unobscured_region, obscured_region);
cairo_region_subtract (clip_region, obscured_region);
}
}
meta_window_actor_set_clip_region_beneath (self, clip_region);
}
static void
meta_window_actor_reset_culling (MetaCullable *cullable)
{
MetaWindowActor *self = META_WINDOW_ACTOR (cullable);
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
meta_shaped_texture_set_clip_region (META_SHAPED_TEXTURE (priv->actor), meta_shaped_texture_set_clip_region (META_SHAPED_TEXTURE (priv->actor),
@@ -1823,13 +1872,6 @@ meta_window_actor_reset_culling (MetaCullable *cullable)
g_clear_pointer (&priv->shadow_clip, cairo_region_destroy); g_clear_pointer (&priv->shadow_clip, cairo_region_destroy);
} }
static void
cullable_iface_init (MetaCullableInterface *iface)
{
iface->cull_out = meta_window_actor_cull_out;
iface->reset_culling = meta_window_actor_reset_culling;
}
static void static void
check_needs_pixmap (MetaWindowActor *self) check_needs_pixmap (MetaWindowActor *self)
{ {
@@ -1838,8 +1880,8 @@ check_needs_pixmap (MetaWindowActor *self)
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);
MetaCompScreen *info = meta_screen_get_compositor_data (screen); MetaCompScreen *info = meta_screen_get_compositor_data (screen);
Window xwindow = meta_window_get_toplevel_xwindow (priv->window);
MetaCompositor *compositor; MetaCompositor *compositor;
Window xwindow = priv->xwindow;
if (!priv->needs_pixmap) if (!priv->needs_pixmap)
return; return;
@@ -1904,7 +1946,7 @@ check_needs_pixmap (MetaWindowActor *self)
if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture)))) if (G_UNLIKELY (!cogl_texture_pixmap_x11_is_using_tfp_extension (COGL_TEXTURE_PIXMAP_X11 (texture))))
g_warning ("NOTE: Not using GLX TFP!\n"); g_warning ("NOTE: Not using GLX TFP!\n");
/* ::size-changed is supposed to refer to meta_window_get_frame_rect(). /* ::size-changed is supposed to refer to meta_window_get_outer_rect().
* Emitting it here works pretty much OK because a new value of the * Emitting it here works pretty much OK because a new value of the
* *input* rect (which is the outer rect with the addition of invisible * *input* rect (which is the outer rect with the addition of invisible
* borders) forces a new pixmap and we get here. In the rare case where * borders) forces a new pixmap and we get here. In the rare case where
@@ -2000,7 +2042,7 @@ meta_window_actor_process_damage (MetaWindowActor *self,
if (meta_window_is_fullscreen (priv->window) && g_list_last (info->windows)->data == self && !priv->unredirected) if (meta_window_is_fullscreen (priv->window) && g_list_last (info->windows)->data == self && !priv->unredirected)
{ {
MetaRectangle window_rect; MetaRectangle window_rect;
meta_window_get_frame_rect (priv->window, &window_rect); meta_window_get_outer_rect (priv->window, &window_rect);
if (window_rect.x == event->area.x && if (window_rect.x == event->area.x &&
window_rect.y == event->area.y && window_rect.y == event->area.y &&
@@ -2187,7 +2229,8 @@ build_and_scan_frame_mask (MetaWindowActor *self,
meta_shaped_texture_set_mask_texture (META_SHAPED_TEXTURE (priv->actor), meta_shaped_texture_set_mask_texture (META_SHAPED_TEXTURE (priv->actor),
mask_texture); mask_texture);
cogl_object_unref (mask_texture); if (mask_texture)
cogl_object_unref (mask_texture);
g_free (mask_data); g_free (mask_data);
} }
@@ -2224,46 +2267,9 @@ meta_window_actor_update_shape_region (MetaWindowActor *self,
priv->shape_region = region; priv->shape_region = region;
g_clear_pointer (&priv->shadow_shape, meta_window_shape_unref); g_clear_pointer (&priv->shadow_shape, meta_window_shape_unref);
meta_window_actor_invalidate_shadow (self); meta_window_actor_invalidate_shadow (self);
} }
static void
meta_window_actor_update_input_region (MetaWindowActor *self,
cairo_rectangle_int_t *client_area)
{
MetaWindowActorPrivate *priv = self->priv;
MetaShapedTexture *stex = META_SHAPED_TEXTURE (priv->actor);
cairo_region_t *region = NULL;
if (priv->window->frame != NULL && priv->window->input_region != NULL)
{
region = meta_frame_get_frame_bounds (priv->window->frame);
cairo_region_subtract_rectangle (region, client_area);
/* input_region is in client window coordinates, so translate the
* input region into that coordinate system and back */
cairo_region_translate (region, -client_area->x, -client_area->y);
cairo_region_union (region, priv->window->input_region);
cairo_region_translate (region, client_area->x, client_area->y);
}
else if (priv->window->input_region != NULL)
{
region = cairo_region_reference (priv->window->input_region);
}
else
{
/* If we don't have a shape on the server, that means that
* we have an implicit shape of one rectangle covering the
* entire window. */
region = cairo_region_create_rectangle (client_area);
}
meta_shaped_texture_set_input_shape_region (stex, region);
cairo_region_destroy (region);
}
static void static void
meta_window_actor_update_opaque_region (MetaWindowActor *self) meta_window_actor_update_opaque_region (MetaWindowActor *self)
{ {
@@ -2324,10 +2330,10 @@ check_needs_reshape (MetaWindowActor *self)
client_area.height = priv->window->rect.height; client_area.height = priv->window->rect.height;
meta_window_actor_update_shape_region (self, &client_area); meta_window_actor_update_shape_region (self, &client_area);
meta_window_actor_update_input_region (self, &client_area);
meta_window_actor_update_opaque_region (self); meta_window_actor_update_opaque_region (self);
priv->needs_reshape = FALSE; priv->needs_reshape = FALSE;
meta_window_actor_invalidate_shadow (self);
} }
void void
@@ -2572,9 +2578,23 @@ void
meta_window_actor_update_opacity (MetaWindowActor *self) meta_window_actor_update_opacity (MetaWindowActor *self)
{ {
MetaWindowActorPrivate *priv = self->priv; MetaWindowActorPrivate *priv = self->priv;
MetaWindow *window = priv->window; MetaDisplay *display = meta_screen_get_display (priv->screen);
MetaCompositor *compositor = meta_display_get_compositor (display);
Window xwin = meta_window_get_xwindow (priv->window);
gulong value;
guint8 opacity;
clutter_actor_set_opacity (self->priv->actor, window->opacity); if (meta_prop_get_cardinal (display, xwin,
compositor->atom_net_wm_window_opacity,
&value))
{
opacity = (guint8)((gfloat)value * 255.0 / ((gfloat)0xffffffff));
}
else
opacity = 255;
self->priv->opacity = opacity;
clutter_actor_set_opacity (self->priv->actor, opacity);
} }
void void

View File

@@ -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,27 +86,6 @@ 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)
{ {
@@ -118,13 +94,13 @@ meta_window_group_paint (ClutterActor *actor)
ClutterActorIter iter; ClutterActorIter iter;
ClutterActor *child; ClutterActor *child;
cairo_rectangle_int_t visible_rect, clip_rect; 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); MetaCompScreen *info = meta_screen_get_compositor_data (window_group->screen);
ClutterActor *stage = clutter_actor_get_stage (actor);
/* Start off by treating all windows as completely unobscured, so damage anywhere /* Start off by treating all windows as completely unobscured, so damage anywhere
* in a window queues redraws, but confine it more below. */ * in a window queues redraws, but confine it more below. */
@@ -158,6 +134,9 @@ meta_window_group_paint (ClutterActor *actor)
return; return;
} }
paint_x_offset = paint_x_origin - actor_x_origin;
paint_y_offset = paint_y_origin - actor_y_origin;
visible_rect.x = visible_rect.y = 0; visible_rect.x = visible_rect.y = 0;
visible_rect.width = clutter_actor_get_width (CLUTTER_ACTOR (stage)); visible_rect.width = clutter_actor_get_width (CLUTTER_ACTOR (stage));
visible_rect.height = clutter_actor_get_height (CLUTTER_ACTOR (stage)); visible_rect.height = clutter_actor_get_height (CLUTTER_ACTOR (stage));
@@ -175,28 +154,127 @@ meta_window_group_paint (ClutterActor *actor)
clip_region = cairo_region_create_rectangle (&clip_rect); clip_region = cairo_region_create_rectangle (&clip_rect);
paint_x_offset = paint_x_origin - actor_x_origin;
paint_y_offset = paint_y_origin - actor_y_origin;
cairo_region_translate (clip_region, -paint_x_offset, -paint_y_offset);
if (info->unredirected_window != NULL) if (info->unredirected_window != NULL)
{ {
cairo_rectangle_int_t unredirected_rect; cairo_rectangle_int_t unredirected_rect;
MetaWindow *window = meta_window_actor_get_meta_window (info->unredirected_window); 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 (unobscured_region, &unredirected_rect);
cairo_region_subtract_rectangle (clip_region, &unredirected_rect); cairo_region_subtract_rectangle (clip_region, &unredirected_rect);
} }
meta_cullable_cull_out (META_CULLABLE (window_group), unobscured_region, clip_region); /* 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.
*/
clutter_actor_iter_init (&iter, actor);
while (clutter_actor_iter_prev (&iter, &child))
{
if (!CLUTTER_ACTOR_IS_VISIBLE (child))
continue;
if (info->unredirected_window != NULL &&
child == CLUTTER_ACTOR (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 (child))
continue;
if (META_IS_WINDOW_ACTOR (child))
{
MetaWindowActor *window_actor = META_WINDOW_ACTOR (child);
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 (unobscured_region, - x, - y);
cairo_region_translate (clip_region, - x, - y);
meta_window_actor_set_unobscured_region (window_actor, unobscured_region);
meta_window_actor_set_clip_region (window_actor, clip_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 (unobscured_region, obscured_region);
cairo_region_subtract (clip_region, obscured_region);
}
}
meta_window_actor_set_clip_region_beneath (window_actor, clip_region);
cairo_region_translate (unobscured_region, x, y);
cairo_region_translate (clip_region, x, y);
}
else if (META_IS_BACKGROUND_ACTOR (child) ||
META_IS_BACKGROUND_GROUP (child))
{
int x, y;
if (!meta_actor_is_untransformed (child, &x, &y))
continue;
x += paint_x_offset;
y += paint_y_offset;
cairo_region_translate (clip_region, - x, - y);
if (META_IS_BACKGROUND_GROUP (child))
meta_background_group_set_clip_region (META_BACKGROUND_GROUP (child), clip_region);
else
meta_background_actor_set_clip_region (META_BACKGROUND_ACTOR (child), clip_region);
cairo_region_translate (clip_region, x, y);
}
}
cairo_region_destroy (unobscured_region); cairo_region_destroy (unobscured_region);
cairo_region_destroy (clip_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)
*/
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_reset_clip_regions (window_actor);
}
else if (META_IS_BACKGROUND_ACTOR (child))
{
MetaBackgroundActor *background_actor = META_BACKGROUND_ACTOR (child);
meta_background_actor_set_clip_region (background_actor, NULL);
}
}
} }
/* Adapted from clutter_actor_update_default_paint_volume() */ /* Adapted from clutter_actor_update_default_paint_volume() */

View File

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

View File

@@ -118,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;
@@ -193,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,
@@ -201,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);
@@ -276,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,
@@ -298,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,
@@ -327,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,
@@ -343,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)
@@ -493,12 +519,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;
@@ -516,7 +541,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;
@@ -562,6 +586,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;
@@ -621,7 +649,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.
@@ -654,13 +682,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,
@@ -673,33 +698,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;
@@ -707,8 +738,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;
} }
} }
@@ -720,28 +765,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);
@@ -806,19 +841,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)
@@ -872,12 +907,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)
@@ -920,7 +955,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)
@@ -1029,7 +1064,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);
@@ -1221,8 +1256,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)
{ {
@@ -1242,7 +1277,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;
} }
@@ -1266,7 +1301,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;
} }
@@ -1355,7 +1390,6 @@ constrain_titlebar_visible (MetaWindow *window,
window->type == META_WINDOW_DOCK || window->type == META_WINDOW_DOCK ||
window->fullscreen || window->fullscreen ||
!window->require_titlebar_visible || !window->require_titlebar_visible ||
!window->decorated ||
unconstrained_user_action) unconstrained_user_action)
return TRUE; return TRUE;
@@ -1379,11 +1413,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;
@@ -1457,11 +1488,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;

View File

@@ -39,6 +39,7 @@ typedef enum
} 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,

View File

@@ -171,7 +171,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
@@ -280,7 +279,8 @@ 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;
meta_stack_tracker_record_lower_below (screen->stack_tracker, meta_stack_tracker_record_lower_below (screen->stack_tracker,
xwindow, xwindow,
@@ -469,6 +469,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,

View File

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

View File

@@ -51,6 +51,7 @@
#include <meta/compositor.h> #include <meta/compositor.h>
#include <meta/compositor-mutter.h> #include <meta/compositor-mutter.h>
#include <X11/Xatom.h> #include <X11/Xatom.h>
#include <X11/cursorfont.h>
#include "mutter-enum-types.h" #include "mutter-enum-types.h"
#include "meta-idle-monitor-private.h" #include "meta-idle-monitor-private.h"
@@ -117,6 +118,12 @@ typedef struct
guint ping_timeout_id; guint ping_timeout_id;
} MetaPingData; } MetaPingData;
typedef struct
{
MetaDisplay *display;
Window xwindow;
} MetaAutoRaiseData;
typedef struct typedef struct
{ {
MetaDisplay *display; MetaDisplay *display;
@@ -1586,10 +1593,23 @@ reset_ignored_crossing_serials (MetaDisplay *display)
static gboolean static gboolean
window_raise_with_delay_callback (void *data) window_raise_with_delay_callback (void *data)
{ {
MetaWindow *window = data; MetaWindow *window;
MetaAutoRaiseData *auto_raise;
window->display->autoraise_timeout_id = 0; auto_raise = data;
window->display->autoraise_window = NULL;
meta_topic (META_DEBUG_FOCUS,
"In autoraise callback for window 0x%lx\n",
auto_raise->xwindow);
auto_raise->display->autoraise_timeout_id = 0;
auto_raise->display->autoraise_window = NULL;
window = meta_display_lookup_x_window (auto_raise->display,
auto_raise->xwindow);
if (window == NULL)
return FALSE;
/* If we aren't already on top, check whether the pointer is inside /* If we aren't already on top, check whether the pointer is inside
* the window and raise the window if so. * the window and raise the window if so.
@@ -1598,7 +1618,6 @@ window_raise_with_delay_callback (void *data)
{ {
int x, y, root_x, root_y; int x, y, root_x, root_y;
Window root, child; Window root, child;
MetaRectangle frame_rect;
unsigned int mask; unsigned int mask;
gboolean same_screen; gboolean same_screen;
gboolean point_in_window; gboolean point_in_window;
@@ -1610,8 +1629,9 @@ window_raise_with_delay_callback (void *data)
&root_x, &root_y, &x, &y, &mask); &root_x, &root_y, &x, &y, &mask);
meta_error_trap_pop (window->display); meta_error_trap_pop (window->display);
meta_window_get_frame_rect (window, &frame_rect); point_in_window =
point_in_window = POINT_IN_RECT (root_x, root_y, frame_rect); (window->frame && POINT_IN_RECT (root_x, root_y, window->frame->rect)) ||
(window->frame == NULL && POINT_IN_RECT (root_x, root_y, window->rect));
if (same_screen && point_in_window) if (same_screen && point_in_window)
meta_window_raise (window); meta_window_raise (window);
else else
@@ -1626,8 +1646,7 @@ window_raise_with_delay_callback (void *data)
static void static void
meta_display_mouse_mode_focus (MetaDisplay *display, meta_display_mouse_mode_focus (MetaDisplay *display,
MetaWindow *window, MetaWindow *window,
guint32 timestamp) guint32 timestamp) {
{
if (window->type != META_WINDOW_DESKTOP) if (window->type != META_WINDOW_DESKTOP)
{ {
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
@@ -1666,8 +1685,7 @@ meta_display_mouse_mode_focus (MetaDisplay *display,
} }
static gboolean static gboolean
window_focus_on_pointer_rest_callback (gpointer data) window_focus_on_pointer_rest_callback (gpointer data) {
{
MetaFocusData *focus_data; MetaFocusData *focus_data;
MetaDisplay *display; MetaDisplay *display;
MetaScreen *screen; MetaScreen *screen;
@@ -1712,9 +1730,9 @@ window_focus_on_pointer_rest_callback (gpointer data)
goto out; goto out;
window = window =
meta_stack_get_default_focus_window_at_point (screen->stack, meta_stack_get_default_focus_window_at_point (screen->stack,
screen->active_workspace, screen->active_workspace,
None, root_x, root_y); None, root_x, root_y);
if (window == NULL) if (window == NULL)
goto out; goto out;
@@ -1722,7 +1740,7 @@ window_focus_on_pointer_rest_callback (gpointer data)
timestamp = meta_display_get_current_time_roundtrip (display); timestamp = meta_display_get_current_time_roundtrip (display);
meta_display_mouse_mode_focus (display, window, timestamp); meta_display_mouse_mode_focus (display, window, timestamp);
out: out:
display->focus_timeout_id = 0; display->focus_timeout_id = 0;
return FALSE; return FALSE;
} }
@@ -1731,11 +1749,17 @@ void
meta_display_queue_autoraise_callback (MetaDisplay *display, meta_display_queue_autoraise_callback (MetaDisplay *display,
MetaWindow *window) MetaWindow *window)
{ {
MetaAutoRaiseData *auto_raise_data;
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"Queuing an autoraise timeout for %s with delay %d\n", "Queuing an autoraise timeout for %s with delay %d\n",
window->desc, window->desc,
meta_prefs_get_auto_raise_delay ()); meta_prefs_get_auto_raise_delay ());
auto_raise_data = g_new (MetaAutoRaiseData, 1);
auto_raise_data->display = window->display;
auto_raise_data->xwindow = window->xwindow;
if (display->autoraise_timeout_id != 0) if (display->autoraise_timeout_id != 0)
g_source_remove (display->autoraise_timeout_id); g_source_remove (display->autoraise_timeout_id);
@@ -1743,7 +1767,8 @@ meta_display_queue_autoraise_callback (MetaDisplay *display,
g_timeout_add_full (G_PRIORITY_DEFAULT, g_timeout_add_full (G_PRIORITY_DEFAULT,
meta_prefs_get_auto_raise_delay (), meta_prefs_get_auto_raise_delay (),
window_raise_with_delay_callback, window_raise_with_delay_callback,
window, NULL); auto_raise_data,
g_free);
display->autoraise_window = window; display->autoraise_window = window;
} }
@@ -2119,19 +2144,6 @@ handle_window_focus_event (MetaDisplay *display,
} }
} }
static gboolean
window_has_xwindow (MetaWindow *window,
Window xwindow)
{
if (window->xwindow == xwindow)
return TRUE;
if (window->frame && window->frame->xwindow == xwindow)
return TRUE;
return FALSE;
}
/** /**
* event_callback: * event_callback:
* @event: The event that just happened * @event: The event that just happened
@@ -2188,7 +2200,7 @@ event_callback (XEvent *event,
if (display->focused_by_us && if (display->focused_by_us &&
event->xany.serial > display->focus_serial && event->xany.serial > display->focus_serial &&
display->focus_window && display->focus_window &&
!window_has_xwindow (display->focus_window, display->server_focus_window)) display->focus_window->xwindow != display->server_focus_window)
{ {
meta_topic (META_DEBUG_FOCUS, "Earlier attempt to focus %s failed\n", meta_topic (META_DEBUG_FOCUS, "Earlier attempt to focus %s failed\n",
display->focus_window->desc); display->focus_window->desc);
@@ -2444,15 +2456,15 @@ event_callback (XEvent *event,
{ {
gboolean north, south; gboolean north, south;
gboolean west, east; gboolean west, east;
MetaRectangle frame_rect; int root_x, root_y;
MetaGrabOp op; MetaGrabOp op;
meta_window_get_frame_rect (window, &frame_rect); meta_window_get_position (window, &root_x, &root_y);
west = device_event->root_x < (frame_rect.x + 1 * frame_rect.width / 3); west = device_event->root_x < (root_x + 1 * window->rect.width / 3);
east = device_event->root_x > (frame_rect.x + 2 * frame_rect.width / 3); east = device_event->root_x > (root_x + 2 * window->rect.width / 3);
north = device_event->root_y < (frame_rect.y + 1 * frame_rect.height / 3); north = device_event->root_y < (root_y + 1 * window->rect.height / 3);
south = device_event->root_y > (frame_rect.y + 2 * frame_rect.height / 3); south = device_event->root_y > (root_y + 2 * window->rect.height / 3);
if (north && west) if (north && west)
op = META_GRAB_OP_RESIZING_NW; op = META_GRAB_OP_RESIZING_NW;
@@ -3867,6 +3879,85 @@ meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display,
return is_a_no_focus_window; return is_a_no_focus_window;
} }
Cursor
meta_display_create_x_cursor (MetaDisplay *display,
MetaCursor cursor)
{
Cursor xcursor;
guint glyph = XC_num_glyphs;
const char *name = NULL;
switch (cursor)
{
case META_CURSOR_DEFAULT:
glyph = XC_left_ptr;
break;
case META_CURSOR_NORTH_RESIZE:
glyph = XC_top_side;
break;
case META_CURSOR_SOUTH_RESIZE:
glyph = XC_bottom_side;
break;
case META_CURSOR_WEST_RESIZE:
glyph = XC_left_side;
break;
case META_CURSOR_EAST_RESIZE:
glyph = XC_right_side;
break;
case META_CURSOR_SE_RESIZE:
glyph = XC_bottom_right_corner;
break;
case META_CURSOR_SW_RESIZE:
glyph = XC_bottom_left_corner;
break;
case META_CURSOR_NE_RESIZE:
glyph = XC_top_right_corner;
break;
case META_CURSOR_NW_RESIZE:
glyph = XC_top_left_corner;
break;
case META_CURSOR_MOVE_OR_RESIZE_WINDOW:
glyph = XC_fleur;
break;
case META_CURSOR_BUSY:
glyph = XC_watch;
break;
case META_CURSOR_DND_IN_DRAG:
name = "dnd-none";
break;
case META_CURSOR_DND_MOVE:
name = "dnd-move";
break;
case META_CURSOR_DND_COPY:
name = "dnd-copy";
break;
case META_CURSOR_DND_UNSUPPORTED_TARGET:
name = "dnd-none";
break;
case META_CURSOR_POINTING_HAND:
glyph = XC_hand2;
break;
case META_CURSOR_CROSSHAIR:
glyph = XC_crosshair;
break;
case META_CURSOR_IBEAM:
glyph = XC_xterm;
break;
default:
g_assert_not_reached ();
glyph = 0; /* silence compiler */
break;
}
if (name != NULL)
xcursor = XcursorLibraryLoadCursor (display->xdisplay, name);
else
xcursor = XCreateFontCursor (display->xdisplay, glyph);
return xcursor;
}
static Cursor static Cursor
xcursor_for_op (MetaDisplay *display, xcursor_for_op (MetaDisplay *display,
MetaGrabOp op) MetaGrabOp op)
@@ -4028,7 +4119,7 @@ meta_display_begin_grab_op (MetaDisplay *display,
* key grab on the RootWindow. * key grab on the RootWindow.
*/ */
if (grab_window) if (grab_window)
grab_xwindow = meta_window_get_toplevel_xwindow (grab_window); grab_xwindow = grab_window->frame ? grab_window->frame->xwindow : grab_window->xwindow;
else else
grab_xwindow = screen->xroot; grab_xwindow = screen->xroot;
@@ -4556,7 +4647,6 @@ meta_display_queue_retheme_all_windows (MetaDisplay *display)
MetaWindow *window = tmp->data; MetaWindow *window = tmp->data;
meta_window_queue (window, META_QUEUE_MOVE_RESIZE); meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
meta_window_frame_size_changed (window);
if (window->frame) if (window->frame)
{ {
meta_frame_queue_draw (window->frame); meta_frame_queue_draw (window->frame);

View File

@@ -985,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));
@@ -1010,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
@@ -1151,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);
@@ -1237,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,

View File

@@ -65,7 +65,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,
@@ -315,23 +314,9 @@ 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
meta_frame_clear_cached_borders (MetaFrame *frame)
{
frame->borders_cached = FALSE;
} }
gboolean gboolean

View File

@@ -41,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;
@@ -52,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);
@@ -71,8 +68,6 @@ gboolean meta_frame_sync_to_window (MetaFrame *frame,
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, void meta_frame_get_mask (MetaFrame *frame,

View File

@@ -41,7 +41,6 @@
#include "ui.h" #include "ui.h"
#include "frame.h" #include "frame.h"
#include "place.h" #include "place.h"
#include "screen-private.h"
#include <meta/prefs.h> #include <meta/prefs.h>
#include <meta/util.h> #include <meta/util.h>
@@ -1278,7 +1277,7 @@ meta_window_grab_keys (MetaWindow *window)
} }
meta_window_change_keygrabs (window, meta_window_change_keygrabs (window,
meta_window_get_toplevel_xwindow (window), window->frame ? window->frame->xwindow : window->xwindow,
TRUE); TRUE);
window->keys_grabbed = TRUE; window->keys_grabbed = TRUE;
@@ -1581,7 +1580,7 @@ meta_window_grab_all_keys (MetaWindow *window,
window->desc); window->desc);
meta_window_focus (window, timestamp); meta_window_focus (window, timestamp);
grabwindow = meta_window_get_toplevel_xwindow (window); grabwindow = window->frame ? window->frame->xwindow : window->xwindow;
meta_topic (META_DEBUG_KEYBINDINGS, meta_topic (META_DEBUG_KEYBINDINGS,
"Grabbing all keys on window %s\n", window->desc); "Grabbing all keys on window %s\n", window->desc);
@@ -1836,6 +1835,7 @@ invoke_handler_by_name (MetaDisplay *display,
invoke_handler (display, screen, handler, window, event, NULL); invoke_handler (display, screen, handler, window, event, NULL);
} }
/* now called from only one place, may be worth merging */
static gboolean static gboolean
process_event (MetaKeyBinding *bindings, process_event (MetaKeyBinding *bindings,
int n_bindings, int n_bindings,
@@ -1843,6 +1843,7 @@ process_event (MetaKeyBinding *bindings,
MetaScreen *screen, MetaScreen *screen,
MetaWindow *window, MetaWindow *window,
XIDeviceEvent *event, XIDeviceEvent *event,
KeySym keysym,
gboolean on_window) gboolean on_window)
{ {
int i; int i;
@@ -1860,6 +1861,7 @@ process_event (MetaKeyBinding *bindings,
MetaKeyHandler *handler = bindings[i].handler; MetaKeyHandler *handler = bindings[i].handler;
if ((!on_window && handler->flags & META_KEY_BINDING_PER_WINDOW) || if ((!on_window && handler->flags & META_KEY_BINDING_PER_WINDOW) ||
event->evtype != XI_KeyPress ||
bindings[i].keycode != event->detail || bindings[i].keycode != event->detail ||
((event->mods.effective & 0xff & ~(display->ignored_modifier_mask)) != ((event->mods.effective & 0xff & ~(display->ignored_modifier_mask)) !=
bindings[i].mask) || bindings[i].mask) ||
@@ -1926,7 +1928,7 @@ process_overlay_key (MetaDisplay *display,
*/ */
if (process_event (display->key_bindings, if (process_event (display->key_bindings,
display->n_key_bindings, display->n_key_bindings,
display, screen, NULL, event, display, screen, NULL, event, keysym,
FALSE)) FALSE))
{ {
/* As normally, after we've handled a global key /* As normally, after we've handled a global key
@@ -2190,7 +2192,7 @@ meta_display_process_key_event (MetaDisplay *display,
/* Do the normal keybindings */ /* Do the normal keybindings */
return process_event (display->key_bindings, return process_event (display->key_bindings,
display->n_key_bindings, display->n_key_bindings,
display, screen, window, event, display, screen, window, event, keysym,
!all_keys_grabbed && window); !all_keys_grabbed && window);
} }
@@ -3138,20 +3140,6 @@ handle_maximize_horizontally (MetaDisplay *display,
} }
} }
static void
handle_always_on_top (MetaDisplay *display,
MetaScreen *screen,
MetaWindow *window,
XIDeviceEvent *event,
MetaKeyBinding *binding,
gpointer dummy)
{
if (window->wm_state_above == FALSE)
meta_window_make_above (window);
else
meta_window_unmake_above (window);
}
/* Move a window to a corner; to_bottom/to_right are FALSE for the /* Move a window to a corner; to_bottom/to_right are FALSE for the
* top or left edge, or TRUE for the bottom/right edge. xchange/ychange * top or left edge, or TRUE for the bottom/right edge. xchange/ychange
* are FALSE if that dimension is not to be changed, TRUE otherwise. * are FALSE if that dimension is not to be changed, TRUE otherwise.
@@ -3169,17 +3157,17 @@ handle_move_to_corner_backend (MetaDisplay *display,
gpointer dummy) gpointer dummy)
{ {
MetaRectangle work_area; MetaRectangle work_area;
MetaRectangle frame_rect; MetaRectangle outer;
int orig_x, orig_y; int orig_x, orig_y;
int new_x, new_y; int new_x, new_y;
meta_window_get_work_area_all_monitors (window, &work_area); meta_window_get_work_area_all_monitors (window, &work_area);
meta_window_get_frame_rect (window, &frame_rect); meta_window_get_outer_rect (window, &outer);
meta_window_get_position (window, &orig_x, &orig_y); meta_window_get_position (window, &orig_x, &orig_y);
if (xchange) { if (xchange) {
new_x = work_area.x + (to_right ? new_x = work_area.x + (to_right ?
work_area.width - frame_rect.width : work_area.width - outer.width :
0); 0);
} else { } else {
new_x = orig_x; new_x = orig_x;
@@ -3187,7 +3175,7 @@ handle_move_to_corner_backend (MetaDisplay *display,
if (ychange) { if (ychange) {
new_y = work_area.y + (to_bottom ? new_y = work_area.y + (to_bottom ?
work_area.height - frame_rect.height : work_area.height - outer.height :
0); 0);
} else { } else {
new_y = orig_y; new_y = orig_y;
@@ -3296,12 +3284,12 @@ handle_move_to_center (MetaDisplay *display,
gpointer dummy) gpointer dummy)
{ {
MetaRectangle work_area; MetaRectangle work_area;
MetaRectangle frame_rect; MetaRectangle outer;
int orig_x, orig_y; int orig_x, orig_y;
int frame_width, frame_height; int frame_width, frame_height;
meta_window_get_work_area_all_monitors (window, &work_area); meta_window_get_work_area_all_monitors (window, &work_area);
meta_window_get_frame_rect (window, &frame_rect); meta_window_get_outer_rect (window, &outer);
meta_window_get_position (window, &orig_x, &orig_y); meta_window_get_position (window, &orig_x, &orig_y);
frame_width = (window->frame ? window->frame->child_x : 0); frame_width = (window->frame ? window->frame->child_x : 0);
@@ -3309,8 +3297,8 @@ handle_move_to_center (MetaDisplay *display,
meta_window_move_resize (window, meta_window_move_resize (window,
TRUE, TRUE,
work_area.x + (work_area.width +frame_width -frame_rect.width )/2, work_area.x + (work_area.width +frame_width -outer.width )/2,
work_area.y + (work_area.height+frame_height-frame_rect.height)/2, work_area.y + (work_area.height+frame_height-outer.height)/2,
window->rect.width, window->rect.width,
window->rect.height); window->rect.height);
} }
@@ -3974,26 +3962,6 @@ handle_move_to_workspace (MetaDisplay *display,
} }
} }
static void
handle_move_to_monitor (MetaDisplay *display,
MetaScreen *screen,
MetaWindow *window,
XIDeviceEvent *event,
MetaKeyBinding *binding,
gpointer dummy)
{
gint which = binding->handler->data;
const MetaMonitorInfo *current, *new;
current = meta_screen_get_monitor_for_window (screen, window);
new = meta_screen_get_monitor_neighbor (screen, current->number, which);
if (new == NULL)
return;
meta_window_move_to_monitor (window, new->number);
}
static void static void
handle_raise_or_lower (MetaDisplay *display, handle_raise_or_lower (MetaDisplay *display,
MetaScreen *screen, MetaScreen *screen,
@@ -4023,8 +3991,8 @@ handle_raise_or_lower (MetaDisplay *display,
if (above->mapped) if (above->mapped)
{ {
meta_window_get_frame_rect (window, &win_rect); meta_window_get_outer_rect (window, &win_rect);
meta_window_get_frame_rect (above, &above_rect); meta_window_get_outer_rect (above, &above_rect);
/* Check if obscured */ /* Check if obscured */
if (meta_rectangle_intersect (&win_rect, &above_rect, &tmp)) if (meta_rectangle_intersect (&win_rect, &above_rect, &tmp))
@@ -4164,6 +4132,28 @@ meta_keybindings_set_custom_handler (const gchar *name,
return TRUE; return TRUE;
} }
/**
* meta_keybindings_switch_window: (skip)
* @display: a #MetaDisplay
* @screen: a #MetaScreen
* @event_window: a #MetaWindow
* @event: a #XIDeviceEvent
* @binding: a #MetaKeyBinding
*
*/
void
meta_keybindings_switch_window (MetaDisplay *display,
MetaScreen *screen,
MetaWindow *event_window,
XIDeviceEvent *event,
MetaKeyBinding *binding)
{
gint backwards = (binding->handler->flags & META_KEY_BINDING_IS_REVERSED) != 0;
do_choose_window (display, screen, event_window, event, binding,
backwards, FALSE);
}
static void static void
init_builtin_key_bindings (MetaDisplay *display) init_builtin_key_bindings (MetaDisplay *display)
{ {
@@ -4650,34 +4640,6 @@ init_builtin_key_bindings (MetaDisplay *display)
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN, META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN,
handle_move_to_workspace, META_MOTION_DOWN); handle_move_to_workspace, META_MOTION_DOWN);
add_builtin_keybinding (display,
"move-to-monitor-left",
common_keybindings,
META_KEY_BINDING_PER_WINDOW,
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_LEFT,
handle_move_to_monitor, META_SCREEN_LEFT);
add_builtin_keybinding (display,
"move-to-monitor-right",
common_keybindings,
META_KEY_BINDING_PER_WINDOW,
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_RIGHT,
handle_move_to_monitor, META_SCREEN_RIGHT);
add_builtin_keybinding (display,
"move-to-monitor-down",
common_keybindings,
META_KEY_BINDING_PER_WINDOW,
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_DOWN,
handle_move_to_monitor, META_SCREEN_DOWN);
add_builtin_keybinding (display,
"move-to-monitor-up",
common_keybindings,
META_KEY_BINDING_PER_WINDOW,
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_UP,
handle_move_to_monitor, META_SCREEN_UP);
add_builtin_keybinding (display, add_builtin_keybinding (display,
"raise-or-lower", "raise-or-lower",
common_keybindings, common_keybindings,
@@ -4713,13 +4675,6 @@ init_builtin_key_bindings (MetaDisplay *display)
META_KEYBINDING_ACTION_MAXIMIZE_HORIZONTALLY, META_KEYBINDING_ACTION_MAXIMIZE_HORIZONTALLY,
handle_maximize_horizontally, 0); handle_maximize_horizontally, 0);
add_builtin_keybinding (display,
"always-on-top",
common_keybindings,
META_KEY_BINDING_PER_WINDOW,
META_KEYBINDING_ACTION_ALWAYS_ON_TOP,
handle_always_on_top, 0);
add_builtin_keybinding (display, add_builtin_keybinding (display,
"move-to-corner-nw", "move-to-corner-nw",
common_keybindings, common_keybindings,

View File

@@ -37,9 +37,7 @@
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <X11/cursorfont.h>
#include <X11/extensions/Xfixes.h> #include <X11/extensions/Xfixes.h>
#include <X11/Xcursor/Xcursor.h>
#include "meta-cursor-tracker-private.h" #include "meta-cursor-tracker-private.h"
#include "screen-private.h" #include "screen-private.h"
@@ -71,106 +69,6 @@ enum {
static guint signals[LAST_SIGNAL]; static guint signals[LAST_SIGNAL];
static void
translate_meta_cursor (MetaCursor cursor,
guint *glyph_out,
const char **name_out)
{
guint glyph = XC_num_glyphs;
const char *name = NULL;
switch (cursor)
{
case META_CURSOR_DEFAULT:
glyph = XC_left_ptr;
break;
case META_CURSOR_NORTH_RESIZE:
glyph = XC_top_side;
break;
case META_CURSOR_SOUTH_RESIZE:
glyph = XC_bottom_side;
break;
case META_CURSOR_WEST_RESIZE:
glyph = XC_left_side;
break;
case META_CURSOR_EAST_RESIZE:
glyph = XC_right_side;
break;
case META_CURSOR_SE_RESIZE:
glyph = XC_bottom_right_corner;
break;
case META_CURSOR_SW_RESIZE:
glyph = XC_bottom_left_corner;
break;
case META_CURSOR_NE_RESIZE:
glyph = XC_top_right_corner;
break;
case META_CURSOR_NW_RESIZE:
glyph = XC_top_left_corner;
break;
case META_CURSOR_MOVE_OR_RESIZE_WINDOW:
glyph = XC_fleur;
break;
case META_CURSOR_BUSY:
glyph = XC_watch;
break;
case META_CURSOR_DND_IN_DRAG:
name = "dnd-none";
break;
case META_CURSOR_DND_MOVE:
name = "dnd-move";
break;
case META_CURSOR_DND_COPY:
name = "dnd-copy";
break;
case META_CURSOR_DND_UNSUPPORTED_TARGET:
name = "dnd-none";
break;
case META_CURSOR_POINTING_HAND:
glyph = XC_hand2;
break;
case META_CURSOR_CROSSHAIR:
glyph = XC_crosshair;
break;
case META_CURSOR_IBEAM:
glyph = XC_xterm;
break;
default:
g_assert_not_reached ();
glyph = 0; /* silence compiler */
break;
}
*glyph_out = glyph;
*name_out = name;
}
static Cursor
load_cursor_on_server (MetaDisplay *display,
MetaCursor cursor)
{
Cursor xcursor;
guint glyph;
const char *name;
translate_meta_cursor (cursor, &glyph, &name);
if (name != NULL)
xcursor = XcursorLibraryLoadCursor (display->xdisplay, name);
else
xcursor = XCreateFontCursor (display->xdisplay, glyph);
return xcursor;
}
Cursor
meta_display_create_x_cursor (MetaDisplay *display,
MetaCursor cursor)
{
return load_cursor_on_server (display, cursor);
}
static void static void
meta_cursor_tracker_init (MetaCursorTracker *self) meta_cursor_tracker_init (MetaCursorTracker *self)
{ {

View File

@@ -501,7 +501,7 @@ make_watch (MetaIdleMonitor *monitor,
if (meta_idle_monitor_get_idletime (monitor) > (gint64)timeout_msec) if (meta_idle_monitor_get_idletime (monitor) > (gint64)timeout_msec)
watch->idle_source_id = g_idle_add (fire_watch_idle, watch); watch->idle_source_id = g_idle_add (fire_watch_idle, watch);
} }
else else if (monitor->user_active_alarm != None)
{ {
watch->xalarm = monitor->user_active_alarm; watch->xalarm = monitor->user_active_alarm;
@@ -842,8 +842,6 @@ on_bus_acquired (GDBusConnection *connection,
for (iter = devices; iter; iter = iter->next) for (iter = devices; iter; iter = iter->next)
on_device_added (device_manager, iter->data, manager); on_device_added (device_manager, iter->data, manager);
g_slist_free (devices);
g_signal_connect_object (device_manager, "device-added", g_signal_connect_object (device_manager, "device-added",
G_CALLBACK (on_device_added), manager, 0); G_CALLBACK (on_device_added), manager, 0);
g_signal_connect_object (device_manager, "device-removed", g_signal_connect_object (device_manager, "device-removed",

View File

@@ -99,9 +99,8 @@ static gboolean meta_monitor_config_assign_crtcs (MetaConfiguration *config,
GPtrArray *crtcs, GPtrArray *crtcs,
GPtrArray *outputs); GPtrArray *outputs);
static void power_client_changed_cb (UpClient *client, static void power_client_changed_cb (UpClient *client,
GParamSpec *pspec, gpointer user_data);
gpointer user_data);
static void static void
free_output_key (MetaOutputKey *key) free_output_key (MetaOutputKey *key)
@@ -233,7 +232,7 @@ meta_monitor_config_init (MetaMonitorConfig *self)
self->up_client = up_client_new (); self->up_client = up_client_new ();
self->lid_is_closed = up_client_get_lid_is_closed (self->up_client); self->lid_is_closed = up_client_get_lid_is_closed (self->up_client);
g_signal_connect_object (self->up_client, "notify::lid-is-closed", g_signal_connect_object (self->up_client, "changed",
G_CALLBACK (power_client_changed_cb), self, 0); G_CALLBACK (power_client_changed_cb), self, 0);
} }
@@ -1361,9 +1360,8 @@ turn_off_laptop_display (MetaMonitorConfig *self,
} }
static void static void
power_client_changed_cb (UpClient *client, power_client_changed_cb (UpClient *client,
GParamSpec *pspec, gpointer user_data)
gpointer user_data)
{ {
MetaMonitorManager *manager = meta_monitor_manager_get (); MetaMonitorManager *manager = meta_monitor_manager_get ();
MetaMonitorConfig *self = user_data; MetaMonitorConfig *self = user_data;

View File

@@ -187,7 +187,7 @@ output_get_backlight_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
XRRGetOutputProperty (manager_xrandr->xdisplay, XRRGetOutputProperty (manager_xrandr->xdisplay,
(XID)output->output_id, (XID)output->output_id,
display->atom_BACKLIGHT, display->atom_Backlight,
0, G_MAXLONG, False, False, XA_INTEGER, 0, G_MAXLONG, False, False, XA_INTEGER,
&actual_type, &actual_format, &actual_type, &actual_format,
&nitems, &bytes_after, &buffer); &nitems, &bytes_after, &buffer);
@@ -212,7 +212,7 @@ output_get_backlight_limits_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
meta_error_trap_push (display); meta_error_trap_push (display);
info = XRRQueryOutputProperty (manager_xrandr->xdisplay, info = XRRQueryOutputProperty (manager_xrandr->xdisplay,
(XID)output->output_id, (XID)output->output_id,
display->atom_BACKLIGHT); display->atom_Backlight);
meta_error_trap_pop (display); meta_error_trap_pop (display);
if (info == NULL) if (info == NULL)
@@ -950,7 +950,7 @@ meta_monitor_manager_xrandr_change_backlight (MetaMonitorManager *manager,
meta_error_trap_push (display); meta_error_trap_push (display);
XRRChangeOutputProperty (manager_xrandr->xdisplay, XRRChangeOutputProperty (manager_xrandr->xdisplay,
(XID)output->output_id, (XID)output->output_id,
display->atom_BACKLIGHT, display->atom_Backlight,
XA_INTEGER, 32, PropModeReplace, XA_INTEGER, 32, PropModeReplace,
(unsigned char *) &hw_value, 1); (unsigned char *) &hw_value, 1);
meta_error_trap_pop (display); meta_error_trap_pop (display);

View File

@@ -406,7 +406,7 @@ make_logical_config (MetaMonitorManager *manager)
for (j = 0; j < monitor_infos->len; j++) for (j = 0; j < monitor_infos->len; j++)
{ {
MetaMonitorInfo *info = &g_array_index (monitor_infos, MetaMonitorInfo, i); MetaMonitorInfo *info = &g_array_index (monitor_infos, MetaMonitorInfo, j);
if (meta_rectangle_equal (&crtc->rect, if (meta_rectangle_equal (&crtc->rect,
&info->rect)) &info->rect))
{ {
@@ -691,60 +691,46 @@ static char *
make_display_name (MetaMonitorManager *manager, make_display_name (MetaMonitorManager *manager,
MetaOutput *output) MetaOutput *output)
{ {
char *inches = NULL;
char *vendor_name = NULL;
char *ret;
if (g_str_has_prefix (output->name, "LVDS") || if (g_str_has_prefix (output->name, "LVDS") ||
g_str_has_prefix (output->name, "eDP")) g_str_has_prefix (output->name, "eDP"))
{ return g_strdup (_("Built-in display"));
ret = g_strdup (_("Built-in display"));
goto out;
}
if (output->width_mm > 0 && output->height_mm > 0) if (output->width_mm != -1 && output->height_mm != -1)
{ {
double d = sqrt (output->width_mm * output->width_mm + double d = sqrt (output->width_mm * output->width_mm +
output->height_mm * output->height_mm); output->height_mm * output->height_mm);
inches = diagonal_to_str (d / 25.4); char *inches = diagonal_to_str (d / 25.4);
} char *vendor_name;
char *ret;
if (g_strcmp0 (output->vendor, "unknown") != 0) if (g_strcmp0 (output->vendor, "unknown") != 0)
{ {
if (!manager->pnp_ids) if (!manager->pnp_ids)
manager->pnp_ids = gnome_pnp_ids_new (); manager->pnp_ids = gnome_pnp_ids_new ();
vendor_name = gnome_pnp_ids_get_pnp_id (manager->pnp_ids, vendor_name = gnome_pnp_ids_get_pnp_id (manager->pnp_ids,
output->vendor); output->vendor);
if (!vendor_name) ret = g_strdup_printf ("%s %s", vendor_name, inches);
vendor_name = g_strdup (output->vendor);
} g_free (vendor_name);
else }
{
if (inches != NULL)
vendor_name = g_strdup (_("Unknown"));
else else
vendor_name = g_strdup (_("Unknown Display")); {
} /* 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"'
*/
ret = g_strdup_printf (_("Unknown %s"), inches);
}
if (inches != NULL) g_free (inches);
{ return ret;
/* TRANSLATORS: this is a monitor vendor name, followed by a
* size in inches, like 'Dell 15"'
*/
ret = g_strdup_printf (_("%s %s"), vendor_name, inches);
} }
else else
{ {
ret = g_strdup (vendor_name); return g_strdup (output->vendor);
} }
out:
g_free (inches);
g_free (vendor_name);
return ret;
} }
static gboolean static gboolean
@@ -820,9 +806,6 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
g_variant_new_take_string (make_display_name (manager, output))); g_variant_new_take_string (make_display_name (manager, output)));
g_variant_builder_add (&properties, "{sv}", "backlight", g_variant_builder_add (&properties, "{sv}", "backlight",
g_variant_new_int32 (output->backlight)); g_variant_new_int32 (output->backlight));
g_variant_builder_add (&properties, "{sv}", "min-backlight-step",
g_variant_new_int32 ((output->backlight_max - output->backlight_min) ?
100 / (output->backlight_max - output->backlight_min) : -1));
g_variant_builder_add (&properties, "{sv}", "primary", g_variant_builder_add (&properties, "{sv}", "primary",
g_variant_new_boolean (output->is_primary)); g_variant_new_boolean (output->is_primary));
g_variant_builder_add (&properties, "{sv}", "presentation", g_variant_builder_add (&properties, "{sv}", "presentation",

View File

@@ -47,18 +47,34 @@ northwestcmp (gconstpointer a, gconstpointer b)
{ {
MetaWindow *aw = (gpointer) a; MetaWindow *aw = (gpointer) a;
MetaWindow *bw = (gpointer) b; MetaWindow *bw = (gpointer) b;
MetaRectangle a_frame;
MetaRectangle b_frame;
int from_origin_a; int from_origin_a;
int from_origin_b; int from_origin_b;
int ax, ay, bx, by; int ax, ay, bx, by;
meta_window_get_frame_rect (aw, &a_frame); /* we're interested in the frame position for cascading,
meta_window_get_frame_rect (bw, &b_frame); * not meta_window_get_position()
ax = a_frame.x; */
ay = a_frame.y; if (aw->frame)
bx = b_frame.x; {
by = b_frame.y; ax = aw->frame->rect.x;
ay = aw->frame->rect.y;
}
else
{
ax = aw->rect.x;
ay = aw->rect.y;
}
if (bw->frame)
{
bx = bw->frame->rect.x;
by = bw->frame->rect.y;
}
else
{
bx = bw->rect.x;
by = bw->rect.y;
}
/* probably there's a fast good-enough-guess we could use here. */ /* probably there's a fast good-enough-guess we could use here. */
from_origin_a = sqrt (ax * ax + ay * ay); from_origin_a = sqrt (ax * ax + ay * ay);
@@ -74,6 +90,7 @@ northwestcmp (gconstpointer a, gconstpointer b)
static void static void
find_next_cascade (MetaWindow *window, find_next_cascade (MetaWindow *window,
MetaFrameBorders *borders,
/* visible windows on relevant workspaces */ /* visible windows on relevant workspaces */
GList *windows, GList *windows,
int x, int x,
@@ -85,7 +102,6 @@ find_next_cascade (MetaWindow *window,
GList *sorted; GList *sorted;
int cascade_x, cascade_y; int cascade_x, cascade_y;
int x_threshold, y_threshold; int x_threshold, y_threshold;
MetaRectangle frame_rect;
int window_width, window_height; int window_width, window_height;
int cascade_stage; int cascade_stage;
MetaRectangle work_area; MetaRectangle work_area;
@@ -104,13 +120,10 @@ find_next_cascade (MetaWindow *window,
* manually cascade. * manually cascade.
*/ */
#define CASCADE_FUZZ 15 #define CASCADE_FUZZ 15
if (window->frame) if (borders)
{ {
MetaFrameBorders borders; x_threshold = MAX (borders->visible.left, CASCADE_FUZZ);
y_threshold = MAX (borders->visible.top, CASCADE_FUZZ);
meta_frame_calc_borders (window->frame, &borders);
x_threshold = MAX (borders.visible.left, CASCADE_FUZZ);
y_threshold = MAX (borders.visible.top, CASCADE_FUZZ);
} }
else else
{ {
@@ -130,25 +143,30 @@ find_next_cascade (MetaWindow *window,
cascade_y = MAX (0, work_area.y); cascade_y = MAX (0, work_area.y);
/* Find first cascade position that's not used. */ /* Find first cascade position that's not used. */
meta_window_get_frame_rect (window, &frame_rect); window_width = window->frame ? window->frame->rect.width : window->rect.width;
window_width = frame_rect.width; window_height = window->frame ? window->frame->rect.height : window->rect.height;
window_height = frame_rect.height;
cascade_stage = 0; cascade_stage = 0;
tmp = sorted; tmp = sorted;
while (tmp != NULL) while (tmp != NULL)
{ {
MetaWindow *w; MetaWindow *w;
MetaRectangle w_frame_rect;
int wx, wy; int wx, wy;
w = tmp->data; w = tmp->data;
/* we want frame position, not window position */ /* we want frame position, not window position */
meta_window_get_frame_rect (w, &w_frame_rect); if (w->frame)
wx = w_frame_rect.x; {
wy = w_frame_rect.y; wx = w->frame->rect.x;
wy = w->frame->rect.y;
}
else
{
wx = w->rect.x;
wy = w->rect.y;
}
if (ABS (wx - cascade_x) < x_threshold && if (ABS (wx - cascade_x) < x_threshold &&
ABS (wy - cascade_y) < y_threshold) ABS (wy - cascade_y) < y_threshold)
@@ -205,12 +223,22 @@ find_next_cascade (MetaWindow *window,
g_list_free (sorted); g_list_free (sorted);
*new_x = cascade_x; /* Convert coords to position of window, not position of frame. */
*new_y = cascade_y; if (borders == NULL)
{
*new_x = cascade_x;
*new_y = cascade_y;
}
else
{
*new_x = cascade_x + borders->visible.left;
*new_y = cascade_y + borders->visible.top;
}
} }
static void static void
find_most_freespace (MetaWindow *window, find_most_freespace (MetaWindow *window,
MetaFrameBorders *borders,
/* visible windows on relevant workspaces */ /* visible windows on relevant workspaces */
MetaWindow *focus_window, MetaWindow *focus_window,
int x, int x,
@@ -222,25 +250,29 @@ find_most_freespace (MetaWindow *window,
int max_area; int max_area;
int max_width, max_height, left, right, top, bottom; int max_width, max_height, left, right, top, bottom;
int left_space, right_space, top_space, bottom_space; int left_space, right_space, top_space, bottom_space;
int frame_size_left, frame_size_top;
MetaRectangle work_area; MetaRectangle work_area;
MetaRectangle avoid; MetaRectangle avoid;
MetaRectangle frame_rect; MetaRectangle outer;
frame_size_left = borders ? borders->visible.left : 0;
frame_size_top = borders ? borders->visible.top : 0;
meta_window_get_work_area_current_monitor (focus_window, &work_area); meta_window_get_work_area_current_monitor (focus_window, &work_area);
meta_window_get_frame_rect (focus_window, &avoid); meta_window_get_outer_rect (focus_window, &avoid);
meta_window_get_frame_rect (window, &frame_rect); meta_window_get_outer_rect (window, &outer);
/* Find the areas of choosing the various sides of the focus window */ /* Find the areas of choosing the various sides of the focus window */
max_width = MIN (avoid.width, frame_rect.width); max_width = MIN (avoid.width, outer.width);
max_height = MIN (avoid.height, frame_rect.height); max_height = MIN (avoid.height, outer.height);
left_space = avoid.x - work_area.x; left_space = avoid.x - work_area.x;
right_space = work_area.width - (avoid.x + avoid.width - work_area.x); right_space = work_area.width - (avoid.x + avoid.width - work_area.x);
top_space = avoid.y - work_area.y; top_space = avoid.y - work_area.y;
bottom_space = work_area.height - (avoid.y + avoid.height - work_area.y); bottom_space = work_area.height - (avoid.y + avoid.height - work_area.y);
left = MIN (left_space, frame_rect.width); left = MIN (left_space, outer.width);
right = MIN (right_space, frame_rect.width); right = MIN (right_space, outer.width);
top = MIN (top_space, frame_rect.height); top = MIN (top_space, outer.height);
bottom = MIN (bottom_space, frame_rect.height); bottom = MIN (bottom_space, outer.height);
/* Find out which side of the focus_window can show the most of the window */ /* Find out which side of the focus_window can show the most of the window */
side = META_LEFT; side = META_LEFT;
@@ -272,56 +304,39 @@ find_most_freespace (MetaWindow *window,
switch (side) switch (side)
{ {
case META_LEFT: case META_LEFT:
*new_y = avoid.y; *new_y = avoid.y + frame_size_top;
if (left_space > frame_rect.width) if (left_space > outer.width)
*new_x = avoid.x - frame_rect.width; *new_x = avoid.x - outer.width + frame_size_left;
else else
*new_x = work_area.x; *new_x = work_area.x + frame_size_left;
break; break;
case META_RIGHT: case META_RIGHT:
*new_y = avoid.y; *new_y = avoid.y + frame_size_top;
if (right_space > frame_rect.width) if (right_space > outer.width)
*new_x = avoid.x + avoid.width; *new_x = avoid.x + avoid.width + frame_size_left;
else else
*new_x = work_area.x + work_area.width - frame_rect.width; *new_x = work_area.x + work_area.width - outer.width + frame_size_left;
break; break;
case META_TOP: case META_TOP:
*new_x = avoid.x; *new_x = avoid.x + frame_size_left;
if (top_space > frame_rect.height) if (top_space > outer.height)
*new_y = avoid.y - frame_rect.height; *new_y = avoid.y - outer.height + frame_size_top;
else else
*new_y = work_area.y; *new_y = work_area.y + frame_size_top;
break; break;
case META_BOTTOM: case META_BOTTOM:
*new_x = avoid.x; *new_x = avoid.x + frame_size_left;
if (bottom_space > frame_rect.height) if (bottom_space > outer.height)
*new_y = avoid.y + avoid.height; *new_y = avoid.y + avoid.height + frame_size_top;
else else
*new_y = work_area.y + work_area.height - frame_rect.height; *new_y = work_area.y + work_area.height - outer.height + frame_size_top;
break; break;
} }
} }
static gboolean
window_overlaps_focus_window (MetaWindow *window)
{
MetaWindow *focus_window;
MetaRectangle window_frame, focus_frame, overlap;
focus_window = window->display->focus_window;
if (focus_window == NULL)
return FALSE;
meta_window_get_frame_rect (window, &window_frame);
meta_window_get_frame_rect (focus_window, &focus_frame);
return meta_rectangle_intersect (&window_frame,
&focus_frame,
&overlap);
}
static void static void
avoid_being_obscured_as_second_modal_dialog (MetaWindow *window, avoid_being_obscured_as_second_modal_dialog (MetaWindow *window,
MetaFrameBorders *borders,
int *x, int *x,
int *y) int *y)
{ {
@@ -340,17 +355,18 @@ avoid_being_obscured_as_second_modal_dialog (MetaWindow *window,
*/ */
MetaWindow *focus_window; MetaWindow *focus_window;
MetaRectangle overlap;
focus_window = window->display->focus_window; focus_window = window->display->focus_window;
/* denied_focus_and_not_transient is only set when focus_window != NULL */
if (window->denied_focus_and_not_transient && if (window->denied_focus_and_not_transient &&
window->wm_state_modal && /* FIXME: Maybe do this for all transients? */ window->wm_state_modal && /* FIXME: Maybe do this for all transients? */
meta_window_same_application (window, focus_window) && meta_window_same_application (window, focus_window) &&
window_overlaps_focus_window (window)) meta_rectangle_intersect (&window->rect,
&focus_window->rect,
&overlap))
{ {
find_most_freespace (window, focus_window, *x, *y, x, y); find_most_freespace (window, borders, focus_window, *x, *y, x, y);
meta_topic (META_DEBUG_PLACEMENT, meta_topic (META_DEBUG_PLACEMENT,
"Dialog window %s was denied focus but may be modal " "Dialog window %s was denied focus but may be modal "
"to the focus window; had to move it to avoid the " "to the focus window; had to move it to avoid the "
@@ -393,7 +409,7 @@ rectangle_overlaps_some_window (MetaRectangle *rect,
case META_WINDOW_UTILITY: case META_WINDOW_UTILITY:
case META_WINDOW_TOOLBAR: case META_WINDOW_TOOLBAR:
case META_WINDOW_MENU: case META_WINDOW_MENU:
meta_window_get_frame_rect (other, &other_rect); meta_window_get_outer_rect (other, &other_rect);
if (meta_rectangle_intersect (rect, &other_rect, &dest)) if (meta_rectangle_intersect (rect, &other_rect, &dest))
return TRUE; return TRUE;
@@ -411,14 +427,20 @@ leftmost_cmp (gconstpointer a, gconstpointer b)
{ {
MetaWindow *aw = (gpointer) a; MetaWindow *aw = (gpointer) a;
MetaWindow *bw = (gpointer) b; MetaWindow *bw = (gpointer) b;
MetaRectangle a_frame;
MetaRectangle b_frame;
int ax, bx; int ax, bx;
meta_window_get_frame_rect (aw, &a_frame); /* we're interested in the frame position for cascading,
meta_window_get_frame_rect (bw, &b_frame); * not meta_window_get_position()
ax = a_frame.x; */
bx = b_frame.x; if (aw->frame)
ax = aw->frame->rect.x;
else
ax = aw->rect.x;
if (bw->frame)
bx = bw->frame->rect.x;
else
bx = bw->rect.x;
if (ax < bx) if (ax < bx)
return -1; return -1;
@@ -433,14 +455,20 @@ topmost_cmp (gconstpointer a, gconstpointer b)
{ {
MetaWindow *aw = (gpointer) a; MetaWindow *aw = (gpointer) a;
MetaWindow *bw = (gpointer) b; MetaWindow *bw = (gpointer) b;
MetaRectangle a_frame;
MetaRectangle b_frame;
int ay, by; int ay, by;
meta_window_get_frame_rect (aw, &a_frame); /* we're interested in the frame position for cascading,
meta_window_get_frame_rect (bw, &b_frame); * not meta_window_get_position()
ay = a_frame.y; */
by = b_frame.y; if (aw->frame)
ay = aw->frame->rect.y;
else
ay = aw->rect.y;
if (bw->frame)
by = bw->frame->rect.y;
else
by = bw->rect.y;
if (ay < by) if (ay < by)
return -1; return -1;
@@ -478,6 +506,7 @@ center_tile_rect_in_area (MetaRectangle *rect,
*/ */
static gboolean static gboolean
find_first_fit (MetaWindow *window, find_first_fit (MetaWindow *window,
MetaFrameBorders *borders,
/* visible windows on relevant workspaces */ /* visible windows on relevant workspaces */
GList *windows, GList *windows,
int monitor, int monitor,
@@ -511,8 +540,15 @@ find_first_fit (MetaWindow *window,
right_sorted = g_list_copy (windows); right_sorted = g_list_copy (windows);
right_sorted = g_list_sort (right_sorted, topmost_cmp); right_sorted = g_list_sort (right_sorted, topmost_cmp);
right_sorted = g_list_sort (right_sorted, leftmost_cmp); right_sorted = g_list_sort (right_sorted, leftmost_cmp);
meta_window_get_frame_rect (window, &rect); rect.width = window->rect.width;
rect.height = window->rect.height;
if (borders)
{
rect.width += borders->visible.left + borders->visible.right;
rect.height += borders->visible.top + borders->visible.bottom;
}
#ifdef WITH_VERBOSE_MODE #ifdef WITH_VERBOSE_MODE
{ {
@@ -534,6 +570,11 @@ find_first_fit (MetaWindow *window,
{ {
*new_x = rect.x; *new_x = rect.x;
*new_y = rect.y; *new_y = rect.y;
if (borders)
{
*new_x += borders->visible.left;
*new_y += borders->visible.top;
}
retval = TRUE; retval = TRUE;
@@ -545,18 +586,23 @@ find_first_fit (MetaWindow *window,
while (tmp != NULL) while (tmp != NULL)
{ {
MetaWindow *w = tmp->data; MetaWindow *w = tmp->data;
MetaRectangle frame_rect; MetaRectangle outer_rect;
meta_window_get_frame_rect (w, &frame_rect); meta_window_get_outer_rect (w, &outer_rect);
rect.x = frame_rect.x; rect.x = outer_rect.x;
rect.y = frame_rect.y + frame_rect.height; rect.y = outer_rect.y + outer_rect.height;
if (meta_rectangle_contains_rect (&work_area, &rect) && if (meta_rectangle_contains_rect (&work_area, &rect) &&
!rectangle_overlaps_some_window (&rect, below_sorted)) !rectangle_overlaps_some_window (&rect, below_sorted))
{ {
*new_x = rect.x; *new_x = rect.x;
*new_y = rect.y; *new_y = rect.y;
if (borders)
{
*new_x += borders->visible.left;
*new_y += borders->visible.top;
}
retval = TRUE; retval = TRUE;
@@ -571,18 +617,23 @@ find_first_fit (MetaWindow *window,
while (tmp != NULL) while (tmp != NULL)
{ {
MetaWindow *w = tmp->data; MetaWindow *w = tmp->data;
MetaRectangle frame_rect; MetaRectangle outer_rect;
meta_window_get_frame_rect (w, &frame_rect); meta_window_get_outer_rect (w, &outer_rect);
rect.x = frame_rect.x + frame_rect.width; rect.x = outer_rect.x + outer_rect.width;
rect.y = frame_rect.y; rect.y = outer_rect.y;
if (meta_rectangle_contains_rect (&work_area, &rect) && if (meta_rectangle_contains_rect (&work_area, &rect) &&
!rectangle_overlaps_some_window (&rect, right_sorted)) !rectangle_overlaps_some_window (&rect, right_sorted))
{ {
*new_x = rect.x; *new_x = rect.x;
*new_y = rect.y; *new_y = rect.y;
if (borders)
{
*new_x += borders->visible.left;
*new_y += borders->visible.top;
}
retval = TRUE; retval = TRUE;
@@ -601,6 +652,7 @@ find_first_fit (MetaWindow *window,
void void
meta_window_place (MetaWindow *window, meta_window_place (MetaWindow *window,
MetaFrameBorders *borders,
int x, int x,
int y, int y,
int *new_x, int *new_x,
@@ -609,6 +661,13 @@ meta_window_place (MetaWindow *window,
GList *windows; GList *windows;
const MetaMonitorInfo *xi; const MetaMonitorInfo *xi;
/* frame member variables should NEVER be used in here, only
* MetaFrameBorders. But remember borders == NULL
* for undecorated windows. Also, this function should
* NEVER have side effects other than computing the
* placement coordinates.
*/
meta_topic (META_DEBUG_PLACEMENT, "Placing window %s\n", window->desc); meta_topic (META_DEBUG_PLACEMENT, "Placing window %s\n", window->desc);
windows = NULL; windows = NULL;
@@ -697,7 +756,7 @@ meta_window_place (MetaWindow *window,
{ {
meta_topic (META_DEBUG_PLACEMENT, meta_topic (META_DEBUG_PLACEMENT,
"Not placing window with PPosition or USPosition set\n"); "Not placing window with PPosition or USPosition set\n");
avoid_being_obscured_as_second_modal_dialog (window, &x, &y); avoid_being_obscured_as_second_modal_dialog (window, borders, &x, &y);
goto done_no_constraints; goto done_no_constraints;
} }
} }
@@ -716,27 +775,29 @@ meta_window_place (MetaWindow *window,
if (parent) if (parent)
{ {
MetaRectangle frame_rect, parent_frame_rect; int w;
meta_window_get_frame_rect (window, &frame_rect); meta_window_get_position (parent, &x, &y);
meta_window_get_frame_rect (parent, &parent_frame_rect); w = parent->rect.width;
y = parent_frame_rect.y;
/* center of parent */ /* center of parent */
x = parent_frame_rect.x + parent_frame_rect.width / 2; x = x + w / 2;
/* center of child over center of parent */ /* center of child over center of parent */
x -= frame_rect.width / 2; x -= window->rect.width / 2;
/* "visually" center window over parent, leaving twice as /* "visually" center window over parent, leaving twice as
* much space below as on top. * much space below as on top.
*/ */
y += (parent_frame_rect.height - frame_rect.height)/3; y += (parent->rect.height - window->rect.height)/3;
/* put top of child's frame, not top of child's client */
if (borders)
y += borders->visible.top;
meta_topic (META_DEBUG_PLACEMENT, "Centered window %s over transient parent\n", meta_topic (META_DEBUG_PLACEMENT, "Centered window %s over transient parent\n",
window->desc); window->desc);
avoid_being_obscured_as_second_modal_dialog (window, &x, &y); avoid_being_obscured_as_second_modal_dialog (window, borders, &x, &y);
goto done; goto done;
} }
@@ -752,9 +813,6 @@ meta_window_place (MetaWindow *window,
{ {
/* Center on current monitor */ /* Center on current monitor */
int w, h; int w, h;
MetaRectangle frame_rect;
meta_window_get_frame_rect (window, &frame_rect);
/* Warning, this function is a round trip! */ /* Warning, this function is a round trip! */
xi = meta_screen_get_current_monitor_info (window->screen); xi = meta_screen_get_current_monitor_info (window->screen);
@@ -762,8 +820,8 @@ meta_window_place (MetaWindow *window,
w = xi->rect.width; w = xi->rect.width;
h = xi->rect.height; h = xi->rect.height;
x = (w - frame_rect.width) / 2; x = (w - window->rect.width) / 2;
y = (h - frame_rect.height) / 2; y = (h - window->rect.height) / 2;
x += xi->rect.x; x += xi->rect.x;
y += xi->rect.y; y += xi->rect.y;
@@ -807,7 +865,7 @@ meta_window_place (MetaWindow *window,
x = xi->rect.x; x = xi->rect.x;
y = xi->rect.y; y = xi->rect.y;
if (find_first_fit (window, windows, if (find_first_fit (window, borders, windows,
xi->number, xi->number,
x, y, &x, &y)) x, y, &x, &y))
goto done_check_denied_focus; goto done_check_denied_focus;
@@ -820,17 +878,17 @@ meta_window_place (MetaWindow *window,
!window->fullscreen) !window->fullscreen)
{ {
MetaRectangle workarea; MetaRectangle workarea;
MetaRectangle frame_rect; MetaRectangle outer;
meta_window_get_work_area_for_monitor (window, meta_window_get_work_area_for_monitor (window,
xi->number, xi->number,
&workarea); &workarea);
meta_window_get_frame_rect (window, &frame_rect); meta_window_get_outer_rect (window, &outer);
/* If the window is bigger than the screen, then automaximize. Do NOT /* If the window is bigger than the screen, then automaximize. Do NOT
* auto-maximize the directions independently. See #419810. * auto-maximize the directions independently. See #419810.
*/ */
if (frame_rect.width >= workarea.width && frame_rect.height >= workarea.height) if (outer.width >= workarea.width && outer.height >= workarea.height)
{ {
window->maximize_horizontally_after_placement = TRUE; window->maximize_horizontally_after_placement = TRUE;
window->maximize_vertically_after_placement = TRUE; window->maximize_vertically_after_placement = TRUE;
@@ -841,7 +899,7 @@ meta_window_place (MetaWindow *window,
* fully overlapping window (e.g. starting multiple terminals) * fully overlapping window (e.g. starting multiple terminals)
* */ * */
if (x == xi->rect.x && y == xi->rect.y) if (x == xi->rect.x && y == xi->rect.y)
find_next_cascade (window, windows, x, y, &x, &y); find_next_cascade (window, borders, windows, x, y, &x, &y);
done_check_denied_focus: done_check_denied_focus:
/* If the window is being denied focus and isn't a transient of the /* If the window is being denied focus and isn't a transient of the
@@ -851,14 +909,17 @@ meta_window_place (MetaWindow *window,
*/ */
if (window->denied_focus_and_not_transient) if (window->denied_focus_and_not_transient)
{ {
MetaWindow *focus_window;
gboolean found_fit; gboolean found_fit;
MetaWindow *focus_window;
MetaRectangle overlap;
focus_window = window->display->focus_window; focus_window = window->display->focus_window;
g_assert (focus_window != NULL); g_assert (focus_window != NULL);
/* No need to do anything if the window doesn't overlap at all */ /* No need to do anything if the window doesn't overlap at all */
found_fit = !window_overlaps_focus_window (window); found_fit = !meta_rectangle_intersect (&window->rect,
&focus_window->rect,
&overlap);
/* Try to do a first fit again, this time only taking into account the /* Try to do a first fit again, this time only taking into account the
* focus window. * focus window.
@@ -872,7 +933,7 @@ meta_window_place (MetaWindow *window,
x = xi->rect.x; x = xi->rect.x;
y = xi->rect.y; y = xi->rect.y;
found_fit = find_first_fit (window, focus_window_list, found_fit = find_first_fit (window, borders, focus_window_list,
xi->number, xi->number,
x, y, &x, &y); x, y, &x, &y);
g_list_free (focus_window_list); g_list_free (focus_window_list);
@@ -882,7 +943,7 @@ meta_window_place (MetaWindow *window,
* as possible. * as possible.
*/ */
if (!found_fit) if (!found_fit)
find_most_freespace (window, focus_window, x, y, &x, &y); find_most_freespace (window, borders, focus_window, x, y, &x, &y);
} }
done: done:

View File

@@ -28,6 +28,7 @@
#include "frame.h" #include "frame.h"
void meta_window_place (MetaWindow *window, void meta_window_place (MetaWindow *window,
MetaFrameBorders *borders,
int x, int x,
int y, int y,
int *new_x, int *new_x,

View File

@@ -392,6 +392,8 @@ int
meta_screen_monitor_index_to_xinerama_index (MetaScreen *screen, meta_screen_monitor_index_to_xinerama_index (MetaScreen *screen,
int index) int index)
{ {
g_return_val_if_fail (index >= 0 && index < screen->n_monitor_infos, -1);
meta_screen_ensure_xinerama_indices (screen); meta_screen_ensure_xinerama_indices (screen);
return screen->monitor_infos[index].xinerama_index; return screen->monitor_infos[index].xinerama_index;
@@ -476,9 +478,6 @@ create_guard_window (Display *xdisplay, MetaScreen *screen)
CWEventMask|CWOverrideRedirect|CWBackPixel, CWEventMask|CWOverrideRedirect|CWBackPixel,
&attributes); &attributes);
/* https://bugzilla.gnome.org/show_bug.cgi?id=710346 */
XStoreName (xdisplay, guard_window, "mutter guard window");
{ {
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 }; unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits }; XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
@@ -859,9 +858,9 @@ meta_screen_free (MetaScreen *screen,
screen->wm_sn_selection_window); screen->wm_sn_selection_window);
if (screen->work_area_later != 0) if (screen->work_area_later != 0)
meta_later_remove (screen->work_area_later); g_source_remove (screen->work_area_later);
if (screen->check_fullscreen_later != 0) if (screen->check_fullscreen_later != 0)
meta_later_remove (screen->check_fullscreen_later); g_source_remove (screen->check_fullscreen_later);
if (screen->monitor_infos) if (screen->monitor_infos)
g_free (screen->monitor_infos); g_free (screen->monitor_infos);
@@ -1476,7 +1475,7 @@ meta_screen_tab_popup_create (MetaScreen *screen,
if (show_type == META_TAB_SHOW_INSTANTLY || if (show_type == META_TAB_SHOW_INSTANTLY ||
!entries[i].hidden || !entries[i].hidden ||
!meta_window_get_icon_geometry (window, &r)) !meta_window_get_icon_geometry (window, &r))
meta_window_get_frame_rect (window, &r); meta_window_get_outer_rect (window, &r);
entries[i].rect = r; entries[i].rect = r;
@@ -1859,7 +1858,7 @@ meta_screen_get_monitor_for_window (MetaScreen *screen,
{ {
MetaRectangle window_rect; MetaRectangle window_rect;
meta_window_get_frame_rect (window, &window_rect); meta_window_get_outer_rect (window, &window_rect);
return meta_screen_get_monitor_for_rect (screen, &window_rect); return meta_screen_get_monitor_for_rect (screen, &window_rect);
} }

View File

@@ -1465,7 +1465,7 @@ window_contains_point (MetaWindow *window,
{ {
MetaRectangle rect; MetaRectangle rect;
meta_window_get_frame_rect (window, &rect); meta_window_get_outer_rect (window, &rect);
return POINT_IN_RECT (root_x, root_y, rect); return POINT_IN_RECT (root_x, root_y, rect);
} }

View File

@@ -352,12 +352,6 @@ struct _MetaWindow
/* if non-NULL, the opaque region _NET_WM_OPAQUE_REGION */ /* if non-NULL, the opaque region _NET_WM_OPAQUE_REGION */
cairo_region_t *opaque_region; cairo_region_t *opaque_region;
/* the input shape region for picking */
cairo_region_t *input_region;
/* _NET_WM_WINDOW_OPACITY */
guint opacity;
/* if TRUE, the we have the new form of sync request counter which /* if TRUE, the we have the new form of sync request counter which
* also handles application frames */ * also handles application frames */
guint extended_sync_request_counter : 1; guint extended_sync_request_counter : 1;
@@ -514,7 +508,6 @@ void meta_window_update_fullscreen_monitors (MetaWindow *window,
unsigned long left, unsigned long left,
unsigned long right); unsigned long right);
/* args to move are window pos, not frame pos */ /* args to move are window pos, not frame pos */
void meta_window_move (MetaWindow *window, void meta_window_move (MetaWindow *window,
gboolean user_op, gboolean user_op,
@@ -658,8 +651,6 @@ void meta_window_recalc_features (MetaWindow *window);
void meta_window_recalc_window_type (MetaWindow *window); void meta_window_recalc_window_type (MetaWindow *window);
void meta_window_frame_size_changed (MetaWindow *window);
void meta_window_stack_just_below (MetaWindow *window, void meta_window_stack_just_below (MetaWindow *window,
MetaWindow *below_this_one); MetaWindow *below_this_one);
@@ -687,16 +678,8 @@ void meta_window_set_opaque_region (MetaWindow *window,
cairo_region_t *region); cairo_region_t *region);
void meta_window_update_opaque_region_x11 (MetaWindow *window); void meta_window_update_opaque_region_x11 (MetaWindow *window);
void meta_window_set_input_region (MetaWindow *window,
cairo_region_t *region);
void meta_window_update_input_region_x11 (MetaWindow *window);
void meta_window_set_shape_region (MetaWindow *window, void meta_window_set_shape_region (MetaWindow *window,
cairo_region_t *region); cairo_region_t *region);
void meta_window_update_shape_region_x11 (MetaWindow *window); void meta_window_update_shape_region_x11 (MetaWindow *window);
void meta_window_set_opacity (MetaWindow *window,
guint opacity);
Window meta_window_get_toplevel_xwindow (MetaWindow *window);
#endif #endif

View File

@@ -316,9 +316,6 @@ reload_gtk_frame_extents (MetaWindow *window,
{ {
window->has_custom_frame_extents = FALSE; window->has_custom_frame_extents = FALSE;
} }
if (!initial)
meta_window_queue(window, META_QUEUE_MOVE_RESIZE);
} }
static void static void
@@ -1709,20 +1706,6 @@ reload_bypass_compositor (MetaWindow *window,
window->bypass_compositor = requested_value; window->bypass_compositor = requested_value;
} }
static void
reload_window_opacity (MetaWindow *window,
MetaPropValue *value,
gboolean initial)
{
int requested_value = 0xFF;
if (value->type != META_PROP_VALUE_INVALID)
requested_value = (int) value->v.cardinal;
meta_window_set_opacity (window, requested_value);
}
#define RELOAD_STRING(var_name, propname) \ #define RELOAD_STRING(var_name, propname) \
static void \ static void \
reload_ ## var_name (MetaWindow *window, \ reload_ ## var_name (MetaWindow *window, \
@@ -1825,7 +1808,6 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
{ display->atom__NET_WM_STRUT, META_PROP_VALUE_INVALID, reload_struts, FALSE, FALSE }, { display->atom__NET_WM_STRUT, META_PROP_VALUE_INVALID, reload_struts, FALSE, FALSE },
{ display->atom__NET_WM_STRUT_PARTIAL, META_PROP_VALUE_INVALID, reload_struts, FALSE, FALSE }, { display->atom__NET_WM_STRUT_PARTIAL, META_PROP_VALUE_INVALID, reload_struts, FALSE, FALSE },
{ display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL, reload_bypass_compositor, FALSE, FALSE }, { display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL, reload_bypass_compositor, FALSE, FALSE },
{ display->atom__NET_WM_WINDOW_OPACITY, META_PROP_VALUE_CARDINAL, reload_window_opacity, TRUE, TRUE },
{ 0 }, { 0 },
}; };

View File

@@ -175,6 +175,7 @@ enum {
PROP_USER_TIME, PROP_USER_TIME,
PROP_DEMANDS_ATTENTION, PROP_DEMANDS_ATTENTION,
PROP_URGENT, PROP_URGENT,
PROP_SKIP_TASKBAR,
PROP_MUTTER_HINTS, PROP_MUTTER_HINTS,
PROP_APPEARS_FOCUSED, PROP_APPEARS_FOCUSED,
PROP_RESIZEABLE, PROP_RESIZEABLE,
@@ -308,6 +309,9 @@ meta_window_get_property(GObject *object,
case PROP_URGENT: case PROP_URGENT:
g_value_set_boolean (value, win->wm_hints_urgent); g_value_set_boolean (value, win->wm_hints_urgent);
break; break;
case PROP_SKIP_TASKBAR:
g_value_set_boolean (value, win->skip_taskbar);
break;
case PROP_MUTTER_HINTS: case PROP_MUTTER_HINTS:
g_value_set_string (value, win->mutter_hints); g_value_set_string (value, win->mutter_hints);
break; break;
@@ -468,6 +472,14 @@ meta_window_class_init (MetaWindowClass *klass)
FALSE, FALSE,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (object_class,
PROP_SKIP_TASKBAR,
g_param_spec_boolean ("skip-taskbar",
"Skip taskbar",
"Whether the skip-taskbar flag of WM_HINTS is set",
FALSE,
G_PARAM_READABLE));
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_MUTTER_HINTS, PROP_MUTTER_HINTS,
g_param_spec_string ("mutter-hints", g_param_spec_string ("mutter-hints",
@@ -1148,15 +1160,12 @@ meta_window_new (MetaDisplay *display,
meta_display_register_x_window (display, &window->xwindow, window); meta_display_register_x_window (display, &window->xwindow, window);
meta_window_update_shape_region_x11 (window); meta_window_update_shape_region_x11 (window);
meta_window_update_input_region_x11 (window);
/* Assign this #MetaWindow a sequence number which can be used /* Assign this #MetaWindow a sequence number which can be used
* for sorting. * for sorting.
*/ */
window->stable_sequence = ++display->window_sequence_counter; window->stable_sequence = ++display->window_sequence_counter;
window->opacity = 0xFF;
/* assign the window to its group, or create a new group if needed /* assign the window to its group, or create a new group if needed
*/ */
window->group = NULL; window->group = NULL;
@@ -1829,8 +1838,6 @@ meta_window_unmanage (MetaWindow *window,
meta_window_ungrab_keys (window); meta_window_ungrab_keys (window);
meta_display_ungrab_window_buttons (window->display, window->xwindow); meta_display_ungrab_window_buttons (window->display, window->xwindow);
meta_display_ungrab_focus_window_button (window->display, window); meta_display_ungrab_focus_window_button (window->display, window);
if (window->display->autoraise_window == window)
meta_display_remove_autoraise_callback (window->display);
meta_display_unregister_x_window (window->display, window->xwindow); meta_display_unregister_x_window (window->display, window->xwindow);
@@ -2052,23 +2059,35 @@ set_net_wm_state (MetaWindow *window)
if (window->fullscreen) if (window->fullscreen)
{ {
data[0] = meta_screen_monitor_index_to_xinerama_index (window->screen, if (window->fullscreen_monitors[0] >= 0)
window->fullscreen_monitors[0]); {
data[1] = meta_screen_monitor_index_to_xinerama_index (window->screen, data[0] = meta_screen_monitor_index_to_xinerama_index (window->screen,
window->fullscreen_monitors[1]); window->fullscreen_monitors[0]);
data[2] = meta_screen_monitor_index_to_xinerama_index (window->screen, data[1] = meta_screen_monitor_index_to_xinerama_index (window->screen,
window->fullscreen_monitors[2]); window->fullscreen_monitors[1]);
data[3] = meta_screen_monitor_index_to_xinerama_index (window->screen, data[2] = meta_screen_monitor_index_to_xinerama_index (window->screen,
window->fullscreen_monitors[3]); window->fullscreen_monitors[2]);
data[3] = meta_screen_monitor_index_to_xinerama_index (window->screen,
window->fullscreen_monitors[3]);
meta_verbose ("Setting _NET_WM_FULLSCREEN_MONITORS\n"); meta_verbose ("Setting _NET_WM_FULLSCREEN_MONITORS\n");
meta_error_trap_push (window->display); meta_error_trap_push (window->display);
XChangeProperty (window->display->xdisplay, XChangeProperty (window->display->xdisplay,
window->xwindow, window->xwindow,
window->display->atom__NET_WM_FULLSCREEN_MONITORS, window->display->atom__NET_WM_FULLSCREEN_MONITORS,
XA_CARDINAL, 32, PropModeReplace, XA_CARDINAL, 32, PropModeReplace,
(guchar*) data, 4); (guchar*) data, 4);
meta_error_trap_pop (window->display); meta_error_trap_pop (window->display);
}
else
{
meta_verbose ("Clearing _NET_WM_FULLSCREEN_MONITORS\n");
meta_error_trap_push (window->display);
XDeleteProperty (window->display->xdisplay,
window->xwindow,
window->display->atom__NET_WM_FULLSCREEN_MONITORS);
meta_error_trap_pop (window->display);
}
} }
} }
@@ -2746,8 +2765,8 @@ static gboolean
windows_overlap (const MetaWindow *w1, const MetaWindow *w2) windows_overlap (const MetaWindow *w1, const MetaWindow *w2)
{ {
MetaRectangle w1rect, w2rect; MetaRectangle w1rect, w2rect;
meta_window_get_frame_rect (w1, &w1rect); meta_window_get_outer_rect (w1, &w1rect);
meta_window_get_frame_rect (w2, &w2rect); meta_window_get_outer_rect (w2, &w2rect);
return meta_rectangle_overlap (&w1rect, &w2rect); return meta_rectangle_overlap (&w1rect, &w2rect);
} }
@@ -3548,11 +3567,11 @@ meta_window_maximize (MetaWindow *window,
MetaRectangle old_rect; MetaRectangle old_rect;
MetaRectangle new_rect; MetaRectangle new_rect;
meta_window_get_frame_rect (window, &old_rect); meta_window_get_outer_rect (window, &old_rect);
meta_window_move_resize_now (window); meta_window_move_resize_now (window);
meta_window_get_frame_rect (window, &new_rect); meta_window_get_outer_rect (window, &new_rect);
meta_compositor_maximize_window (window->display->compositor, meta_compositor_maximize_window (window->display->compositor,
window, window,
&old_rect, &old_rect,
@@ -3611,7 +3630,7 @@ meta_window_get_all_monitors (MetaWindow *window, gsize *length)
int i; int i;
monitors = g_array_new (FALSE, FALSE, sizeof (int)); monitors = g_array_new (FALSE, FALSE, sizeof (int));
meta_window_get_frame_rect (window, &window_rect); meta_window_get_outer_rect (window, &window_rect);
for (i = 0; i < window->screen->n_monitor_infos; i++) for (i = 0; i < window->screen->n_monitor_infos; i++)
{ {
@@ -3644,7 +3663,7 @@ meta_window_is_screen_sized (MetaWindow *window)
int screen_width, screen_height; int screen_width, screen_height;
meta_screen_get_size (window->screen, &screen_width, &screen_height); meta_screen_get_size (window->screen, &screen_width, &screen_height);
meta_window_get_frame_rect (window, &window_rect); meta_window_get_outer_rect (window, &window_rect);
if (window_rect.x == 0 && window_rect.y == 0 && if (window_rect.x == 0 && window_rect.y == 0 &&
window_rect.width == screen_width && window_rect.height == screen_height) window_rect.width == screen_width && window_rect.height == screen_height)
@@ -3673,7 +3692,7 @@ meta_window_is_monitor_sized (MetaWindow *window)
{ {
MetaRectangle window_rect, monitor_rect; MetaRectangle window_rect, monitor_rect;
meta_window_get_frame_rect (window, &window_rect); meta_window_get_outer_rect (window, &window_rect);
meta_screen_get_monitor_geometry (window->screen, window->monitor->number, &monitor_rect); meta_screen_get_monitor_geometry (window->screen, window->monitor->number, &monitor_rect);
if (meta_rectangle_equal (&window_rect, &monitor_rect)) if (meta_rectangle_equal (&window_rect, &monitor_rect))
@@ -3741,11 +3760,11 @@ meta_window_tile (MetaWindow *window)
MetaRectangle old_rect; MetaRectangle old_rect;
MetaRectangle new_rect; MetaRectangle new_rect;
meta_window_get_frame_rect (window, &old_rect); meta_window_get_outer_rect (window, &old_rect);
meta_window_move_resize_now (window); meta_window_move_resize_now (window);
meta_window_get_frame_rect (window, &new_rect); meta_window_get_outer_rect (window, &new_rect);
meta_compositor_maximize_window (window->display->compositor, meta_compositor_maximize_window (window->display->compositor,
window, window,
&old_rect, &old_rect,
@@ -3774,7 +3793,7 @@ meta_window_can_tile_side_by_side (MetaWindow *window)
{ {
int monitor; int monitor;
MetaRectangle tile_area; MetaRectangle tile_area;
MetaRectangle client_rect; MetaFrameBorders borders;
if (!meta_window_can_tile_maximized (window)) if (!meta_window_can_tile_maximized (window))
return FALSE; return FALSE;
@@ -3788,10 +3807,13 @@ meta_window_can_tile_side_by_side (MetaWindow *window)
tile_area.width /= 2; tile_area.width /= 2;
meta_window_frame_rect_to_client_rect (window, &tile_area, &client_rect); meta_frame_calc_borders (window->frame, &borders);
return client_rect.width >= window->size_hints.min_width && tile_area.width -= (borders.visible.left + borders.visible.right);
client_rect.height >= window->size_hints.min_height; tile_area.height -= (borders.visible.top + borders.visible.bottom);
return tile_area.width >= window->size_hints.min_width &&
tile_area.height >= window->size_hints.min_height;
} }
static void static void
@@ -3852,10 +3874,8 @@ meta_window_unmaximize_internal (MetaWindow *window,
{ {
MetaRectangle target_rect; MetaRectangle target_rect;
MetaRectangle work_area; MetaRectangle work_area;
MetaRectangle old_rect;
meta_window_get_work_area_for_monitor (window, window->monitor->number, &work_area); meta_window_get_work_area_for_monitor (window, window->monitor->number, &work_area);
meta_window_get_frame_rect (window, &old_rect);
meta_topic (META_DEBUG_WINDOW_OPS, meta_topic (META_DEBUG_WINDOW_OPS,
"Unmaximizing %s%s\n", "Unmaximizing %s%s\n",
@@ -3869,12 +3889,6 @@ meta_window_unmaximize_internal (MetaWindow *window,
window->maximized_vertically = window->maximized_vertically =
window->maximized_vertically && !unmaximize_vertically; window->maximized_vertically && !unmaximize_vertically;
/* recalc_window_features() will eventually clear the cached frame
* extents, but we need the correct frame extents in the code below,
* so invalidate the old frame extents manually up front.
*/
meta_window_frame_size_changed (window);
/* Unmaximize to the saved_rect position in the direction(s) /* Unmaximize to the saved_rect position in the direction(s)
* being unmaximized. * being unmaximized.
*/ */
@@ -3919,7 +3933,9 @@ meta_window_unmaximize_internal (MetaWindow *window,
if (window->display->compositor) if (window->display->compositor)
{ {
MetaRectangle new_rect; MetaRectangle old_rect, new_rect;
meta_window_get_outer_rect (window, &old_rect);
meta_window_move_resize_internal (window, meta_window_move_resize_internal (window,
META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION, META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION,
@@ -3929,7 +3945,7 @@ meta_window_unmaximize_internal (MetaWindow *window,
target_rect.width, target_rect.width,
target_rect.height); target_rect.height);
meta_window_get_frame_rect (window, &new_rect); meta_window_get_outer_rect (window, &new_rect);
meta_compositor_unmaximize_window (window->display->compositor, meta_compositor_unmaximize_window (window->display->compositor,
window, window,
&old_rect, &old_rect,
@@ -4034,7 +4050,6 @@ meta_window_set_above (MetaWindow *window,
window->wm_state_above = new_value; window->wm_state_above = new_value;
meta_window_update_layer (window); meta_window_update_layer (window);
set_net_wm_state (window); set_net_wm_state (window);
meta_window_frame_size_changed (window);
g_object_notify (G_OBJECT (window), "above"); g_object_notify (G_OBJECT (window), "above");
} }
@@ -4174,7 +4189,6 @@ meta_window_shade (MetaWindow *window,
window->shaded = TRUE; window->shaded = TRUE;
meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING); meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING);
meta_window_frame_size_changed (window);
/* After queuing the calc showing, since _focus flushes it, /* After queuing the calc showing, since _focus flushes it,
* and we need to focus the frame * and we need to focus the frame
@@ -4200,7 +4214,6 @@ meta_window_unshade (MetaWindow *window,
{ {
window->shaded = FALSE; window->shaded = FALSE;
meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING); meta_window_queue(window, META_QUEUE_MOVE_RESIZE | META_QUEUE_CALC_SHOWING);
meta_window_frame_size_changed (window);
/* focus the window */ /* focus the window */
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
@@ -4928,16 +4941,12 @@ meta_window_move_resize_internal (MetaWindow *window,
did_placement = !window->placed && window->calc_placement; did_placement = !window->placed && window->calc_placement;
meta_window_constrain (window, meta_window_constrain (window,
window->frame ? &borders : NULL,
flags, flags,
gravity, gravity,
&old_rect, &old_rect,
&new_rect); &new_rect);
/* meta_window_constrain() might have maximized the window after placement,
* changing the borders.
*/
meta_frame_calc_borders (window->frame, &borders);
w = new_rect.width; w = new_rect.width;
h = new_rect.height; h = new_rect.height;
root_x_nw = new_rect.x; root_x_nw = new_rect.x;
@@ -5361,10 +5370,23 @@ meta_window_move_frame (MetaWindow *window,
int root_x_nw, int root_x_nw,
int root_y_nw) int root_y_nw)
{ {
MetaRectangle rect = { root_x_nw, root_y_nw, 0, 0 }; int x = root_x_nw;
int y = root_y_nw;
meta_window_frame_rect_to_client_rect (window, &rect, &rect); if (window->frame)
meta_window_move (window, user_op, rect.x, rect.y); {
MetaFrameBorders borders;
meta_frame_calc_borders (window->frame, &borders);
/* root_x_nw and root_y_nw correspond to where the top of
* the visible frame should be. Offset by the distance between
* the origin of the window and the origin of the enclosing
* window decorations.
*/
x += window->frame->child_x - borders.invisible.left;
y += window->frame->child_y - borders.invisible.top;
}
meta_window_move (window, user_op, x, y);
} }
static void static void
@@ -5412,10 +5434,18 @@ meta_window_move_resize_frame (MetaWindow *window,
int w, int w,
int h) int h)
{ {
MetaRectangle rect = { root_x_nw, root_y_nw, w, h }; MetaFrameBorders borders;
meta_window_frame_rect_to_client_rect (window, &rect, &rect);
meta_window_move_resize (window, user_op, rect.x, rect.y, rect.width, rect.height); meta_frame_calc_borders (window->frame, &borders);
/* offset by the distance between the origin of the window
* and the origin of the enclosing window decorations ( + border)
*/
root_x_nw += borders.visible.left;
root_y_nw += borders.visible.top;
w -= borders.visible.left + borders.visible.right;
h -= borders.visible.top + borders.visible.bottom;
meta_window_move_resize (window, user_op, root_x_nw, root_y_nw, w, h);
} }
/** /**
@@ -5727,135 +5757,17 @@ meta_window_get_input_rect (const MetaWindow *window,
*rect = window->rect; *rect = window->rect;
} }
static void
get_custom_frame_extents (MetaWindow *window,
GtkBorder *extents)
{
if (!window->has_custom_frame_extents)
return;
*extents = window->custom_frame_extents;
if (META_WINDOW_MAXIMIZED_HORIZONTALLY (window))
{
extents->left = 0;
extents->right = 0;
}
else if (META_WINDOW_TILED_LEFT (window))
extents->left = 0;
else if (META_WINDOW_TILED_RIGHT (window))
extents->right = 0;
if (META_WINDOW_MAXIMIZED_VERTICALLY (window))
{
extents->top = 0;
extents->bottom = 0;
}
}
/** /**
* meta_window_client_rect_to_frame_rect: * meta_window_get_outer_rect:
* @window: a #MetaWindow
* @client_rect: client rectangle in root coordinates
* @frame_rect: (out): location to store the computed corresponding frame bounds.
*
* Converts a desired bounds of the client window - what is passed to meta_window_move_resize() -
* into the corresponding bounds of the window frame (excluding invisible borders
* and client side shadows.)
*/
void
meta_window_client_rect_to_frame_rect (MetaWindow *window,
MetaRectangle *client_rect,
MetaRectangle *frame_rect)
{
if (!frame_rect)
return;
*frame_rect = *client_rect;
/* The support for G_MAXINT here to mean infinity is a convenience for
* constraints.c:get_size_limits() and not something that we provide
* in other locations or document.
*/
if (window->frame)
{
MetaFrameBorders borders;
meta_frame_calc_borders (window->frame, &borders);
frame_rect->x -= borders.visible.left;
frame_rect->y -= borders.visible.top;
if (frame_rect->width != G_MAXINT)
frame_rect->width += borders.visible.left + borders.visible.right;
if (frame_rect->height != G_MAXINT)
frame_rect->height += borders.visible.top + borders.visible.bottom;
}
else
{
GtkBorder extents = { 0 };
get_custom_frame_extents (window, &extents);
frame_rect->x += extents.left;
frame_rect->y += extents.top;
if (frame_rect->width != G_MAXINT)
frame_rect->width -= extents.left + extents.right;
if (frame_rect->height != G_MAXINT)
frame_rect->height -= extents.top + extents.bottom;
}
}
/**
* meta_window_frame_rect_to_client_rect:
* @window: a #MetaWindow
* @frame_rect: desired frame bounds for the window
* @client_rect: (out): location to store the computed corresponding client rectangle.
*
* Converts a desired frame bounds for a window into the bounds of the client
* window - what is passed to meta_window_move_resize().
*/
void
meta_window_frame_rect_to_client_rect (MetaWindow *window,
MetaRectangle *frame_rect,
MetaRectangle *client_rect)
{
if (!client_rect)
return;
*client_rect = *frame_rect;
if (window->frame)
{
MetaFrameBorders borders;
meta_frame_calc_borders (window->frame, &borders);
client_rect->x += borders.visible.left;
client_rect->y += borders.visible.top;
client_rect->width -= borders.visible.left + borders.visible.right;
client_rect->height -= borders.visible.top + borders.visible.bottom;
}
else
{
GtkBorder extents = { 0 };
get_custom_frame_extents (window, &extents);
client_rect->x -= extents.left;
client_rect->y -= extents.top;
client_rect->width += extents.left + extents.right;
client_rect->height += extents.top + extents.bottom;
}
}
/**
* meta_window_get_frame_rect:
* @window: a #MetaWindow * @window: a #MetaWindow
* @rect: (out): pointer to an allocated #MetaRectangle * @rect: (out): pointer to an allocated #MetaRectangle
* *
* Gets the rectangle that bounds @window that is what the user thinks of * Gets the rectangle that bounds @window that is responsive to mouse events.
* as the edge of the window. This doesn't include any extra reactive * This includes only what is visible; it doesn't include any extra reactive
* area that we or the client adds to the window, or any area that the * area we add to the edges of windows.
* client adds to draw a client-side shadow.
*/ */
void void
meta_window_get_frame_rect (const MetaWindow *window, meta_window_get_outer_rect (const MetaWindow *window,
MetaRectangle *rect) MetaRectangle *rect)
{ {
if (window->frame) if (window->frame)
@@ -5884,25 +5796,6 @@ meta_window_get_frame_rect (const MetaWindow *window,
} }
} }
/**
* meta_window_get_outer_rect:
* @window: a #MetaWindow
* @rect: (out): pointer to an allocated #MetaRectangle
*
* Gets the rectangle that bounds @window that is what the user thinks of
* as the edge of the window. This doesn't include any extra reactive
* area that we or the client adds to the window, or any area that the
* client adds to draw a client-side shadow.
*
* Deprecated: 3.12: Use meta_window_get_frame_rect() instead.
*/
void
meta_window_get_outer_rect (const MetaWindow *window,
MetaRectangle *rect)
{
meta_window_get_frame_rect (window, rect);
}
const char* const char*
meta_window_get_startup_id (MetaWindow *window) meta_window_get_startup_id (MetaWindow *window)
{ {
@@ -6144,7 +6037,6 @@ window_stick_impl (MetaWindow *window)
* toggled back off. * toggled back off.
*/ */
window->on_all_workspaces_requested = TRUE; window->on_all_workspaces_requested = TRUE;
meta_window_frame_size_changed (window);
meta_window_update_on_all_workspaces (window); meta_window_update_on_all_workspaces (window);
meta_window_queue(window, META_QUEUE_CALC_SHOWING); meta_window_queue(window, META_QUEUE_CALC_SHOWING);
@@ -6159,7 +6051,6 @@ window_unstick_impl (MetaWindow *window)
/* Revert to window->workspaces */ /* Revert to window->workspaces */
window->on_all_workspaces_requested = FALSE; window->on_all_workspaces_requested = FALSE;
meta_window_frame_size_changed (window);
meta_window_update_on_all_workspaces (window); meta_window_update_on_all_workspaces (window);
/* We change ourselves to the active workspace, since otherwise you'd get /* We change ourselves to the active workspace, since otherwise you'd get
@@ -6666,7 +6557,8 @@ meta_window_property_notify (MetaWindow *window,
void void
meta_window_change_workspace_by_index (MetaWindow *window, meta_window_change_workspace_by_index (MetaWindow *window,
gint space_index, gint space_index,
gboolean append) gboolean append,
guint32 timestamp)
{ {
MetaWorkspace *workspace; MetaWorkspace *workspace;
MetaScreen *screen; MetaScreen *screen;
@@ -6685,7 +6577,11 @@ meta_window_change_workspace_by_index (MetaWindow *window,
meta_screen_get_workspace_by_index (screen, space_index); meta_screen_get_workspace_by_index (screen, space_index);
if (!workspace && append) if (!workspace && append)
workspace = meta_screen_append_new_workspace (screen, FALSE, CurrentTime); {
if (timestamp == CurrentTime)
timestamp = meta_display_get_current_time_roundtrip (window->display);
workspace = meta_screen_append_new_workspace (screen, FALSE, timestamp);
}
if (workspace) if (workspace)
{ {
@@ -7235,7 +7131,6 @@ static void
meta_window_appears_focused_changed (MetaWindow *window) meta_window_appears_focused_changed (MetaWindow *window)
{ {
set_net_wm_state (window); set_net_wm_state (window);
meta_window_frame_size_changed (window);
g_object_notify (G_OBJECT (window), "appears-focused"); g_object_notify (G_OBJECT (window), "appears-focused");
@@ -7816,91 +7711,6 @@ meta_window_set_shape_region (MetaWindow *window,
meta_compositor_window_shape_changed (window->display->compositor, window); meta_compositor_window_shape_changed (window->display->compositor, window);
} }
void
meta_window_update_input_region_x11 (MetaWindow *window)
{
cairo_region_t *region = NULL;
#ifdef HAVE_SHAPE
if (META_DISPLAY_HAS_SHAPE (window->display))
{
/* Translate the set of XShape rectangles that we
* get from the X server to a cairo_region. */
XRectangle *rects = NULL;
int n_rects, ordering;
int x_bounding, y_bounding, x_clip, y_clip;
unsigned w_bounding, h_bounding, w_clip, h_clip;
int bounding_shaped, clip_shaped;
meta_error_trap_push (window->display);
XShapeQueryExtents (window->display->xdisplay, window->xwindow,
&bounding_shaped, &x_bounding, &y_bounding,
&w_bounding, &h_bounding,
&clip_shaped, &x_clip, &y_clip,
&w_clip, &h_clip);
rects = XShapeGetRectangles (window->display->xdisplay,
window->xwindow,
ShapeInput,
&n_rects,
&ordering);
meta_error_trap_pop (window->display);
/* XXX: The x shape extension doesn't provide a way to only test if an
* input shape has been specified, so we have to query and throw away the
* rectangles. */
if (rects)
{
if (n_rects > 1 ||
(n_rects == 1 &&
(rects[0].x != x_bounding ||
rects[1].y != y_bounding ||
rects[2].width != w_bounding ||
rects[3].height != h_bounding)))
region = region_create_from_x_rectangles (rects, n_rects);
XFree (rects);
}
}
#endif /* HAVE_SHAPE */
if (region != NULL)
{
cairo_rectangle_int_t client_area;
client_area.x = 0;
client_area.y = 0;
client_area.width = window->rect.width;
client_area.height = window->rect.height;
/* The shape we get back from the client may have coordinates
* outside of the frame. The X SHAPE Extension requires that
* the overall shape the client provides never exceeds the
* "bounding rectangle" of the window -- the shape that the
* window would have gotten if it was unshaped. In our case,
* this is simply the client area.
*/
cairo_region_intersect_rectangle (region, &client_area);
}
meta_window_set_input_region (window, region);
cairo_region_destroy (region);
}
void
meta_window_set_input_region (MetaWindow *window,
cairo_region_t *region)
{
g_clear_pointer (&window->input_region, cairo_region_destroy);
if (region != NULL)
window->input_region = cairo_region_reference (region);
if (window->display->compositor)
meta_compositor_window_shape_changed (window->display->compositor, window);
}
void void
meta_window_update_shape_region_x11 (MetaWindow *window) meta_window_update_shape_region_x11 (MetaWindow *window)
{ {
@@ -8408,13 +8218,6 @@ recalc_window_type (MetaWindow *window)
} }
} }
void
meta_window_frame_size_changed (MetaWindow *window)
{
if (window->frame)
meta_frame_clear_cached_borders (window->frame);
}
static void static void
set_allowed_actions_hint (MetaWindow *window) set_allowed_actions_hint (MetaWindow *window)
{ {
@@ -8501,6 +8304,7 @@ recalc_window_features (MetaWindow *window)
gboolean old_has_resize_func; gboolean old_has_resize_func;
gboolean old_has_shade_func; gboolean old_has_shade_func;
gboolean old_always_sticky; gboolean old_always_sticky;
gboolean old_skip_taskbar;
old_has_close_func = window->has_close_func; old_has_close_func = window->has_close_func;
old_has_minimize_func = window->has_minimize_func; old_has_minimize_func = window->has_minimize_func;
@@ -8508,6 +8312,7 @@ recalc_window_features (MetaWindow *window)
old_has_resize_func = window->has_resize_func; old_has_resize_func = window->has_resize_func;
old_has_shade_func = window->has_shade_func; old_has_shade_func = window->has_shade_func;
old_always_sticky = window->always_sticky; old_always_sticky = window->always_sticky;
old_skip_taskbar = window->skip_taskbar;
/* Use MWM hints initially */ /* Use MWM hints initially */
window->decorated = window->mwm_decorated; window->decorated = window->mwm_decorated;
@@ -8614,13 +8419,18 @@ recalc_window_features (MetaWindow *window)
if (window->has_maximize_func) if (window->has_maximize_func)
{ {
MetaRectangle work_area, client_rect; MetaRectangle work_area;
MetaFrameBorders borders;
int min_frame_width, min_frame_height;
meta_window_get_work_area_current_monitor (window, &work_area); meta_window_get_work_area_current_monitor (window, &work_area);
meta_window_frame_rect_to_client_rect (window, &work_area, &client_rect); meta_frame_calc_borders (window->frame, &borders);
if (window->size_hints.min_width >= client_rect.width || min_frame_width = window->size_hints.min_width + borders.visible.left + borders.visible.right;
window->size_hints.min_height >= client_rect.height) min_frame_height = window->size_hints.min_height + borders.visible.top + borders.visible.bottom;
if (min_frame_width >= work_area.width ||
min_frame_height >= work_area.height)
window->has_maximize_func = FALSE; window->has_maximize_func = FALSE;
} }
@@ -8695,6 +8505,9 @@ recalc_window_features (MetaWindow *window)
window->skip_taskbar, window->skip_taskbar,
window->skip_pager); window->skip_pager);
if (old_skip_taskbar != window->skip_taskbar)
g_object_notify (G_OBJECT (window), "skip-taskbar");
/* FIXME: /* FIXME:
* Lame workaround for recalc_window_features * Lame workaround for recalc_window_features
* being used overzealously. The fix is to * being used overzealously. The fix is to
@@ -8713,8 +8526,6 @@ recalc_window_features (MetaWindow *window)
if (window->has_resize_func != old_has_resize_func) if (window->has_resize_func != old_has_resize_func)
g_object_notify (G_OBJECT (window), "resizeable"); g_object_notify (G_OBJECT (window), "resizeable");
meta_window_frame_size_changed (window);
/* FIXME perhaps should ensure if we don't have a shade func, /* FIXME perhaps should ensure if we don't have a shade func,
* we aren't shaded, etc. * we aren't shaded, etc.
*/ */
@@ -8991,7 +8802,7 @@ meta_window_show_menu (MetaWindow *window,
void void
meta_window_shove_titlebar_onscreen (MetaWindow *window) meta_window_shove_titlebar_onscreen (MetaWindow *window)
{ {
MetaRectangle frame_rect; MetaRectangle outer_rect;
GList *onscreen_region; GList *onscreen_region;
int horiz_amount, vert_amount; int horiz_amount, vert_amount;
int newx, newy; int newx, newy;
@@ -9003,15 +8814,15 @@ meta_window_shove_titlebar_onscreen (MetaWindow *window)
return; return;
/* Get the basic info we need */ /* Get the basic info we need */
meta_window_get_frame_rect (window, &frame_rect); meta_window_get_outer_rect (window, &outer_rect);
onscreen_region = window->screen->active_workspace->screen_region; onscreen_region = window->screen->active_workspace->screen_region;
/* Extend the region (just in case the window is too big to fit on the /* Extend the region (just in case the window is too big to fit on the
* screen), then shove the window on screen, then return the region to * screen), then shove the window on screen, then return the region to
* normal. * normal.
*/ */
horiz_amount = frame_rect.width; horiz_amount = outer_rect.width;
vert_amount = frame_rect.height; vert_amount = outer_rect.height;
meta_rectangle_expand_region (onscreen_region, meta_rectangle_expand_region (onscreen_region,
horiz_amount, horiz_amount,
horiz_amount, horiz_amount,
@@ -9019,15 +8830,15 @@ meta_window_shove_titlebar_onscreen (MetaWindow *window)
vert_amount); vert_amount);
meta_rectangle_shove_into_region(onscreen_region, meta_rectangle_shove_into_region(onscreen_region,
FIXED_DIRECTION_X, FIXED_DIRECTION_X,
&frame_rect); &outer_rect);
meta_rectangle_expand_region (onscreen_region, meta_rectangle_expand_region (onscreen_region,
-horiz_amount, -horiz_amount,
-horiz_amount, -horiz_amount,
0, 0,
-vert_amount); -vert_amount);
newx = frame_rect.x + window->frame->child_x; newx = outer_rect.x + window->frame->child_x;
newy = frame_rect.y + window->frame->child_y; newy = outer_rect.y + window->frame->child_y;
meta_window_move_resize (window, meta_window_move_resize (window,
FALSE, FALSE,
newx, newx,
@@ -9052,7 +8863,7 @@ meta_window_titlebar_is_onscreen (MetaWindow *window)
return FALSE; return FALSE;
/* Get the rectangle corresponding to the titlebar */ /* Get the rectangle corresponding to the titlebar */
meta_window_get_frame_rect (window, &titlebar_rect); meta_window_get_outer_rect (window, &titlebar_rect);
titlebar_rect.height = window->frame->child_y; titlebar_rect.height = window->frame->child_y;
/* Run through the spanning rectangles for the screen and see if one of /* Run through the spanning rectangles for the screen and see if one of
@@ -10354,7 +10165,7 @@ warp_grab_pointer (MetaWindow *window,
/* We may not have done begin_grab_op yet, i.e. may not be in a grab /* We may not have done begin_grab_op yet, i.e. may not be in a grab
*/ */
meta_window_get_frame_rect (window, &rect); meta_window_get_outer_rect (window, &rect);
switch (grab_op) switch (grab_op)
{ {
@@ -10693,7 +10504,7 @@ meta_window_set_demands_attention (MetaWindow *window)
} }
else else
{ {
meta_window_get_frame_rect (window, &candidate_rect); meta_window_get_outer_rect (window, &candidate_rect);
/* The stack is sorted with the top windows first. */ /* The stack is sorted with the top windows first. */
@@ -10704,7 +10515,7 @@ meta_window_set_demands_attention (MetaWindow *window)
if (meta_window_located_on_workspace (other_window, window->workspace)) if (meta_window_located_on_workspace (other_window, window->workspace))
{ {
meta_window_get_frame_rect (other_window, &other_rect); meta_window_get_outer_rect (other_window, &other_rect);
if (meta_rectangle_overlap (&candidate_rect, &other_rect)) if (meta_rectangle_overlap (&candidate_rect, &other_rect))
{ {
@@ -11408,8 +11219,8 @@ meta_window_compute_tile_match (MetaWindow *window)
bottommost = match; bottommost = match;
} }
meta_window_get_frame_rect (bottommost, &bottommost_rect); meta_window_get_outer_rect (bottommost, &bottommost_rect);
meta_window_get_frame_rect (topmost, &topmost_rect); meta_window_get_outer_rect (topmost, &topmost_rect);
/* /*
* If there's a window stacked in between which is partially visible * If there's a window stacked in between which is partially visible
* behind the topmost tile we don't consider the tiles to match. * behind the topmost tile we don't consider the tiles to match.
@@ -11423,7 +11234,7 @@ meta_window_compute_tile_match (MetaWindow *window)
meta_window_get_workspace (above) != meta_window_get_workspace (window)) meta_window_get_workspace (above) != meta_window_get_workspace (window))
continue; continue;
meta_window_get_frame_rect (above, &above_rect); meta_window_get_outer_rect (above, &above_rect);
if (meta_rectangle_overlap (&above_rect, &bottommost_rect) && if (meta_rectangle_overlap (&above_rect, &bottommost_rect) &&
meta_rectangle_overlap (&above_rect, &topmost_rect)) meta_rectangle_overlap (&above_rect, &topmost_rect))
@@ -11439,19 +11250,3 @@ meta_window_can_close (MetaWindow *window)
{ {
return window->has_close_func; return window->has_close_func;
} }
Window
meta_window_get_toplevel_xwindow (MetaWindow *window)
{
return window->frame ? window->frame->xwindow : window->xwindow;
}
void
meta_window_set_opacity (MetaWindow *window,
guint opacity)
{
window->opacity = opacity;
if (window->display->compositor)
meta_compositor_window_opacity_changed (window->display->compositor, window);
}

View File

@@ -80,7 +80,7 @@ item(MULTIPLE)
item(TIMESTAMP) item(TIMESTAMP)
item(VERSION) item(VERSION)
item(ATOM_PAIR) item(ATOM_PAIR)
item(BACKLIGHT) item(Backlight)
item(hotplug_mode_update) item(hotplug_mode_update)
/* Oddities: These are used, and we need atoms for them, /* Oddities: These are used, and we need atoms for them,
@@ -179,7 +179,6 @@ item(_NET_WM_BYPASS_COMPOSITOR)
item(_NET_WM_OPAQUE_REGION) item(_NET_WM_OPAQUE_REGION)
item(_NET_WM_FRAME_DRAWN) item(_NET_WM_FRAME_DRAWN)
item(_NET_WM_FRAME_TIMINGS) item(_NET_WM_FRAME_TIMINGS)
item(_NET_WM_WINDOW_OPACITY)
#if 0 #if 0
/* We apparently never use: */ /* We apparently never use: */

View File

@@ -66,8 +66,6 @@ void meta_compositor_unmanage_screen (MetaCompositor *compositor,
void meta_compositor_window_shape_changed (MetaCompositor *compositor, void meta_compositor_window_shape_changed (MetaCompositor *compositor,
MetaWindow *window); MetaWindow *window);
void meta_compositor_window_opacity_changed (MetaCompositor *compositor,
MetaWindow *window);
gboolean meta_compositor_process_event (MetaCompositor *compositor, gboolean meta_compositor_process_event (MetaCompositor *compositor,
XEvent *event, XEvent *event,

View File

@@ -35,6 +35,13 @@ gboolean meta_keybindings_set_custom_handler (const gchar *name,
gpointer user_data, gpointer user_data,
GDestroyNotify free_data); GDestroyNotify free_data);
void meta_keybindings_switch_window (MetaDisplay *display,
MetaScreen *screen,
MetaWindow *event_window,
XIDeviceEvent *event,
MetaKeyBinding *binding);
void meta_screen_ungrab_all_keys (MetaScreen *screen, guint32 timestamp); void meta_screen_ungrab_all_keys (MetaScreen *screen, guint32 timestamp);
gboolean meta_screen_grab_all_keys (MetaScreen *screen, guint32 timestamp); gboolean meta_screen_grab_all_keys (MetaScreen *screen, guint32 timestamp);
#endif #endif

View File

@@ -83,8 +83,6 @@ CoglTexture * meta_shaped_texture_get_texture (MetaShapedTexture *stex);
void meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex, void meta_shaped_texture_set_mask_texture (MetaShapedTexture *stex,
CoglTexture *mask_texture); CoglTexture *mask_texture);
void meta_shaped_texture_set_input_shape_region (MetaShapedTexture *stex,
cairo_region_t *shape_region);
void meta_shaped_texture_set_clip_region (MetaShapedTexture *stex, void meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
cairo_region_t *clip_region); cairo_region_t *clip_region);

View File

@@ -243,10 +243,6 @@ void meta_prefs_set_ignore_request_hide_titlebar (gboolean whether);
* @META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_RIGHT: FILLME * @META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_RIGHT: FILLME
* @META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_UP: FILLME * @META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_UP: FILLME
* @META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN: FILLME * @META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN: FILLME
* @META_KEYBINDING_ACTION_MOVE_TO_MONITOR_LEFT: FILLME
* @META_KEYBINDING_ACTION_MOVE_TO_MONITOR_RIGHT: FILLME
* @META_KEYBINDING_ACTION_MOVE_TO_MONITOR_UP: FILLME
* @META_KEYBINDING_ACTION_MOVE_TO_MONITOR_DOWN: FILLME
* @META_KEYBINDING_ACTION_RAISE_OR_LOWER: FILLME * @META_KEYBINDING_ACTION_RAISE_OR_LOWER: FILLME
* @META_KEYBINDING_ACTION_RAISE: FILLME * @META_KEYBINDING_ACTION_RAISE: FILLME
* @META_KEYBINDING_ACTION_LOWER: FILLME * @META_KEYBINDING_ACTION_LOWER: FILLME
@@ -262,7 +258,6 @@ void meta_prefs_set_ignore_request_hide_titlebar (gboolean whether);
* @META_KEYBINDING_ACTION_MOVE_TO_SIDE_W: FILLME * @META_KEYBINDING_ACTION_MOVE_TO_SIDE_W: FILLME
* @META_KEYBINDING_ACTION_MOVE_TO_CENTER: FILLME * @META_KEYBINDING_ACTION_MOVE_TO_CENTER: FILLME
* @META_KEYBINDING_ACTION_OVERLAY_KEY: FILLME * @META_KEYBINDING_ACTION_OVERLAY_KEY: FILLME
* @META_KEYBINDING_ACTION_ALWAYS_ON_TOP: FILLME
* @META_KEYBINDING_ACTION_LAST: FILLME * @META_KEYBINDING_ACTION_LAST: FILLME
*/ */
/* XXX FIXME This should be x-macroed, but isn't yet because it would be /* XXX FIXME This should be x-macroed, but isn't yet because it would be
@@ -340,10 +335,6 @@ typedef enum _MetaKeyBindingAction
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_RIGHT, META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_RIGHT,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_UP, META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_UP,
META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN, META_KEYBINDING_ACTION_MOVE_TO_WORKSPACE_DOWN,
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_LEFT,
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_RIGHT,
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_UP,
META_KEYBINDING_ACTION_MOVE_TO_MONITOR_DOWN,
META_KEYBINDING_ACTION_RAISE_OR_LOWER, META_KEYBINDING_ACTION_RAISE_OR_LOWER,
META_KEYBINDING_ACTION_RAISE, META_KEYBINDING_ACTION_RAISE,
META_KEYBINDING_ACTION_LOWER, META_KEYBINDING_ACTION_LOWER,
@@ -360,7 +351,6 @@ typedef enum _MetaKeyBindingAction
META_KEYBINDING_ACTION_MOVE_TO_CENTER, META_KEYBINDING_ACTION_MOVE_TO_CENTER,
META_KEYBINDING_ACTION_OVERLAY_KEY, META_KEYBINDING_ACTION_OVERLAY_KEY,
META_KEYBINDING_ACTION_ISO_NEXT_GROUP, META_KEYBINDING_ACTION_ISO_NEXT_GROUP,
META_KEYBINDING_ACTION_ALWAYS_ON_TOP,
META_KEYBINDING_ACTION_LAST META_KEYBINDING_ACTION_LAST
} MetaKeyBindingAction; } MetaKeyBindingAction;

View File

@@ -100,17 +100,7 @@ gboolean meta_window_is_override_redirect (MetaWindow *window);
gboolean meta_window_is_skip_taskbar (MetaWindow *window); gboolean meta_window_is_skip_taskbar (MetaWindow *window);
MetaRectangle *meta_window_get_rect (MetaWindow *window); MetaRectangle *meta_window_get_rect (MetaWindow *window);
void meta_window_get_input_rect (const MetaWindow *window, MetaRectangle *rect); void meta_window_get_input_rect (const MetaWindow *window, MetaRectangle *rect);
void meta_window_get_outer_rect (const MetaWindow *window, MetaRectangle *rect);
void meta_window_get_frame_rect (const MetaWindow *window, MetaRectangle *rect);
void meta_window_get_outer_rect (const MetaWindow *window, MetaRectangle *rect) G_GNUC_DEPRECATED;
void meta_window_client_rect_to_frame_rect (MetaWindow *window,
MetaRectangle *client_rect,
MetaRectangle *frame_rect);
void meta_window_frame_rect_to_client_rect (MetaWindow *window,
MetaRectangle *frame_rect,
MetaRectangle *client_rect);
MetaScreen *meta_window_get_screen (MetaWindow *window); MetaScreen *meta_window_get_screen (MetaWindow *window);
MetaDisplay *meta_window_get_display (MetaWindow *window); MetaDisplay *meta_window_get_display (MetaWindow *window);
Window meta_window_get_xwindow (MetaWindow *window); Window meta_window_get_xwindow (MetaWindow *window);
@@ -150,7 +140,8 @@ void meta_window_unset_demands_attention (MetaWindow *window);
const char* meta_window_get_startup_id (MetaWindow *window); const char* meta_window_get_startup_id (MetaWindow *window);
void meta_window_change_workspace_by_index (MetaWindow *window, void meta_window_change_workspace_by_index (MetaWindow *window,
gint space_index, gint space_index,
gboolean append); gboolean append,
guint32 timestamp);
void meta_window_change_workspace (MetaWindow *window, void meta_window_change_workspace (MetaWindow *window,
MetaWorkspace *workspace); MetaWorkspace *workspace);
GObject *meta_window_get_compositor_private (MetaWindow *window); GObject *meta_window_get_compositor_private (MetaWindow *window);