Compare commits

...

71 Commits

Author SHA1 Message Date
Owen W. Taylor
27de94b915 Bump version to 2.31.4 2010-06-25 16:18:39 -04:00
Kjartan Maraas
9e31f2b1de Added Norwegian bokmål translation 2010-06-20 11:41:52 +02:00
Maxim Ermilov
13ad103823 Clean up MutterPlugin effect interface
The current effect API passes an unnecessary list of windows to
switch_workspace() and forces a window to be passed in when killing
the switch_workspace() effect.

We can simplify the interface to correspond more closely to how
it is actually used and fix these problems:

Remove the actors parameter to plugin->switch_workspace
Remove the events parameter to plugin->kill_effect and rename it to kill_window_effects
Add plugin->kill_switch_workspace

Remove mutter_plugin_manager_kill_effect
Add mutter_plugin_manager_kill_window_effects
Add mutter_plugin_manager_kill_switch_workspace

Remove mutter_plugin_effect_completed
Add mutter_plugin_[minimize/map/destroy/maximize/unmaximize]_completed
https://bugzilla.gnome.org/show_bug.cgi?id=621082
2010-06-17 01:40:43 +04:00
Owen W. Taylor
ff5a73de49 Fix problem with window unmaximization
A mismerge of the Metacity commit "4943d79 Prevent window self-maximisation"
caused the window's user set size and position to be saved *before*
actually resizing the window to the unmaximized position rather than after.

This meant that after unmaximization the window was in an inconsistent
state and anything that caused a resize to be queued (like a change in
window properties by the application) would cause it to pop back to
the maximized size and position.

https://bugzilla.gnome.org/show_bug.cgi?id=621413
2010-06-14 16:44:28 -04:00
A S Alam
275a6ec63f update Punjabi Translation 2010-06-14 08:09:49 +05:30
Colin Walters
604da0f6ea Add _XOPEN_SOURCE display.c for gethostname()
We shouldn't need _GNU_SOURCE in delete.c anymore either.

https://bugzilla.gnome.org/show_bug.cgi?id=620860
2010-06-07 14:26:45 -04:00
Colin Walters
72a19dd448 [display] Include unistd.h for gethostname
https://bugzilla.gnome.org/show_bug.cgi?id=620860
2010-06-07 12:32:56 -04:00
Colin Walters
3a73f6b8ec Add meta_window_is_remote
It's useful for plugins to be able to easily detect whether
or not a window is from a remote host.  Also, make use of this
in the window delete codepath, instead of looking up the hostname
each time.

https://bugzilla.gnome.org/show_bug.cgi?id=620585
2010-06-07 09:44:14 -04:00
Colin Walters
343474a570 Allow logging only specific debug topics
While debugging a focus problem, I noticed that Mutter had exactly
the debug statements I wanted under the META_DEBUG_FOCUS topic.
However, calling meta_set_verbose (true) results in enormous amounts
of other messages, and it's inconvenient to filter after having
started mutter.

This patch allows one to call Meta.add_debug_topic(Meta.DebugTopic.FOCUS)
from a console, and get just what one wants.

https://bugzilla.gnome.org/show_bug.cgi?id=620359
2010-06-04 11:27:48 -04:00
Robert Bragg
91d82bf8c7 mutter-window: request DamageReportBoundingBox report level
In commit d34ae764769 I switched mutter-window to ask for Raw rectangles
from the X server. This avoided 2 non synchronous and 2 synchronous X
requests per window with damage, per frame; 2 (non-sync) to
create/destroy a temporary region to copy the damage region into, 1 to
request the server to copy the damage region into a our given region and
another to fetch that region back into the client. The problem with raw
events though is that it's possible to DOS the compositor with them.

Instead of receiving an event for every bit of damage this patch instead
asks the server to only report BoundingBox changes to the damage region.

https://bugzilla.gnome.org/show_bug.cgi?id=611838
2010-06-04 00:36:08 +01:00
Fran Diéguez
ed19060074 Updated Galician translations 2010-06-03 23:46:58 +02:00
Yaron Shahrabani
f230a67b94 Updated Hebrew translation. 2010-06-03 14:33:17 +03:00
Owen W. Taylor
849f101feb Bump version to 2.31.2 2010-05-25 14:16:40 -04:00
Owen W. Taylor
f45083ce82 Fix crash with --sync option
If the display hasn't been initialized yet, just change the
start variable and don't update the display.

https://bugzilla.gnome.org/show_bug.cgi?id=618613
2010-05-25 13:24:42 -04:00
Claude Paroz
4c143ae9af Updated French translation 2010-05-17 20:39:44 +02:00
Khaled Hosny
cd1a1d5778 Updated Arabic translation 2010-05-15 23:55:34 +03:00
Tomas Frydrych
e28e7a72aa [MetaDisplay] meta_display_get_leader_window()
This function returns xid of the WM leader window (as defined by the
_NET_SUPPORTING_WM_CHECK mechanism of EWMH). For use by plugins that wish to
attach custom properties to this window.

https://bugzilla.gnome.org/show_bug.cgi?id=613125
2010-05-14 12:44:38 +01:00
Tomas Frydrych
fc9488211f [MetaScreen] Keep num_workspaces key in sync with the actual workspace number
Changing the number of workspaces via an external pager relies on the gconf
key; if a plugin adds or removes workspaces on the fly, we can get into a
situation when the stale number stored by the preferences matches the new
number requested by the pager, in which case the pager request becomes a nop.

This commit ensures that when the meta_screen_append_new_workspace() or
meta_screen_remove_workspace() functions are called, the stored value is
updated accordingly.

https://bugzilla.gnome.org/show_bug.cgi?id=613127
2010-05-14 12:31:38 +01:00
Tomas Frydrych
28767c4d34 _MUTTER_HINTS
A per-window _MUTTER_HINTS property allowing plugins to use custom hints. The
property holds a colon separated list of key=value pairs; plugin-specific keys
must be suitably namespaced, while 'mutter-' prefix is reserved for internal
Mutter use only.

This commit adds MetaWindow::mutter-hints property, and
meta_window_get_mutter_hints() accessor, as well as the internal machinery for
reading and updating of the hints.

https://bugzilla.gnome.org/show_bug.cgi?id=613123
2010-05-14 12:20:56 +01:00
Florian Müllner
c6c7b05d7b Add compatibility with GTK+ 2.18
To replace all calls to deprecated code, GTK+ 2.20 is required - add
some basic compatibility code, so that it is still possible to build
mutter with GTK+ 2.18 when not using -DGSEAL_ENABLE.

https://bugzilla.gnome.org/show_bug.cgi?id=595496
2010-05-12 11:02:52 +02:00
Florian Müllner
5526e91b6e Replace left-over accesses of struct members
When replacing direct accesses with accessor functions, two snippets
were left out. Mutter now builds with GSEAL_ENABLE.

https://bugzilla.gnome.org/show_bug.cgi?id=595496
2010-05-12 11:02:52 +02:00
Javier Jardón
9e123695d0 Use accessor functions instead direct access.
GTK+ 2.20 is now the required version

Still missing:
GTK_MENU_SHELL ()->have_xgrab

https://bugzilla.gnome.org/show_bug.cgi?id=595496
2010-05-12 11:02:45 +02:00
Owen W. Taylor
092cc47afc Work around COGL bug causing flash for new windows
COGL bug http://bugzilla.openedhand.com/show_bug.cgi?id=2110 results
in pending drawing at the time of cogl_offscreen_new_to_texture() going
to the newly created framebuffer rather than the stage.

This would result in most windows being missing for the first frame
when a new window is mapped.

Work around this by calling cogl_flush() before
cogl_offscreen_new_to_texture().

https://bugzilla.gnome.org/show_bug.cgi?id=618138
2010-05-09 14:30:18 -04:00
Colin Walters
fd20059f68 Add public function to sort windows by stacking
https://bugzilla.gnome.org/show_bug.cgi?id=616050
2010-05-05 17:18:22 -04:00
Colin Walters
609aae684f Export functions to iterate over window transients
https://bugzilla.gnome.org/show_bug.cgi?id=616050
2010-05-05 17:17:41 -04:00
Colin Walters
49940877d1 Export meta_window_raise and meta_window_lower
For plugins that want fine grained control over window stacking.

https://bugzilla.gnome.org/show_bug.cgi?id=616050
2010-05-05 17:13:08 -04:00
Mario Blättermann
22ae86104b Updated German translation 2010-05-02 12:26:41 +02:00
Edward Sheldrake
f8dd4c160b Fix crash when right-clicking on window frame
This is a regression added in 333446ab.

https://bugzilla.gnome.org/show_bug.cgi?id=614592
2010-04-26 17:04:07 -04:00
Vincent Untz
11061a23b1 Fix build with gcc 4.5
Based on patch by Dominique Leuenberger
<dominique-gnomezilla@leuenberger.net>

https://bugzilla.gnome.org/show_bug.cgi?id=606719
2010-04-26 17:02:23 -04:00
Owen W. Taylor
d8b0f213b2 Fix accounting of frozen with maximize/unmaximize
The beginning maximization/unmaximization don't go through
start_effect_simple(), so we need to freeze the window
separately.

Change MutterWindow.freeze_count to a signed integer for
consistency with other counts, and so the logic for
checking for errors works properly.

https://bugzilla.gnome.org/show_bug.cgi?id=616546
2010-04-26 16:57:06 -04:00
Colin Walters
e9fbe4b2c1 Export the functions to control demands_attention
Plugins can want a finer grained control over this.

https://bugzilla.gnome.org/show_bug.cgi?id=616050
2010-04-24 13:13:54 -04:00
Colin Walters
edcb351107 Export methods interact with user_time
This is useful when calling some of the lower level mutter functions,
e.g. controlling window stacking.

https://bugzilla.gnome.org/show_bug.cgi?id=616050
2010-04-24 13:13:54 -04:00
Robert Bragg
0c14640352 mutter-window: stream raw updates to ClutterX11TexturePixmap
This changes the way we handle Damage events so instead of getting an
event when the damage region of a pixmap becomes non-empty we now get
sent all damage rectangles and stream those all though to
ClutterX11TexturePixmap using clutter_x11_texture_pixmap_update_area()

For Clutter 1.2, ClutterGLXTexturePixmap was updated so that calls to
clutter_x11_texture_pixmap_update_area are now cheap (glXBindTexImageEXT
calls are now deferred until just before painting) and since
ClutterGLXTexturePixmap is now capable of queueing clipped redraws that
can result in only updating a sub-region of the stage during a repaint
cycle (and using glXCopySubBufferMESA to present the sub-region redraw
to the front buffer) this should improve performance and reduced power
consumption for a range of use cases. (For example viewing a website
that has animated adverts doesn't force the whole screen to be redrawn
for each frame of the advert)

Besides being able to take advantage of glXCopySubBuffer to only update
a small region of the stage the fact that this patch makes Mutter now
request RawRectangles from the X server means we no longer do a
synchronous X request for a complete Damage Region for every window
damaged each frame. This should also improve performance.

CLUTTER_PAINT=redraws can be used to visualize what parts of the stage
are redrawn and with this patch applied I can open a terminal and as I
type I see that only the damaged areas of the terminal are being
redrawn.
2010-04-21 16:40:46 +01:00
Robert Bragg
cfa30f9876 make sure we create a pixmap for all new mutter windows
In the case where a mutter window is created for an X Window that is
already mapped then we weren't calling mutter_window_mark_for_repair and
so we weren't calling XCompositeNameWindowPixmap e.g. for menu windows.

This doesn't get noticed because as soon as some damage gets delivered
for such windows the pixmap will be named anyway, but if we were to
change how damage is handled this would result in broken menus.

We now call mutter_window_mark_for_repair in mutter_window_new when the
given Window is already mapped.
2010-04-21 16:40:34 +01:00
Luca Ferretti
af60dd3634 Add a missing space 2010-04-21 14:09:12 +02:00
Matej Urbančič
ccabce1b34 Updated Slovenian translation 2010-04-17 19:39:08 +02:00
Owen W. Taylor
9915a18810 Avoid triggering strict-aliasing checks when iterating preferences
Rewrite the code to iterate generically over Meta*Preference
arrays to avoid running into GCC's strict-aliasing warnings.

https://bugzilla.gnome.org/show_bug.cgi?id=615672
2010-04-14 22:18:45 -04:00
Jorge González
a78373f324 Updated Spanish translation 2010-04-14 19:53:44 +02:00
Owen W. Taylor
1d7476a725 Allow a theme to specify ellipsize width for a title
It's nice to indicate when a title is truncated with an ellipsis.
Because themes may draw a title multiple times to draw a shadow, or
may include the window icon within the title area, we can't determine
the proper ellipsization width automatically, so add an optional
attribute to the <title/> element "ellipsize_width" which, if set,
is the width to ellipsize at.

This is only enabled if a theme version of 3.1 is required.

When it's not set, we keep the old behavior of just letting the
title be clipped with a hard edge.

https://bugzilla.gnome.org/show_bug.cgi?id=591842
2010-04-13 14:10:54 -04:00
Owen W. Taylor
e8e78ebfdd Add frame_x_center/frame_y_center variables for themes
Sometimes you want to position something (usually the title) to be centered
with respect to the entire frame instead of centered with respect to the
individual piece currently being drawn.

This patch adds frame_x_center and frame_y_center variables that represent
the X/Y centers of the frame in the coordinate system of the piece being
drawn.

The theme version is bumped from 3.0 to 3.1 (3.0 is just the new version
system, 3.1 will have all the features we add for Mutter-2.28.)
position expressions

https://bugzilla.gnome.org/show_bug.cgi?id=591842
2010-04-13 14:07:50 -04:00
Owen W. Taylor
b77b0a3d81 Load one copy of plugins early
Although multi-screen support has not been tested and probably
doesn't fully work, the basic setup for multi-screen is that
we have the same list of plugins for all screens, but a different
instance of the plugins for each screen.

To allow plugins to do setup that is screen independent and needs
to occur early in the setup process, we identify a "default plugin
manager" and load (but not start) that plugin manager's plugins
immediately after we know our list of plugins.

That plugin manager is then reused for the first screen we open
and the plugins are started at that time. Separate plugin managers
are loaded and started for any other screens we open.

(A plugin could keep track of whether the screen-independent
setup has been done in a static variable, or it could do everything
in a way that is safe to do repeatedly.)

https://bugzilla.gnome.org/show_bug.cgi?id=615586
2010-04-13 13:53:55 -04:00
Owen W. Taylor
95b260f3a9 Add meta_prefs_override_preference_location()
Allow a plugin to redirect preferences from one GConf location
to another GConf location. This is useful for keys that need to be
set differently in a plugin-managed environment (like GNOME Shell)
as compared to in standalone Metacity.

Overriding is implemented by overwriting the keys in the arrays
of preferences; a list of the current overrides is stored to allow
proper memory management when an override is itself overriden.
(we need to know whether to free the old keys or not)

This patch cleans up the comments in prefs.c a bit as well; some ideas
about less-exciting potential improvements were removed to make the
comments explaining the structure easier to figure out.

https://bugzilla.gnome.org/show_bug.cgi?id=615586
2010-04-13 13:52:39 -04:00
Owen W. Taylor
97a9726845 Add an explicit start() method for plugins
Rather than using the plugin objects constructed() method for doing
setup that requires the MetaScreen, add an explicit start() method
that is called after the screen is set.

The reason for this is that this allows plugin objects to be created
early before the bulk of Metacity setup, which then allows plugins
to affect how the setup happens. (For example, to change the way
that preferences are loaded.)

This is an incompatible change, since 'screen' is now not set in the
constructed method, so the plugin API version is bumped.

https://bugzilla.gnome.org/show_bug.cgi?id=615586
2010-04-13 13:40:16 -04:00
Owen W. Taylor
020aea033c metacity-theme-3.xml: Add a flexible version mechanism
The current mechanism of metacity-theme-1.xml and metacity-theme-2.xml
is not flexible for allowing small-scale additions. With this patch
we bump the major version version once more to metacity-theme-3.xml
and add a single feature:

Any element in the DTD can have an attribute:

 version="[<|<=|=>|>] MAJOR.MINOR"

And it will be ignored unless the predicate is met. (< and > should
be to be entity escaped as &lt; and &gt;)

This allows having alternate sections of the theme file for older and
newer version.

* Required GLib version is bumped to 2.14 so we can parse versions
  with a regular expression.

* We switch internal version numbers to be "1000 * major + minor"

* We keep a stack of the maximum required version for the current portion
  the XML tree so that the "cannot use versions you don't require" stricture
  of the old code can be made local to a subpart of the tree.

* A version on the top metacity_theme element causes the entire file to
  be ignored; this allows having one metacity-theme-3.xml for version 3.2
  and newer (say) and a metacity-1.xml for everything old.

Actual new features will be added starting with 3.1 - 3.0 is just the
version="" feature.

http://bugzilla.gnome.org/show_bug.cgi?id=592503
2010-04-13 13:40:16 -04:00
Owen W. Taylor
0ac46316af Clean up code to find themes
Simplify code to find the right theme to load and loading it by moving
all the loading code into a load_theme() helper function, and making
meta_load_theme() use that as it searches through the directories.

Look for old-version themes even when loading relative to the working
in debug mode.

Don't unnecessarily duplicate and then free info->theme_file and
info->theme_dir.

http://bugzilla.gnome.org/show_bug.cgi?id=592503
2010-04-13 11:15:10 -04:00
Owen W. Taylor
94d47dc25e Make sure all workspaces have a non-empty, non-null name
The change to using gconf_client_all_entries() in commit 2d57b1b4
meant that workspaces without a GConf key for their name were not
getting a name at all. Fix this by doing a post-processing loop
to set workspace names that were not otherwise set.

Alternate to patch from Tomas Frydrych
https://bugzilla.gnome.org/show_bug.cgi?id=613136
2010-04-13 08:51:06 -04:00
Dan Winship
debf08cac0 Fix handling of grabbed key events
https://bugzilla.gnome.org/show_bug.cgi?id=596659
2010-04-12 17:52:19 -04:00
Javier Jardón
ce1393d2d4 Fix missing comma in previous commit 2010-04-11 19:59:29 +02:00
Javier Jardón
fac482c442 Stop using gtk_widget_set_uposition
Replace with non-deprecated gtk_window_move()

http://bugzilla.gnome.org/show_bug.cgi?id=587991
2010-04-11 18:35:22 +02:00
Owen W. Taylor
ee35540b6e Remove compositor-internal window lookup code
Since all windows are now MetaWindows as well as compositor
windows, there's no reason to keep a compositor-specific hash table
mapping from XID to MutterWindow.

This reduces complexity and removes a call to XQueryTree that could
potentially produce a BadWindow error if not error-trapped.

https://bugzilla.gnome.org/show_bug.cgi?id=613398
2010-04-07 10:22:30 -04:00
Adel Gadllah
f77507e825 Don't trap XErrors in meta_compositor_process_event
meta_compositor_process_event uses meta_error_trap_push/pop for
every event processed by meta_compositor_process_event which isn't needed
and can cause performance problems.

https://bugzilla.gnome.org/show_bug.cgi?id=613398
2010-04-07 13:28:19 +02:00
Luca Ferretti
0021efd593 Updated Italian translation 2010-04-06 22:53:15 +02:00
Xandru Armesto Fernandez
0d955bb873 Updated asturian translation 2010-03-30 06:03:10 +02:00
Pavol Šimo
7fa2e8d2d3 Updated Slovak translation 2010-03-27 16:48:20 +01:00
Gintautas Miliauskas
713d94d881 Updated Lithuanian translation. 2010-03-27 12:06:07 +02:00
Petr Kovar
4ecf8964b8 Update Czech translation 2010-03-20 02:54:09 +01:00
Inaki Larranaga Murgoitio
11d044fa6e Updated Basque language 2010-03-19 17:28:47 +01:00
Owen W. Taylor
a2104c5404 Bump version to 2.29.1 2010-03-18 18:29:48 -04:00
Dan Winship
1abed05413 meta_display_get_keybinding_action: strip out uninteresting modifiers
That is, don't consider the state of num lock, xkb group number, etc,
when looking up keybindings.

https://bugzilla.gnome.org/show_bug.cgi?id=613278
2010-03-18 17:57:47 -04:00
Bruno Brouard
1465895ff7 Updated French translation 2010-03-17 21:39:21 +01:00
Robert Bragg
452025e984 Remove the workaround for multi-texturing with old intel drivers
The 2009 Q2 release of the drivers includes the relevent bug fix.

https://bugzilla.gnome.org/show_bug.cgi?id=613121
2010-03-17 16:13:24 +00:00
Tomas Frydrych
d537dd93d5 [MetaWindow] Accessor for the instance part of WM_CLASS property
https://bugzilla.gnome.org/show_bug.cgi?id=613128
2010-03-17 16:10:03 +00:00
Colin Walters
650a1e807c [MetaDisplay] Expose meta_display_get_keybinding_action
This can be used when a plugin has control of input to determine
what action would be done, and thus filter to a subset of them.

https://bugzilla.gnome.org/show_bug.cgi?id=613100
2010-03-17 07:22:04 -04:00
Owen W. Taylor
67f8a33cad Include <sys/wait.h> for WIFEXITSTATUS/WIFEXITED
Exit status macros are specified by POSIX to be in <sys/wait.h>.
Fixes compilation on Solaris.

Reported by Brian Cameron
https://bugzilla.gnome.org/show_bug.cgi?id=612506
2010-03-15 11:09:49 -04:00
Owen W. Taylor
ff4f096f1d Support and require Clutter 1.2
- Specify a minimum version of Clutter-1.2.0
- Remove conditionalizatin and always use Clutter-1.1 framebuffer
  API rather than raw GL fbos
- Replace deprecated cogl_material/texture_unref() with
  cogl_handle_unref()

https://bugzilla.gnome.org/show_bug.cgi?id=610862
2010-03-11 15:06:06 -05:00
Alexander Shopov
b5cb353ab5 Added Bulgarian translation 2010-02-27 10:50:32 +02:00
Nils-Christoph Fiedler
17a38dfbed Updated LowGerman translation 2010-02-25 16:59:48 +01:00
Piotr Drąg
f773683601 Updated Polish translation 2010-02-24 19:29:54 +01:00
Aron Xu
abeaf828a3 Update Simplified Chinese translation. 2010-02-24 18:58:13 +08:00
Mario Blättermann
23a8a4201a Updated German translation 2010-02-21 17:00:06 +01:00
Nguyễn Thái Ngọc Duy
2d409e5c09 Remove executable bit from mutter-shaped-texture.c 2010-02-21 21:23:17 +07:00
70 changed files with 12122 additions and 14469 deletions

View File

@@ -1,13 +1,13 @@
AC_PREREQ(2.50)
m4_define([mutter_major_version], [2])
m4_define([mutter_minor_version], [29])
m4_define([mutter_micro_version], [0])
m4_define([mutter_minor_version], [31])
m4_define([mutter_micro_version], [4])
m4_define([mutter_version],
[mutter_major_version.mutter_minor_version.mutter_micro_version])
m4_define([mutter_plugin_api_version], [2])
m4_define([mutter_plugin_api_version], [3])
AC_INIT([mutter], [mutter_version],
[http://bugzilla.gnome.org/enter_bug.cgi?product=mutter])
@@ -124,7 +124,7 @@ if test "x$GCC" = "xyes"; then
fi
changequote([,])dnl
MUTTER_PC_MODULES='gtk+-2.0 >= 2.10.0 pango >= 1.2.0'
MUTTER_PC_MODULES='gtk+-2.0 >= 2.18 pango >= 1.2.0'
AC_ARG_ENABLE(gconf,
AC_HELP_STRING([--disable-gconf],
@@ -181,11 +181,11 @@ AC_CHECK_HEADERS(execinfo.h, [AC_CHECK_FUNCS(backtrace)])
AM_GLIB_GNU_GETTEXT
## here we get the flags we'll actually use
# GOptionEntry requires glib-2.6.0
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.6.0)
# GRegex requires Glib-2.14.0
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
# gtk_window_set_icon_name requires gtk2+-2.6.0
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-2.0 >= 2.6.0)
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-2.0 >= 2.6.0)
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-2.0 >= 2.18)
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-2.0 >= 2.18)
# Unconditionally use this dir to avoid a circular dep with gnomecc
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
@@ -249,7 +249,7 @@ else
AC_MSG_ERROR([no. Mutter requires the Xcomposite extension to build.])
fi
CLUTTER_VERSION=1.0.0
CLUTTER_VERSION=1.2.0
CLUTTER_PACKAGE=clutter-1.0
AC_SUBST(CLUTTER_PACKAGE)
if $PKG_CONFIG --atleast-version $CLUTTER_VERSION $CLUTTER_PACKAGE ; then

View File

@@ -4,6 +4,7 @@ of the theme format, and a given theme can support more than one format.
Version 1: THEMEDIR/metacity-1/metacity-theme-1.xml
(original metacity format)
Version 2: THEMEDIR/metacity-1/metacity-theme-2.xml
Version 3: THEMEDIR/metacity-1/metacity-theme-3.xml
The subdirectory name is "metacity-1" in all versions.
@@ -21,6 +22,41 @@ This document has separate sections for each format version. You may
want to read the document in reverse order, since the base features
are discussed under version 1.
New Features in Theme Format Version 3.1
========================================
Additional predefined variables are added for positioning expressions:
frame_x_center: the X center of the entire frame, with respect to the
piece currently being drawn.
frame_y_center: the Y center of the entire frame, with respect to the
piece currently being drawn.
The <title/> element now supports an "ellipsize_width" attribute. When
specified, this gives a width at which to ellipsize the title. If not
specified, the title will simply be clipped to the title area.
New Features in Theme Format Version 3
======================================
Format version 3 has exactly one new feature; any element in the file
can now have a version attribute:
version="[<|<=|=>|>] MAJOR.MINOR"
(< and > should be to be entity escaped as &lt; and &gt;). If this
version check is not met, then the element and its children will be
ignored. This allows having alternate sections of the theme file for
older and newer version of the Metacity theme format.
When placed on the toplevel <metacity_theme> element, an unsatisfied
version check will not just cause the contents of the file to be
ignored, it will also cause the lookup of a theme file to proceed on
and look for an older format 2 or format 1 file. This allows making a
metacity-theme-3.xml file that is only used the format version 3.2 or
newer is supported, and using metacity-theme-1.xml for older window
managers.
New Features in Theme Format Version 2
======================================

572
po/ar.po

File diff suppressed because it is too large Load Diff

1815
po/ast.po

File diff suppressed because it is too large Load Diff

1186
po/bg.po

File diff suppressed because it is too large Load Diff

343
po/cs.po
View File

@@ -5,13 +5,13 @@
# Miloslav Trmac <mitr@volny.cz>, 2002, 2003, 2004, 2005, 2006.
# Petr Tomeš <ptomes@gmail.com>, 2006.
# Jakub Friedl <jfriedl@suse.cz>, 2006, 2007.
# Petr Kovar <pknbe@volny.cz>, 2007, 2008, 2009.
# Petr Kovar <pknbe@volny.cz>, 2007, 2008, 2009, 2010.
msgid ""
msgstr ""
"Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-10-10 18:41+0200\n"
"PO-Revision-Date: 2009-10-10 18:40+0200\n"
"POT-Creation-Date: 2010-03-20 02:52+0100\n"
"PO-Revision-Date: 2010-03-20 02:52+0100\n"
"Last-Translator: Petr Kovar <pknbe@volny.cz>\n"
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
"MIME-Version: 1.0\n"
@@ -20,48 +20,53 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Lokalize 1.0\n"
#: ../src/core/bell.c:302
msgid "Bell event"
msgstr "Událost zvonku"
#: ../src/core/core.c:213
#, c-format
msgid "Unknown window information request: %d"
msgstr "Neznámý informační požadavek okna: %d"
#: ../src/core/delete.c:105
#. Translators: %s is a window title
#: ../src/core/delete.c:95
#, c-format
msgid ""
"<big><b><tt>%s</tt> is not responding.</b></big>\n"
"\n"
"<i>You may choose to wait a short while for it to continue or force the "
"application to quit entirely.</i>"
msgstr ""
"<big><b><tt>%s</tt> neodpovídá.</b></big>\n"
"\n"
"<i>Je možné chvíli počkat, aby aplikace mohla pokračovat, nebo si vynutit "
"úplné ukončení aplikace.</i>"
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> neodpovídá."
#: ../src/core/delete.c:116
#: ../src/core/delete.c:100
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Je možné chvíli počkat, aby aplikace mohla pokračovat, nebo si vynutit úplné "
"ukončení aplikace."
#: ../src/core/delete.c:109
msgid "_Wait"
msgstr "_Počkat"
#: ../src/core/delete.c:116
#: ../src/core/delete.c:109
msgid "_Force Quit"
msgstr "_Vynutit ukončení"
#: ../src/core/delete.c:217
#: ../src/core/delete.c:207
#, c-format
msgid "Failed to get hostname: %s\n"
msgstr "Nelze získat název počítače: %s\n"
#: ../src/core/display.c:329
#: ../src/core/display.c:362
#, c-format
msgid "Missing %s extension required for compositing"
msgstr "Schází rozšíření %s vyžadované funkcemi kompozitoru"
#: ../src/core/display.c:414
#: ../src/core/display.c:447
#, c-format
msgid "Failed to open X Window System display '%s'\n"
msgstr "Nelze otevřít displej X Window System \"%s\"\n"
#: ../src/core/errors.c:236
#: ../src/core/errors.c:233
#, c-format
msgid ""
"Lost connection to the display '%s';\n"
@@ -72,12 +77,12 @@ msgstr ""
"pravděpodobně byl ukončen server X nebo jste zabili/zrušili\n"
"správce oken.\n"
#: ../src/core/errors.c:243
#: ../src/core/errors.c:240
#, c-format
msgid "Fatal IO error %d (%s) on display '%s'.\n"
msgstr "Kritická chyba V/V %d (%s) na displeji \"%s\".\n"
#: ../src/core/keybindings.c:697
#: ../src/core/keybindings.c:708
#, c-format
msgid ""
"Some other program is already using the key %s with modifiers %x as a "
@@ -88,7 +93,7 @@ msgstr ""
#. Displayed when a keybinding which is
#. * supposed to launch a program fails.
#.
#: ../src/core/keybindings.c:2388
#: ../src/core/keybindings.c:2399
#, c-format
msgid ""
"There was an error running <tt>%s</tt>:\n"
@@ -99,88 +104,95 @@ msgstr ""
"\n"
"%s"
#: ../src/core/keybindings.c:2478
#: ../src/core/keybindings.c:2489
#, c-format
msgid "No command %d has been defined.\n"
msgstr "Nebyl definován příkaz %d.\n"
#: ../src/core/keybindings.c:3491
#: ../src/core/keybindings.c:3502
#, c-format
msgid "No terminal command has been defined.\n"
msgstr "Nebyl definován příkaz terminálu.\n"
#: ../src/core/main.c:127
#: ../src/core/main.c:130
#, c-format
msgid ""
"mutter %s\n"
"Copyright (C) 2001-2008 Havoc Pennington, Red Hat, Inc., and others\n"
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
"This is free software; see the source for copying conditions.\n"
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
"PARTICULAR PURPOSE.\n"
msgstr ""
"mutter %s\n"
"Copyright (C) 2001-2008 Havoc Pennington, Red Hat, Inc. a další.\n"
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc. a další.\n"
"Toto je svobodný software; podmínky kopírování a rozšiřování naleznete ve "
"zdrojových textech.\n"
"Tento software je BEZ JAKÉKOLIV ZÁRUKY; neposkytují se ani záruky "
"PRODEJNOSTI anebo VHODNOSTI PRO URČITÝ ÚČEL.\n"
#: ../src/core/main.c:257
#: ../src/core/main.c:261
msgid "Disable connection to session manager"
msgstr "Zakáže připojení ke správci sezení"
#: ../src/core/main.c:263
#: ../src/core/main.c:267
msgid "Replace the running window manager with Mutter"
msgstr "Nahradí běžícího správce oken správcem Mutter"
#: ../src/core/main.c:269
#: ../src/core/main.c:273
msgid "Specify session management ID"
msgstr "Určení ID správy sezení"
#: ../src/core/main.c:274
#: ../src/core/main.c:278
msgid "X Display to use"
msgstr "Displej X, který použije"
#: ../src/core/main.c:280
#: ../src/core/main.c:284
msgid "Initialize session from savefile"
msgstr "Spustí sezení z uloženého souboru"
#: ../src/core/main.c:286
#: ../src/core/main.c:290
msgid "Print version"
msgstr "Vypíše verzi"
#: ../src/core/main.c:292
#: ../src/core/main.c:296
msgid "Make X calls synchronous"
msgstr "Provede volání X synchronně"
#: ../src/core/main.c:298
#: ../src/core/main.c:302
msgid "Turn compositing on"
msgstr "Zapnout funkci kompozitoru"
#: ../src/core/main.c:304
#: ../src/core/main.c:308
msgid "Turn compositing off"
msgstr "Vypnout funkci kompozitoru"
#: ../src/core/main.c:310
#: ../src/core/main.c:314
msgid ""
"Don't make fullscreen windows that are maximized and have no decorations"
msgstr ""
"Nevytvářet okna přes celou obrazovku, která jsou maximalizovaná a nemají "
"dekorace"
#: ../src/core/main.c:320
msgid "Comma-separated list of compositor plugins"
msgstr "Čárkou oddělený seznam zásuvných modulů kompozitoru"
#: ../src/core/main.c:316
#: ../src/core/main.c:326
msgid "Whether window popup/frame should be shown when cycling windows."
msgstr ""
"Zda se má při procházení okny zobrazovat automaticky otevírané okno či "
"rámeček okna."
#: ../src/core/main.c:323
#: ../src/core/main.c:333
msgid "Internal argument for GObject introspection"
msgstr "Vnitřní argument GObject introspection"
#: ../src/core/main.c:668
#: ../src/core/main.c:663
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Nelze prohledat adresář motivů: %s\n"
#: ../src/core/main.c:684
#: ../src/core/main.c:679
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -188,7 +200,7 @@ msgstr ""
"Nelze najít motiv! Ujistěte se prosím, že existuje %s a obsahuje obvyklé "
"motivy.\n"
#: ../src/core/main.c:745
#: ../src/core/main.c:743
#, c-format
msgid "Failed to restart: %s\n"
msgstr "Nezdařil se restart: %s\n"
@@ -204,24 +216,24 @@ msgstr "Nezdařil se restart: %s\n"
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:522 ../src/core/prefs.c:683
#: ../src/core/prefs.c:529 ../src/core/prefs.c:690
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "Klíč GConf \"%s\" je nastaven na neplatnou hodnotu\n"
#: ../src/core/prefs.c:609 ../src/core/prefs.c:852
#: ../src/core/prefs.c:616 ../src/core/prefs.c:859
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr "%d uloženo v klíči GConf %s je mimo rozsah %d až %d\n"
#: ../src/core/prefs.c:653 ../src/core/prefs.c:730 ../src/core/prefs.c:778
#: ../src/core/prefs.c:842 ../src/core/prefs.c:1142 ../src/core/prefs.c:1158
#: ../src/core/prefs.c:1175 ../src/core/prefs.c:1191
#: ../src/core/prefs.c:660 ../src/core/prefs.c:737 ../src/core/prefs.c:785
#: ../src/core/prefs.c:849 ../src/core/prefs.c:1149 ../src/core/prefs.c:1165
#: ../src/core/prefs.c:1182 ../src/core/prefs.c:1198
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "Klíč GConf \"%s\" je nastaven na neplatný typ\n"
#: ../src/core/prefs.c:1282
#: ../src/core/prefs.c:1289
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@@ -229,12 +241,12 @@ msgstr ""
"Bylo zakázáno obcházení chyb aplikací. Některé aplikace se možná nebudou "
"chovat správně.\n"
#: ../src/core/prefs.c:1353
#: ../src/core/prefs.c:1360
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr "Nelze analyzovat popis písma \"%s\" v klíči GConf %s\n"
#: ../src/core/prefs.c:1415
#: ../src/core/prefs.c:1422
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@@ -243,17 +255,17 @@ msgstr ""
"\"%s\" nalezené v databázi nastavení není platnou hodnotou modifikátoru "
"tlačítka myši\n"
#: ../src/core/prefs.c:1839
#: ../src/core/prefs.c:1849
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "Chyba při nastavování počtu ploch na %d: %s\n"
#: ../src/core/prefs.c:2023 ../src/core/prefs.c:2529
#: ../src/core/prefs.c:2028 ../src/core/prefs.c:2531
#, c-format
msgid "Workspace %d"
msgstr "Plocha %d"
#: ../src/core/prefs.c:2056 ../src/core/prefs.c:2234
#: ../src/core/prefs.c:2061 ../src/core/prefs.c:2239
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@@ -262,39 +274,39 @@ msgstr ""
"\"%s\" nalezené v databázi nastavení není platnou hodnotou klávesové zkratky "
"\"%s\"\n"
#: ../src/core/prefs.c:2610
#: ../src/core/prefs.c:2612
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr "Chyba při nastavování názvu plochy %d na \"%s\": %s\n"
#: ../src/core/prefs.c:2808
#: ../src/core/prefs.c:2816
#, c-format
msgid "Error setting compositor status: %s\n"
msgstr "Chyba při nastavování stavu kompozitoru: %s\n"
#: ../src/core/prefs.c:2836
#: ../src/core/prefs.c:2845
#, c-format
msgid "Error setting clutter plugin list: %s\n"
msgstr "Chyba při nastavování seznamu zásuvných modulů clutter: %s\n"
#: ../src/core/prefs.c:2879
#: ../src/core/prefs.c:2889
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr "Chyba při nastavování stavu aktivních oken, která jsou skrytá: %s\n"
#: ../src/core/prefs.c:2907
#: ../src/core/prefs.c:2917
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr ""
"Chyba při nastavování stavu bez automaticky otevíraného okna tabulátorem: %"
"s\n"
#: ../src/core/screen.c:570
#: ../src/core/screen.c:577
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Obrazovka %d na displeji \"%s\" je neplatná\n"
#: ../src/core/screen.c:586
#: ../src/core/screen.c:593
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -303,76 +315,70 @@ msgstr ""
"Obrazovka %d na displeji \"%s\" již správce oken má; zkuste prosím nahradit "
"aktuálního správce oken pomocí přepínače --replace.\n"
#: ../src/core/screen.c:613
#: ../src/core/screen.c:620
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr "Nelze získat výběr správce oken na obrazovce %d displeje \"%s\"\n"
#: ../src/core/screen.c:668
#: ../src/core/screen.c:675
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Obrazovka %d na displeji \"%s\" již má správce oken\n"
#: ../src/core/screen.c:880
#: ../src/core/screen.c:857
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Nelze uvolnit obrazovku %d na displeji \"%s\"\n"
#: ../src/core/session.c:851 ../src/core/session.c:858
#: ../src/core/session.c:856 ../src/core/session.c:863
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Nelze vytvořit adresář \"%s\": %s\n"
#: ../src/core/session.c:868
#: ../src/core/session.c:873
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Nelze otevřít soubor sezení \"%s\" k zápisu: %s\n"
#: ../src/core/session.c:1009
#: ../src/core/session.c:1014
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Chyba při zápisu souboru sezení \"%s\": %s\n"
#: ../src/core/session.c:1014
#: ../src/core/session.c:1019
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Chyba při zavírání souboru sezení \"%s\": %s\n"
#. oh, just give up
#: ../src/core/session.c:1107
#, c-format
msgid "Failed to read saved session file %s: %s\n"
msgstr "Chyba při čtení uloženého souboru sezení %s: %s\n"
#: ../src/core/session.c:1146
#: ../src/core/session.c:1149
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Chyba při analyzování uloženého souboru sezení: %s\n"
#: ../src/core/session.c:1195
#: ../src/core/session.c:1198
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "nalezen atribut <mutter_session>, ale ID sezení už k dispozici je"
#: ../src/core/session.c:1208 ../src/core/session.c:1283
#: ../src/core/session.c:1315 ../src/core/session.c:1387
#: ../src/core/session.c:1447
#: ../src/core/session.c:1211 ../src/core/session.c:1286
#: ../src/core/session.c:1318 ../src/core/session.c:1390
#: ../src/core/session.c:1450
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Neznámý atribut %s prvku <%s>"
#: ../src/core/session.c:1225
#: ../src/core/session.c:1228
#, c-format
msgid "nested <window> tag"
msgstr "vnořená značka <window>"
#: ../src/core/session.c:1467
#: ../src/core/session.c:1470
#, c-format
msgid "Unknown element %s"
msgstr "Neznámý prvek %s"
#: ../src/core/session.c:1818
#: ../src/core/session.c:1822
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -380,39 +386,39 @@ msgstr ""
"Tato okna nepodporují &quot;ukládání aktuálního nastavení&quot; a po vašem "
"příštím přihlášení je budete muset spustit ručně."
#: ../src/core/util.c:106
#: ../src/core/util.c:104
#, c-format
msgid "Failed to open debug log: %s\n"
msgstr "Nelze otevřít ladicí záznam: %s\n"
#: ../src/core/util.c:116
#: ../src/core/util.c:114
#, c-format
msgid "Failed to fdopen() log file %s: %s\n"
msgstr "Nelze provést fdopen() soubor záznamu %s: %s\n"
#: ../src/core/util.c:122
#: ../src/core/util.c:120
#, c-format
msgid "Opened log file %s\n"
msgstr "Otevřen soubor záznamu %s\n"
#: ../src/core/util.c:141 ../src/tools/mutter-message.c:176
#: ../src/core/util.c:139 ../src/tools/mutter-message.c:176
#, c-format
msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mutter bylo přeloženo bez podpory podrobného režimu\n"
#: ../src/core/util.c:241
#: ../src/core/util.c:239
msgid "Window manager: "
msgstr "Správce oken: "
#: ../src/core/util.c:393
#: ../src/core/util.c:391
msgid "Bug in window manager: "
msgstr "Chyba ve správci oken: "
#: ../src/core/util.c:426
#: ../src/core/util.c:424
msgid "Window manager warning: "
msgstr "Varování správce oken: "
#: ../src/core/util.c:454
#: ../src/core/util.c:452
msgid "Window manager error: "
msgstr "Chyba správce oken: "
@@ -424,7 +430,7 @@ msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6098
#: ../src/core/window.c:6217
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -440,7 +446,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:6761
#: ../src/core/window.c:6880
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
@@ -460,7 +466,7 @@ msgstr "Aplikace nastavila neplatný _NET_WM_PID %lu\n"
msgid "%s (on %s)"
msgstr "%s (na %s)"
#: ../src/core/window-props.c:1419
#: ../src/core/window-props.c:1435
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Neplatné okno WM_TRANSIENT_FOR 0x%lx specifikováno pro %s.\n"
@@ -480,12 +486,12 @@ msgstr ""
"To je pravděpodobně chyba aplikace, nikoliv správce oken.\n"
"Okno má nadpis=\"%s\", třída=\"%s\", název=\"%s\".\n"
#: ../src/core/xprops.c:401
#: ../src/core/xprops.c:411
#, c-format
msgid "Property %s on window 0x%lx contained invalid UTF-8\n"
msgstr "Vlastnost %s okna 0x%lx obsahovala neplatné UTF-8\n"
#: ../src/core/xprops.c:484
#: ../src/core/xprops.c:494
#, c-format
msgid ""
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
@@ -1300,7 +1306,7 @@ msgstr "Souřadnicový výraz zřejmě nemá žádné operátory nebo operandy"
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "Motiv obsahoval výraz, který způsobil chybu: %s\n"
#: ../src/ui/theme.c:4187
#: ../src/ui/theme.c:4203
#, c-format
msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
@@ -1309,25 +1315,25 @@ msgstr ""
"U tohoto stylu rámu musí být zadáno <button function=\"%s\" state=\"%s\" "
"draw_ops=\"cokoliv\"/>"
#: ../src/ui/theme.c:4695 ../src/ui/theme.c:4720
#: ../src/ui/theme.c:4711 ../src/ui/theme.c:4736
#, c-format
msgid ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr ""
"Chybí <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"cokoliv\"/>"
#: ../src/ui/theme.c:4764
#: ../src/ui/theme.c:4780
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "Nelze načíst motiv \"%s\": %s\n"
#: ../src/ui/theme.c:4894 ../src/ui/theme.c:4901 ../src/ui/theme.c:4908
#: ../src/ui/theme.c:4915 ../src/ui/theme.c:4922
#: ../src/ui/theme.c:4910 ../src/ui/theme.c:4917 ../src/ui/theme.c:4924
#: ../src/ui/theme.c:4931 ../src/ui/theme.c:4938
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "Není nastaveno <%s> motivu \"%s\""
#: ../src/ui/theme.c:4930
#: ../src/ui/theme.c:4946
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
@@ -1336,7 +1342,7 @@ msgstr ""
"U typu okna \"%s\" motivu \"%s\" není nastaven typ rámu, přidejte prosím "
"prvek <window type=\"%s\" style_set=\"cokoliv\"/>"
#: ../src/ui/theme.c:5383 ../src/ui/theme.c:5445 ../src/ui/theme.c:5508
#: ../src/ui/theme.c:5389 ../src/ui/theme.c:5451 ../src/ui/theme.c:5514
#, c-format
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
@@ -1344,7 +1350,7 @@ msgstr ""
"Uživatelem definované konstanty musí začínat velkým písmenem; \"%s\" toto "
"nesplňuje"
#: ../src/ui/theme.c:5391 ../src/ui/theme.c:5453 ../src/ui/theme.c:5516
#: ../src/ui/theme.c:5397 ../src/ui/theme.c:5459 ../src/ui/theme.c:5522
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "Konstanta \"%s\" již byla definována"
@@ -1465,10 +1471,10 @@ msgid "Window type \"%s\" has already been assigned a style set"
msgstr "Typu okna \"%s\" již byla přiřazena sada stylů"
#: ../src/ui/theme-parser.c:1229 ../src/ui/theme-parser.c:1293
#: ../src/ui/theme-parser.c:1519 ../src/ui/theme-parser.c:2732
#: ../src/ui/theme-parser.c:2778 ../src/ui/theme-parser.c:2926
#: ../src/ui/theme-parser.c:3118 ../src/ui/theme-parser.c:3156
#: ../src/ui/theme-parser.c:3194 ../src/ui/theme-parser.c:3232
#: ../src/ui/theme-parser.c:1519 ../src/ui/theme-parser.c:2740
#: ../src/ui/theme-parser.c:2786 ../src/ui/theme-parser.c:2934
#: ../src/ui/theme-parser.c:3126 ../src/ui/theme-parser.c:3164
#: ../src/ui/theme-parser.c:3202 ../src/ui/theme-parser.c:3240
#, c-format
msgid "Element <%s> is not allowed below <%s>"
msgstr "Prvek <%s> není povolen pod <%s>"
@@ -1497,108 +1503,108 @@ msgstr "Poměr stran \"%s\" není znám"
msgid "Border \"%s\" is unknown"
msgstr "Okraj \"%s\" není znám"
#: ../src/ui/theme-parser.c:1776
#: ../src/ui/theme-parser.c:1784
#, c-format
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
msgstr "Chybí atribut \"start_angle\" nebo \"from\" v prvku <%s>"
#: ../src/ui/theme-parser.c:1783
#: ../src/ui/theme-parser.c:1791
#, c-format
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
msgstr "Chybí atribut \"extent_angle\" nebo \"to\" v prvku <%s>"
#: ../src/ui/theme-parser.c:2023
#: ../src/ui/theme-parser.c:2031
#, c-format
msgid "Did not understand value \"%s\" for type of gradient"
msgstr "Nerozuměno hodnotě \"%s\" typu přechodu"
#: ../src/ui/theme-parser.c:2101 ../src/ui/theme-parser.c:2476
#: ../src/ui/theme-parser.c:2109 ../src/ui/theme-parser.c:2484
#, c-format
msgid "Did not understand fill type \"%s\" for <%s> element"
msgstr "Nerozuměno typu výplně \"%s\" prvku <%s>"
#: ../src/ui/theme-parser.c:2268 ../src/ui/theme-parser.c:2351
#: ../src/ui/theme-parser.c:2414
#: ../src/ui/theme-parser.c:2276 ../src/ui/theme-parser.c:2359
#: ../src/ui/theme-parser.c:2422
#, c-format
msgid "Did not understand state \"%s\" for <%s> element"
msgstr "Nerozuměno stavu \"%s\" prvku <%s>"
#: ../src/ui/theme-parser.c:2278 ../src/ui/theme-parser.c:2361
#: ../src/ui/theme-parser.c:2286 ../src/ui/theme-parser.c:2369
#, c-format
msgid "Did not understand shadow \"%s\" for <%s> element"
msgstr "Nerozuměno stínu \"%s\" prvku <%s>"
#: ../src/ui/theme-parser.c:2288
#: ../src/ui/theme-parser.c:2296
#, c-format
msgid "Did not understand arrow \"%s\" for <%s> element"
msgstr "Nerozuměno šipce \"%s\" prvku <%s>"
#: ../src/ui/theme-parser.c:2588 ../src/ui/theme-parser.c:2684
#: ../src/ui/theme-parser.c:2596 ../src/ui/theme-parser.c:2692
#, c-format
msgid "No <draw_ops> called \"%s\" has been defined"
msgstr "Nebyly definovány žádné <draw_ops> nazvané \"%s\""
#: ../src/ui/theme-parser.c:2600 ../src/ui/theme-parser.c:2696
#: ../src/ui/theme-parser.c:2608 ../src/ui/theme-parser.c:2704
#, c-format
msgid "Including draw_ops \"%s\" here would create a circular reference"
msgstr "Vložení draw_ops \"%s\" na tomto místě by vytvořilo zacyklený odkaz"
#: ../src/ui/theme-parser.c:2811
#: ../src/ui/theme-parser.c:2819
#, c-format
msgid "Unknown position \"%s\" for frame piece"
msgstr "Neznámá pozice položky rámu \"%s\""
#: ../src/ui/theme-parser.c:2819
#: ../src/ui/theme-parser.c:2827
#, c-format
msgid "Frame style already has a piece at position %s"
msgstr "Styl rámu již má položku na pozici %s"
#: ../src/ui/theme-parser.c:2836 ../src/ui/theme-parser.c:2911
#: ../src/ui/theme-parser.c:2844 ../src/ui/theme-parser.c:2919
#, c-format
msgid "No <draw_ops> with the name \"%s\" has been defined"
msgstr "Nebyly definované žádné <draw_ops> s názvem \"%s\""
#: ../src/ui/theme-parser.c:2865
#: ../src/ui/theme-parser.c:2873
#, c-format
msgid "Unknown function \"%s\" for button"
msgstr "Neznámá funkce tlačítka \"%s\""
#: ../src/ui/theme-parser.c:2874
#: ../src/ui/theme-parser.c:2882
#, c-format
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
msgstr "Funkce tlačítka \"%s\" v této verzi neexistuje (%d, potřeba je %d)"
#: ../src/ui/theme-parser.c:2886
#: ../src/ui/theme-parser.c:2894
#, c-format
msgid "Unknown state \"%s\" for button"
msgstr "Neznámý stav tlačítka \"%s\""
#: ../src/ui/theme-parser.c:2894
#: ../src/ui/theme-parser.c:2902
#, c-format
msgid "Frame style already has a button for function %s state %s"
msgstr "Styl rámu již má tlačítko funkce %s stavu %s"
#: ../src/ui/theme-parser.c:2965
#: ../src/ui/theme-parser.c:2973
#, c-format
msgid "\"%s\" is not a valid value for focus attribute"
msgstr "\"%s\" není platná hodnota atributu focus"
#: ../src/ui/theme-parser.c:2974
#: ../src/ui/theme-parser.c:2982
#, c-format
msgid "\"%s\" is not a valid value for state attribute"
msgstr "\"%s\" není platná hodnota atributu state"
#: ../src/ui/theme-parser.c:2984
#: ../src/ui/theme-parser.c:2992
#, c-format
msgid "A style called \"%s\" has not been defined"
msgstr "Nebyl definován styl \"%s\""
#: ../src/ui/theme-parser.c:3005 ../src/ui/theme-parser.c:3028
#: ../src/ui/theme-parser.c:3013 ../src/ui/theme-parser.c:3036
#, c-format
msgid "\"%s\" is not a valid value for resize attribute"
msgstr "\"%s\" není platná hodnota atributu resize"
#: ../src/ui/theme-parser.c:3039
#: ../src/ui/theme-parser.c:3047
#, c-format
msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
@@ -1607,23 +1613,23 @@ msgstr ""
"Atribut \"resize\" by neměl být na prvku <%s> maximalizovaného/svinutého "
"stavu"
#: ../src/ui/theme-parser.c:3053
#: ../src/ui/theme-parser.c:3061
#, c-format
msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized states"
msgstr "Atribut \"resize\" by neměl být na prvku <%s> maximalizovaného stavu"
#: ../src/ui/theme-parser.c:3067 ../src/ui/theme-parser.c:3089
#: ../src/ui/theme-parser.c:3075 ../src/ui/theme-parser.c:3097
#, c-format
msgid "Style has already been specified for state %s resize %s focus %s"
msgstr "U state %s resize %s focus %s již byl definován styl"
#: ../src/ui/theme-parser.c:3078 ../src/ui/theme-parser.c:3100
#: ../src/ui/theme-parser.c:3086 ../src/ui/theme-parser.c:3108
#, c-format
msgid "Style has already been specified for state %s focus %s"
msgstr "U state %s focus %s již byl definován styl"
#: ../src/ui/theme-parser.c:3139
#: ../src/ui/theme-parser.c:3147
msgid ""
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)"
@@ -1631,7 +1637,7 @@ msgstr ""
"Nelze mít dvě draw_ops u prvku <piece> (motiv definoval atribut draw_ops i "
"prvek <draw_ops>, nebo definoval dva prvky)"
#: ../src/ui/theme-parser.c:3177
#: ../src/ui/theme-parser.c:3185
msgid ""
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)"
@@ -1639,7 +1645,7 @@ msgstr ""
"Nelze mít dvě draw_ops u prvku <button> (motiv definoval atribut draw_ops i "
"prvek <draw_ops>, nebo definoval dva prvky)"
#: ../src/ui/theme-parser.c:3215
#: ../src/ui/theme-parser.c:3223
msgid ""
"Can't have a two draw_ops for a <menu_icon> element (theme specified a "
"draw_ops attribute and also a <draw_ops> element, or specified two elements)"
@@ -1647,78 +1653,65 @@ msgstr ""
"Nelze mít dvě draw_ops u prvku <menu_icon> (motiv definoval atribut draw_ops "
"i prvek <draw_ops>, nebo definoval dva prvky)"
#: ../src/ui/theme-parser.c:3263
#: ../src/ui/theme-parser.c:3271
#, c-format
msgid "Outermost element in theme must be <metacity_theme> not <%s>"
msgstr "Vnější prvek motivu musí být <metacity_theme>, nikoliv <%s>"
#: ../src/ui/theme-parser.c:3283
#: ../src/ui/theme-parser.c:3291
#, c-format
msgid ""
"Element <%s> is not allowed inside a name/author/date/description element"
msgstr "Prvek <%s> není dovolen v prvku name/author/date/description"
#: ../src/ui/theme-parser.c:3288
#: ../src/ui/theme-parser.c:3296
#, c-format
msgid "Element <%s> is not allowed inside a <constant> element"
msgstr "Prvek <%s> není dovolen v prvku <constant>"
#: ../src/ui/theme-parser.c:3300
#: ../src/ui/theme-parser.c:3308
#, c-format
msgid ""
"Element <%s> is not allowed inside a distance/border/aspect_ratio element"
msgstr "Prvek <%s> není dovolen v prvku distance/border/aspect_ratio"
#: ../src/ui/theme-parser.c:3322
#: ../src/ui/theme-parser.c:3330
#, c-format
msgid "Element <%s> is not allowed inside a draw operation element"
msgstr "Prvek <%s> není dovolen v prvku operace kreslení"
#: ../src/ui/theme-parser.c:3332 ../src/ui/theme-parser.c:3362
#: ../src/ui/theme-parser.c:3367 ../src/ui/theme-parser.c:3372
#: ../src/ui/theme-parser.c:3340 ../src/ui/theme-parser.c:3370
#: ../src/ui/theme-parser.c:3375 ../src/ui/theme-parser.c:3380
#, c-format
msgid "Element <%s> is not allowed inside a <%s> element"
msgstr "Prvek <%s> není dovolen v prvku <%s>"
#: ../src/ui/theme-parser.c:3594
#: ../src/ui/theme-parser.c:3602
msgid "No draw_ops provided for frame piece"
msgstr "U položky rámu neposkytnuty draw_ops"
#: ../src/ui/theme-parser.c:3609
#: ../src/ui/theme-parser.c:3617
msgid "No draw_ops provided for button"
msgstr "U tlačítka neposkytnuty draw_ops"
#: ../src/ui/theme-parser.c:3661
#: ../src/ui/theme-parser.c:3669
#, c-format
msgid "No text is allowed inside element <%s>"
msgstr "V prvku <%s> není dovolen žádný text"
#: ../src/ui/theme-parser.c:3716
msgid "<name> specified twice for this theme"
msgstr "<name> u tohoto motivu definováno dvakrát"
#: ../src/ui/theme-parser.c:3724 ../src/ui/theme-parser.c:3736
#: ../src/ui/theme-parser.c:3748 ../src/ui/theme-parser.c:3760
#: ../src/ui/theme-parser.c:3772
#, c-format
msgid "<%s> specified twice for this theme"
msgstr "<%s> u tohoto motivu definováno dvakrát"
#: ../src/ui/theme-parser.c:3727
msgid "<author> specified twice for this theme"
msgstr "<author> u tohoto motivu definováno dvakrát"
#: ../src/ui/theme-parser.c:3738
msgid "<copyright> specified twice for this theme"
msgstr "<copyright> u tohoto motivu definováno dvakrát"
#: ../src/ui/theme-parser.c:3749
msgid "<date> specified twice for this theme"
msgstr "<date> u tohoto motivu definováno dvakrát"
#: ../src/ui/theme-parser.c:3760
msgid "<description> specified twice for this theme"
msgstr "<description> u tohoto motivu definováno dvakrát"
#: ../src/ui/theme-parser.c:4027
#: ../src/ui/theme-parser.c:4040
#, c-format
msgid "Failed to find a valid file for theme %s\n"
msgstr "Nelze nalézt platný soubor motivu %s\n"
#: ../src/ui/theme-parser.c:4083
#: ../src/ui/theme-parser.c:4096
#, c-format
msgid "Theme file %s did not contain a root <metacity_theme> element"
msgstr "Soubor motivu %s neobsahoval kořenový prvek <metacity_theme>"
@@ -1920,6 +1913,21 @@ msgstr "Hodnota y byla %d, bylo očekáváno %d"
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
msgstr "Zpracováno %d výrazů souřadnic za %g sekund (průměr %g sekund)\n"
#~ msgid "Failed to read saved session file %s: %s\n"
#~ msgstr "Chyba při čtení uloženého souboru sezení %s: %s\n"
#~ msgid "<author> specified twice for this theme"
#~ msgstr "<author> u tohoto motivu definováno dvakrát"
#~ msgid "<copyright> specified twice for this theme"
#~ msgstr "<copyright> u tohoto motivu definováno dvakrát"
#~ msgid "<date> specified twice for this theme"
#~ msgstr "<date> u tohoto motivu definováno dvakrát"
#~ msgid "<description> specified twice for this theme"
#~ msgstr "<description> u tohoto motivu definováno dvakrát"
#~ msgid "Desktop"
#~ msgstr "Pracovní prostředí"
@@ -2396,9 +2404,6 @@ msgstr "Zpracováno %d výrazů souřadnic za %g sekund (průměr %g sekund)\n"
#~ msgid "Window title font"
#~ msgstr "Písmo nadpisu oken"
#~ msgid "\"%s\" is not responding."
#~ msgstr "\"%s\" neodpovídá."
#~ msgid "Title"
#~ msgstr "Nadpis"

1944
po/de.po

File diff suppressed because it is too large Load Diff

267
po/es.po
View File

@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: metacity.HEAD\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&component=general\n"
"POT-Creation-Date: 2010-02-11 18:07+0000\n"
"PO-Revision-Date: 2010-02-15 11:30+0100\n"
"POT-Creation-Date: 2010-04-13 17:54+0000\n"
"PO-Revision-Date: 2010-04-14 19:51+0200\n"
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\n"
@@ -31,18 +31,12 @@ msgid "Unknown window information request: %d"
msgstr "Petición de información de ventana desconocida: %d"
#. Translators: %s is a window title
#: ../src/core/delete.c:94
#: ../src/core/delete.c:95
#, c-format
#| msgid "\"%s\" is not responding."
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> no está respondiendo."
#: ../src/core/delete.c:99
#| msgid ""
#| "<big><b><tt>%s</tt> is not responding.</b></big>\n"
#| "\n"
#| "<i>You may choose to wait a short while for it to continue or force the "
#| "application to quit entirely.</i>"
#: ../src/core/delete.c:100
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
@@ -50,15 +44,15 @@ msgstr ""
"Puede elegir esperar un rato para ver si continua o forzar la aplicación "
"para cerrarla completamente."
#: ../src/core/delete.c:108
#: ../src/core/delete.c:109
msgid "_Wait"
msgstr "_Esperar"
#: ../src/core/delete.c:108
#: ../src/core/delete.c:109
msgid "_Force Quit"
msgstr "_Forzar la salida"
#: ../src/core/delete.c:206
#: ../src/core/delete.c:207
#, c-format
msgid "Failed to get hostname: %s\n"
msgstr "Ocurrió un error al obtener el nombre del host: %s\n"
@@ -89,7 +83,7 @@ msgstr ""
msgid "Fatal IO error %d (%s) on display '%s'.\n"
msgstr "Error fatal de E/S %d (%s) en la pantalla «%s».\n"
#: ../src/core/keybindings.c:697
#: ../src/core/keybindings.c:708
#, c-format
msgid ""
"Some other program is already using the key %s with modifiers %x as a "
@@ -101,7 +95,7 @@ msgstr ""
#. Displayed when a keybinding which is
#. * supposed to launch a program fails.
#.
#: ../src/core/keybindings.c:2388
#: ../src/core/keybindings.c:2399
#, c-format
msgid ""
"There was an error running <tt>%s</tt>:\n"
@@ -112,24 +106,18 @@ msgstr ""
"\n"
"%s"
#: ../src/core/keybindings.c:2478
#: ../src/core/keybindings.c:2489
#, c-format
msgid "No command %d has been defined.\n"
msgstr "No ha sido definido ningún comando %d.\n"
#: ../src/core/keybindings.c:3491
#: ../src/core/keybindings.c:3502
#, c-format
msgid "No terminal command has been defined.\n"
msgstr "No ha sido definido ningún comando de terminal.\n"
#: ../src/core/main.c:130
#, c-format
#| msgid ""
#| "mutter %s\n"
#| "Copyright (C) 2001-2008 Havoc Pennington, Red Hat, Inc., and others\n"
#| "This is free software; see the source for copying conditions.\n"
#| "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
#| "PARTICULAR PURPOSE.\n"
msgid ""
"mutter %s\n"
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
@@ -199,12 +187,12 @@ msgstr ""
msgid "Internal argument for GObject introspection"
msgstr "Argumento interno para introspección de GObject"
#: ../src/core/main.c:662
#: ../src/core/main.c:663
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Falló al inspeccionar el directorio de temas: %s\n"
#: ../src/core/main.c:678
#: ../src/core/main.c:679
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -212,7 +200,7 @@ msgstr ""
"No se ha podido encontrar un tema. Asegúrese de que %s existe y contiene los "
"temas usuales.\n"
#: ../src/core/main.c:742
#: ../src/core/main.c:743
#, c-format
msgid "Failed to restart: %s\n"
msgstr "No se pudo reiniciar: %s\n"
@@ -228,25 +216,37 @@ msgstr "No se pudo reiniciar: %s\n"
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:525 ../src/core/prefs.c:686
#: ../src/core/prefs.c:542 ../src/core/prefs.c:703
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "La clave GConf «%s» está configurada con un valor inválido\n"
#: ../src/core/prefs.c:612 ../src/core/prefs.c:855
#: ../src/core/prefs.c:629 ../src/core/prefs.c:872
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr ""
"%d almacenado en la clave de GConf %s está fuera de rango %d hasta %d\n"
#: ../src/core/prefs.c:656 ../src/core/prefs.c:733 ../src/core/prefs.c:781
#: ../src/core/prefs.c:845 ../src/core/prefs.c:1145 ../src/core/prefs.c:1161
#: ../src/core/prefs.c:1178 ../src/core/prefs.c:1194
#: ../src/core/prefs.c:673 ../src/core/prefs.c:750 ../src/core/prefs.c:798
#: ../src/core/prefs.c:862 ../src/core/prefs.c:1319 ../src/core/prefs.c:1335
#: ../src/core/prefs.c:1352 ../src/core/prefs.c:1368
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "La clave GConf «%s» está configurada con un tipo inválido\n"
#: ../src/core/prefs.c:1285
#: ../src/core/prefs.c:1198
#, c-format
msgid "GConf key %s is already in use and can't be used to override %s\n"
msgstr ""
"La clave de GConf %s ya está en uso y no se puede usar para sobreescribir %"
"s\n"
#: ../src/core/prefs.c:1257
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "No se puede sobreescribir la clave de GConf, no se encontró %s\n"
#: ../src/core/prefs.c:1459
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@@ -254,14 +254,14 @@ msgstr ""
"Los arreglos para aplicaciones rotas se han deshabilitado. Algunas "
"aplicaciones podrían no comportarse correctamente.\n"
#: ../src/core/prefs.c:1356
#: ../src/core/prefs.c:1530
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr ""
"No se ha podido interpretar la descripción de la tipografía «%s» de la clave "
"GConf %s\n"
#: ../src/core/prefs.c:1418
#: ../src/core/prefs.c:1592
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@@ -270,18 +270,18 @@ msgstr ""
"«%s» encontrado en la base de datos de configuración no es un valor válido "
"para el modificador del botón del ratón\n"
#: ../src/core/prefs.c:1845
#: ../src/core/prefs.c:2019
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr ""
"Ocurrió un error configurando la número de espacios de trabajo para %d: %s\n"
#: ../src/core/prefs.c:2005 ../src/core/prefs.c:2511
#: ../src/core/prefs.c:2201 ../src/core/prefs.c:2703
#, c-format
msgid "Workspace %d"
msgstr "Área de trabajo %d"
#: ../src/core/prefs.c:2038 ../src/core/prefs.c:2216
#: ../src/core/prefs.c:2233 ../src/core/prefs.c:2411
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@@ -290,29 +290,29 @@ msgstr ""
"«%s» encontrado en la base de datos de configuración no es un valor válido "
"para la combinación de teclas «%s»\n"
#: ../src/core/prefs.c:2592
#: ../src/core/prefs.c:2784
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr ""
"Ocurrió un error al establecer el nombre del área de trabajo %d como «%s»: %"
"s \n"
#: ../src/core/prefs.c:2796
#: ../src/core/prefs.c:2988
#, c-format
msgid "Error setting compositor status: %s\n"
msgstr "Error al establecer el estado del compositor: %s\n"
#: ../src/core/prefs.c:2824
#: ../src/core/prefs.c:3017
#, c-format
msgid "Error setting clutter plugin list: %s\n"
msgstr "Error al establecer la lista de complementos de «Clutter»: %s\n"
#: ../src/core/prefs.c:2867
#: ../src/core/prefs.c:3061
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr "Error al establecer el estado de vida de las ventanas ocultas: %s\n"
#: ../src/core/prefs.c:2895
#: ../src/core/prefs.c:3089
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr ""
@@ -451,7 +451,7 @@ msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6183
#: ../src/core/window.c:6217
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -467,7 +467,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:6846
#: ../src/core/window.c:6880
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
@@ -1403,69 +1403,69 @@ msgstr "La constante «%s» ya ha sido definida"
#. Translators: This means that an attribute which should have been found
#. * on an XML element was not in fact found.
#.
#: ../src/ui/theme-parser.c:202
#: ../src/ui/theme-parser.c:236
#, c-format
msgid "No \"%s\" attribute on element <%s>"
msgstr "El atributo «%s» no está definido en el elemento <%s>"
#: ../src/ui/theme-parser.c:231 ../src/ui/theme-parser.c:249
#: ../src/ui/theme-parser.c:265 ../src/ui/theme-parser.c:283
#, c-format
msgid "Line %d character %d: %s"
msgstr "Línea %d carácter %d: %s"
#: ../src/ui/theme-parser.c:413
#: ../src/ui/theme-parser.c:479
#, c-format
msgid "Attribute \"%s\" repeated twice on the same <%s> element"
msgstr "El atributo «%s» se ha repetido dos veces en el mismo elemento <%s>"
#: ../src/ui/theme-parser.c:437 ../src/ui/theme-parser.c:480
#: ../src/ui/theme-parser.c:503 ../src/ui/theme-parser.c:552
#, c-format
msgid "Attribute \"%s\" is invalid on <%s> element in this context"
msgstr "El atributo «%s» es inválido en el elemento <%s> en este contexto"
#: ../src/ui/theme-parser.c:522
#: ../src/ui/theme-parser.c:594
#, c-format
msgid "Could not parse \"%s\" as an integer"
msgstr "No se ha podido interpretar «%s» como un entero"
#: ../src/ui/theme-parser.c:531 ../src/ui/theme-parser.c:586
#: ../src/ui/theme-parser.c:603 ../src/ui/theme-parser.c:658
#, c-format
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
msgstr "No se comprenden los caracteres sobrantes «%s» en la cadena «%s»"
#: ../src/ui/theme-parser.c:541
#: ../src/ui/theme-parser.c:613
#, c-format
msgid "Integer %ld must be positive"
msgstr "El entero %ld debe ser positivo"
#: ../src/ui/theme-parser.c:549
#: ../src/ui/theme-parser.c:621
#, c-format
msgid "Integer %ld is too large, current max is %d"
msgstr "El entero %ld es demasiado grande, el máximo actual es %d"
#: ../src/ui/theme-parser.c:577 ../src/ui/theme-parser.c:693
#: ../src/ui/theme-parser.c:649 ../src/ui/theme-parser.c:765
#, c-format
msgid "Could not parse \"%s\" as a floating point number"
msgstr "No se ha podido interpretar «%s» como un número de coma flotante"
#: ../src/ui/theme-parser.c:608 ../src/ui/theme-parser.c:636
#: ../src/ui/theme-parser.c:680 ../src/ui/theme-parser.c:708
#, c-format
msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
msgstr "Los valores booleanos deben ser «true» o «false» no «%s»"
#: ../src/ui/theme-parser.c:663
#: ../src/ui/theme-parser.c:735
#, c-format
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"
#: ../src/ui/theme-parser.c:726
#: ../src/ui/theme-parser.c:798
#, c-format
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
msgstr ""
"El valor de alfa debe estar entre 0.0 (invisible) y 1.0 (completamente "
"opaco), fue %g\n"
#: ../src/ui/theme-parser.c:791
#: ../src/ui/theme-parser.c:863
#, c-format
msgid ""
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
@@ -1474,59 +1474,59 @@ msgstr ""
"Escala de título inválida «%s» (debe ser una de xx-small,x-small,small,medium,"
"large,x-large,xx-large)\n"
#: ../src/ui/theme-parser.c:936 ../src/ui/theme-parser.c:999
#: ../src/ui/theme-parser.c:1033 ../src/ui/theme-parser.c:1136
#: ../src/ui/theme-parser.c:1008 ../src/ui/theme-parser.c:1071
#: ../src/ui/theme-parser.c:1105 ../src/ui/theme-parser.c:1208
#, c-format
msgid "<%s> name \"%s\" used a second time"
msgstr "<%s> nombre «%s» usado una segunda vez"
#: ../src/ui/theme-parser.c:948 ../src/ui/theme-parser.c:1045
#: ../src/ui/theme-parser.c:1148
#: ../src/ui/theme-parser.c:1020 ../src/ui/theme-parser.c:1117
#: ../src/ui/theme-parser.c:1220
#, c-format
msgid "<%s> parent \"%s\" has not been defined"
msgstr "El <%s> padre «%s» no ha sido definido"
#: ../src/ui/theme-parser.c:1058
#: ../src/ui/theme-parser.c:1130
#, c-format
msgid "<%s> geometry \"%s\" has not been defined"
msgstr "La <%s> geometría «%s» no ha sido definida"
#: ../src/ui/theme-parser.c:1071
#: ../src/ui/theme-parser.c:1143
#, c-format
msgid "<%s> must specify either a geometry or a parent that has a geometry"
msgstr ""
"<%s> debe especificar o una geometría o un padre para tenga una geometría"
#: ../src/ui/theme-parser.c:1113
#: ../src/ui/theme-parser.c:1185
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"
#: ../src/ui/theme-parser.c:1180
#: ../src/ui/theme-parser.c:1252
#, c-format
msgid "Unknown type \"%s\" on <%s> element"
msgstr "Tipo «%s» desconocido en el elemento <%s>"
#: ../src/ui/theme-parser.c:1191
#: ../src/ui/theme-parser.c:1263
#, c-format
msgid "Unknown style_set \"%s\" on <%s> element"
msgstr "style_set «%s» desconocido en el elemento <%s>"
#: ../src/ui/theme-parser.c:1199
#: ../src/ui/theme-parser.c:1271
#, c-format
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"
#: ../src/ui/theme-parser.c:1229 ../src/ui/theme-parser.c:1293
#: ../src/ui/theme-parser.c:1519 ../src/ui/theme-parser.c:2740
#: ../src/ui/theme-parser.c:2786 ../src/ui/theme-parser.c:2934
#: ../src/ui/theme-parser.c:3126 ../src/ui/theme-parser.c:3164
#: ../src/ui/theme-parser.c:3202 ../src/ui/theme-parser.c:3240
#: ../src/ui/theme-parser.c:1301 ../src/ui/theme-parser.c:1365
#: ../src/ui/theme-parser.c:1591 ../src/ui/theme-parser.c:2812
#: ../src/ui/theme-parser.c:2858 ../src/ui/theme-parser.c:3006
#: ../src/ui/theme-parser.c:3198 ../src/ui/theme-parser.c:3236
#: ../src/ui/theme-parser.c:3274 ../src/ui/theme-parser.c:3312
#, c-format
msgid "Element <%s> is not allowed below <%s>"
msgstr "El elemento <%s> no está permitido debajo de <%s>"
#: ../src/ui/theme-parser.c:1343 ../src/ui/theme-parser.c:1357
#: ../src/ui/theme-parser.c:1402
#: ../src/ui/theme-parser.c:1415 ../src/ui/theme-parser.c:1429
#: ../src/ui/theme-parser.c:1474
msgid ""
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
"for buttons"
@@ -1534,123 +1534,123 @@ msgstr ""
"No se puede especificar ambos «button_width»/«button_height» y «aspect ratio» "
"para los botones"
#: ../src/ui/theme-parser.c:1366
#: ../src/ui/theme-parser.c:1438
#, c-format
msgid "Distance \"%s\" is unknown"
msgstr "La distancia «%s» es desconocida"
#: ../src/ui/theme-parser.c:1411
#: ../src/ui/theme-parser.c:1483
#, c-format
msgid "Aspect ratio \"%s\" is unknown"
msgstr "La proporción «%s» es desconocido"
#: ../src/ui/theme-parser.c:1473
#: ../src/ui/theme-parser.c:1545
#, c-format
msgid "Border \"%s\" is unknown"
msgstr "El borde «%s» es desconocido"
#: ../src/ui/theme-parser.c:1784
#: ../src/ui/theme-parser.c:1856
#, c-format
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
msgstr "No hay atributo «start_angle» o «from» en el elemento <%s>"
#: ../src/ui/theme-parser.c:1791
#: ../src/ui/theme-parser.c:1863
#, c-format
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
msgstr "No hay atributo «extent_angle» o «to» en el elemento <%s>"
#: ../src/ui/theme-parser.c:2031
#: ../src/ui/theme-parser.c:2103
#, c-format
msgid "Did not understand value \"%s\" for type of gradient"
msgstr "No se entendió el valor «%s» para el tipo de degradado"
#: ../src/ui/theme-parser.c:2109 ../src/ui/theme-parser.c:2484
#: ../src/ui/theme-parser.c:2181 ../src/ui/theme-parser.c:2556
#, c-format
msgid "Did not understand fill type \"%s\" for <%s> element"
msgstr "No se entendió en tipo de relleno «%s» para el elemento <%s>"
#: ../src/ui/theme-parser.c:2276 ../src/ui/theme-parser.c:2359
#: ../src/ui/theme-parser.c:2422
#: ../src/ui/theme-parser.c:2348 ../src/ui/theme-parser.c:2431
#: ../src/ui/theme-parser.c:2494
#, c-format
msgid "Did not understand state \"%s\" for <%s> element"
msgstr "No se entendió estado «%s» para el elemento <%s>"
#: ../src/ui/theme-parser.c:2286 ../src/ui/theme-parser.c:2369
#: ../src/ui/theme-parser.c:2358 ../src/ui/theme-parser.c:2441
#, c-format
msgid "Did not understand shadow \"%s\" for <%s> element"
msgstr "No se entendió enrollar «%s» para el elemento <%s>"
#: ../src/ui/theme-parser.c:2296
#: ../src/ui/theme-parser.c:2368
#, c-format
msgid "Did not understand arrow \"%s\" for <%s> element"
msgstr "No se entendió la flecha «%s» para el elemento <%s>"
#: ../src/ui/theme-parser.c:2596 ../src/ui/theme-parser.c:2692
#: ../src/ui/theme-parser.c:2668 ../src/ui/theme-parser.c:2764
#, c-format
msgid "No <draw_ops> called \"%s\" has been defined"
msgstr "No se ha definido una <draw_ops> llamada «%s»"
#: ../src/ui/theme-parser.c:2608 ../src/ui/theme-parser.c:2704
#: ../src/ui/theme-parser.c:2680 ../src/ui/theme-parser.c:2776
#, c-format
msgid "Including draw_ops \"%s\" here would create a circular reference"
msgstr "Incluir el draw_ops «%s» aquí podría crear una referencia circular"
#: ../src/ui/theme-parser.c:2819
#: ../src/ui/theme-parser.c:2891
#, c-format
msgid "Unknown position \"%s\" for frame piece"
msgstr "Posición desconocida «%s» para la pieza del marco"
#: ../src/ui/theme-parser.c:2827
#: ../src/ui/theme-parser.c:2899
#, c-format
msgid "Frame style already has a piece at position %s"
msgstr "El estilo del marco ya tiene una pieza en la posición %s"
#: ../src/ui/theme-parser.c:2844 ../src/ui/theme-parser.c:2919
#: ../src/ui/theme-parser.c:2916 ../src/ui/theme-parser.c:2991
#, c-format
msgid "No <draw_ops> with the name \"%s\" has been defined"
msgstr "No se ha definido ninguna <draw_ops> con el nombre «%s»"
#: ../src/ui/theme-parser.c:2873
#: ../src/ui/theme-parser.c:2945
#, c-format
msgid "Unknown function \"%s\" for button"
msgstr "Función desconocida «%s» para el botón"
#: ../src/ui/theme-parser.c:2882
#: ../src/ui/theme-parser.c:2954
#, c-format
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)"
#: ../src/ui/theme-parser.c:2894
#: ../src/ui/theme-parser.c:2966
#, c-format
msgid "Unknown state \"%s\" for button"
msgstr "Estado desconocido «%s» para el botón"
#: ../src/ui/theme-parser.c:2902
#: ../src/ui/theme-parser.c:2974
#, c-format
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"
#: ../src/ui/theme-parser.c:2973
#: ../src/ui/theme-parser.c:3045
#, c-format
msgid "\"%s\" is not a valid value for focus attribute"
msgstr "«%s» no es valor válido para el atributo foco"
#: ../src/ui/theme-parser.c:2982
#: ../src/ui/theme-parser.c:3054
#, c-format
msgid "\"%s\" is not a valid value for state attribute"
msgstr "«%s» no es un valor válido para el atributo estado"
#: ../src/ui/theme-parser.c:2992
#: ../src/ui/theme-parser.c:3064
#, c-format
msgid "A style called \"%s\" has not been defined"
msgstr "No se ha definido ningún estilo llamado «%s»"
#: ../src/ui/theme-parser.c:3013 ../src/ui/theme-parser.c:3036
#: ../src/ui/theme-parser.c:3085 ../src/ui/theme-parser.c:3108
#, c-format
msgid "\"%s\" is not a valid value for resize attribute"
msgstr "«%s» no es un estado válido para el atributo resize"
#: ../src/ui/theme-parser.c:3047
#: ../src/ui/theme-parser.c:3119
#, c-format
msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
@@ -1659,7 +1659,7 @@ msgstr ""
"No debería tener un atributo «resize» en el elemento <%s> para los estados "
"maximizado/enrollado"
#: ../src/ui/theme-parser.c:3061
#: ../src/ui/theme-parser.c:3133
#, c-format
msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized states"
@@ -1667,18 +1667,18 @@ msgstr ""
"No debería tener un atributo «resize» en el elemento <%s> para los estados "
"maximizados."
#: ../src/ui/theme-parser.c:3075 ../src/ui/theme-parser.c:3097
#: ../src/ui/theme-parser.c:3147 ../src/ui/theme-parser.c:3169
#, c-format
msgid "Style has already been specified for state %s resize %s focus %s"
msgstr ""
"El estilo ya ha sido especificado para estado %s redimensionado %s foco %s"
#: ../src/ui/theme-parser.c:3086 ../src/ui/theme-parser.c:3108
#: ../src/ui/theme-parser.c:3158 ../src/ui/theme-parser.c:3180
#, c-format
msgid "Style has already been specified for state %s focus %s"
msgstr "El estilo ya ha sido especificado para estado %s foco %s"
#: ../src/ui/theme-parser.c:3147
#: ../src/ui/theme-parser.c:3219
msgid ""
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)"
@@ -1687,7 +1687,7 @@ msgstr ""
"especificado un atributo draw_ops y también un elemento <draw_ops> o ha "
"especificado los dos elementos)"
#: ../src/ui/theme-parser.c:3185
#: ../src/ui/theme-parser.c:3257
msgid ""
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)"
@@ -1696,7 +1696,7 @@ msgstr ""
"especificado un atributo draw_ops y también un elemento <draw_ops> o ha "
"especificado los dos elementos)"
#: ../src/ui/theme-parser.c:3223
#: ../src/ui/theme-parser.c:3295
msgid ""
"Can't have a two draw_ops for a <menu_icon> element (theme specified a "
"draw_ops attribute and also a <draw_ops> element, or specified two elements)"
@@ -1705,12 +1705,32 @@ msgstr ""
"especificado un atributo draw_ops y también un elemento <draw_ops> o ha "
"especificado los dos elementos)"
#: ../src/ui/theme-parser.c:3271
#: ../src/ui/theme-parser.c:3359
#, c-format
msgid "Bad version specification '%s'"
msgstr "Especificación de versión «%s» errónea"
#: ../src/ui/theme-parser.c:3432
msgid ""
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
"theme-2.xml"
msgstr ""
"No se puede usar el atributo «version» con metacity-theme-1.xml o metacity-"
"theme-2.xml"
#: ../src/ui/theme-parser.c:3455
#, c-format
msgid "Theme requires version %s but latest supported theme version is %d.%d"
msgstr ""
"El tema requiere la versión %s pero la última versión soportada del tema es "
"la %d.%d"
#: ../src/ui/theme-parser.c:3487
#, c-format
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>"
#: ../src/ui/theme-parser.c:3291
#: ../src/ui/theme-parser.c:3507
#, c-format
msgid ""
"Element <%s> is not allowed inside a name/author/date/description element"
@@ -1718,12 +1738,12 @@ msgstr ""
"El elemento <%s> no esta permitido dentro de un elemento name/author/date/"
"description"
#: ../src/ui/theme-parser.c:3296
#: ../src/ui/theme-parser.c:3512
#, c-format
msgid "Element <%s> is not allowed inside a <constant> element"
msgstr "El elemento <%s> no esta permitido dentro de un elemento <constant>"
#: ../src/ui/theme-parser.c:3308
#: ../src/ui/theme-parser.c:3524
#, c-format
msgid ""
"Element <%s> is not allowed inside a distance/border/aspect_ratio element"
@@ -1731,50 +1751,44 @@ msgstr ""
"El elemento <%s> no esta permitido dentro de un elemento distance/border/"
"aspect_ratio"
#: ../src/ui/theme-parser.c:3330
#: ../src/ui/theme-parser.c:3546
#, c-format
msgid "Element <%s> is not allowed inside a draw operation element"
msgstr ""
"El elemento <%s> no esta permitido dentro de un elemento de operación de "
"dibujo"
#: ../src/ui/theme-parser.c:3340 ../src/ui/theme-parser.c:3370
#: ../src/ui/theme-parser.c:3375 ../src/ui/theme-parser.c:3380
#: ../src/ui/theme-parser.c:3556 ../src/ui/theme-parser.c:3586
#: ../src/ui/theme-parser.c:3591 ../src/ui/theme-parser.c:3596
#, c-format
msgid "Element <%s> is not allowed inside a <%s> element"
msgstr "El elemento <%s> no esta permitido dentro del elemento <%s>"
#: ../src/ui/theme-parser.c:3602
#: ../src/ui/theme-parser.c:3824
msgid "No draw_ops provided for frame piece"
msgstr "No se dio draw_ops para la pieza del cuadro"
#: ../src/ui/theme-parser.c:3617
#: ../src/ui/theme-parser.c:3839
msgid "No draw_ops provided for button"
msgstr "No se dio draw_ops para botón"
#: ../src/ui/theme-parser.c:3669
#: ../src/ui/theme-parser.c:3893
#, c-format
msgid "No text is allowed inside element <%s>"
msgstr "No se permite texto dentro del elemento <%s>"
#: ../src/ui/theme-parser.c:3724 ../src/ui/theme-parser.c:3736
#: ../src/ui/theme-parser.c:3748 ../src/ui/theme-parser.c:3760
#: ../src/ui/theme-parser.c:3772
#: ../src/ui/theme-parser.c:3951 ../src/ui/theme-parser.c:3963
#: ../src/ui/theme-parser.c:3975 ../src/ui/theme-parser.c:3987
#: ../src/ui/theme-parser.c:3999
#, c-format
#| msgid "<name> specified twice for this theme"
msgid "<%s> specified twice for this theme"
msgstr "<%s> especificado dos veces para este tema"
#: ../src/ui/theme-parser.c:4040
#: ../src/ui/theme-parser.c:4269
#, c-format
msgid "Failed to find a valid file for theme %s\n"
msgstr "Falló al encontrar un archivo válido para el tema%s\n"
#: ../src/ui/theme-parser.c:4096
#, c-format
msgid "Theme file %s did not contain a root <metacity_theme> element"
msgstr "El archivo de tema %s no contiene un elemento raíz <metacity_theme>"
#: ../src/ui/theme-viewer.c:75
msgid "/_Windows"
msgstr "/_Ventanas"
@@ -1977,6 +1991,9 @@ msgstr ""
"%d expresiones de coordenadas interpretadas en %g segundos (%g segundos de "
"media)\n"
#~ msgid "Theme file %s did not contain a root <metacity_theme> element"
#~ msgstr "El archivo de tema %s no contiene un elemento raíz <metacity_theme>"
#~ msgid "Failed to read saved session file %s: %s\n"
#~ msgstr "Ocurrió un error al leer el archivo de sesión guardado %s: %s\n"

336
po/eu.po
View File

@@ -3,14 +3,14 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
#
# Hizkuntza Politikarako Sailburuordetza <hizpol@ej-gv.es>, 2004.
# Iñaki Larrañaga Murgoitio <dooteo@euskalgnu.org>, 2004, 2005, 2006, 2008, 2009.
# Iñaki Larrañaga Murgoitio <dooteo@euskalgnu.org>, 2004, 2005, 2006, 2008, 2009, 2010.
# Iñaki Larrañaga Murgoitio <dooteo@zundan.com>, 2007.
msgid ""
msgstr ""
"Project-Id-Version: eu\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-09-04 11:40+0200\n"
"PO-Revision-Date: 2009-09-04 11:56+0200\n"
"POT-Creation-Date: 2010-03-19 17:23+0100\n"
"PO-Revision-Date: 2010-03-19 17:27+0100\n"
"Last-Translator: Iñaki Larrañaga Murgoitio <dooteo@euskalgnu.org>\n"
"Language-Team: Basque <itzulpena@euskalgnu.org>\n"
"MIME-Version: 1.0\n"
@@ -20,48 +20,53 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"\n"
#: ../src/core/bell.c:302
msgid "Bell event"
msgstr "Soinuaren gertaera"
#: ../src/core/core.c:213
#, c-format
msgid "Unknown window information request: %d"
msgstr "Leihoaren informazio eskaera ezezaguna: %d"
#: ../src/core/delete.c:105
#. Translators: %s is a window title
#: ../src/core/delete.c:95
#, c-format
msgid ""
"<big><b><tt>%s</tt> is not responding.</b></big>\n"
"\n"
"<i>You may choose to wait a short while for it to continue or force the "
"application to quit entirely.</i>"
msgstr ""
"<big><b><tt>%s</tt>(e)k ez du erantzuten.</b></big>\n"
"\n"
"<i>Aukeratu piskatean zai egotea aplikazioak jarraitzeko edo derrigortu "
"aplikazioa erabat ixtea.</i>"
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt>(e)k ez du erantzuten."
#: ../src/core/delete.c:116
#: ../src/core/delete.c:100
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Aukeratu piskatean zai egotea aplikazioak jarraitzeko edo derrigortu "
"aplikazioa erabat ixtea."
#: ../src/core/delete.c:109
msgid "_Wait"
msgstr "_Itxaron"
#: ../src/core/delete.c:116
#: ../src/core/delete.c:109
msgid "_Force Quit"
msgstr "_Behartu ixtera"
#: ../src/core/delete.c:217
#: ../src/core/delete.c:207
#, c-format
msgid "Failed to get hostname: %s\n"
msgstr "Huts egin du ostalari-izena hartzean: %s\n"
#: ../src/core/display.c:329
#: ../src/core/display.c:362
#, c-format
msgid "Missing %s extension required for compositing"
msgstr "Konposaketa lantzeko beharrezkoa den %s hedapena falta da"
#: ../src/core/display.c:414
#: ../src/core/display.c:447
#, c-format
msgid "Failed to open X Window System display '%s'\n"
msgstr "Huts egin du X Window sistemaren '%s' pantaila irekitzean\n"
#: ../src/core/errors.c:236
#: ../src/core/errors.c:233
#, c-format
msgid ""
"Lost connection to the display '%s';\n"
@@ -72,12 +77,12 @@ msgstr ""
"seguru asko X zerbitzaria itzalita egongo da edo leiho-kudeatzailea \n"
"hilko/hondatuko zenuen.\n"
#: ../src/core/errors.c:243
#: ../src/core/errors.c:240
#, c-format
msgid "Fatal IO error %d (%s) on display '%s'.\n"
msgstr "S/Iko %d (%s) errore konponezina '%s' pantailan.\n"
#: ../src/core/keybindings.c:697
#: ../src/core/keybindings.c:708
#, c-format
msgid ""
"Some other program is already using the key %s with modifiers %x as a "
@@ -89,7 +94,7 @@ msgstr ""
#. Displayed when a keybinding which is
#. * supposed to launch a program fails.
#.
#: ../src/core/keybindings.c:2392
#: ../src/core/keybindings.c:2399
#, c-format
msgid ""
"There was an error running <tt>%s</tt>:\n"
@@ -100,92 +105,96 @@ msgstr ""
"\n"
"%s"
#: ../src/core/keybindings.c:2482
#: ../src/core/keybindings.c:2489
#, c-format
msgid "No command %d has been defined.\n"
msgstr "%d komandoa ez dago definituta.\n"
#: ../src/core/keybindings.c:3495
#: ../src/core/keybindings.c:3502
#, c-format
msgid "No terminal command has been defined.\n"
msgstr "Ez da terminalaren komandoa definitu.\n"
#: ../src/core/main.c:127
#: ../src/core/main.c:130
#, c-format
msgid ""
"mutter %s\n"
"Copyright (C) 2001-2008 Havoc Pennington, Red Hat, Inc., and others\n"
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
"This is free software; see the source for copying conditions.\n"
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
"PARTICULAR PURPOSE.\n"
msgstr ""
"mutter %s\n"
"Copyright-a (C) 2001-2008 Havoc Pennington, Red Hat, Inc., eta beste batzuk\n"
"Copyright-a (C) 2001-%d Havoc Pennington, Red Hat, Inc., eta beste batzuk\n"
"Hau software librea da; ikus kopiatzeko baldintzak iturburu-kodean.\n"
"EZ du bermerik; ezta MERKATURATZEKO edo XEDE JAKIN BATERAKO EGOKITASUNAREN "
"BERMERIK ERE.\n"
#: ../src/core/main.c:257
#: ../src/core/main.c:261
msgid "Disable connection to session manager"
msgstr "Desgaitu saio-kudeatzailearen konexioa"
#: ../src/core/main.c:263
#: ../src/core/main.c:267
msgid "Replace the running window manager with Mutter"
msgstr "Ordeztu exekutatzen dagoen leiho-kudeatzailea Mutter-rekin"
#: ../src/core/main.c:269
#: ../src/core/main.c:273
msgid "Specify session management ID"
msgstr "Zehaztu saio-kudeatzailearen IDa"
#: ../src/core/main.c:274
#: ../src/core/main.c:278
msgid "X Display to use"
msgstr "X pantaila erabiltzeko"
#: ../src/core/main.c:280
#: ../src/core/main.c:284
msgid "Initialize session from savefile"
msgstr "Hasieratu saioa babes-fitxategitik"
#: ../src/core/main.c:286
#: ../src/core/main.c:290
msgid "Print version"
msgstr "Erakutsi bertsioa"
#: ../src/core/main.c:292
#: ../src/core/main.c:296
msgid "Make X calls synchronous"
msgstr "Egin X deiak sinkronoak izatea"
#: ../src/core/main.c:298
#: ../src/core/main.c:302
msgid "Turn compositing on"
msgstr "Aktibatu konposaketa"
#: ../src/core/main.c:304
#: ../src/core/main.c:308
msgid "Turn compositing off"
msgstr "Desaktibatu konposaketa"
#: ../src/core/main.c:310
#: ../src/core/main.c:314
msgid "Don't make fullscreen windows that are maximized and have no decorations"
msgstr "Ez jarri pantaila osoan maximizatuta dauden eta dekoraziorik ez duten leihoak"
#: ../src/core/main.c:320
msgid "Comma-separated list of compositor plugins"
msgstr "Konpositoreen pluginen komaz bereiztutako zerrenda"
#: ../src/core/main.c:316
#: ../src/core/main.c:326
msgid "Whether window popup/frame should be shown when cycling windows."
msgstr "Leihoak begiztan sartzean laster-leihoak/-markoak erakutsiko diren edo ez."
#: ../src/core/main.c:323
#: ../src/core/main.c:333
msgid "Internal argument for GObject introspection"
msgstr "Barneko argumentua GObject objektua aztertzeko"
#: ../src/core/main.c:668
#: ../src/core/main.c:663
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Huts egin du gaien direktorioa aztertzean: %s\n"
#: ../src/core/main.c:684
#: ../src/core/main.c:679
#, c-format
msgid "Could not find a theme! Be sure %s exists and contains the usual themes.\n"
msgstr ""
"Gai bat ezin izan da aurkitu. Ziurtatu %s badagoela eta ohiko gaiak "
"dituela.\n"
#: ../src/core/main.c:745
#: ../src/core/main.c:743
#, c-format
msgid "Failed to restart: %s\n"
msgstr "Ezin izan da berrabiarazi: %s\n"
@@ -201,24 +210,24 @@ msgstr "Ezin izan da berrabiarazi: %s\n"
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:522 ../src/core/prefs.c:683
#: ../src/core/prefs.c:529 ../src/core/prefs.c:690
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "\"%s\" GConf gakoa balio baliogabean ezarrita dago\n"
#: ../src/core/prefs.c:609 ../src/core/prefs.c:852
#: ../src/core/prefs.c:616 ../src/core/prefs.c:859
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr "%2$s GConf gakoko %1$d balioa %3$d - %4$d barrutitik kanpo dago\n"
#: ../src/core/prefs.c:653 ../src/core/prefs.c:730 ../src/core/prefs.c:778
#: ../src/core/prefs.c:842 ../src/core/prefs.c:1142 ../src/core/prefs.c:1158
#: ../src/core/prefs.c:1175 ../src/core/prefs.c:1191
#: ../src/core/prefs.c:660 ../src/core/prefs.c:737 ../src/core/prefs.c:785
#: ../src/core/prefs.c:849 ../src/core/prefs.c:1149 ../src/core/prefs.c:1165
#: ../src/core/prefs.c:1182 ../src/core/prefs.c:1198
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "\"%s\" GConf gakoa mota baliogabean ezarrita dago\n"
#: ../src/core/prefs.c:1282
#: ../src/core/prefs.c:1289
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@@ -226,12 +235,12 @@ msgstr ""
"Aplikazio hautsien konponbidea desgaituta. Aplikazio batzuk ez dira behar "
"den bezala ibiliko.\n"
#: ../src/core/prefs.c:1353
#: ../src/core/prefs.c:1360
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr "Ezin izan da analizatu \"%s\" letra-tipoaren deskribapena %s GConf gakoan\n"
#: ../src/core/prefs.c:1415
#: ../src/core/prefs.c:1422
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@@ -240,17 +249,17 @@ msgstr ""
"Konfigurazioaren datu-basean aurkitutako \"%s\" balioa ez da baliozkoa sagu-"
"botoiaren aldatzailearentzat\n"
#: ../src/core/prefs.c:1839
#: ../src/core/prefs.c:1849
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "Errorea laneko %d area ezartzean: %s\n"
#: ../src/core/prefs.c:2023 ../src/core/prefs.c:2529
#: ../src/core/prefs.c:2028 ../src/core/prefs.c:2531
#, c-format
msgid "Workspace %d"
msgstr "%d. laneko area"
#: ../src/core/prefs.c:2056 ../src/core/prefs.c:2234
#: ../src/core/prefs.c:2061 ../src/core/prefs.c:2239
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@@ -259,37 +268,37 @@ msgstr ""
"Konfigurazioaren datu-basean aurkitutako \"%s\" balioa ez da baliozkoa \"%s"
"\" laster-teklarentzat.\n"
#: ../src/core/prefs.c:2610
#: ../src/core/prefs.c:2612
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr "Errorea %d. laneko areari \"%s\" izena ezartzean: %s\n"
#: ../src/core/prefs.c:2808
#: ../src/core/prefs.c:2816
#, c-format
msgid "Error setting compositor status: %s\n"
msgstr "Errorea konposaketaren egoera ezartzean: %s\n"
#: ../src/core/prefs.c:2836
#: ../src/core/prefs.c:2845
#, c-format
msgid "Error setting clutter plugin list: %s\n"
msgstr "Errorea 'clutter' pluginen zerrenda ezartzean: %s\n"
#: ../src/core/prefs.c:2879
#: ../src/core/prefs.c:2889
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr "Errorea ezkutuko leihoen bizitzen egoera ezartzean: %s\n"
#: ../src/core/prefs.c:2907
#: ../src/core/prefs.c:2917
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr "Errorea fitxarik gabeko laster-leihoen egoera ezartzean: %s\n"
#: ../src/core/screen.c:561
#: ../src/core/screen.c:577
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "'%2$s' bistaratzeko %1$d pantaila ez da baliozkoa\n"
#: ../src/core/screen.c:577
#: ../src/core/screen.c:593
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -298,77 +307,71 @@ msgstr ""
"\"%2$s\" bistaratzeko %1$d pantailak badu leiho-kudeatzailea; leiho-"
"kudeatzaile hori ordeztu nahi baduzu, saiatu --replace aukerarekin.\n"
#: ../src/core/screen.c:604
#: ../src/core/screen.c:620
#, c-format
msgid "Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr ""
"Ezin izan da eskuratu leiho-kudeatzailearen hautapena \"%2$s\" bistaratzeko %"
"1$d pantailan\n"
#: ../src/core/screen.c:659
#: ../src/core/screen.c:675
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "\"%2$s\" bistaratzeko %1$d pantailak badu leiho-kudeatzailea\n"
#: ../src/core/screen.c:871
#: ../src/core/screen.c:857
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Ezin izan da askatu \"%2$s\" bistaratzeko %1$d pantaila\n"
#: ../src/core/session.c:851 ../src/core/session.c:858
#: ../src/core/session.c:856 ../src/core/session.c:863
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Ezin izan da '%s' direktorioa sortu: %s\n"
#: ../src/core/session.c:868
#: ../src/core/session.c:873
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Ezin izan da '%s' saio-fitxategia idazteko ireki: %s\n"
#: ../src/core/session.c:1009
#: ../src/core/session.c:1014
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Errorea '%s' saio-fitxategia idaztean: %s\n"
#: ../src/core/session.c:1014
#: ../src/core/session.c:1019
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Errorea '%s' saio-fitxategia ixtean: %s\n"
#. oh, just give up
#: ../src/core/session.c:1107
#, c-format
msgid "Failed to read saved session file %s: %s\n"
msgstr "Huts egin du gordetako %s saio-fitxategia irakurtzean: %s\n"
#: ../src/core/session.c:1146
#: ../src/core/session.c:1149
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Huts egin du gordetako saio-fitxategia analizatzean: %s\n"
#: ../src/core/session.c:1195
#: ../src/core/session.c:1198
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "<mutter_session> atributua ikusi da baina dagoeneko badugu saio-IDa"
#: ../src/core/session.c:1208 ../src/core/session.c:1283
#: ../src/core/session.c:1315 ../src/core/session.c:1387
#: ../src/core/session.c:1447
#: ../src/core/session.c:1211 ../src/core/session.c:1286
#: ../src/core/session.c:1318 ../src/core/session.c:1390
#: ../src/core/session.c:1450
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "%s atributu ezezaguna <%s> elementuan"
#: ../src/core/session.c:1225
#: ../src/core/session.c:1228
#, c-format
msgid "nested <window> tag"
msgstr "<window> etiketa habiaratua"
#: ../src/core/session.c:1467
#: ../src/core/session.c:1470
#, c-format
msgid "Unknown element %s"
msgstr "%s elementu ezezaguna"
#: ../src/core/session.c:1818
#: ../src/core/session.c:1822
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -376,51 +379,51 @@ msgstr ""
"Leiho hauek ez dute onartzen &quot;gorde uneko konfigurazioa&quot; eta eskuz "
"berrabiarazi beharko dituzu hurrengo saioa hasten duzunean."
#: ../src/core/util.c:103
#: ../src/core/util.c:104
#, c-format
msgid "Failed to open debug log: %s\n"
msgstr "Huts egin du arazketako egunkaria irekitzean: %s\n"
#: ../src/core/util.c:113
#: ../src/core/util.c:114
#, c-format
msgid "Failed to fdopen() log file %s: %s\n"
msgstr "Huts egin du %s egunkari-fitxategian fdopen() egitean: %s\n"
#: ../src/core/util.c:119
#: ../src/core/util.c:120
#, c-format
msgid "Opened log file %s\n"
msgstr "%s egunkari-fitxategia irekita\n"
#: ../src/core/util.c:138 ../src/tools/mutter-message.c:176
#: ../src/core/util.c:139 ../src/tools/mutter-message.c:176
#, c-format
msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mutter modu xehatuaren euskarririk gabe konpilatu da\n"
#: ../src/core/util.c:238
#: ../src/core/util.c:239
msgid "Window manager: "
msgstr "Leiho-kudeatzailea: "
#: ../src/core/util.c:390
#: ../src/core/util.c:391
msgid "Bug in window manager: "
msgstr "Akatsa leiho-kudeatzailean: "
#: ../src/core/util.c:423
#: ../src/core/util.c:424
msgid "Window manager warning: "
msgstr "Leiho-kudeatzailearen abisua: "
#: ../src/core/util.c:451
#: ../src/core/util.c:452
msgid "Window manager error: "
msgstr "Leiho-kudeatzailearen errorea: "
#. Translators: This is the title used on dialog boxes
#. eof all-keybindings.h
#: ../src/core/util.c:570 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:573 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6086
#: ../src/core/window.c:6217
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -436,7 +439,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:6749
#: ../src/core/window.c:6880
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
@@ -456,7 +459,7 @@ msgstr "Aplikazioak _NET_WM_PID %lu faltsua ezarri du\n"
msgid "%s (on %s)"
msgstr "%s (%s)"
#: ../src/core/window-props.c:1419
#: ../src/core/window-props.c:1435
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "%2$s(e)n baliogabeko WM_TRANSIENT_FOR 0x%1$lx leihoa zehaztu da.\n"
@@ -476,12 +479,12 @@ msgstr ""
"Gehiago ematen du aplikazioaren akatsa leiho-kudeatzailearena baino.\n"
"Leihoak title=\"%s\" class=\"%s\" name=\"%s\" du\n"
#: ../src/core/xprops.c:401
#: ../src/core/xprops.c:411
#, c-format
msgid "Property %s on window 0x%lx contained invalid UTF-8\n"
msgstr "0x%2$lx leihoko %1$s propietateak UTF-8 baliogabea du\n"
#: ../src/core/xprops.c:484
#: ../src/core/xprops.c:494
#, c-format
msgid "Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
msgstr ""
@@ -804,7 +807,9 @@ msgstr "Clutter pluginak"
msgid ""
"Determines whether hidden windows (i.e., minimized windows and windows on "
"other workspaces than the current one) should be kept alive."
msgstr "Ezkutuko leihoak (adib. ikonotutakoak, beste laneko arekoak) bizirik iraungo diren edo ez zehazten du."
msgstr ""
"Ezkutuko leihoak (adib. ikonotutakoak, beste laneko arekoak) bizirik iraungo "
"diren edo ez zehazten du."
#: ../src/mutter.schemas.in.h:3
msgid "Live Hidden Windows"
@@ -816,7 +821,9 @@ msgstr "Aldatzailea leihoak kudeatzeko eragiketa hedatuetan erabiltzeko"
#: ../src/mutter.schemas.in.h:5
msgid "Plugins to load for the Clutter-based compositing manager."
msgstr "Kargatuko diren puginak Clutter-en oinarritutako konposaketa-kudeatzailearentzako"
msgstr ""
"Kargatuko diren puginak Clutter-en oinarritutako konposaketa-"
"kudeatzailearentzako"
#: ../src/mutter.schemas.in.h:6
msgid ""
@@ -825,8 +832,8 @@ msgid ""
"\"Windows key\" on PC hardware. It's expected that this binding either the "
"default or set to the empty string."
msgstr ""
"Gako honek \"overlay\" (gainjarria) hasieratuko du: hau leihoaren "
"ikuspegi orokorraren eta aplikazioa abiarazteko sistemaren arteko konbinazioa da. "
"Gako honek \"overlay\" (gainjarria) hasieratuko du: hau leihoaren ikuspegi "
"orokorraren eta aplikazioa abiarazteko sistemaren arteko konbinazioa da. "
"Lehenetsi gisa, PC ordenagailuko \"Windows tekla\" da. Tekla konbinazio hau "
"lehenetsia izatea edo kate hutz gisa ezartzea da."
@@ -1289,7 +1296,7 @@ msgstr "Koordenatuen adierazpenak ez dirudi eragilerik edo eragigairik duenik"
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "Gaiak errorea ematen duen adierazpen bat dauka: %s\n"
#: ../src/ui/theme.c:4187
#: ../src/ui/theme.c:4203
#, c-format
msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
@@ -1298,23 +1305,23 @@ msgstr ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> zehaztu behar "
"da marko-estilo honetan"
#: ../src/ui/theme.c:4695 ../src/ui/theme.c:4720
#: ../src/ui/theme.c:4711 ../src/ui/theme.c:4736
#, c-format
msgid "Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr "<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> falta da"
#: ../src/ui/theme.c:4764
#: ../src/ui/theme.c:4780
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "Huts egin du \"%s\" gaia kargatzean: %s\n"
#: ../src/ui/theme.c:4894 ../src/ui/theme.c:4901 ../src/ui/theme.c:4908
#: ../src/ui/theme.c:4915 ../src/ui/theme.c:4922
#: ../src/ui/theme.c:4910 ../src/ui/theme.c:4917 ../src/ui/theme.c:4924
#: ../src/ui/theme.c:4931 ../src/ui/theme.c:4938
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "<%s> ez da ezarri \"%s\" gaian"
#: ../src/ui/theme.c:4930
#: ../src/ui/theme.c:4946
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
@@ -1323,14 +1330,14 @@ msgstr ""
"Ez da marko-estilorik ezarri set \"%s\" leiho-motarentzat \"%s\" gaian, "
"gehitu <window type=\"%s\" style_set=\"whatever\"/> elementu bat"
#: ../src/ui/theme.c:5383 ../src/ui/theme.c:5445 ../src/ui/theme.c:5508
#: ../src/ui/theme.c:5389 ../src/ui/theme.c:5451 ../src/ui/theme.c:5514
#, c-format
msgid "User-defined constants must begin with a capital letter; \"%s\" does not"
msgstr ""
"Erabiltzaileak definitutako konstanteak maiuskulaz hasi behar du; \"%s\" ez "
"da maiuskulaz hasten"
#: ../src/ui/theme.c:5391 ../src/ui/theme.c:5453 ../src/ui/theme.c:5516
#: ../src/ui/theme.c:5397 ../src/ui/theme.c:5459 ../src/ui/theme.c:5522
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "\"%s\" konstantea lehendik definituta dago"
@@ -1449,10 +1456,10 @@ msgid "Window type \"%s\" has already been assigned a style set"
msgstr "\"%s\" leiho-motak dagoeneko esleituta du estilo-multzoa"
#: ../src/ui/theme-parser.c:1229 ../src/ui/theme-parser.c:1293
#: ../src/ui/theme-parser.c:1519 ../src/ui/theme-parser.c:2732
#: ../src/ui/theme-parser.c:2778 ../src/ui/theme-parser.c:2926
#: ../src/ui/theme-parser.c:3118 ../src/ui/theme-parser.c:3156
#: ../src/ui/theme-parser.c:3194 ../src/ui/theme-parser.c:3232
#: ../src/ui/theme-parser.c:1519 ../src/ui/theme-parser.c:2740
#: ../src/ui/theme-parser.c:2786 ../src/ui/theme-parser.c:2934
#: ../src/ui/theme-parser.c:3126 ../src/ui/theme-parser.c:3164
#: ../src/ui/theme-parser.c:3202 ../src/ui/theme-parser.c:3240
#, c-format
msgid "Element <%s> is not allowed below <%s>"
msgstr "Ez da onartzen <%s> elementua <%s>(r)en azpian jartzea"
@@ -1481,108 +1488,108 @@ msgstr "\"%s\" aspektu-erlazioa ezezaguna da"
msgid "Border \"%s\" is unknown"
msgstr "\"%s\" ertza ezezaguna da"
#: ../src/ui/theme-parser.c:1776
#: ../src/ui/theme-parser.c:1784
#, c-format
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
msgstr "Ez dago \"start_angle\" edo \"from\" atributurik <%s> elementuan"
#: ../src/ui/theme-parser.c:1783
#: ../src/ui/theme-parser.c:1791
#, c-format
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
msgstr "Ez dago \"extent_angle\" edo \"to\" atributurik <%s> elementuan"
#: ../src/ui/theme-parser.c:2023
#: ../src/ui/theme-parser.c:2031
#, c-format
msgid "Did not understand value \"%s\" for type of gradient"
msgstr "Gradiente-motan ez da ulertu \"%s\" balioa"
#: ../src/ui/theme-parser.c:2101 ../src/ui/theme-parser.c:2476
#: ../src/ui/theme-parser.c:2109 ../src/ui/theme-parser.c:2484
#, c-format
msgid "Did not understand fill type \"%s\" for <%s> element"
msgstr "Ez da ulertu \"%s\" betetze-mota <%s> elementuan"
#: ../src/ui/theme-parser.c:2268 ../src/ui/theme-parser.c:2351
#: ../src/ui/theme-parser.c:2414
#: ../src/ui/theme-parser.c:2276 ../src/ui/theme-parser.c:2359
#: ../src/ui/theme-parser.c:2422
#, c-format
msgid "Did not understand state \"%s\" for <%s> element"
msgstr "Ez da ulertu \"%s\" egoera <%s> elementuan"
#: ../src/ui/theme-parser.c:2278 ../src/ui/theme-parser.c:2361
#: ../src/ui/theme-parser.c:2286 ../src/ui/theme-parser.c:2369
#, c-format
msgid "Did not understand shadow \"%s\" for <%s> element"
msgstr "Ez da ulertu \"%s\" itzala <%s> elementuan"
#: ../src/ui/theme-parser.c:2288
#: ../src/ui/theme-parser.c:2296
#, c-format
msgid "Did not understand arrow \"%s\" for <%s> element"
msgstr "Ez da ulertu \"%s\" gezia <%s> elementuan"
#: ../src/ui/theme-parser.c:2588 ../src/ui/theme-parser.c:2684
#: ../src/ui/theme-parser.c:2596 ../src/ui/theme-parser.c:2692
#, c-format
msgid "No <draw_ops> called \"%s\" has been defined"
msgstr "Ez da \"%s\" izeneko <draw_ops> bat ere definitu"
#: ../src/ui/theme-parser.c:2600 ../src/ui/theme-parser.c:2696
#: ../src/ui/theme-parser.c:2608 ../src/ui/theme-parser.c:2704
#, c-format
msgid "Including draw_ops \"%s\" here would create a circular reference"
msgstr "Hemen \"%s\" draw_ops sartzen bada, erreferentzia zirkularra sortuko da"
#: ../src/ui/theme-parser.c:2811
#: ../src/ui/theme-parser.c:2819
#, c-format
msgid "Unknown position \"%s\" for frame piece"
msgstr "\"%s\" kokaleku ezezaguna markoarentzat"
#: ../src/ui/theme-parser.c:2819
#: ../src/ui/theme-parser.c:2827
#, c-format
msgid "Frame style already has a piece at position %s"
msgstr "Marko-estiloak badu zati bat %s posizioan"
#: ../src/ui/theme-parser.c:2836 ../src/ui/theme-parser.c:2911
#: ../src/ui/theme-parser.c:2844 ../src/ui/theme-parser.c:2919
#, c-format
msgid "No <draw_ops> with the name \"%s\" has been defined"
msgstr "Ez da \"%s\" izeneko <draw_ops> bat ere definitu"
#: ../src/ui/theme-parser.c:2865
#: ../src/ui/theme-parser.c:2873
#, c-format
msgid "Unknown function \"%s\" for button"
msgstr "\"%s\" funtzioa ezezaguna botoiarentzat"
#: ../src/ui/theme-parser.c:2874
#: ../src/ui/theme-parser.c:2882
#, c-format
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
msgstr "\"%s\" botoi-funtzioa ez da existitzen bertsio honetan (%d, %d behar du)"
#: ../src/ui/theme-parser.c:2886
#: ../src/ui/theme-parser.c:2894
#, c-format
msgid "Unknown state \"%s\" for button"
msgstr "\"%s\" egoera ezezaguna botoiarentzat"
#: ../src/ui/theme-parser.c:2894
#: ../src/ui/theme-parser.c:2902
#, c-format
msgid "Frame style already has a button for function %s state %s"
msgstr "Marko-estiloak badu botoi bat %s funtzioan %s egoeran"
#: ../src/ui/theme-parser.c:2965
#: ../src/ui/theme-parser.c:2973
#, c-format
msgid "\"%s\" is not a valid value for focus attribute"
msgstr "\"%s\" ez da baliozko balioa foku-atributuarentzat"
#: ../src/ui/theme-parser.c:2974
#: ../src/ui/theme-parser.c:2982
#, c-format
msgid "\"%s\" is not a valid value for state attribute"
msgstr "\"%s\" ez da baliozko balioa egoera-atributuarentzat"
#: ../src/ui/theme-parser.c:2984
#: ../src/ui/theme-parser.c:2992
#, c-format
msgid "A style called \"%s\" has not been defined"
msgstr "\"%s\" izeneko estiloa ez da definitu"
#: ../src/ui/theme-parser.c:3005 ../src/ui/theme-parser.c:3028
#: ../src/ui/theme-parser.c:3013 ../src/ui/theme-parser.c:3036
#, c-format
msgid "\"%s\" is not a valid value for resize attribute"
msgstr "\"%s\" ez da baliozko balioa tamainaz aldatzeko atributuarentzat"
#: ../src/ui/theme-parser.c:3039
#: ../src/ui/theme-parser.c:3047
#, c-format
msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
@@ -1591,24 +1598,24 @@ msgstr ""
"Ez luke izan behar \"resize\" atributurik <%s> elementuan maximizatutako/"
"bildutako egoerentzat"
#: ../src/ui/theme-parser.c:3053
#: ../src/ui/theme-parser.c:3061
#, c-format
msgid "Should not have \"resize\" attribute on <%s> element for maximized states"
msgstr ""
"Ez luke izan behar \"resize\" atributurik <%s> elementuan maximizatutako "
"egoerentzat"
#: ../src/ui/theme-parser.c:3067 ../src/ui/theme-parser.c:3089
#: ../src/ui/theme-parser.c:3075 ../src/ui/theme-parser.c:3097
#, c-format
msgid "Style has already been specified for state %s resize %s focus %s"
msgstr "Estiloa dagoeneko zehaztu da %s egoeran %s tamaina-aldatzean %s fokuan"
#: ../src/ui/theme-parser.c:3078 ../src/ui/theme-parser.c:3100
#: ../src/ui/theme-parser.c:3086 ../src/ui/theme-parser.c:3108
#, c-format
msgid "Style has already been specified for state %s focus %s"
msgstr "Estiloa dagoeneko zehaztu da %s egoeran %s fokuan"
#: ../src/ui/theme-parser.c:3139
#: ../src/ui/theme-parser.c:3147
msgid ""
"Can't have a two draw_ops for a <piece> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)"
@@ -1616,7 +1623,7 @@ msgstr ""
"Ezin dira bi draw_ops izan <piece> elementu batean (gaiak draw_ops atributu "
"bat eta <draw_ops> elementu bat zehaztu ditu, edo bi elementu zehaztu ditu)"
#: ../src/ui/theme-parser.c:3177
#: ../src/ui/theme-parser.c:3185
msgid ""
"Can't have a two draw_ops for a <button> element (theme specified a draw_ops "
"attribute and also a <draw_ops> element, or specified two elements)"
@@ -1624,7 +1631,7 @@ msgstr ""
"Ezin dira bi draw_ops izan <button> elementu batean (gaiak draw_ops atributu "
"bat eta <draw_ops> elementu bat zehaztu ditu, edo bi elementu zehaztu ditu)"
#: ../src/ui/theme-parser.c:3215
#: ../src/ui/theme-parser.c:3223
msgid ""
"Can't have a two draw_ops for a <menu_icon> element (theme specified a "
"draw_ops attribute and also a <draw_ops> element, or specified two elements)"
@@ -1633,76 +1640,63 @@ msgstr ""
"atributu bat eta <draw_ops> elementu bat zehaztu ditu, edo bi elementu "
"zehaztu ditu)"
#: ../src/ui/theme-parser.c:3263
#: ../src/ui/theme-parser.c:3271
#, c-format
msgid "Outermost element in theme must be <metacity_theme> not <%s>"
msgstr "Gaian kanporen dagoen elementuak <metacity_theme> izan behar du, ez <%s>"
#: ../src/ui/theme-parser.c:3283
#: ../src/ui/theme-parser.c:3291
#, c-format
msgid "Element <%s> is not allowed inside a name/author/date/description element"
msgstr "<%s> elementua ez da onartzen name/author/date/description elementuan"
#: ../src/ui/theme-parser.c:3288
#: ../src/ui/theme-parser.c:3296
#, c-format
msgid "Element <%s> is not allowed inside a <constant> element"
msgstr "<%s> elementua ez da onartzen <constant> elementuaren barnean"
#: ../src/ui/theme-parser.c:3300
#: ../src/ui/theme-parser.c:3308
#, c-format
msgid "Element <%s> is not allowed inside a distance/border/aspect_ratio element"
msgstr "<%s> elementua ez da onartzen distance/border/aspect_ratio elementuan"
#: ../src/ui/theme-parser.c:3322
#: ../src/ui/theme-parser.c:3330
#, c-format
msgid "Element <%s> is not allowed inside a draw operation element"
msgstr "<%s> elementua ez da onartzen marrazteko eragiketaren elementuaren barnean"
#: ../src/ui/theme-parser.c:3332 ../src/ui/theme-parser.c:3362
#: ../src/ui/theme-parser.c:3367 ../src/ui/theme-parser.c:3372
#: ../src/ui/theme-parser.c:3340 ../src/ui/theme-parser.c:3370
#: ../src/ui/theme-parser.c:3375 ../src/ui/theme-parser.c:3380
#, c-format
msgid "Element <%s> is not allowed inside a <%s> element"
msgstr "<%s> elementua ez da onartzen <%s> elementuaren barnean"
#: ../src/ui/theme-parser.c:3594
#: ../src/ui/theme-parser.c:3602
msgid "No draw_ops provided for frame piece"
msgstr "Ez da draw_ops-ik eman marko-zatiarentzat"
#: ../src/ui/theme-parser.c:3609
#: ../src/ui/theme-parser.c:3617
msgid "No draw_ops provided for button"
msgstr "Ez da draw_ops-ik eman botoiarentzat"
#: ../src/ui/theme-parser.c:3661
#: ../src/ui/theme-parser.c:3669
#, c-format
msgid "No text is allowed inside element <%s>"
msgstr "Ez da testurik onartzen <%s> elementuaren barnean"
#: ../src/ui/theme-parser.c:3716
msgid "<name> specified twice for this theme"
msgstr "<izena> birritan zehaztu da gai honetan"
#: ../src/ui/theme-parser.c:3724 ../src/ui/theme-parser.c:3736
#: ../src/ui/theme-parser.c:3748 ../src/ui/theme-parser.c:3760
#: ../src/ui/theme-parser.c:3772
#, c-format
msgid "<%s> specified twice for this theme"
msgstr "<%s> birritan zehaztu da gai honetan"
#: ../src/ui/theme-parser.c:3727
msgid "<author> specified twice for this theme"
msgstr "<egilea> birritan zehaztu da gai honetan"
#: ../src/ui/theme-parser.c:3738
msgid "<copyright> specified twice for this theme"
msgstr "<copyright-a> birritan zehaztu da gai honetan"
#: ../src/ui/theme-parser.c:3749
msgid "<date> specified twice for this theme"
msgstr "<data> birritan zehaztu da gai honetan"
#: ../src/ui/theme-parser.c:3760
msgid "<description> specified twice for this theme"
msgstr "<azalpena> birritan zehaztu da gai honetan"
#: ../src/ui/theme-parser.c:4027
#: ../src/ui/theme-parser.c:4040
#, c-format
msgid "Failed to find a valid file for theme %s\n"
msgstr "Huts egin du %s gaiaren fitxategi egokia bilatzean\n"
#: ../src/ui/theme-parser.c:4083
#: ../src/ui/theme-parser.c:4096
#, c-format
msgid "Theme file %s did not contain a root <metacity_theme> element"
msgstr "%s gai-fitxategiak ez du erroko <metacity_theme> elementurik"

616
po/fr.po

File diff suppressed because it is too large Load Diff

741
po/gl.po

File diff suppressed because it is too large Load Diff

2710
po/he.po

File diff suppressed because it is too large Load Diff

1874
po/it.po

File diff suppressed because it is too large Load Diff

1667
po/lt.po

File diff suppressed because it is too large Load Diff

491
po/nb.po

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgstr ""
"Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&component=general\n"
"POT-Creation-Date: 2009-11-24 21:04+0000\n"
"PO-Revision-Date: 2009-11-26 21:39+0100\n"
"PO-Revision-Date: 2010-02-25 16:58+0100\n"
"Last-Translator: Nils-Christoph Fiedler <fiedler@medienkompanie.de>\n"
"Language-Team: Low German <nds-lowgerman@lists.sourceforge.net>\n"
"MIME-Version: 1.0\n"
@@ -335,7 +335,7 @@ msgstr ""
#: ../src/core/session.c:1468
#, c-format
msgid "Unknown element %s"
msgstr ""
msgstr "Unbekanntes Element %s"
#: ../src/core/session.c:1820
msgid "These windows do not support &quot;save current setup&quot; and will have to be restarted manually next time you log in."
@@ -364,7 +364,7 @@ msgstr ""
#: ../src/core/util.c:239
msgid "Window manager: "
msgstr ""
msgstr "Finsteroppasser:"
#: ../src/core/util.c:391
msgid "Bug in window manager: "
@@ -384,7 +384,7 @@ msgstr ""
#: ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr ""
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6161
@@ -441,51 +441,51 @@ msgstr ""
#: ../src/include/all-keybindings.h:88
msgid "Switch to workspace 1"
msgstr ""
msgstr "Nah Schrievdisk 1 wesseln"
#: ../src/include/all-keybindings.h:90
msgid "Switch to workspace 2"
msgstr ""
msgstr "Nah Schrievdisk 2 wesseln"
#: ../src/include/all-keybindings.h:92
msgid "Switch to workspace 3"
msgstr ""
msgstr "Nah Schrievdisk 3 wesseln"
#: ../src/include/all-keybindings.h:94
msgid "Switch to workspace 4"
msgstr ""
msgstr "Nah Schrievdisk 4 wesseln"
#: ../src/include/all-keybindings.h:96
msgid "Switch to workspace 5"
msgstr ""
msgstr "Nah Schrievdisk 5 wesseln"
#: ../src/include/all-keybindings.h:98
msgid "Switch to workspace 6"
msgstr ""
msgstr "Nah Schrievdisk 6 wesseln"
#: ../src/include/all-keybindings.h:100
msgid "Switch to workspace 7"
msgstr ""
msgstr "Nah Schrievdisk 7 wesseln"
#: ../src/include/all-keybindings.h:102
msgid "Switch to workspace 8"
msgstr ""
msgstr "Nah Schrievdisk 8 wesseln"
#: ../src/include/all-keybindings.h:104
msgid "Switch to workspace 9"
msgstr ""
msgstr "Nah Schrievdisk 9 wesseln"
#: ../src/include/all-keybindings.h:106
msgid "Switch to workspace 10"
msgstr ""
msgstr "Nah Schrievdisk 10 wesseln"
#: ../src/include/all-keybindings.h:108
msgid "Switch to workspace 11"
msgstr ""
msgstr "Nah Schrievdisk 11 wesseln"
#: ../src/include/all-keybindings.h:110
msgid "Switch to workspace 12"
msgstr ""
msgstr "Nah Schrievdisk 12 wesseln"
#: ../src/include/all-keybindings.h:122
msgid "Switch to workspace on the left of the current workspace"
@@ -577,7 +577,7 @@ msgstr ""
#: ../src/include/all-keybindings.h:256
msgid "Run a terminal"
msgstr ""
msgstr "Een Terminal lööpen laten"
#: ../src/include/all-keybindings.h:271
msgid "Activate the window menu"

1966
po/pa.po

File diff suppressed because it is too large Load Diff

2731
po/pl.po

File diff suppressed because it is too large Load Diff

2118
po/sk.po

File diff suppressed because it is too large Load Diff

397
po/sl.po
View File

@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&component=general\n"
"POT-Creation-Date: 2010-02-11 18:07+0000\n"
"PO-Revision-Date: 2010-02-11 20:58+0100\n"
"POT-Creation-Date: 2010-04-15 02:19+0000\n"
"PO-Revision-Date: 2010-04-17 19:38+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"MIME-Version: 1.0\n"
@@ -32,24 +32,24 @@ msgid "Unknown window information request: %d"
msgstr "Zahteva izpisa podrobnosti neznanega okna: %d"
#. Translators: %s is a window title
#: ../src/core/delete.c:94
#: ../src/core/delete.c:95
#, c-format
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> se ne odziva."
#: ../src/core/delete.c:99
#: ../src/core/delete.c:100
msgid "You may choose to wait a short while for it to continue or force the application to quit entirely."
msgstr "Lahko še malo počakate, če se program morda zbudi, ali pa vsilite končanje delovanja."
#: ../src/core/delete.c:108
#: ../src/core/delete.c:109
msgid "_Wait"
msgstr "_Počakaj"
#: ../src/core/delete.c:108
#: ../src/core/delete.c:109
msgid "_Force Quit"
msgstr "_Vsili izhod"
msgstr "_Vsili konec"
#: ../src/core/delete.c:206
#: ../src/core/delete.c:207
#, c-format
msgid "Failed to get hostname: %s\n"
msgstr "Ni mogoče dobiti gostitelja z imenom: %s\n"
@@ -81,7 +81,7 @@ msgid "Fatal IO error %d (%s) on display '%s'.\n"
msgstr "Usodna napaka IO %d (%s) na zaslonu '%s'.\n"
# G:1 K:0 O:0
#: ../src/core/keybindings.c:697
#: ../src/core/keybindings.c:708
#, c-format
msgid "Some other program is already using the key %s with modifiers %x as a binding\n"
msgstr "Tipko %s s spremenilnikom %x uporablja že nek drug program\n"
@@ -89,7 +89,7 @@ msgstr "Tipko %s s spremenilnikom %x uporablja že nek drug program\n"
#. Displayed when a keybinding which is
#. * supposed to launch a program fails.
#.
#: ../src/core/keybindings.c:2388
#: ../src/core/keybindings.c:2399
#, c-format
msgid ""
"There was an error running <tt>%s</tt>:\n"
@@ -100,12 +100,12 @@ msgstr ""
"\n"
"%s"
#: ../src/core/keybindings.c:2478
#: ../src/core/keybindings.c:2489
#, c-format
msgid "No command %d has been defined.\n"
msgstr "Ukaz %d ni bil naveden.\n"
#: ../src/core/keybindings.c:3491
#: ../src/core/keybindings.c:3502
#, c-format
msgid "No terminal command has been defined.\n"
msgstr "Ni bilo navedenih ukazov terminala.\n"
@@ -175,17 +175,17 @@ msgstr "Ali naj bo prikazan okvir okna med kroženjem oken."
msgid "Internal argument for GObject introspection"
msgstr "Notranji argument za GObject"
#: ../src/core/main.c:662
#: ../src/core/main.c:663
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Ni mogoče preiskati mape tem: %s\n"
#: ../src/core/main.c:678
#: ../src/core/main.c:679
#, c-format
msgid "Could not find a theme! Be sure %s exists and contains the usual themes.\n"
msgstr "Ni mogoče najti teme! Prepričajte se, da %s obstaja in vsebuje običajne teme.\n"
#: ../src/core/main.c:742
#: ../src/core/main.c:743
#, c-format
msgid "Failed to restart: %s\n"
msgstr "Ni mogoče znova pognati: %s\n"
@@ -201,84 +201,94 @@ msgstr "Ni mogoče znova pognati: %s\n"
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:525
#: ../src/core/prefs.c:686
#: ../src/core/prefs.c:536
#: ../src/core/prefs.c:697
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "Ključ GConf '%s' je nastavljen na neveljavno vrednost\n"
#: ../src/core/prefs.c:612
#: ../src/core/prefs.c:855
#: ../src/core/prefs.c:623
#: ../src/core/prefs.c:866
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr "%d shranjen v GConf ključu %s je izven meja med %d in %d\n"
# G:1 K:0 O:0
#: ../src/core/prefs.c:656
#: ../src/core/prefs.c:733
#: ../src/core/prefs.c:781
#: ../src/core/prefs.c:845
#: ../src/core/prefs.c:1145
#: ../src/core/prefs.c:1161
#: ../src/core/prefs.c:1178
#: ../src/core/prefs.c:1194
#: ../src/core/prefs.c:667
#: ../src/core/prefs.c:744
#: ../src/core/prefs.c:792
#: ../src/core/prefs.c:856
#: ../src/core/prefs.c:1323
#: ../src/core/prefs.c:1339
#: ../src/core/prefs.c:1356
#: ../src/core/prefs.c:1372
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "Ključ GConf \"%s\" je nastavljen na neveljavno vrsto\n"
#: ../src/core/prefs.c:1285
#: ../src/core/prefs.c:1202
#, c-format
msgid "GConf key %s is already in use and can't be used to override %s\n"
msgstr "Ključ GConf %s je že v uporabi in ga ni mogoče uporabiti za prepis %s\n"
#: ../src/core/prefs.c:1261
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "Ni mogoče prepisati ključa GConf, saj %s ni mogoče najti.\n"
#: ../src/core/prefs.c:1463
msgid "Workarounds for broken applications disabled. Some applications may not behave properly.\n"
msgstr "Obhodi za pokvarjene programe so izključeni. Nekateri programi se morda ne bodo pravilno obnašali.\n"
#: ../src/core/prefs.c:1356
#: ../src/core/prefs.c:1534
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr "Ni mogoče razčleniti opisa \"%s\" iz ključa GConf %s\n"
#: ../src/core/prefs.c:1418
#: ../src/core/prefs.c:1596
#, c-format
msgid "\"%s\" found in configuration database is not a valid value for mouse button modifier\n"
msgstr "\"%s\", ki je bil najden v podatkovni zbirki nastavitev ni veljaven spremenilnik za miškine gumbe.\n"
#: ../src/core/prefs.c:1845
#: ../src/core/prefs.c:2023
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "Napaka ob nastavljanju števila delovnih površin na %d: %s\n"
# G:1 K:0 O:0
#: ../src/core/prefs.c:2005
#: ../src/core/prefs.c:2511
#: ../src/core/prefs.c:2205
#: ../src/core/prefs.c:2707
#, c-format
msgid "Workspace %d"
msgstr "Delovna površina %d"
#: ../src/core/prefs.c:2038
#: ../src/core/prefs.c:2216
#: ../src/core/prefs.c:2237
#: ../src/core/prefs.c:2415
#, c-format
msgid "\"%s\" found in configuration database is not a valid value for keybinding \"%s\"\n"
msgstr "\"%s\" najden v podatkovni zbirki nastavitev ni veljaven ključ za tipkovno vez \"%s\"\n"
#: ../src/core/prefs.c:2592
#: ../src/core/prefs.c:2788
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr "Napaka ob nastavljanju imena delovne površine %d na \"%s\": %s\n"
#: ../src/core/prefs.c:2796
#: ../src/core/prefs.c:2992
#, c-format
msgid "Error setting compositor status: %s\n"
msgstr "Napaka pri nastavljanju stanja skladanja: %s\n"
#: ../src/core/prefs.c:2824
#: ../src/core/prefs.c:3021
#, c-format
msgid "Error setting clutter plugin list: %s\n"
msgstr "Napaka pri nastavljanju seznama vstavkov clutter: %s\n"
#: ../src/core/prefs.c:2867
#: ../src/core/prefs.c:3065
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr "Napaka pri nastavljanju stanja skritih oken: %s\n"
#: ../src/core/prefs.c:2895
#: ../src/core/prefs.c:3093
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr "Napaka pri nastavljanju stanja pojavnih oken: %s\n"
@@ -411,7 +421,7 @@ msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6183
#: ../src/core/window.c:6217
#, c-format
msgid "Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER window as specified in the ICCCM.\n"
msgstr "Okno %s nastavi svoj SM_CLIENT_ID, namesto, da bi nastavilo WM_CLIENT_LEADER kot je zavedeno v ICCCM.\n"
@@ -423,7 +433,7 @@ msgstr "Okno %s nastavi svoj SM_CLIENT_ID, namesto, da bi nastavilo WM_CLIENT_LE
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:6846
#: ../src/core/window.c:6880
#, c-format
msgid "Window %s sets an MWM hint indicating it isn't resizable, but sets min size %d x %d and max size %d x %d; this doesn't make much sense.\n"
msgstr "Okno %s določi namig MWM, ki pove, da ni mogoče spremeniti velikosti, hkrati pa določi najmanjšo velikost na %d x %d in največjo na %d x %d; vrednost ni smiselna.\n"
@@ -810,51 +820,51 @@ msgstr "Ta vrednost začne \"prevleko\", ki združuje predogled okna in zaganjal
msgid "Usage: %s\n"
msgstr "Uporaba: %s\n"
#: ../src/ui/frames.c:1118
#: ../src/ui/frames.c:1119
msgid "Close Window"
msgstr "Zapri okno"
# G:1 K:1 O:0
#: ../src/ui/frames.c:1121
#: ../src/ui/frames.c:1122
msgid "Window Menu"
msgstr "Meni okna"
# G:0 K:1 O:0
#: ../src/ui/frames.c:1124
#: ../src/ui/frames.c:1125
msgid "Minimize Window"
msgstr "Skrči okno"
#: ../src/ui/frames.c:1127
#: ../src/ui/frames.c:1128
msgid "Maximize Window"
msgstr "Razpri okno"
#: ../src/ui/frames.c:1130
#: ../src/ui/frames.c:1131
msgid "Restore Window"
msgstr "Obnovi okno"
# G:2 K:0 O:0
#: ../src/ui/frames.c:1133
#: ../src/ui/frames.c:1134
msgid "Roll Up Window"
msgstr "Zavij okno"
#: ../src/ui/frames.c:1136
#: ../src/ui/frames.c:1137
msgid "Unroll Window"
msgstr "Odvij okno"
#: ../src/ui/frames.c:1139
#: ../src/ui/frames.c:1140
msgid "Keep Window On Top"
msgstr "Ohrani okno na vrhu"
#: ../src/ui/frames.c:1142
#: ../src/ui/frames.c:1143
msgid "Remove Window From Top"
msgstr "Odstrani okno z vrha"
# G:1 K:0 O:0
#: ../src/ui/frames.c:1145
#: ../src/ui/frames.c:1146
msgid "Always On Visible Workspace"
msgstr "Vedno na vidni delovni površini"
#: ../src/ui/frames.c:1148
#: ../src/ui/frames.c:1149
msgid "Put Window On Only One Workspace"
msgstr "Postavi okno na samo eno delovno površino"
@@ -1233,79 +1243,79 @@ msgstr "Izraz koordinat se konča z operatorjem namesto z operandom"
msgid "Coordinate expression has operator \"%c\" following operator \"%c\" with no operand in between"
msgstr "Izraz koordinat vsebuje operator \"%c\", ki sledi operatorju \"%c\", brez vmesnega operanda"
#: ../src/ui/theme.c:2195
#: ../src/ui/theme.c:2236
#: ../src/ui/theme.c:2199
#: ../src/ui/theme.c:2244
#, c-format
msgid "Coordinate expression had unknown variable or constant \"%s\""
msgstr "Izraz koordinat vsebuje neznano spremenljivko ali konstanto \"%s\""
#: ../src/ui/theme.c:2290
#: ../src/ui/theme.c:2298
#, c-format
msgid "Coordinate expression parser overflowed its buffer."
msgstr "Razčlenjevalnik izrazov koordinat je preplavil medpomnilnik."
#: ../src/ui/theme.c:2319
#: ../src/ui/theme.c:2327
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr "Izraz koordinat vsebuje zaklepaj, a ne oklepaja"
#: ../src/ui/theme.c:2383
#: ../src/ui/theme.c:2391
#, c-format
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
msgstr "Izraz koordinat vsebuje uklepaj, vendar je brez zaklepaja"
#: ../src/ui/theme.c:2394
#: ../src/ui/theme.c:2402
#, c-format
msgid "Coordinate expression doesn't seem to have any operators or operands"
msgstr "Videti je, da izraz koordinat ne vsebuje operatorjev ali operandov"
#: ../src/ui/theme.c:2596
#: ../src/ui/theme.c:2616
#: ../src/ui/theme.c:2636
#: ../src/ui/theme.c:2604
#: ../src/ui/theme.c:2624
#: ../src/ui/theme.c:2644
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "Tema vsebuje izraz, ki je povzročil napako: %s\n"
#: ../src/ui/theme.c:4203
#: ../src/ui/theme.c:4255
#, c-format
msgid "<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be specified for this frame style"
msgstr "za ta slog okvirja mora biti naveden <button function=\"%s\" state=\"%s\" draw_ops=\"karkoli\"/>"
#: ../src/ui/theme.c:4711
#: ../src/ui/theme.c:4736
#: ../src/ui/theme.c:4763
#: ../src/ui/theme.c:4788
#, c-format
msgid "Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr "Manjka <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"karkoli\"/>"
#: ../src/ui/theme.c:4780
#: ../src/ui/theme.c:4832
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "Nalaganje teme \"%s\" ni uspelo: %s\n"
#: ../src/ui/theme.c:4910
#: ../src/ui/theme.c:4917
#: ../src/ui/theme.c:4924
#: ../src/ui/theme.c:4931
#: ../src/ui/theme.c:4938
#: ../src/ui/theme.c:4964
#: ../src/ui/theme.c:4971
#: ../src/ui/theme.c:4978
#: ../src/ui/theme.c:4985
#: ../src/ui/theme.c:4992
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "Ni nastavljen <%s> za temo \"%s\""
#: ../src/ui/theme.c:4946
#: ../src/ui/theme.c:5000
#, c-format
msgid "No frame style set for window type \"%s\" in theme \"%s\", add a <window type=\"%s\" style_set=\"whatever\"/> element"
msgstr "Slog okvirja za okno vrste \"%s\" v temi \"%s\" ni nastavljen, dodajte element <window type=\"%s\" style_set=\"whatever\"/>"
#: ../src/ui/theme.c:5389
#: ../src/ui/theme.c:5451
#: ../src/ui/theme.c:5514
#: ../src/ui/theme.c:5443
#: ../src/ui/theme.c:5505
#: ../src/ui/theme.c:5568
#, c-format
msgid "User-defined constants must begin with a capital letter; \"%s\" does not"
msgstr "Uporabniško določene konstante se morajo začeti z veliko črko; \"%s\" se ne"
#: ../src/ui/theme.c:5397
#: ../src/ui/theme.c:5459
#: ../src/ui/theme.c:5522
#: ../src/ui/theme.c:5451
#: ../src/ui/theme.c:5513
#: ../src/ui/theme.c:5576
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "Konstanta \"%s\" je bila že določena"
@@ -1313,362 +1323,371 @@ msgstr "Konstanta \"%s\" je bila že določena"
#. Translators: This means that an attribute which should have been found
#. * on an XML element was not in fact found.
#.
#: ../src/ui/theme-parser.c:202
#: ../src/ui/theme-parser.c:236
#, c-format
msgid "No \"%s\" attribute on element <%s>"
msgstr "Ni atributa \"%s\" za element <%s>"
#: ../src/ui/theme-parser.c:231
#: ../src/ui/theme-parser.c:249
#: ../src/ui/theme-parser.c:265
#: ../src/ui/theme-parser.c:283
#, c-format
msgid "Line %d character %d: %s"
msgstr "Vrstica %d, znak %d: %s"
#: ../src/ui/theme-parser.c:413
#: ../src/ui/theme-parser.c:479
#, c-format
msgid "Attribute \"%s\" repeated twice on the same <%s> element"
msgstr "Atribut \"%s\" je bil v enakem elementu <%s> ponovljen dvakrat"
#: ../src/ui/theme-parser.c:437
#: ../src/ui/theme-parser.c:480
#: ../src/ui/theme-parser.c:503
#: ../src/ui/theme-parser.c:552
#, c-format
msgid "Attribute \"%s\" is invalid on <%s> element in this context"
msgstr "Atribut \"%s\" je v tem kontekstu v elementu <%s> neveljaven"
#: ../src/ui/theme-parser.c:522
#: ../src/ui/theme-parser.c:594
#, c-format
msgid "Could not parse \"%s\" as an integer"
msgstr "Ni mogoče razčleniti \"%s\" kot celoštevilčne vrednosti"
#: ../src/ui/theme-parser.c:531
#: ../src/ui/theme-parser.c:586
#: ../src/ui/theme-parser.c:603
#: ../src/ui/theme-parser.c:658
#, c-format
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
msgstr "Ni mogoče razumeti končnih znakov \"%s\" v nizu \"%s\""
#: ../src/ui/theme-parser.c:541
#: ../src/ui/theme-parser.c:613
#, c-format
msgid "Integer %ld must be positive"
msgstr "Celoštevilska vrednost %ld mora biti pozitivna"
#: ../src/ui/theme-parser.c:549
#: ../src/ui/theme-parser.c:621
#, c-format
msgid "Integer %ld is too large, current max is %d"
msgstr "Celoštevilska vrednost %ld je prevelika, trenutna omejitev je %d"
#: ../src/ui/theme-parser.c:577
#: ../src/ui/theme-parser.c:693
#: ../src/ui/theme-parser.c:649
#: ../src/ui/theme-parser.c:765
#, c-format
msgid "Could not parse \"%s\" as a floating point number"
msgstr "Ni mogoče razčleniti \"%s\" kot števila s plavajočo vejico"
#: ../src/ui/theme-parser.c:608
#: ../src/ui/theme-parser.c:636
#: ../src/ui/theme-parser.c:680
#: ../src/ui/theme-parser.c:708
#, c-format
msgid "Boolean values must be \"true\" or \"false\" not \"%s\""
msgstr "Logične vrednosti morajo biti \"prav\" ali \"napak\" in ne \"%s\""
#: ../src/ui/theme-parser.c:663
#: ../src/ui/theme-parser.c:735
#, c-format
msgid "Angle must be between 0.0 and 360.0, was %g\n"
msgstr "Kot mora biti med 0.0 in 360.0, bil pa je %g\n"
#: ../src/ui/theme-parser.c:726
#: ../src/ui/theme-parser.c:798
#, c-format
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
msgstr "Alfa mora biti med 0.0 (nevidno) in 1.0 (popolnoma vidno), bilo je %g\n"
#: ../src/ui/theme-parser.c:791
#: ../src/ui/theme-parser.c:863
#, c-format
msgid "Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,large,x-large,xx-large)\n"
msgstr "Neveljavna velikost naziva \"%s\" (mora biti eno od xx-small,x-small,small,medium,large,x-large,xx-large)\n"
#: ../src/ui/theme-parser.c:936
#: ../src/ui/theme-parser.c:999
#: ../src/ui/theme-parser.c:1033
#: ../src/ui/theme-parser.c:1136
#: ../src/ui/theme-parser.c:1008
#: ../src/ui/theme-parser.c:1071
#: ../src/ui/theme-parser.c:1105
#: ../src/ui/theme-parser.c:1208
#, c-format
msgid "<%s> name \"%s\" used a second time"
msgstr "ime <%s> \"%s\" je uporabljeno drugič"
#: ../src/ui/theme-parser.c:948
#: ../src/ui/theme-parser.c:1045
#: ../src/ui/theme-parser.c:1148
#: ../src/ui/theme-parser.c:1020
#: ../src/ui/theme-parser.c:1117
#: ../src/ui/theme-parser.c:1220
#, c-format
msgid "<%s> parent \"%s\" has not been defined"
msgstr "nadrejeni predmet <%s> \"%s\" ni bil naveden"
#: ../src/ui/theme-parser.c:1058
#: ../src/ui/theme-parser.c:1130
#, c-format
msgid "<%s> geometry \"%s\" has not been defined"
msgstr "geometrija <%s> \"%s\" ni bila navedena"
#: ../src/ui/theme-parser.c:1071
#: ../src/ui/theme-parser.c:1143
#, c-format
msgid "<%s> must specify either a geometry or a parent that has a geometry"
msgstr "<%s> mora navesti ali geometrijo ali nadrejeni predmet, ki ima geometrijo"
#: ../src/ui/theme-parser.c:1113
#: ../src/ui/theme-parser.c:1185
msgid "You must specify a background for an alpha value to be meaningful"
msgstr "Določiti morate ozadje, v kolikor želite, da ima alfa vrednost pomen."
#: ../src/ui/theme-parser.c:1180
#: ../src/ui/theme-parser.c:1252
#, c-format
msgid "Unknown type \"%s\" on <%s> element"
msgstr "Neznana vrsta \"%s\" v elementu <%s>"
#: ../src/ui/theme-parser.c:1191
#: ../src/ui/theme-parser.c:1263
#, c-format
msgid "Unknown style_set \"%s\" on <%s> element"
msgstr "Neznan style_set \"%s\" v elementu <%s>"
#: ../src/ui/theme-parser.c:1199
#: ../src/ui/theme-parser.c:1271
#, c-format
msgid "Window type \"%s\" has already been assigned a style set"
msgstr "Vrsti okna \"%s\" je bil nabor sloga že določen"
#: ../src/ui/theme-parser.c:1229
#: ../src/ui/theme-parser.c:1293
#: ../src/ui/theme-parser.c:1519
#: ../src/ui/theme-parser.c:2740
#: ../src/ui/theme-parser.c:2786
#: ../src/ui/theme-parser.c:2934
#: ../src/ui/theme-parser.c:3126
#: ../src/ui/theme-parser.c:3164
#: ../src/ui/theme-parser.c:3202
#: ../src/ui/theme-parser.c:3240
#: ../src/ui/theme-parser.c:1301
#: ../src/ui/theme-parser.c:1365
#: ../src/ui/theme-parser.c:1591
#: ../src/ui/theme-parser.c:2826
#: ../src/ui/theme-parser.c:2872
#: ../src/ui/theme-parser.c:3020
#: ../src/ui/theme-parser.c:3212
#: ../src/ui/theme-parser.c:3250
#: ../src/ui/theme-parser.c:3288
#: ../src/ui/theme-parser.c:3326
#, c-format
msgid "Element <%s> is not allowed below <%s>"
msgstr "Element <%s> ni dovoljen pod <%s>"
#: ../src/ui/theme-parser.c:1343
#: ../src/ui/theme-parser.c:1357
#: ../src/ui/theme-parser.c:1402
#: ../src/ui/theme-parser.c:1415
#: ../src/ui/theme-parser.c:1429
#: ../src/ui/theme-parser.c:1474
msgid "Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" for buttons"
msgstr "Ni mogoče navesti obojega \"button_width\"/\"button_height\" in razmerja\"aspect_ratio\" gumba"
#: ../src/ui/theme-parser.c:1366
#: ../src/ui/theme-parser.c:1438
#, c-format
msgid "Distance \"%s\" is unknown"
msgstr "Razdalja \"%s\" ni znana"
#: ../src/ui/theme-parser.c:1411
#: ../src/ui/theme-parser.c:1483
#, c-format
msgid "Aspect ratio \"%s\" is unknown"
msgstr "Razmerje \"%s\" ni znano"
#: ../src/ui/theme-parser.c:1473
#: ../src/ui/theme-parser.c:1545
#, c-format
msgid "Border \"%s\" is unknown"
msgstr "Rob \"%s\" ni znane vrste"
#: ../src/ui/theme-parser.c:1784
#: ../src/ui/theme-parser.c:1856
#, c-format
msgid "No \"start_angle\" or \"from\" attribute on element <%s>"
msgstr "Element <%s> nima atributa \"start_angle\" ali \"from\""
#: ../src/ui/theme-parser.c:1791
#: ../src/ui/theme-parser.c:1863
#, c-format
msgid "No \"extent_angle\" or \"to\" attribute on element <%s>"
msgstr "Element <%s> nima atributa \"extent_angle\" ali \"to\""
#: ../src/ui/theme-parser.c:2031
#: ../src/ui/theme-parser.c:2103
#, c-format
msgid "Did not understand value \"%s\" for type of gradient"
msgstr "Ni mogoče razumeti vrednost za vrsto preliva \"%s\""
#: ../src/ui/theme-parser.c:2109
#: ../src/ui/theme-parser.c:2484
#: ../src/ui/theme-parser.c:2181
#: ../src/ui/theme-parser.c:2556
#, c-format
msgid "Did not understand fill type \"%s\" for <%s> element"
msgstr "Nerazpoznavna vrsta polnjenja \"%s\" za element <%s>"
#: ../src/ui/theme-parser.c:2276
#: ../src/ui/theme-parser.c:2359
#: ../src/ui/theme-parser.c:2422
#: ../src/ui/theme-parser.c:2348
#: ../src/ui/theme-parser.c:2431
#: ../src/ui/theme-parser.c:2494
#, c-format
msgid "Did not understand state \"%s\" for <%s> element"
msgstr "Ni mogoče razumeti stanja \"%s\" za element <%s>"
#: ../src/ui/theme-parser.c:2286
#: ../src/ui/theme-parser.c:2369
#: ../src/ui/theme-parser.c:2358
#: ../src/ui/theme-parser.c:2441
#, c-format
msgid "Did not understand shadow \"%s\" for <%s> element"
msgstr "Ni mogoče razumeti senčenja \"%s\" za element <%s>"
#: ../src/ui/theme-parser.c:2296
#: ../src/ui/theme-parser.c:2368
#, c-format
msgid "Did not understand arrow \"%s\" for <%s> element"
msgstr "Ni mogoče razumeti puščice \"%s\" za element <%s>"
#: ../src/ui/theme-parser.c:2596
#: ../src/ui/theme-parser.c:2692
#: ../src/ui/theme-parser.c:2682
#: ../src/ui/theme-parser.c:2778
#, c-format
msgid "No <draw_ops> called \"%s\" has been defined"
msgstr "<draw_ops> imenovan \"%s\" ni bil naveden"
#: ../src/ui/theme-parser.c:2608
#: ../src/ui/theme-parser.c:2704
#: ../src/ui/theme-parser.c:2694
#: ../src/ui/theme-parser.c:2790
#, c-format
msgid "Including draw_ops \"%s\" here would create a circular reference"
msgstr "Vključevanje draw_ops \"%s\" tu, bi ustvarilo krožno nanašanje"
#: ../src/ui/theme-parser.c:2819
#: ../src/ui/theme-parser.c:2905
#, c-format
msgid "Unknown position \"%s\" for frame piece"
msgstr "Neznan položaj \"%s\" za del okvirja"
#: ../src/ui/theme-parser.c:2827
#: ../src/ui/theme-parser.c:2913
#, c-format
msgid "Frame style already has a piece at position %s"
msgstr "Slog okvirja že ima del na položaju %s"
#: ../src/ui/theme-parser.c:2844
#: ../src/ui/theme-parser.c:2919
#: ../src/ui/theme-parser.c:2930
#: ../src/ui/theme-parser.c:3005
#, c-format
msgid "No <draw_ops> with the name \"%s\" has been defined"
msgstr "Za ime \"%s\" ni bilo navedenega <draw_ops>"
#: ../src/ui/theme-parser.c:2873
#: ../src/ui/theme-parser.c:2959
#, c-format
msgid "Unknown function \"%s\" for button"
msgstr "Neznana funkcija \"%s\" za gumb"
#: ../src/ui/theme-parser.c:2882
#: ../src/ui/theme-parser.c:2968
#, c-format
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
msgstr "Funkcija gumba \"%s\" ne obstaja v tej različici (%d, zahtevana %d)"
#: ../src/ui/theme-parser.c:2894
#: ../src/ui/theme-parser.c:2980
#, c-format
msgid "Unknown state \"%s\" for button"
msgstr "Neznano stanje \"%s\" za gumb"
#: ../src/ui/theme-parser.c:2902
#: ../src/ui/theme-parser.c:2988
#, c-format
msgid "Frame style already has a button for function %s state %s"
msgstr "Slog okvirja že ima gumb za funkcijo %s stanje %s"
#: ../src/ui/theme-parser.c:2973
#: ../src/ui/theme-parser.c:3059
#, c-format
msgid "\"%s\" is not a valid value for focus attribute"
msgstr "\"%s\" ni veljavna vrednost za atribut \"focus\""
#: ../src/ui/theme-parser.c:2982
#: ../src/ui/theme-parser.c:3068
#, c-format
msgid "\"%s\" is not a valid value for state attribute"
msgstr "\"%s\" ni veljavna vrednost za atribut \"state\""
#: ../src/ui/theme-parser.c:2992
#: ../src/ui/theme-parser.c:3078
#, c-format
msgid "A style called \"%s\" has not been defined"
msgstr "Slog imenovan \"%s\" ni bil določen"
#: ../src/ui/theme-parser.c:3013
#: ../src/ui/theme-parser.c:3036
#: ../src/ui/theme-parser.c:3099
#: ../src/ui/theme-parser.c:3122
#, c-format
msgid "\"%s\" is not a valid value for resize attribute"
msgstr "\"%s\" ni veljavna vrednost za atribut \"resize\""
#: ../src/ui/theme-parser.c:3047
#: ../src/ui/theme-parser.c:3133
#, c-format
msgid "Should not have \"resize\" attribute on <%s> element for maximized/shaded states"
msgstr "Element <%s> ne bi smel imeti atributa \"resize\" za razpeta/senčena stanja"
#: ../src/ui/theme-parser.c:3061
#: ../src/ui/theme-parser.c:3147
#, c-format
msgid "Should not have \"resize\" attribute on <%s> element for maximized states"
msgstr "Element <%s> ne bi smel imeti atributa \"resize\" za razpeta stanja"
#: ../src/ui/theme-parser.c:3075
#: ../src/ui/theme-parser.c:3097
#: ../src/ui/theme-parser.c:3161
#: ../src/ui/theme-parser.c:3183
#, c-format
msgid "Style has already been specified for state %s resize %s focus %s"
msgstr "Slog za stanje %s resize %s fokus %s je bil že naveden"
#: ../src/ui/theme-parser.c:3086
#: ../src/ui/theme-parser.c:3108
#: ../src/ui/theme-parser.c:3172
#: ../src/ui/theme-parser.c:3194
#, c-format
msgid "Style has already been specified for state %s focus %s"
msgstr "Slog za stanje %s fokus %s je bil že naveden"
#: ../src/ui/theme-parser.c:3147
#: ../src/ui/theme-parser.c:3233
msgid "Can't have a two draw_ops for a <piece> element (theme specified a draw_ops attribute and also a <draw_ops> element, or specified two elements)"
msgstr "Za element <piece> ni mogoče imeti dveh draw_ops (tema je navedla atribut draw_ops in hkrati element <draw_ops> ali navedena dva elementa)"
#: ../src/ui/theme-parser.c:3185
#: ../src/ui/theme-parser.c:3271
msgid "Can't have a two draw_ops for a <button> element (theme specified a draw_ops attribute and also a <draw_ops> element, or specified two elements)"
msgstr "Za element <button> ni mogoče imeti dveh draw_ops (tema je navedla atribut draw_ops in hkrati element <draw_ops> ali navedena dva elementa)"
#: ../src/ui/theme-parser.c:3223
#: ../src/ui/theme-parser.c:3309
msgid "Can't have a two draw_ops for a <menu_icon> element (theme specified a draw_ops attribute and also a <draw_ops> element, or specified two elements)"
msgstr "Za element <menu_icon> ni mogoče imeti dveh draw_ops (tema je navedla atribut draw_ops in hkrati element <draw_ops> ali navedena dva elementa)"
#: ../src/ui/theme-parser.c:3271
#: ../src/ui/theme-parser.c:3373
#, c-format
msgid "Bad version specification '%s'"
msgstr "Slabo določilo različice '%s'"
#: ../src/ui/theme-parser.c:3446
msgid "\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-theme-2.xml"
msgstr "atributa \"version\" ni mogoče uporabiti v temi metacity-theme-1.xml oziroma metacity-theme-2.xml"
#: ../src/ui/theme-parser.c:3469
#, c-format
msgid "Theme requires version %s but latest supported theme version is %d.%d"
msgstr "Tema zahteva različico %s, zadnja podprta različica teme pa je %d.%d"
#: ../src/ui/theme-parser.c:3501
#, c-format
msgid "Outermost element in theme must be <metacity_theme> not <%s>"
msgstr "Najbolj zunanji element teme mora biti <metacity_theme> in ne <%s>"
#: ../src/ui/theme-parser.c:3291
#: ../src/ui/theme-parser.c:3521
#, c-format
msgid "Element <%s> is not allowed inside a name/author/date/description element"
msgstr "Element <%s> ni dovoljen znotraj elementov name, author, date ali description"
#: ../src/ui/theme-parser.c:3296
#: ../src/ui/theme-parser.c:3526
#, c-format
msgid "Element <%s> is not allowed inside a <constant> element"
msgstr "Element <%s> ni dovoljen znotraj elementa <constant>"
#: ../src/ui/theme-parser.c:3308
#: ../src/ui/theme-parser.c:3538
#, c-format
msgid "Element <%s> is not allowed inside a distance/border/aspect_ratio element"
msgstr "Element <%s> ni dovoljen znotraj elementov distance/border/aspect_ration"
#: ../src/ui/theme-parser.c:3330
#: ../src/ui/theme-parser.c:3560
#, c-format
msgid "Element <%s> is not allowed inside a draw operation element"
msgstr "Element <%s> ni dovoljen znotraj elementa operacije draw"
#: ../src/ui/theme-parser.c:3340
#: ../src/ui/theme-parser.c:3370
#: ../src/ui/theme-parser.c:3375
#: ../src/ui/theme-parser.c:3380
#: ../src/ui/theme-parser.c:3570
#: ../src/ui/theme-parser.c:3600
#: ../src/ui/theme-parser.c:3605
#: ../src/ui/theme-parser.c:3610
#, c-format
msgid "Element <%s> is not allowed inside a <%s> element"
msgstr "Element <%s> ni dovoljen znotraj elementa <%s>"
#: ../src/ui/theme-parser.c:3602
#: ../src/ui/theme-parser.c:3838
msgid "No draw_ops provided for frame piece"
msgstr "Za del okvirja ni naveden draw_ops"
#: ../src/ui/theme-parser.c:3617
#: ../src/ui/theme-parser.c:3853
msgid "No draw_ops provided for button"
msgstr "Za gumb ni naveden draw_ops"
#: ../src/ui/theme-parser.c:3669
#: ../src/ui/theme-parser.c:3907
#, c-format
msgid "No text is allowed inside element <%s>"
msgstr "Znotraj elementa <%s> besedilo ni dovoljeno"
#: ../src/ui/theme-parser.c:3724
#: ../src/ui/theme-parser.c:3736
#: ../src/ui/theme-parser.c:3748
#: ../src/ui/theme-parser.c:3760
#: ../src/ui/theme-parser.c:3772
#: ../src/ui/theme-parser.c:3965
#: ../src/ui/theme-parser.c:3977
#: ../src/ui/theme-parser.c:3989
#: ../src/ui/theme-parser.c:4001
#: ../src/ui/theme-parser.c:4013
#, c-format
msgid "<%s> specified twice for this theme"
msgstr "<%s> je za to temo naveden dvakrat"
#: ../src/ui/theme-parser.c:4040
#: ../src/ui/theme-parser.c:4283
#, c-format
msgid "Failed to find a valid file for theme %s\n"
msgstr "Ni mogoče najti veljavne datoteke za temo %s\n"
#: ../src/ui/theme-parser.c:4096
#, c-format
msgid "Theme file %s did not contain a root <metacity_theme> element"
msgstr "Datoteka teme %s ne vsebuje korenskega elementa <metacity_theme>"
#: ../src/ui/theme-viewer.c:75
msgid "/_Windows"
msgstr "/_Okna"
@@ -1839,12 +1858,12 @@ msgstr "Pričakovana je napaka, vendar odziva ni bilo"
#: ../src/ui/theme-viewer.c:1255
#, c-format
msgid "Error %d was expected but %d given"
msgstr "Pričakovana je napaka %d, vrnjena pa je bilo %d"
msgstr "Pričakovana je napaka %d, vrnjena pa je bila %d"
#: ../src/ui/theme-viewer.c:1261
#, c-format
msgid "Error not expected but one was returned: %s"
msgstr "Napaka ni pričakovana, vendar je vrnjena: %s"
msgstr "Napaka ni pričakovana, vendar je vrnjen odziv: %s"
#: ../src/ui/theme-viewer.c:1265
#, c-format
@@ -1854,13 +1873,15 @@ msgstr "vrednost x je %d, pričakovana pa je %d"
#: ../src/ui/theme-viewer.c:1268
#, c-format
msgid "y value was %d, %d was expected"
msgstr "vrednost z je %d, pričakovana pa je %d"
msgstr "vrednost y je %d, pričakovana pa je %d"
#: ../src/ui/theme-viewer.c:1333
#, c-format
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
msgstr "%d izjav koordinat razčlenjenih v %g sekundah (%g sekund v povprečju)\n"
#~ msgid "Theme file %s did not contain a root <metacity_theme> element"
#~ msgstr "Datoteka teme %s ne vsebuje korenskega elementa <metacity_theme>"
#~ msgid "Failed to read saved session file %s: %s\n"
#~ msgstr "Ni mogoče prebrati datoteke shranjene seje %s: %s\n"
#~ msgid "<author> specified twice for this theme"

File diff suppressed because it is too large Load Diff

View File

@@ -39,6 +39,7 @@ mutter_SOURCES= \
compositor/mutter-shaped-texture.h \
compositor/tidy/tidy-texture-frame.c \
compositor/tidy/tidy-texture-frame.h \
gtk-compat.h \
include/compositor.h \
include/mutter-plugin.h \
include/mutter-window.h \

View File

@@ -33,59 +33,6 @@ composite_at_least_version (MetaDisplay *display, int maj, int min)
return (major > maj || (major == maj && minor >= min));
}
static MutterWindow*
find_window_for_screen (MetaScreen *screen, Window xwindow)
{
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
if (info == NULL)
return NULL;
return g_hash_table_lookup (info->windows_by_xid,
(gpointer) xwindow);
}
static MutterWindow *
find_window_in_display (MetaDisplay *display, Window xwindow)
{
GSList *index;
MetaWindow *window = meta_display_lookup_x_window (display, xwindow);
if (window)
{
void *priv = meta_window_get_compositor_private (window);
if (priv)
return priv;
}
for (index = meta_display_get_screens (display);
index;
index = index->next)
{
MutterWindow *cw = find_window_for_screen (index->data, xwindow);
if (cw != NULL)
return cw;
}
return NULL;
}
static MutterWindow *
find_window_for_child_window_in_display (MetaDisplay *display, Window xwindow)
{
Window ignored1, *ignored2, parent;
guint ignored_children;
XQueryTree (meta_display_get_xdisplay (display), xwindow, &ignored1,
&parent, &ignored2, &ignored_children);
if (parent != None)
return find_window_in_display (display, parent);
return NULL;
}
static void sync_actor_stacking (GList *windows);
static void
@@ -144,9 +91,15 @@ add_win (MetaWindow *window)
static void
process_damage (MetaCompositor *compositor,
XDamageNotifyEvent *event)
XDamageNotifyEvent *event,
MetaWindow *window)
{
MutterWindow *cw = find_window_in_display (compositor->display, event->drawable);
MutterWindow *cw;
if (window == NULL)
return;
cw = MUTTER_WINDOW (meta_window_get_compositor_private (window));
if (cw == NULL)
return;
@@ -156,10 +109,15 @@ process_damage (MetaCompositor *compositor,
#ifdef HAVE_SHAPE
static void
process_shape (MetaCompositor *compositor,
XShapeEvent *event)
XShapeEvent *event,
MetaWindow *window)
{
MutterWindow *cw = find_window_in_display (compositor->display,
event->window);
MutterWindow *cw;
if (window == NULL)
return;
cw = MUTTER_WINDOW (meta_window_get_compositor_private (window));
if (cw == NULL)
return;
@@ -172,43 +130,29 @@ process_shape (MetaCompositor *compositor,
static void
process_property_notify (MetaCompositor *compositor,
XPropertyEvent *event)
XPropertyEvent *event,
MetaWindow *window)
{
MetaDisplay *display = compositor->display;
MutterWindow *cw;
if (window == NULL)
return;
cw = MUTTER_WINDOW (meta_window_get_compositor_private (window));
if (cw == NULL)
return;
/* Check for the opacity changing */
if (event->atom == compositor->atom_net_wm_window_opacity)
{
MutterWindow *cw = find_window_in_display (display, event->window);
if (!cw)
{
/* Applications can set this for their toplevel windows, so
* this must be propagated to the window managed by the compositor
*/
cw = find_window_for_child_window_in_display (display,
event->window);
}
if (!cw)
{
DEBUG_TRACE ("process_property_notify: opacity, early exit\n");
return;
}
mutter_window_update_opacity (cw);
DEBUG_TRACE ("process_property_notify: net_wm_window_opacity\n");
return;
}
else if (event->atom == meta_display_get_atom (display,
META_ATOM__NET_WM_WINDOW_TYPE))
{
MutterWindow *cw = find_window_in_display (display, event->window);
if (!cw)
{
DEBUG_TRACE ("process_property_notify: net_wm_type, early exit\n");
return;
}
mutter_window_update_window_type (cw);
DEBUG_TRACE ("process_property_notify: net_wm_type\n");
return;
@@ -505,7 +449,6 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
info->output = None;
info->windows = NULL;
info->windows_by_xid = g_hash_table_new (g_direct_hash, g_direct_equal);
meta_screen_set_cm_selection (screen);
@@ -545,9 +488,17 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
clutter_actor_hide (info->hidden_group);
info->plugin_mgr =
mutter_plugin_manager_new (screen);
if (!mutter_plugin_manager_load (info->plugin_mgr))
g_critical ("failed to load plugins");
mutter_plugin_manager_get (screen);
if (info->plugin_mgr != mutter_plugin_manager_get_default ())
{
/* The default plugin manager has been initialized during
* global preferences load.
*/
if (!mutter_plugin_manager_load (info->plugin_mgr))
g_critical ("failed to load plugins");
}
if (!mutter_plugin_manager_initialize (info->plugin_mgr))
g_critical ("failed to initialize plugins");
@@ -634,8 +585,8 @@ is_grabbed_event (XEvent *event)
case EnterNotify:
case LeaveNotify:
case MotionNotify:
case KeyPressMask:
case KeyReleaseMask:
case KeyPress:
case KeyRelease:
return TRUE;
}
@@ -696,38 +647,37 @@ meta_compositor_process_event (MetaCompositor *compositor,
}
}
/*
* This trap is so that none of the compositor functions cause
* X errors. This is really a hack, but I'm afraid I don't understand
* enough about Metacity/X to know how else you are supposed to do it
*/
meta_error_trap_push (compositor->display);
switch (event->type)
{
case PropertyNotify:
process_property_notify (compositor, (XPropertyEvent *) event);
process_property_notify (compositor, (XPropertyEvent *) event, window);
break;
default:
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);
process_damage (compositor, (XDamageNotifyEvent *) event, window);
}
#ifdef HAVE_SHAPE
else if (event->type == meta_display_get_shape_event_base (compositor->display) + ShapeNotify)
{
DEBUG_TRACE ("meta_compositor_process_event (process_shape)\n");
process_shape (compositor, (XShapeEvent *) event);
process_shape (compositor, (XShapeEvent *) event, window);
}
#endif /* HAVE_SHAPE */
break;
}
meta_error_trap_pop (compositor->display, FALSE);
/* Clutter needs to know about MapNotify events otherwise it will
think the stage is invisible */
if (event->type == MapNotify)
@@ -840,7 +790,6 @@ meta_compositor_switch_workspace (MetaCompositor *compositor,
if (!info->plugin_mgr ||
!mutter_plugin_manager_switch_workspace (info->plugin_mgr,
(const GList **)&info->windows,
from_indx,
to_indx,
direction))

View File

@@ -39,26 +39,27 @@
*/
static GHashTable *plugin_modules = NULL;
/*
* We have one "default plugin manager" that acts for the first screen,
* but also can be used before we open any screens, and additional
* plugin managers for each screen. (This is ugly. Probably we should
* have one plugin manager and only make the plugins per-screen.)
*/
static MutterPluginManager *default_plugin_manager;
static gboolean mutter_plugin_manager_reload (MutterPluginManager *plugin_mgr);
struct MutterPluginManager
{
MetaScreen *screen;
GList /* MutterPluginPending */ *pending_plugin_modules; /* Plugins not yet fully loaded */
GList /* MutterPlugin */ *plugins; /* TODO -- maybe use hash table */
GList *unload; /* Plugins that are disabled and pending unload */
guint idle_unload_id;
};
typedef struct MutterPluginPending
{
MutterModule *module;
char *path;
char *params;
} MutterPluginPending;
/*
* Checks that the plugin is compatible with the WM and sets up the plugin
* struct.
@@ -78,7 +79,6 @@ mutter_plugin_load (MutterPluginManager *mgr,
}
plugin = g_object_new (plugin_type,
"screen", mgr->screen,
"params", params,
NULL);
@@ -270,12 +270,14 @@ mutter_plugin_manager_load (MutterPluginManager *plugin_mgr)
if (use_succeeded)
{
MutterPluginPending *pending = g_new0 (MutterPluginPending, 1);
pending->module = module;
pending->path = g_strdup (path);
pending->params = g_strdup (params);
plugin_mgr->pending_plugin_modules =
g_list_prepend (plugin_mgr->pending_plugin_modules, pending);
MutterPlugin *plugin = mutter_plugin_load (plugin_mgr, module, params);
if (plugin)
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
else
g_warning ("Plugin load for [%s] failed", path);
g_type_module_unuse (G_TYPE_MODULE (module));
}
}
else
@@ -293,7 +295,7 @@ mutter_plugin_manager_load (MutterPluginManager *plugin_mgr)
if (fallback)
g_slist_free (fallback);
if (plugin_mgr->pending_plugin_modules != NULL)
if (plugin_mgr->plugins != NULL)
{
meta_prefs_add_listener (prefs_changed_callback, plugin_mgr);
return TRUE;
@@ -307,27 +309,19 @@ mutter_plugin_manager_initialize (MutterPluginManager *plugin_mgr)
{
GList *iter;
for (iter = plugin_mgr->pending_plugin_modules; iter; iter = iter->next)
for (iter = plugin_mgr->plugins; iter; iter = iter->next)
{
MutterPluginPending *pending = (MutterPluginPending*) iter->data;
MutterPlugin *p;
MutterPlugin *plugin = (MutterPlugin*) iter->data;
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
if ((p = mutter_plugin_load (plugin_mgr, pending->module, pending->params)))
{
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, p);
}
else
{
g_warning ("Plugin load for [%s] failed", pending->path);
}
g_object_set (plugin,
"screen", plugin_mgr->screen,
NULL);
g_type_module_unuse (G_TYPE_MODULE (pending->module));
g_free (pending->path);
g_free (pending->params);
g_free (pending);
if (klass->start)
klass->start (plugin);
}
g_list_free (plugin_mgr->pending_plugin_modules);
plugin_mgr->pending_plugin_modules = NULL;
return TRUE;
}
@@ -349,7 +343,7 @@ mutter_plugin_manager_reload (MutterPluginManager *plugin_mgr)
return mutter_plugin_manager_load (plugin_mgr);
}
MutterPluginManager *
static MutterPluginManager *
mutter_plugin_manager_new (MetaScreen *screen)
{
MutterPluginManager *plugin_mgr;
@@ -364,13 +358,52 @@ mutter_plugin_manager_new (MetaScreen *screen)
plugin_mgr->screen = screen;
if (screen)
g_object_set_data (G_OBJECT (screen), "mutter-plugin-manager", plugin_mgr);
return plugin_mgr;
}
MutterPluginManager *
mutter_plugin_manager_get_default (void)
{
if (!default_plugin_manager)
{
default_plugin_manager = mutter_plugin_manager_new (NULL);
}
return default_plugin_manager;
}
MutterPluginManager *
mutter_plugin_manager_get (MetaScreen *screen)
{
MutterPluginManager *plugin_mgr;
plugin_mgr = g_object_get_data (G_OBJECT (screen), "mutter-plugin-manager");
if (plugin_mgr)
return plugin_mgr;
if (!default_plugin_manager)
mutter_plugin_manager_get_default ();
if (!default_plugin_manager->screen)
{
/* The default plugin manager is so far unused, we can recycle it */
default_plugin_manager->screen = screen;
g_object_set_data (G_OBJECT (screen), "mutter-plugin-manager", default_plugin_manager);
return default_plugin_manager;
}
else
{
return mutter_plugin_manager_new (screen);
}
}
static void
mutter_plugin_manager_kill_effect (MutterPluginManager *plugin_mgr,
MutterWindow *actor,
unsigned long events)
mutter_plugin_manager_kill_window_effects (MutterPluginManager *plugin_mgr,
MutterWindow *actor)
{
GList *l = plugin_mgr->plugins;
@@ -380,17 +413,32 @@ mutter_plugin_manager_kill_effect (MutterPluginManager *plugin_mgr,
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
if (!mutter_plugin_disabled (plugin)
&& (mutter_plugin_features (plugin) & events)
&& klass->kill_effect)
klass->kill_effect (plugin, actor, events);
&& klass->kill_window_effects)
klass->kill_window_effects (plugin, actor);
l = l->next;
}
}
static void
mutter_plugin_manager_kill_switch_workspace (MutterPluginManager *plugin_mgr)
{
GList *l = plugin_mgr->plugins;
while (l)
{
MutterPlugin *plugin = l->data;
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
if (!mutter_plugin_disabled (plugin)
&& (mutter_plugin_features (plugin) & MUTTER_PLUGIN_SWITCH_WORKSPACE)
&& klass->kill_switch_workspace)
klass->kill_switch_workspace (plugin);
l = l->next;
}
}
#define ALL_BUT_SWITCH \
MUTTER_PLUGIN_ALL_EFFECTS & \
~MUTTER_PLUGIN_SWITCH_WORKSPACE
/*
* Public method that the compositor hooks into for events that require
* no additional parameters.
@@ -427,10 +475,9 @@ mutter_plugin_manager_event_simple (MutterPluginManager *plugin_mgr,
case MUTTER_PLUGIN_MINIMIZE:
if (klass->minimize)
{
mutter_plugin_manager_kill_effect (
mutter_plugin_manager_kill_window_effects (
plugin_mgr,
actor,
ALL_BUT_SWITCH);
actor);
_mutter_plugin_effect_started (plugin);
klass->minimize (plugin, actor);
@@ -439,10 +486,9 @@ mutter_plugin_manager_event_simple (MutterPluginManager *plugin_mgr,
case MUTTER_PLUGIN_MAP:
if (klass->map)
{
mutter_plugin_manager_kill_effect (
mutter_plugin_manager_kill_window_effects (
plugin_mgr,
actor,
ALL_BUT_SWITCH);
actor);
_mutter_plugin_effect_started (plugin);
klass->map (plugin, actor);
@@ -506,10 +552,9 @@ mutter_plugin_manager_event_maximize (MutterPluginManager *plugin_mgr,
case MUTTER_PLUGIN_MAXIMIZE:
if (klass->maximize)
{
mutter_plugin_manager_kill_effect (
mutter_plugin_manager_kill_window_effects (
plugin_mgr,
actor,
ALL_BUT_SWITCH);
actor);
_mutter_plugin_effect_started (plugin);
klass->maximize (plugin, actor,
@@ -520,10 +565,9 @@ mutter_plugin_manager_event_maximize (MutterPluginManager *plugin_mgr,
case MUTTER_PLUGIN_UNMAXIMIZE:
if (klass->unmaximize)
{
mutter_plugin_manager_kill_effect (
mutter_plugin_manager_kill_window_effects (
plugin_mgr,
actor,
ALL_BUT_SWITCH);
actor);
_mutter_plugin_effect_started (plugin);
klass->unmaximize (plugin, actor,
@@ -552,7 +596,6 @@ mutter_plugin_manager_event_maximize (MutterPluginManager *plugin_mgr,
*/
gboolean
mutter_plugin_manager_switch_workspace (MutterPluginManager *plugin_mgr,
const GList **actors,
gint from,
gint to,
MetaMotionDirection direction)
@@ -570,19 +613,15 @@ mutter_plugin_manager_switch_workspace (MutterPluginManager *plugin_mgr,
MutterPluginClass *klass = MUTTER_PLUGIN_GET_CLASS (plugin);
if (!mutter_plugin_disabled (plugin) &&
(mutter_plugin_features (plugin) & MUTTER_PLUGIN_SWITCH_WORKSPACE) &&
(actors && *actors))
(mutter_plugin_features (plugin) & MUTTER_PLUGIN_SWITCH_WORKSPACE))
{
if (klass->switch_workspace)
{
retval = TRUE;
mutter_plugin_manager_kill_effect (
plugin_mgr,
MUTTER_WINDOW ((*actors)->data),
MUTTER_PLUGIN_SWITCH_WORKSPACE);
mutter_plugin_manager_kill_switch_workspace (plugin_mgr);
_mutter_plugin_effect_started (plugin);
klass->switch_workspace (plugin, actors, from, to, direction);
klass->switch_workspace (plugin, from, to, direction);
}
}

View File

@@ -31,9 +31,20 @@
#include "mutter-plugin.h"
#undef MUTTER_PLUGIN_FROM_MANAGER_
#define MUTTER_PLUGIN_MINIMIZE (1<<0)
#define MUTTER_PLUGIN_MAXIMIZE (1<<1)
#define MUTTER_PLUGIN_UNMAXIMIZE (1<<2)
#define MUTTER_PLUGIN_MAP (1<<3)
#define MUTTER_PLUGIN_DESTROY (1<<4)
#define MUTTER_PLUGIN_SWITCH_WORKSPACE (1<<5)
#define MUTTER_PLUGIN_ALL_EFFECTS (~0)
typedef struct MutterPluginManager MutterPluginManager;
MutterPluginManager * mutter_plugin_manager_new (MetaScreen *screen);
MutterPluginManager * mutter_plugin_manager_get (MetaScreen *screen);
MutterPluginManager * mutter_plugin_manager_get_default (void);
gboolean mutter_plugin_manager_load (MutterPluginManager *mgr);
gboolean mutter_plugin_manager_initialize (MutterPluginManager *plugin_mgr);
gboolean mutter_plugin_manager_event_simple (MutterPluginManager *mgr,
@@ -52,7 +63,6 @@ void mutter_plugin_manager_update_workspaces (MutterPluginManager *mgr);
void mutter_plugin_manager_update_workspace (MutterPluginManager *mgr, MetaWorkspace *w);
gboolean mutter_plugin_manager_switch_workspace (MutterPluginManager *mgr,
const GList **actors,
gint from,
gint to,
MetaMotionDirection direction);

View File

@@ -238,8 +238,7 @@ mutter_plugin_class_init (MutterPluginClass *klass)
"MetaScreen",
"MetaScreen",
META_TYPE_SCREEN,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_PARAMS,
@@ -368,9 +367,25 @@ _mutter_plugin_effect_started (MutterPlugin *plugin)
}
void
mutter_plugin_effect_completed (MutterPlugin *plugin,
MutterWindow *actor,
unsigned long event)
mutter_plugin_switch_workspace_completed (MutterPlugin *plugin)
{
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
MetaScreen *screen = mutter_plugin_get_screen (plugin);
if (priv->running-- < 0)
{
g_warning ("Error in running effect accounting, adjusting.");
priv->running = 0;
}
mutter_switch_workspace_completed (screen);
}
static void
mutter_plugin_window_effect_completed (MutterPlugin *plugin,
MutterWindow *actor,
unsigned long event)
{
MutterPluginPrivate *priv = MUTTER_PLUGIN (plugin)->priv;
@@ -392,17 +407,42 @@ mutter_plugin_effect_completed (MutterPlugin *plugin,
name ? name : "unknown");
}
if (event == MUTTER_PLUGIN_SWITCH_WORKSPACE)
{
/* The window is just used to identify the screen */
MetaWindow *window = mutter_window_get_meta_window (actor);
MetaScreen *screen = meta_window_get_screen (window);
mutter_switch_workspace_completed (screen);
}
else
{
mutter_window_effect_completed (actor, event);
}
mutter_window_effect_completed (actor, event);
}
void
mutter_plugin_minimize_completed (MutterPlugin *plugin,
MutterWindow *actor)
{
mutter_plugin_window_effect_completed (plugin, actor, MUTTER_PLUGIN_MINIMIZE);
}
void
mutter_plugin_maximize_completed (MutterPlugin *plugin,
MutterWindow *actor)
{
mutter_plugin_window_effect_completed (plugin, actor, MUTTER_PLUGIN_MAXIMIZE);
}
void
mutter_plugin_unmaximize_completed (MutterPlugin *plugin,
MutterWindow *actor)
{
mutter_plugin_window_effect_completed (plugin, actor, MUTTER_PLUGIN_UNMAXIMIZE);
}
void
mutter_plugin_map_completed (MutterPlugin *plugin,
MutterWindow *actor)
{
mutter_plugin_window_effect_completed (plugin, actor, MUTTER_PLUGIN_MAP);
}
void
mutter_plugin_destroy_completed (MutterPlugin *plugin,
MutterWindow *actor)
{
mutter_plugin_window_effect_completed (plugin, actor, MUTTER_PLUGIN_DESTROY);
}
void

40
src/compositor/mutter-shaped-texture.c Executable file → Normal file
View File

@@ -124,18 +124,18 @@ mutter_shaped_texture_dispose (GObject *object)
if (priv->material != COGL_INVALID_HANDLE)
{
cogl_material_unref (priv->material);
cogl_handle_unref (priv->material);
priv->material = COGL_INVALID_HANDLE;
}
if (priv->material_unshaped != COGL_INVALID_HANDLE)
{
cogl_material_unref (priv->material_unshaped);
cogl_handle_unref (priv->material_unshaped);
priv->material_unshaped = COGL_INVALID_HANDLE;
}
#if 1 /* see comment in mutter_shaped_texture_paint */
if (priv->material_workaround != COGL_INVALID_HANDLE)
{
cogl_material_unref (priv->material_workaround);
cogl_handle_unref (priv->material_workaround);
priv->material_workaround = COGL_INVALID_HANDLE;
}
#endif
@@ -194,7 +194,7 @@ mutter_shaped_texture_dirty_mask (MutterShapedTexture *stex)
if (mask_gl_target == GL_TEXTURE_RECTANGLE_ARB)
glDeleteTextures (1, &mask_gl_tex);
cogl_texture_unref (priv->mask_texture);
cogl_handle_unref (priv->mask_texture);
priv->mask_texture = COGL_INVALID_HANDLE;
}
}
@@ -299,9 +299,6 @@ mutter_shaped_texture_paint (ClutterActor *actor)
guint tex_width, tex_height;
ClutterActorBox alloc;
CoglHandle material;
#if 1 /* please see comment below about workaround */
guint depth;
#endif
if (priv->clip_region && gdk_region_empty (priv->clip_region))
return;
@@ -363,35 +360,6 @@ mutter_shaped_texture_paint (ClutterActor *actor)
}
material = priv->material;
#if 1
/* This was added as a workaround. It seems that with the intel
* drivers when multi-texturing using an RGB TFP texture, the
* texture is actually setup internally as an RGBA texture, where
* the alpha channel is mostly 0.0 so you only see a shimmer of the
* window. This workaround forcibly defines the alpha channel as
* 1.0. Maybe there is some clutter/cogl state that is interacting
* with this that is being overlooked, but for now this seems to
* work. */
g_object_get (stex, "pixmap-depth", &depth, NULL);
if (depth == 24)
{
if (priv->material_workaround == COGL_INVALID_HANDLE)
{
material = priv->material_workaround = cogl_material_new ();
cogl_material_set_layer_combine (material, 0,
"RGB = MODULATE (TEXTURE, PREVIOUS)"
"A = REPLACE (PREVIOUS)",
NULL);
cogl_material_set_layer_combine (material, 1,
"RGBA = MODULATE (PREVIOUS, TEXTURE[A])",
NULL);
}
material = priv->material_workaround;
}
#endif
cogl_material_set_layer (material, 1, priv->mask_texture);
}

View File

@@ -31,15 +31,6 @@
#define M_LOG2E 1.4426950408889634074
#endif
#if !CLUTTER_CHECK_VERSION(1,1,3)
static PFNGLACTIVETEXTUREARBPROC activeTexture;
static PFNGLGENFRAMEBUFFERSPROC genFramebuffers;
static PFNGLDELETEFRAMEBUFFERSPROC deleteFramebuffers;
static PFNGLBINDFRAMEBUFFERPROC bindFramebuffer;
static PFNGLFRAMEBUFFERTEXTURE2DPROC framebufferTexture2D;
#endif
#define MAX_TEXTURE_LEVELS 12
/* If the texture format in memory doesn't match this, then Mesa
@@ -68,11 +59,7 @@ struct _MutterTextureTower
{
int n_levels;
CoglHandle textures[MAX_TEXTURE_LEVELS];
#if CLUTTER_CHECK_VERSION(1,1,3)
CoglHandle fbos[MAX_TEXTURE_LEVELS];
#else
GLuint fbos[MAX_TEXTURE_LEVELS];
#endif
Box invalid[MAX_TEXTURE_LEVELS];
};
@@ -131,7 +118,7 @@ free_texture (CoglHandle texture)
if (gl_target == GL_TEXTURE_RECTANGLE_ARB)
glDeleteTextures (1, &gl_tex);
cogl_texture_unref (texture);
cogl_handle_unref (texture);
}
/**
@@ -165,22 +152,14 @@ mutter_texture_tower_set_base_texture (MutterTextureTower *tower,
tower->textures[i] = COGL_INVALID_HANDLE;
}
#if CLUTTER_CHECK_VERSION(1,1,3)
if (tower->fbos[i] != COGL_INVALID_HANDLE)
{
cogl_handle_unref (tower->fbos[i]);
tower->fbos[i] = COGL_INVALID_HANDLE;
}
#else
if (tower->fbos[i] != 0)
{
(*deleteFramebuffers) (1, &tower->fbos[i]);
tower->fbos[i] = 0;
}
#endif
}
cogl_texture_unref (tower->textures[0]);
cogl_handle_unref (tower->textures[0]);
}
tower->textures[0] = texture;
@@ -189,7 +168,7 @@ mutter_texture_tower_set_base_texture (MutterTextureTower *tower,
{
int width, height;
cogl_texture_ref (tower->textures[0]);
cogl_handle_ref (tower->textures[0]);
width = cogl_texture_get_width (tower->textures[0]);
height = cogl_texture_get_height (tower->textures[0]);
@@ -429,17 +408,6 @@ texture_tower_create_texture (MutterTextureTower *tower,
tower->invalid[level].y2 = height;
}
/* The COGL fbo (render-to-texture) support is pretty hard to use in
* Clutter 1.0; there's no way to save and restore the old projection
* matrix and viewport without ugly workarounds that require explicit
* access to the ClutterStage. In Clutter 1.2, the save/restore is
* automatic. For now, until we depend on Clutter 1.2, we use GL
* directly for render-to-texture. The main downside (other than
* a lot of verbosity) is that we have to save the state, reset anything
* that we think COGL might have left in a way we don't want it, then
* restore the old state.
*/
#if CLUTTER_CHECK_VERSION(1,1,3)
static gboolean
texture_tower_revalidate_fbo (MutterTextureTower *tower,
int level)
@@ -454,7 +422,12 @@ texture_tower_revalidate_fbo (MutterTextureTower *tower,
CoglMatrix modelview;
if (tower->fbos[level] == COGL_INVALID_HANDLE)
tower->fbos[level] = cogl_offscreen_new_to_texture (dest_texture);
{
/* Work around http://bugzilla.openedhand.com/show_bug.cgi?id=2110 */
cogl_flush();
tower->fbos[level] = cogl_offscreen_new_to_texture (dest_texture);
}
if (tower->fbos[level] == COGL_INVALID_HANDLE)
return FALSE;
@@ -478,162 +451,6 @@ texture_tower_revalidate_fbo (MutterTextureTower *tower,
return TRUE;
}
#else
static void
initialize_gl_functions (void)
{
static gboolean initialized = FALSE;
if (!initialized)
{
initialized = TRUE;
activeTexture = (PFNGLACTIVETEXTUREARBPROC) cogl_get_proc_address ("glActiveTextureARB");
genFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) cogl_get_proc_address ("glGenFramebuffersEXT");
deleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) cogl_get_proc_address ("glDeleteFramebuffersEXT");
bindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) cogl_get_proc_address ("glBindFramebufferEXT");
framebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) cogl_get_proc_address ("glFramebufferTexture2D");
}
}
static gboolean
texture_tower_revalidate_fbo (MutterTextureTower *tower,
int level)
{
CoglHandle source_texture = tower->textures[level - 1];
int source_texture_width = cogl_texture_get_width (source_texture);
int source_texture_height = cogl_texture_get_height (source_texture);
CoglHandle dest_texture = tower->textures[level];
int dest_texture_width = cogl_texture_get_width (dest_texture);
int dest_texture_height = cogl_texture_get_height (dest_texture);
ClutterActorBox source_box;
Box *dest_box;
GLuint source_gl_tex;
GLenum source_gl_target;
if (!cogl_features_available (COGL_FEATURE_OFFSCREEN))
return FALSE;
initialize_gl_functions ();
/* Create the frame-buffer object that renders to the texture, if
* it doesn't exist; just bind it for rendering if it does */
if (tower->fbos[level] == 0)
{
GLuint dest_gl_tex;
GLenum dest_gl_target;
cogl_texture_get_gl_texture (dest_texture, &dest_gl_tex, &dest_gl_target);
(*genFramebuffers) (1, &tower->fbos[level]);
(*bindFramebuffer) (GL_FRAMEBUFFER_EXT, tower->fbos[level]);
(*framebufferTexture2D) (GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
dest_gl_target, dest_gl_tex, 0);
}
else
{
(*bindFramebuffer) (GL_FRAMEBUFFER_EXT, tower->fbos[level]);
}
/* Save the old state (other than the transformation matrices) */
glPushAttrib (GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TEXTURE_BIT | GL_VIEWPORT_BIT);
/* And set up the state we need */
glDisable (GL_BLEND);
glDisable (GL_SCISSOR_TEST);
glDisable (GL_STENCIL_TEST);
glDisable (GL_CLIP_PLANE3);
glDisable (GL_CLIP_PLANE2);
glDisable (GL_CLIP_PLANE1);
glDisable (GL_CLIP_PLANE0);
cogl_texture_get_gl_texture (source_texture, &source_gl_tex, &source_gl_target);
(*activeTexture) (GL_TEXTURE0_ARB);
if (source_gl_target == GL_TEXTURE_2D)
glDisable (GL_TEXTURE_RECTANGLE_ARB);
else
glDisable (GL_TEXTURE_2D);
glEnable (source_gl_target);
glBindTexture (source_gl_target, source_gl_tex);
glTexParameteri (source_gl_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri (source_gl_target, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri (source_gl_target, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
/* In theory, we should loop over all the texture units supported
* by the GL implementation, but here we just assume that no more
* than three are used by Mutter and all GL implementations we care
* about will support at least 3.
*/
(*activeTexture) (GL_TEXTURE1_ARB);
glDisable (GL_TEXTURE_2D);
glDisable (GL_TEXTURE_RECTANGLE_ARB);
(*activeTexture) (GL_TEXTURE2_ARB);
glDisable (GL_TEXTURE_2D);
glDisable (GL_TEXTURE_RECTANGLE_ARB);
glViewport (0, 0, dest_texture_width, dest_texture_height);
/* Save the transformation matrices and set up new ones that map
* coordinates directly onto the destination texture */
glMatrixMode (GL_MODELVIEW);
glPushMatrix ();
glLoadIdentity ();
glMatrixMode (GL_PROJECTION);
glPushMatrix();
glLoadIdentity ();
glOrtho (0, dest_texture_width, 0, dest_texture_height, -1., 1.);
/* Draw */
dest_box = &tower->invalid[level];
if (texture_is_rectangle (source_texture))
{
source_box.x1 = 2 * dest_box->x1;
source_box.y1 = 2 * dest_box->y1;
source_box.x2 = 2 * dest_box->x2;
source_box.y2 = 2 * dest_box->y2;
}
else
{
source_box.x1 = (2. * dest_box->x1) / source_texture_width;
source_box.y1 = (2. * dest_box->y1) / source_texture_height;
source_box.x2 = (2. * dest_box->x2) / source_texture_width;
source_box.y2 = (2. * dest_box->y2) / source_texture_height;
}
glColor3f (0., 1., 1.);
glBegin (GL_QUADS);
glTexCoord2f (source_box.x1, source_box.y1);
glVertex2f (dest_box->x1, dest_box->y1);
glTexCoord2f (source_box.x2, source_box.y1);
glVertex2f (dest_box->x2, dest_box->y1);
glTexCoord2f (source_box.x2, source_box.y2);
glVertex2f (dest_box->x2, dest_box->y2);
glTexCoord2f (source_box.x1, source_box.y2);
glVertex2f (dest_box->x1, dest_box->y2);
glEnd ();
/* And restore everything back the way we found it */
glMatrixMode (GL_PROJECTION);
glPopMatrix ();
glMatrixMode (GL_MODELVIEW);
glPopMatrix ();
glPopAttrib ();
(*bindFramebuffer) (GL_FRAMEBUFFER_EXT, 0);
return TRUE;
}
#endif
static void
fill_copy (guchar *buf,

View File

@@ -47,6 +47,8 @@ struct _MutterWindowPrivate
* texture */
GdkRegion *bounding_region;
gint freeze_count;
/*
* These need to be counters rather than flags, since more plugins
* can implement same effect; the practicality of stacking effects
@@ -65,7 +67,10 @@ struct _MutterWindowPrivate
guint disposed : 1;
guint redecorating : 1;
guint needs_repair : 1;
guint needs_damage_all : 1;
guint received_damage : 1;
guint needs_pixmap : 1;
guint needs_reshape : 1;
guint size_changed : 1;
@@ -272,9 +277,6 @@ mutter_meta_window_decorated_notify (MetaWindow *mw,
priv->damage = None;
}
g_hash_table_remove (info->windows_by_xid, (gpointer) priv->xwindow);
g_hash_table_insert (info->windows_by_xid, (gpointer) new_xwindow, self);
g_free (priv->desc);
priv->desc = NULL;
@@ -335,7 +337,8 @@ mutter_window_constructed (GObject *object)
if (priv->attrs.class == InputOnly)
priv->damage = None;
else
priv->damage = XDamageCreate (xdisplay, xwindow, XDamageReportNonEmpty);
priv->damage = XDamageCreate (xdisplay, xwindow,
XDamageReportBoundingBox);
format = XRenderFindVisualFormat (xdisplay, priv->attrs.visual);
@@ -421,7 +424,6 @@ mutter_window_dispose (GObject *object)
}
info->windows = g_list_remove (info->windows, (gconstpointer) self);
g_hash_table_remove (info->windows_by_xid, (gpointer) priv->xwindow);
/*
* Release the extra reference we took on the actor.
@@ -769,6 +771,60 @@ mutter_window_showing_on_its_workspace (MutterWindow *self)
return meta_window_showing_on_its_workspace (self->priv->window);
}
static void
mutter_window_freeze (MutterWindow *self)
{
self->priv->freeze_count++;
}
static void
mutter_window_damage_all (MutterWindow *self)
{
MutterWindowPrivate *priv = self->priv;
ClutterX11TexturePixmap *texture_x11 = CLUTTER_X11_TEXTURE_PIXMAP (priv->actor);
guint pixmap_width = 0;
guint pixmap_height = 0;
if (!priv->needs_damage_all)
return;
g_object_get (texture_x11,
"pixmap-width", &pixmap_width,
"pixmap-height", &pixmap_height,
NULL);
clutter_x11_texture_pixmap_update_area (texture_x11,
0,
0,
pixmap_width,
pixmap_height);
priv->needs_damage_all = FALSE;
}
static void
mutter_window_thaw (MutterWindow *self)
{
self->priv->freeze_count--;
if (G_UNLIKELY (self->priv->freeze_count < 0))
{
g_warning ("Error in freeze/thaw accounting.");
self->priv->freeze_count = 0;
return;
}
if (self->priv->freeze_count)
return;
/* Since we ignore damage events while a window is frozen for certain effects
* we may need to issue an update_area() covering the whole pixmap if we
* don't know what real damage has happened. */
if (self->priv->needs_damage_all)
mutter_window_damage_all (self);
}
gboolean
mutter_window_effect_in_progress (MutterWindow *self)
{
@@ -780,11 +836,11 @@ mutter_window_effect_in_progress (MutterWindow *self)
}
static void
mutter_window_mark_for_repair (MutterWindow *self)
mutter_window_queue_create_pixmap (MutterWindow *self)
{
MutterWindowPrivate *priv = self->priv;
priv->needs_repair = TRUE;
priv->needs_pixmap = TRUE;
if (!priv->mapped)
return;
@@ -800,6 +856,21 @@ mutter_window_mark_for_repair (MutterWindow *self)
clutter_actor_queue_redraw (priv->actor);
}
static gboolean
is_freeze_thaw_effect (gulong event)
{
switch (event)
{
case MUTTER_PLUGIN_DESTROY:
case MUTTER_PLUGIN_MAXIMIZE:
case MUTTER_PLUGIN_UNMAXIMIZE:
return TRUE;
break;
default:
return FALSE;
}
}
static gboolean
start_simple_effect (MutterWindow *self,
gulong event)
@@ -807,6 +878,7 @@ start_simple_effect (MutterWindow *self,
MutterWindowPrivate *priv = self->priv;
MetaCompScreen *info = meta_screen_get_compositor_data (priv->screen);
gint *counter = NULL;
gboolean use_freeze_thaw = FALSE;
if (!info->plugin_mgr)
return FALSE;
@@ -831,6 +903,11 @@ start_simple_effect (MutterWindow *self,
g_assert (counter);
use_freeze_thaw = is_freeze_thaw_effect (event);
if (use_freeze_thaw)
mutter_window_freeze (self);
(*counter)++;
if (!mutter_plugin_manager_event_simple (info->plugin_mgr,
@@ -838,6 +915,8 @@ start_simple_effect (MutterWindow *self,
event))
{
(*counter)--;
if (use_freeze_thaw)
mutter_window_thaw (self);
return FALSE;
}
@@ -861,7 +940,7 @@ mutter_window_after_effects (MutterWindow *self)
if (!meta_window_is_mapped (priv->window))
mutter_window_detach (self);
if (priv->needs_repair)
if (priv->needs_pixmap)
clutter_actor_queue_redraw (priv->actor);
}
@@ -930,6 +1009,9 @@ mutter_window_effect_completed (MutterWindow *self,
break;
}
if (is_freeze_thaw_effect (event))
mutter_window_thaw (self);
if (!mutter_window_effect_in_progress (self))
mutter_window_after_effects (self);
}
@@ -955,7 +1037,7 @@ mutter_window_detach (MutterWindow *self)
clutter_x11_texture_pixmap_set_pixmap (CLUTTER_X11_TEXTURE_PIXMAP (priv->actor),
None);
mutter_window_mark_for_repair (self);
mutter_window_queue_create_pixmap (self);
}
void
@@ -976,7 +1058,6 @@ mutter_window_destroy (MutterWindow *self)
*/
info = meta_screen_get_compositor_data (priv->screen);
info->windows = g_list_remove (info->windows, (gconstpointer) self);
g_hash_table_remove (info->windows_by_xid, (gpointer)priv->xwindow);
if (priv->type == META_COMP_WINDOW_DROPDOWN_MENU ||
priv->type == META_COMP_WINDOW_POPUP_MENU ||
@@ -1019,7 +1100,7 @@ mutter_window_sync_actor_position (MutterWindow *self)
priv->attrs.height != window_rect.height)
{
priv->size_changed = TRUE;
mutter_window_mark_for_repair (self);
mutter_window_queue_create_pixmap (self);
}
/* XXX deprecated: please use meta_window_get_outer_rect instead */
@@ -1136,6 +1217,7 @@ mutter_window_maximize (MutterWindow *self,
clutter_actor_set_size (CLUTTER_ACTOR (self), old_rect->width, old_rect->height);
self->priv->maximize_in_progress++;
mutter_window_freeze (self);
if (!info->plugin_mgr ||
!mutter_plugin_manager_event_maximize (info->plugin_mgr,
@@ -1146,6 +1228,7 @@ mutter_window_maximize (MutterWindow *self,
{
self->priv->maximize_in_progress--;
mutter_window_thaw (self);
}
}
@@ -1163,6 +1246,7 @@ mutter_window_unmaximize (MutterWindow *self,
clutter_actor_set_size (CLUTTER_ACTOR (self), old_rect->width, old_rect->height);
self->priv->unmaximize_in_progress++;
mutter_window_freeze (self);
if (!info->plugin_mgr ||
!mutter_plugin_manager_event_maximize (info->plugin_mgr,
@@ -1172,6 +1256,7 @@ mutter_window_unmaximize (MutterWindow *self,
new_rect->width, new_rect->height))
{
self->priv->unmaximize_in_progress--;
mutter_window_thaw (self);
}
}
@@ -1210,6 +1295,8 @@ mutter_window_new (MetaWindow *window)
priv = self->priv;
priv->mapped = meta_window_toplevel_is_mapped (priv->window);
if (priv->mapped)
mutter_window_queue_create_pixmap (self);
mutter_window_sync_actor_position (self);
@@ -1224,7 +1311,6 @@ mutter_window_new (MetaWindow *window)
* before we first paint.
*/
info->windows = g_list_append (info->windows, self);
g_hash_table_insert (info->windows_by_xid, (gpointer) top_window, self);
return self;
}
@@ -1238,7 +1324,7 @@ mutter_window_mapped (MutterWindow *self)
priv->mapped = TRUE;
mutter_window_mark_for_repair (self);
mutter_window_queue_create_pixmap (self);
}
void
@@ -1254,7 +1340,7 @@ mutter_window_unmapped (MutterWindow *self)
return;
mutter_window_detach (self);
priv->needs_repair = FALSE;
priv->needs_pixmap = FALSE;
}
static void
@@ -1466,7 +1552,7 @@ mutter_window_reset_visible_regions (MutterWindow *self)
}
static void
check_needs_repair (MutterWindow *self)
check_needs_pixmap (MutterWindow *self)
{
MutterWindowPrivate *priv = self->priv;
MetaScreen *screen = priv->screen;
@@ -1477,7 +1563,7 @@ check_needs_repair (MutterWindow *self)
Window xwindow = priv->xwindow;
gboolean full = FALSE;
if (!priv->needs_repair)
if (!priv->needs_pixmap)
return;
if (!priv->mapped)
@@ -1549,74 +1635,52 @@ check_needs_repair (MutterWindow *self)
full = TRUE;
}
/*
* TODO -- on some gfx hardware updating the whole texture instead of
* the individual rectangles is actually quicker, so we might want to
* make this a configurable option (on desktop HW with multiple pipelines
* it is usually quicker to just update the damaged parts).
*
* If we are using TFP we update the whole texture (this simply trigers
* the texture rebind).
*/
if (full
#ifdef HAVE_GLX_TEXTURE_PIXMAP
|| (CLUTTER_GLX_IS_TEXTURE_PIXMAP (priv->actor) &&
clutter_glx_texture_pixmap_using_extension
(CLUTTER_GLX_TEXTURE_PIXMAP (priv->actor)))
#endif /* HAVE_GLX_TEXTURE_PIXMAP */
)
{
XDamageSubtract (xdisplay, priv->damage, None, None);
clutter_x11_texture_pixmap_update_area
(CLUTTER_X11_TEXTURE_PIXMAP (priv->actor),
0,
0,
clutter_actor_get_width (priv->actor),
clutter_actor_get_height (priv->actor));
}
else
{
XRectangle *r_damage;
XRectangle r_bounds;
XserverRegion parts;
int i, r_count;
parts = XFixesCreateRegion (xdisplay, 0, 0);
XDamageSubtract (xdisplay, priv->damage, None, parts);
r_damage = XFixesFetchRegionAndBounds (xdisplay,
parts,
&r_count,
&r_bounds);
if (r_damage)
{
for (i = 0; i < r_count; ++i)
{
clutter_x11_texture_pixmap_update_area
(CLUTTER_X11_TEXTURE_PIXMAP (priv->actor),
r_damage[i].x,
r_damage[i].y,
r_damage[i].width,
r_damage[i].height);
}
}
XFree (r_damage);
XFixesDestroyRegion (xdisplay, parts);
}
meta_error_trap_pop (display, FALSE);
priv->needs_repair = FALSE;
priv->needs_pixmap = FALSE;
}
static gboolean
is_frozen (MutterWindow *self)
{
return self->priv->freeze_count ? TRUE : FALSE;
}
void
mutter_window_process_damage (MutterWindow *self,
XDamageNotifyEvent *event)
{
mutter_window_mark_for_repair (self);
MutterWindowPrivate *priv = self->priv;
ClutterX11TexturePixmap *texture_x11 = CLUTTER_X11_TEXTURE_PIXMAP (priv->actor);
priv->received_damage = TRUE;
if (is_frozen (self))
{
/* The window is frozen due to an effect in progress: we ignore damage
* here on the off chance that this will stop the corresponding
* texture_from_pixmap from being update.
*
* needs_damage_all tracks that some unknown damage happened while the
* window was frozen so that when the window becomes unfrozen we can
* issue a full window update to cover any lost damage.
*
* It should be noted that this is an unreliable mechanism since it's
* quite likely that drivers will aim to provide a zero-copy
* implementation of the texture_from_pixmap extension and in those cases
* any drawing done to the window is always immediately reflected in the
* texture regardless of damage event handling.
*/
priv->needs_damage_all = TRUE;
return;
}
clutter_x11_texture_pixmap_update_area (texture_x11,
event->area.x,
event->area.y,
event->area.width,
event->area.height);
}
void
@@ -1688,16 +1752,25 @@ void
mutter_window_pre_paint (MutterWindow *self)
{
MutterWindowPrivate *priv = self->priv;
MetaScreen *screen = priv->screen;
MetaDisplay *display = meta_screen_get_display (screen);
Display *xdisplay = meta_display_get_xdisplay (display);
/* The window is frozen due to a pending animation: we'll wait until
* the animation finishes to reshape and repair the window */
if (priv->destroy_in_progress ||
priv->maximize_in_progress ||
priv->unmaximize_in_progress)
return;
if (is_frozen (self))
{
/* The window is frozen due to a pending animation: we'll wait until
* the animation finishes to reshape and repair the window */
return;
}
if (priv->received_damage)
{
XDamageSubtract (xdisplay, priv->damage, None, None);
priv->received_damage = FALSE;
}
check_needs_reshape (self);
check_needs_repair (self);
check_needs_pixmap (self);
}
void

View File

@@ -81,11 +81,12 @@ static void unmaximize (MutterPlugin *plugin,
gint x, gint y, gint width, gint height);
static void switch_workspace (MutterPlugin *plugin,
const GList **actors, gint from, gint to,
gint from, gint to,
MetaMotionDirection direction);
static void kill_effect (MutterPlugin *plugin,
MutterWindow *actor, gulong event);
static void kill_window_effects (MutterPlugin *plugin,
MutterWindow *actor);
static void kill_switch_workspace (MutterPlugin *plugin);
static const MutterPluginInfo * plugin_info (MutterPlugin *plugin);
@@ -99,7 +100,6 @@ struct _MutterDefaultPluginPrivate
/* Valid only when switch_workspace effect is in progress */
ClutterTimeline *tml_switch_workspace1;
ClutterTimeline *tml_switch_workspace2;
GList **actors;
ClutterActor *desktop1;
ClutterActor *desktop2;
@@ -175,10 +175,9 @@ mutter_default_plugin_get_property (GObject *object,
}
static void
mutter_default_plugin_constructed (GObject *object)
start (MutterPlugin *plugin)
{
MutterPlugin *plugin = MUTTER_PLUGIN (object);
MutterDefaultPluginPrivate *priv = MUTTER_DEFAULT_PLUGIN (object)->priv;
MutterDefaultPluginPrivate *priv = MUTTER_DEFAULT_PLUGIN (plugin)->priv;
guint destroy_timeout = DESTROY_TIMEOUT;
guint minimize_timeout = MINIMIZE_TIMEOUT;
@@ -201,7 +200,6 @@ mutter_default_plugin_constructed (GObject *object)
map_timeout *= 2;
switch_timeout *= 2;
}
}
static void
@@ -212,18 +210,19 @@ mutter_default_plugin_class_init (MutterDefaultPluginClass *klass)
gobject_class->finalize = mutter_default_plugin_finalize;
gobject_class->dispose = mutter_default_plugin_dispose;
gobject_class->constructed = mutter_default_plugin_constructed;
gobject_class->set_property = mutter_default_plugin_set_property;
gobject_class->get_property = mutter_default_plugin_get_property;
plugin_class->start = start;
plugin_class->map = map;
plugin_class->minimize = minimize;
plugin_class->maximize = maximize;
plugin_class->unmaximize = unmaximize;
plugin_class->destroy = destroy;
plugin_class->switch_workspace = switch_workspace;
plugin_class->kill_effect = kill_effect;
plugin_class->plugin_info = plugin_info;
plugin_class->kill_window_effects = kill_window_effects;
plugin_class->kill_switch_workspace = kill_switch_workspace;
g_type_class_add_private (gobject_class, sizeof (MutterDefaultPluginPrivate));
}
@@ -272,20 +271,12 @@ get_actor_private (MutterWindow *actor)
return priv;
}
typedef struct SwitchWorkspaceData
{
MutterPlugin *plugin;
const GList **actors;
} SwitchWorkspaceData;
static void
on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
{
SwitchWorkspaceData *sw_data = data;
MutterPlugin *plugin = sw_data->plugin;
MutterPlugin *plugin = MUTTER_PLUGIN (data);
MutterDefaultPluginPrivate *priv = MUTTER_DEFAULT_PLUGIN (plugin)->priv;
GList *l = *((GList**)sw_data->actors);
MutterWindow *actor_for_cb = l->data;
GList *l = mutter_plugin_get_windows (plugin);
while (l)
{
@@ -305,21 +296,17 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
clutter_actor_destroy (priv->desktop1);
clutter_actor_destroy (priv->desktop2);
priv->actors = NULL;
priv->tml_switch_workspace1 = NULL;
priv->tml_switch_workspace2 = NULL;
priv->desktop1 = NULL;
priv->desktop2 = NULL;
g_free (data);
mutter_plugin_effect_completed (plugin, actor_for_cb,
MUTTER_PLUGIN_SWITCH_WORKSPACE);
mutter_plugin_switch_workspace_completed (plugin);
}
static void
switch_workspace (MutterPlugin *plugin,
const GList **actors, gint from, gint to,
gint from, gint to,
MetaMotionDirection direction)
{
MutterDefaultPluginPrivate *priv = MUTTER_DEFAULT_PLUGIN (plugin)->priv;
@@ -330,12 +317,8 @@ switch_workspace (MutterPlugin *plugin,
ClutterActor *stage;
int screen_width, screen_height;
MetaScreen *screen = mutter_plugin_get_screen (plugin);
SwitchWorkspaceData *sw_data = g_new (SwitchWorkspaceData, 1);
ClutterAnimation *animation;
sw_data->plugin = plugin;
sw_data->actors = actors;
stage = mutter_plugin_get_stage (plugin);
mutter_plugin_query_screen_size (plugin,
@@ -355,14 +338,13 @@ switch_workspace (MutterPlugin *plugin,
if (from == to)
{
mutter_plugin_effect_completed (plugin, NULL,
MUTTER_PLUGIN_SWITCH_WORKSPACE);
mutter_plugin_switch_workspace_completed (plugin);
return;
}
n_workspaces = meta_screen_get_n_workspaces (screen);
l = g_list_last (*((GList**) actors));
l = g_list_last (mutter_plugin_get_windows (plugin));
while (l)
{
@@ -397,7 +379,6 @@ switch_workspace (MutterPlugin *plugin,
l = l->prev;
}
priv->actors = (GList **)actors;
priv->desktop1 = workspace0;
priv->desktop2 = workspace1;
@@ -410,7 +391,7 @@ switch_workspace (MutterPlugin *plugin,
g_signal_connect (priv->tml_switch_workspace1,
"completed",
G_CALLBACK (on_switch_workspace_effect_complete),
sw_data);
plugin);
animation = clutter_actor_animate (workspace1, CLUTTER_EASE_IN_SINE,
SWITCH_TIMEOUT,
@@ -448,8 +429,7 @@ on_minimize_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data
CLUTTER_GRAVITY_NORTH_WEST);
/* Now notify the manager that we are done with this effect */
mutter_plugin_effect_completed (plugin, mc_window,
MUTTER_PLUGIN_MINIMIZE);
mutter_plugin_minimize_completed (plugin, mc_window);
g_free (data);
}
@@ -492,8 +472,7 @@ minimize (MutterPlugin *plugin, MutterWindow *mc_window)
}
else
mutter_plugin_effect_completed (plugin, mc_window,
MUTTER_PLUGIN_MINIMIZE);
mutter_plugin_minimize_completed (plugin, mc_window);
}
/*
@@ -518,8 +497,7 @@ on_maximize_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data
CLUTTER_GRAVITY_NORTH_WEST);
/* Now notify the manager that we are done with this effect */
mutter_plugin_effect_completed (plugin, mc_window,
MUTTER_PLUGIN_MAXIMIZE);
mutter_plugin_maximize_completed (plugin, mc_window);
g_free (data);
}
@@ -589,8 +567,7 @@ maximize (MutterPlugin *plugin,
return;
}
mutter_plugin_effect_completed (plugin, mc_window,
MUTTER_PLUGIN_MAXIMIZE);
mutter_plugin_maximize_completed (plugin, mc_window);
}
/*
@@ -613,8 +590,7 @@ unmaximize (MutterPlugin *plugin,
}
/* Do this conditionally, if the effect requires completion callback. */
mutter_plugin_effect_completed (plugin, mc_window,
MUTTER_PLUGIN_UNMAXIMIZE);
mutter_plugin_unmaximize_completed (plugin, mc_window);
}
static void
@@ -633,7 +609,7 @@ on_map_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data)
CLUTTER_GRAVITY_NORTH_WEST);
/* Now notify the manager that we are done with this effect */
mutter_plugin_effect_completed (plugin, mc_window, MUTTER_PLUGIN_MAP);
mutter_plugin_map_completed (plugin, mc_window);
g_free (data);
}
@@ -679,8 +655,7 @@ map (MutterPlugin *plugin, MutterWindow *mc_window)
}
else
mutter_plugin_effect_completed (plugin, mc_window,
MUTTER_PLUGIN_MAP);
mutter_plugin_map_completed (plugin, mc_window);
}
/*
@@ -696,8 +671,7 @@ on_destroy_effect_complete (ClutterTimeline *timeline, EffectCompleteData *data)
apriv->tml_destroy = NULL;
mutter_plugin_effect_completed (plugin, mc_window,
MUTTER_PLUGIN_DESTROY);
mutter_plugin_destroy_completed (plugin, mc_window);
}
/*
@@ -734,54 +708,48 @@ destroy (MutterPlugin *plugin, MutterWindow *mc_window)
data);
}
else
mutter_plugin_effect_completed (plugin, mc_window,
MUTTER_PLUGIN_DESTROY);
mutter_plugin_destroy_completed (plugin, mc_window);
}
static void
kill_effect (MutterPlugin *plugin, MutterWindow *mc_window, gulong event)
kill_switch_workspace (MutterPlugin *plugin)
{
MutterDefaultPluginPrivate *priv = MUTTER_DEFAULT_PLUGIN (plugin)->priv;
if (priv->tml_switch_workspace1)
{
clutter_timeline_stop (priv->tml_switch_workspace1);
clutter_timeline_stop (priv->tml_switch_workspace2);
g_signal_emit_by_name (priv->tml_switch_workspace1, "completed", NULL);
}
}
static void
kill_window_effects (MutterPlugin *plugin, MutterWindow *mc_window)
{
ActorPrivate *apriv;
if (event & MUTTER_PLUGIN_SWITCH_WORKSPACE)
{
MutterDefaultPluginPrivate *priv = MUTTER_DEFAULT_PLUGIN (plugin)->priv;
if (priv->tml_switch_workspace1)
{
clutter_timeline_stop (priv->tml_switch_workspace1);
clutter_timeline_stop (priv->tml_switch_workspace2);
g_signal_emit_by_name (priv->tml_switch_workspace1, "completed", NULL);
}
if (!(event & ~MUTTER_PLUGIN_SWITCH_WORKSPACE))
{
/* Workspace switch only, nothing more to do */
return;
}
}
apriv = get_actor_private (mc_window);
if ((event & MUTTER_PLUGIN_MINIMIZE) && apriv->tml_minimize)
if (apriv->tml_minimize)
{
clutter_timeline_stop (apriv->tml_minimize);
g_signal_emit_by_name (apriv->tml_minimize, "completed", NULL);
}
if ((event & MUTTER_PLUGIN_MAXIMIZE) && apriv->tml_maximize)
if (apriv->tml_maximize)
{
clutter_timeline_stop (apriv->tml_maximize);
g_signal_emit_by_name (apriv->tml_maximize, "completed", NULL);
}
if ((event & MUTTER_PLUGIN_MAP) && apriv->tml_map)
if (apriv->tml_map)
{
clutter_timeline_stop (apriv->tml_map);
g_signal_emit_by_name (apriv->tml_map, "completed", NULL);
}
if ((event & MUTTER_PLUGIN_DESTROY) && apriv->tml_destroy)
if (apriv->tml_destroy)
{
clutter_timeline_stop (apriv->tml_destroy);
g_signal_emit_by_name (apriv->tml_destroy, "completed", NULL);

View File

@@ -155,7 +155,7 @@ tidy_texture_frame_unrealize (ClutterActor *self)
if (priv->material == COGL_INVALID_HANDLE)
return;
cogl_material_unref (priv->material);
cogl_handle_unref (priv->material);
priv->material = COGL_INVALID_HANDLE;
CLUTTER_ACTOR_UNSET_FLAGS (self, CLUTTER_ACTOR_REALIZED);
@@ -415,7 +415,7 @@ tidy_texture_frame_dispose (GObject *gobject)
if (priv->material)
{
cogl_material_unref (priv->material);
cogl_handle_unref (priv->material);
priv->material = COGL_INVALID_HANDLE;
}

View File

@@ -526,6 +526,9 @@ meta_core_get_menu_accelerator (MetaMenuOp menu_op,
switch (menu_op)
{
case META_MENU_OP_NONE:
/* No keybinding for this one */
break;
case META_MENU_OP_DELETE:
name = "close";
break;

View File

@@ -22,8 +22,7 @@
* 02111-1307, USA.
*/
#define _GNU_SOURCE
#define _SVID_SOURCE /* for gethostname() */
#define _XOPEN_SOURCE /* for kill() */
#include <config.h>
#include "util.h"
@@ -32,6 +31,7 @@
#include "workspace.h"
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
@@ -178,36 +178,23 @@ meta_window_delete (MetaWindow *window,
void
meta_window_kill (MetaWindow *window)
{
char buf[257];
meta_topic (META_DEBUG_WINDOW_OPS,
"Killing %s brutally\n",
window->desc);
if (window->wm_client_machine != NULL &&
if (!meta_window_is_remote (window) &&
window->net_wm_pid > 0)
{
if (gethostname (buf, sizeof(buf)-1) == 0)
{
if (strcmp (buf, window->wm_client_machine) == 0)
{
meta_topic (META_DEBUG_WINDOW_OPS,
"Killing %s with kill()\n",
window->desc);
meta_topic (META_DEBUG_WINDOW_OPS,
"Killing %s with kill()\n",
window->desc);
if (kill (window->net_wm_pid, 9) < 0)
meta_topic (META_DEBUG_WINDOW_OPS,
"Failed to signal %s: %s\n",
window->desc, strerror (errno));
}
}
else
{
meta_warning (_("Failed to get hostname: %s\n"),
strerror (errno));
}
if (kill (window->net_wm_pid, 9) < 0)
meta_topic (META_DEBUG_WINDOW_OPS,
"Failed to signal %s: %s\n",
window->desc, strerror (errno));
}
meta_topic (META_DEBUG_WINDOW_OPS,
"Disconnecting %s with XKillClient()\n",
window->desc);

View File

@@ -83,10 +83,11 @@ struct _MetaDisplay
char *name;
Display *xdisplay;
char *hostname;
Window leader_window;
Window timestamp_pinging_window;
/* Pull in all the names of atoms as fields; we will intern them when the
* class is constructed.
*/
@@ -303,22 +304,15 @@ struct _MetaDisplayClass
GObjectClass parent_class;
};
/* Xserver time can wraparound, thus comparing two timestamps needs to take
* this into account. Here's a little macro to help out. If no wraparound
* has occurred, this is equivalent to
* time1 < time2
* Of course, the rest of the ugliness of this macro comes from accounting
* for the fact that wraparound can occur and the fact that a timestamp of
* 0 must be special-cased since it means older than anything else.
*
* Note that this is NOT an equivalent for time1 <= time2; if that's what
* you need then you'll need to swap the order of the arguments and negate
* the result.
*/
#define XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS(time1, time2) \
( (( (time1) < (time2) ) && ( (time2) - (time1) < ((guint32)-1)/2 )) || \
(( (time1) > (time2) ) && ( (time1) - (time2) > ((guint32)-1)/2 )) \
)
/**
* XSERVER_TIME_IS_BEFORE:
*
* See the docs for meta_display_xserver_time_is_before().
*/
#define XSERVER_TIME_IS_BEFORE(time1, time2) \
( (time1) == 0 || \
(XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS(time1, time2) && \

View File

@@ -30,6 +30,8 @@
* The display is represented as a MetaDisplay struct.
*/
#define _XOPEN_SOURCE 600 /* for gethostname() */
#include <config.h>
#include "display-private.h"
#include "util.h"
@@ -72,6 +74,7 @@
#include <X11/extensions/Xdamage.h>
#include <X11/extensions/Xfixes.h>
#include <string.h>
#include <unistd.h>
#define GRAB_OP_IS_WINDOW_SWITCH(g) \
(g == META_GRAB_OP_KEYBOARD_TABBING_NORMAL || \
@@ -429,6 +432,7 @@ meta_display_open (void)
GSList *tmp;
int i;
guint32 timestamp;
char buf[257];
/* A list of all atom names, so that we can intern them in one go. */
char *atom_names[] = {
@@ -463,6 +467,11 @@ meta_display_open (void)
*/
the_display->name = g_strdup (XDisplayName (NULL));
the_display->xdisplay = xdisplay;
if (gethostname (buf, sizeof(buf)-1) == 0)
{
buf[sizeof(buf)-1] = '\0';
the_display->hostname = g_strdup (buf);
}
the_display->error_trap_synced_at_last_pop = TRUE;
the_display->error_traps = 0;
the_display->error_trap_handler = NULL;
@@ -1320,6 +1329,43 @@ meta_grab_op_is_moving (MetaGrabOp op)
}
}
/**
* meta_display_xserver_time_is_before:
* @display: a #MetaDisplay
* @time1: An event timestamp
* @time2: An event timestamp
*
* Xserver time can wraparound, thus comparing two timestamps needs to take
* this into account. If no wraparound has occurred, this is equivalent to
* time1 < time2
* Otherwise, we need to account for the fact that wraparound can occur
* and the fact that a timestamp of 0 must be special-cased since it
* means "older than anything else".
*
* Note that this is NOT an equivalent for time1 <= time2; if that's what
* you need then you'll need to swap the order of the arguments and negate
* the result.
*/
gboolean
meta_display_xserver_time_is_before (MetaDisplay *display,
guint32 time1,
guint32 time2)
{
return XSERVER_TIME_IS_BEFORE(time1, time2);
}
/**
* meta_display_get_last_user_time:
* @display: a #MetaDisplay
*
* Returns: Timestamp of the last user interaction event with a window
*/
guint32
meta_display_get_last_user_time (MetaDisplay *display)
{
return display->last_user_time;
}
/* Get time of current event, or CurrentTime if none. */
guint32
meta_display_get_current_time (MetaDisplay *display)
@@ -4132,8 +4178,8 @@ meta_set_syncing (gboolean setting)
if (setting != is_syncing)
{
is_syncing = setting;
XSynchronize (meta_get_display ()->xdisplay, is_syncing);
if (meta_get_display ())
XSynchronize (meta_get_display ()->xdisplay, is_syncing);
}
}
@@ -4974,6 +5020,34 @@ meta_display_stack_cmp (const void *a,
return 0; /* not reached in theory, if windows on same display */
}
/**
* meta_display_sort_windows_by_stacking:
* @display: a #MetaDisplay
* @windows: (element-type MetaWindow): Set of windows
*
* Sorts a set of windows according to their current stacking order. If windows
* from multiple screens are present in the set of input windows, then all the
* windows on screen 0 are sorted below all the windows on screen 1, and so forth.
* Since the stacking order of override-redirect windows isn't controlled by
* Metacity, if override-redirect windows are in the input, the result may not
* correspond to the actual stacking order in the X server.
*
* An example of using this would be to sort the list of transient dialogs for a
* window into their current stacking order.
*
* Returns: (transfer container): Input windows sorted by stacking order, from lowest to highest
*/
GSList *
meta_display_sort_windows_by_stacking (MetaDisplay *display,
GSList *windows)
{
GSList *copy = g_slist_copy (windows);
copy = g_slist_sort (copy, meta_display_stack_cmp);
return copy;
}
void
meta_display_devirtualize_modifiers (MetaDisplay *display,
MetaVirtualModifier modifiers,
@@ -5340,3 +5414,19 @@ Atom meta_display_get_atom (MetaDisplay *display, MetaAtom meta_atom)
return atoms[meta_atom - 1];
}
/**
* meta_display_get_leader_window:
* @display: a #MetaDisplay
*
* Returns the window manager's leader window (as defined by the
* _NET_SUPPORTING_WM_CHECK mechanism of EWMH). For use by plugins that wish
* to attach additional custom properties to this window.
*
* Return value: (transfer none): xid of the leader window.
**/
Window
meta_display_get_leader_window (MetaDisplay *display)
{
return display->leader_window;
}

View File

@@ -499,14 +499,25 @@ display_get_keybinding (MetaDisplay *display,
return NULL;
}
static MetaKeyBindingAction
display_get_keybinding_action (MetaDisplay *display,
unsigned int keysym,
unsigned int keycode,
unsigned long mask)
/**
* meta_display_get_keybinding_action:
* @display: A #MetaDisplay
* @keysym: Key symbol
* @keycode: Raw keycode
* @mask: Event mask
*
* Returns: The action that should be taken for the given key, or %META_KEYBINDING_ACTION_NONE.
*
*/
MetaKeyBindingAction
meta_display_get_keybinding_action (MetaDisplay *display,
unsigned int keysym,
unsigned int keycode,
unsigned long mask)
{
MetaKeyBinding *binding;
mask = mask & 0xff & ~display->ignored_modifier_mask;
binding = display_get_keybinding (display, keysym, keycode, mask);
if (binding)
@@ -2756,10 +2767,10 @@ process_workspace_switch_grab (MetaDisplay *display,
MetaWorkspace *target_workspace;
MetaKeyBindingAction action;
action = display_get_keybinding_action (display,
keysym,
event->xkey.keycode,
display->grab_mask);
action = meta_display_get_keybinding_action (display,
keysym,
event->xkey.keycode,
display->grab_mask);
switch (action)
{

View File

@@ -586,7 +586,7 @@ main (int argc, char **argv)
* is initialized at this point, and we don't plan to run any real
* plugin code.
*/
MutterPluginManager *mgr = mutter_plugin_manager_new (NULL);
MutterPluginManager *mgr = mutter_plugin_manager_get_default ();
if (!mutter_plugin_manager_load (mgr))
g_critical ("failed to load plugins");
}

View File

@@ -27,6 +27,7 @@
#include "prefs.h"
#include "ui.h"
#include "util.h"
#include "compositor/mutter-plugin-manager.h"
#ifdef HAVE_GCONF
#include <gconf/gconf-client.h>
#endif
@@ -146,6 +147,8 @@ static gboolean update_command (const char *name,
static gboolean update_workspace_name (const char *name,
const char *value);
static void notify_new_value (const char *key,
GConfValue *value);
static void change_notify (GConfClient *client,
guint cnxn_id,
GConfEntry *entry,
@@ -228,7 +231,12 @@ static GConfEnumStringPair symtab_titlebar_action[] =
{ 0, NULL },
};
/**
/*
* Note that 'gchar *key' is the first element of all these structures;
* we count on that below in key_is_used and do_override.
*/
/*
* The details of one preference which is constrained to be
* one of a small number of string values-- in other words,
* an enumeration.
@@ -241,21 +249,6 @@ static GConfEnumStringPair symtab_titlebar_action[] =
* been outweighed by the bugs caused when the ordering of the enum
* strings got out of sync with the actual enum statement. Also,
* there is existing library code to use this kind of symbol tables.
*
* Other things we might consider doing to clean this up in the
* future include:
*
* - most of the keys begin with the same prefix, and perhaps we
* could assume it if they don't start with a slash
*
* - there are several cases where a single identifier could be used
* to generate an entire entry, and perhaps this could be done
* with a macro. (This would reduce clarity, however, and is
* probably a bad thing.)
*
* - these types all begin with a gchar* (and contain a MetaPreference)
* and we can factor out the repeated code in the handlers by taking
* advantage of this using some kind of union arrangement.
*/
typedef struct
{
@@ -496,6 +489,20 @@ static MetaIntPreference preferences_int[] =
{ NULL, 0, NULL, 0, 0, 0, },
};
/*
* This is used to keep track of preferences that have been
* repointed to a different GConf key location; we modify the
* preferences arrays directly, but we also need to remember
* what we have done to handle subsequent overrides correctly.
*/
typedef struct
{
gchar *original_key;
gchar *new_key;
} MetaPrefsOverriddenKey;
static GSList *overridden_keys;
static void
handle_preference_init_enum (void)
{
@@ -1031,6 +1038,7 @@ meta_prefs_init (void)
#ifdef HAVE_GCONF
GError *err = NULL;
gchar **gconf_dir_cursor;
MutterPluginManager *plugin_manager;
if (default_client != NULL)
return;
@@ -1049,12 +1057,7 @@ meta_prefs_init (void)
cleanup_error (&err);
}
/* Pick up initial values. */
handle_preference_init_enum ();
handle_preference_init_bool ();
handle_preference_init_string ();
handle_preference_init_int ();
/* The plugin list is special and needs to be handled first */
if (!clutter_plugins_overridden)
clutter_plugins = gconf_client_get_list (default_client, KEY_CLUTTER_PLUGINS,
@@ -1062,6 +1065,18 @@ meta_prefs_init (void)
cleanup_error (&err);
/* We now initialize plugins so that they can override any preference locations */
plugin_manager = mutter_plugin_manager_get_default ();
mutter_plugin_manager_load (plugin_manager);
/* Pick up initial values. */
handle_preference_init_enum ();
handle_preference_init_bool ();
handle_preference_init_string ();
handle_preference_init_int ();
/* @@@ Is there any reason we don't do the add_dir here? */
for (gconf_dir_cursor=gconf_dirs_we_are_interested_in;
*gconf_dir_cursor!=NULL;
@@ -1094,6 +1109,160 @@ meta_prefs_init (void)
init_workspace_names ();
}
/* This count on the key being the first element of the
* preference structure */
static gboolean
key_is_used (void *prefs,
size_t pref_size,
const char *new_key)
{
void *p = prefs;
while (TRUE)
{
char **key = p;
if (*key == NULL)
break;
if (strcmp (*key, new_key) == 0)
return TRUE;
p = (guchar *)p + pref_size;
}
return FALSE;
}
static gboolean
do_override (void *prefs,
size_t pref_size,
const char *search_key,
char *new_key)
{
void *p = prefs;
while (TRUE)
{
char **key = p;
if (*key == NULL)
break;
if (strcmp (*key, search_key) == 0)
{
*key = new_key;
return TRUE;
}
p = (guchar *)p + pref_size;
}
return FALSE;
}
/**
* meta_prefs_override_preference_location
* @original_key: the normal Metacity preference location
* @new_key: the Metacity preference location to use instead.
*
* Substitute a different location to use instead of a standard Metacity
* GConf key location. This might be used if a plugin expected a different
* value for some preference than the Metacity default. While this function
* can be called at any point, this function should generally be called
* in a plugin's constructor, rather than in its start() method so the
* preference isn't first loaded with one value then changed to another
* value.
*/
void
meta_prefs_override_preference_location (const char *original_key,
const char *new_key)
{
const char *search_key;
char *new_key_copy;
gboolean found;
MetaPrefsOverriddenKey *overridden;
GSList *tmp;
/* Merge identical overrides, this isn't an error */
for (tmp = overridden_keys; tmp; tmp = tmp->next)
{
MetaPrefsOverriddenKey *tmp_overridden = tmp->data;
if (strcmp (tmp_overridden->original_key, original_key) == 0 &&
strcmp (tmp_overridden->new_key, new_key) == 0)
return;
}
/* We depend on a unique mapping from GConf key to preference, so
* enforce this */
if (key_is_used (preferences_enum, sizeof(MetaEnumPreference), new_key) ||
key_is_used (preferences_bool, sizeof(MetaBoolPreference), new_key) ||
key_is_used (preferences_string, sizeof(MetaStringPreference), new_key) ||
key_is_used (preferences_int, sizeof(MetaIntPreference), new_key))
{
meta_warning (_("GConf key %s is already in use and can't be used to override %s\n"),
new_key, original_key);
}
new_key_copy = g_strdup (new_key);
search_key = original_key;
overridden = NULL;
for (tmp = overridden_keys; tmp; tmp = tmp->next)
{
MetaPrefsOverriddenKey *tmp_overridden = tmp->data;
if (strcmp (overridden->original_key, original_key) == 0)
{
overridden = tmp_overridden;
search_key = tmp_overridden->new_key;
}
}
found =
do_override (preferences_enum, sizeof(MetaEnumPreference), search_key, new_key_copy) ||
do_override (preferences_bool, sizeof(MetaBoolPreference), search_key, new_key_copy) ||
do_override (preferences_string, sizeof(MetaStringPreference), search_key, new_key_copy) ||
do_override (preferences_int, sizeof(MetaIntPreference), search_key, new_key_copy);
if (found)
{
if (overridden)
{
g_free (overridden->new_key);
overridden->new_key = new_key_copy;
}
else
{
overridden = g_slice_new (MetaPrefsOverriddenKey);
overridden->original_key = g_strdup (original_key);
overridden->new_key = new_key_copy;
}
#ifdef HAVE_GCONF
if (default_client != NULL)
{
/* We're already initialized, so notify of a change */
GConfValue *value;
GError *err = NULL;
value = gconf_client_get (default_client, new_key, &err);
cleanup_error (&err);
notify_new_value (new_key, value);
if (value)
gconf_value_free (value);
}
#endif /* HAVE_GCONF */
}
else
{
meta_warning (_("Can't override GConf key, %s not found\n"), original_key);
g_free (new_key_copy);
}
}
/****************************************************************************/
/* Updates. */
@@ -1109,6 +1278,23 @@ gboolean (*preference_update_handler[]) (const gchar*, GConfValue*) = {
NULL
};
static void
notify_new_value (const char *key,
GConfValue *value)
{
int i = 0;
/* FIXME: Use MetaGenericPreference and save a bit of code duplication */
while (preference_update_handler[i] != NULL)
{
if (preference_update_handler[i] (key, value))
return;
i++;
}
}
static void
change_notify (GConfClient *client,
guint cnxn_id,
@@ -1117,25 +1303,13 @@ change_notify (GConfClient *client,
{
const char *key;
GConfValue *value;
gint i=0;
key = gconf_entry_get_key (entry);
value = gconf_entry_get_value (entry);
/* First, search for a handler that might know what to do. */
/* FIXME: When this is all working, since the first item in every
* array is the gchar* of the key, there's no reason we can't
* find the correct record for that key here and save code duplication.
*/
while (preference_update_handler[i]!=NULL)
{
if (preference_update_handler[i] (key, value))
goto out; /* Get rid of this eventually */
i++;
}
notify_new_value (key, value);
if (g_str_has_prefix (key, KEY_WINDOW_BINDINGS_PREFIX) ||
g_str_has_prefix (key, KEY_SCREEN_BINDINGS_PREFIX))
@@ -2004,6 +2178,8 @@ init_commands (void)
static void
init_workspace_names (void)
{
int i;
#ifdef HAVE_GCONF
GSList *list, *l;
const char *str_val;
@@ -2022,14 +2198,14 @@ init_workspace_names (void)
gconf_entry_free (entry);
}
g_slist_free (list);
#else
int i;
#endif /* HAVE_GCONF */
for (i = 0; i < MAX_REASONABLE_WORKSPACES; i++)
workspace_names[i] = g_strdup_printf (_("Workspace %d"), i + 1);
if (workspace_names[i] == NULL)
workspace_names[i] = g_strdup_printf (_("Workspace %d"), i + 1);
meta_topic (META_DEBUG_PREFS,
"Initialized workspace names\n");
#endif /* HAVE_GCONF */
}
static gboolean

View File

@@ -1266,7 +1266,8 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace,
GList *l;
MetaWorkspace *neighbour = NULL;
GList *next = NULL;
int index;
int index;
int new_num;
l = screen->workspaces;
while (l)
@@ -1308,7 +1309,10 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace,
/* This also removes the workspace from the screens list */
meta_workspace_remove (workspace);
set_number_of_spaces_hint (screen, g_list_length (screen->workspaces));
new_num = g_list_length (screen->workspaces);
set_number_of_spaces_hint (screen, new_num);
meta_prefs_set_num_workspaces (new_num);
l = next;
while (l)
@@ -1344,6 +1348,7 @@ meta_screen_append_new_workspace (MetaScreen *screen, gboolean activate,
guint32 timestamp)
{
MetaWorkspace *w;
int new_num;
/* This also adds the workspace to the screen list */
w = meta_workspace_new (screen);
@@ -1354,7 +1359,10 @@ meta_screen_append_new_workspace (MetaScreen *screen, gboolean activate,
if (activate)
meta_workspace_activate (w, timestamp);
set_number_of_spaces_hint (screen, g_list_length (screen->workspaces));
new_num = g_list_length (screen->workspaces);
set_number_of_spaces_hint (screen, new_num);
meta_prefs_set_num_workspaces (new_num);
meta_screen_queue_workarea_recalc (screen);
@@ -1381,6 +1389,9 @@ update_num_workspaces (MetaScreen *screen,
g_assert (new_num > 0);
if (g_list_length (screen->workspaces) == (guint) new_num)
return;
last_remaining = NULL;
extras = NULL;
i = 0;

View File

@@ -40,6 +40,12 @@
#include <X11/Xlib.h> /* must explicitly be included for Solaris; #326746 */
#include <X11/Xutil.h> /* Just for the definition of the various gravities */
static void
meta_topic_real_valist (MetaDebugTopic topic,
const char *format,
va_list args);
#ifdef HAVE_BACKTRACE
#include <execinfo.h>
void
@@ -71,7 +77,7 @@ meta_print_backtrace (void)
}
#endif
static gboolean is_verbose = FALSE;
static gint verbose_topics = 0;
static gboolean is_debugging = FALSE;
static gboolean replace_current = FALSE;
static int no_prefix = 0;
@@ -128,7 +134,7 @@ ensure_logfile (void)
gboolean
meta_is_verbose (void)
{
return is_verbose;
return verbose_topics != 0;
}
void
@@ -141,8 +147,48 @@ meta_set_verbose (gboolean setting)
if (setting)
ensure_logfile ();
#endif
is_verbose = setting;
if (setting)
meta_add_verbose_topic (META_DEBUG_VERBOSE);
else
meta_remove_verbose_topic (META_DEBUG_VERBOSE);
}
/**
* meta_add_verbose_topic:
* @topic: Topic for which logging will be started
*
* Ensure log messages for the given topic @topic
* will be printed.
*/
void
meta_add_verbose_topic (MetaDebugTopic topic)
{
if (verbose_topics == META_DEBUG_VERBOSE)
return;
if (topic == META_DEBUG_VERBOSE)
verbose_topics = META_DEBUG_VERBOSE;
else
verbose_topics |= topic;
}
/**
* meta_remove_verbose_topic:
* @topic: Topic for which logging will be stopped
*
* Stop printing log messages for the given topic @topic. Note
* that this method does not stack with meta_add_verbose_topic();
* i.e. if two calls to meta_add_verbose_topic() for the same
* topic are made, one call to meta_remove_verbose_topic() will
* remove it.
*/
void
meta_remove_verbose_topic (MetaDebugTopic topic)
{
if (topic == META_DEBUG_VERBOSE)
verbose_topics = 0;
else
verbose_topics &= ~topic;
}
gboolean
@@ -250,27 +296,10 @@ void
meta_verbose_real (const char *format, ...)
{
va_list args;
gchar *str;
FILE *out;
g_return_if_fail (format != NULL);
if (!is_verbose)
return;
va_start (args, format);
str = g_strdup_vprintf (format, args);
meta_topic_real_valist (META_DEBUG_VERBOSE, format, args);
va_end (args);
out = logfile ? logfile : stderr;
if (no_prefix == 0)
utf8_fputs ("Window manager: ", out);
utf8_fputs (str, out);
fflush (out);
g_free (str);
}
#endif /* WITH_VERBOSE_MODE */
@@ -324,6 +353,8 @@ topic_name (MetaDebugTopic topic)
return "COMPOSITOR";
case META_DEBUG_EDGE_RESISTANCE:
return "EDGE_RESISTANCE";
case META_DEBUG_VERBOSE:
return "VERBOSE";
}
return "WM";
@@ -331,23 +362,22 @@ topic_name (MetaDebugTopic topic)
static int sync_count = 0;
void
meta_topic_real (MetaDebugTopic topic,
const char *format,
...)
static void
meta_topic_real_valist (MetaDebugTopic topic,
const char *format,
va_list args)
{
va_list args;
gchar *str;
FILE *out;
g_return_if_fail (format != NULL);
if (!is_verbose)
if (verbose_topics == 0
|| (topic == META_DEBUG_VERBOSE && verbose_topics != META_DEBUG_VERBOSE)
|| (!(verbose_topics & topic)))
return;
va_start (args, format);
str = g_strdup_vprintf (format, args);
va_end (args);
out = logfile ? logfile : stderr;
@@ -366,6 +396,18 @@ meta_topic_real (MetaDebugTopic topic,
g_free (str);
}
void
meta_topic_real (MetaDebugTopic topic,
const char *format,
...)
{
va_list args;
va_start (args, format);
meta_topic_real_valist (topic, format, args);
va_end (args);
}
#endif /* WITH_VERBOSE_MODE */
void

View File

@@ -46,9 +46,6 @@
typedef struct _MetaWindowQueue MetaWindowQueue;
typedef gboolean (*MetaWindowForeachFunc) (MetaWindow *window,
void *data);
typedef enum {
META_CLIENT_TYPE_UNKNOWN = 0,
META_CLIENT_TYPE_APPLICATION = 1,
@@ -99,6 +96,7 @@ struct _MetaWindow
char *sm_client_id;
char *wm_client_machine;
char *startup_id;
char *mutter_hints;
int net_wm_pid;
@@ -506,8 +504,6 @@ void meta_window_get_geometry (MetaWindow *window,
void meta_window_kill (MetaWindow *window);
void meta_window_focus (MetaWindow *window,
guint32 timestamp);
void meta_window_raise (MetaWindow *window);
void meta_window_lower (MetaWindow *window);
void meta_window_update_unfocused_button_grabs (MetaWindow *window);
@@ -582,12 +578,6 @@ void meta_window_refresh_resize_popup (MetaWindow *window);
void meta_window_free_delete_dialog (MetaWindow *window);
void meta_window_foreach_transient (MetaWindow *window,
MetaWindowForeachFunc func,
void *data);
void meta_window_foreach_ancestor (MetaWindow *window,
MetaWindowForeachFunc func,
void *data);
void meta_window_begin_grab_op (MetaWindow *window,
MetaGrabOp op,
@@ -610,10 +600,6 @@ void meta_window_stack_just_below (MetaWindow *window,
void meta_window_set_user_time (MetaWindow *window,
guint32 timestamp);
void meta_window_set_demands_attention (MetaWindow *window);
void meta_window_unset_demands_attention (MetaWindow *window);
void meta_window_update_icon_now (MetaWindow *window);
void meta_window_update_role (MetaWindow *window);

View File

@@ -523,6 +523,49 @@ reload_wm_name (MetaWindow *window,
}
}
static void
reload_mutter_hints (MetaWindow *window,
MetaPropValue *value,
gboolean initial)
{
if (value->type != META_PROP_VALUE_INVALID)
{
char *new_hints = value->v.str;
char *old_hints = window->mutter_hints;
gboolean changed = FALSE;
if (new_hints)
{
if (!old_hints || strcmp (new_hints, old_hints))
changed = TRUE;
}
else
{
if (old_hints)
changed = TRUE;
}
if (changed)
{
g_free (old_hints);
if (new_hints)
window->mutter_hints = g_strdup (new_hints);
else
window->mutter_hints = NULL;
g_object_notify (G_OBJECT (window), "mutter-hints");
}
}
else if (window->mutter_hints)
{
g_free (window->mutter_hints);
window->mutter_hints = NULL;
g_object_notify (G_OBJECT (window), "mutter-hints");
}
}
static void
set_icon_title (MetaWindow *window,
const char *title)
@@ -1506,6 +1549,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
{ XA_WM_CLASS, META_PROP_VALUE_CLASS_HINT, reload_wm_class, TRUE, TRUE },
{ display->atom__NET_WM_PID, META_PROP_VALUE_CARDINAL, reload_net_wm_pid, TRUE, TRUE },
{ XA_WM_NAME, META_PROP_VALUE_TEXT_PROPERTY, reload_wm_name, TRUE, TRUE },
{ display->atom__MUTTER_HINTS, META_PROP_VALUE_TEXT_PROPERTY, reload_mutter_hints, TRUE, TRUE },
{ display->atom__NET_WM_ICON_NAME, META_PROP_VALUE_UTF8, reload_net_wm_icon_name, TRUE, FALSE },
{ XA_WM_ICON_NAME, META_PROP_VALUE_TEXT_PROPERTY, reload_wm_icon_name, TRUE, FALSE },
{ display->atom__NET_WM_DESKTOP, META_PROP_VALUE_CARDINAL, reload_net_wm_desktop, TRUE, FALSE },

View File

@@ -146,7 +146,8 @@ enum {
PROP_WINDOW_TYPE,
PROP_USER_TIME,
PROP_DEMANDS_ATTENTION,
PROP_URGENT
PROP_URGENT,
PROP_MUTTER_HINTS
};
enum
@@ -228,6 +229,9 @@ meta_window_get_property(GObject *object,
case PROP_URGENT:
g_value_set_boolean (value, win->wm_hints_urgent);
break;
case PROP_MUTTER_HINTS:
g_value_set_string (value, win->mutter_hints);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -348,6 +352,13 @@ meta_window_class_init (MetaWindowClass *klass)
FALSE,
G_PARAM_READABLE));
g_object_class_install_property (object_class,
PROP_MUTTER_HINTS,
g_param_spec_string ("mutter-hints",
"_MUTTER_HINTS",
"Contents of the _MUTTER_HINTS property of this window",
NULL,
G_PARAM_READABLE));
window_signals[WORKSPACE_CHANGED] =
g_signal_new ("workspace-changed",
G_TYPE_FROM_CLASS (object_class),
@@ -3224,10 +3235,6 @@ meta_window_unmaximize (MetaWindow *window,
window->display->grab_anchor_window_pos = target_rect;
}
/* Make sure user_rect is current.
*/
force_save_user_window_placement (window);
if (window->display->compositor)
{
MetaRectangle old_rect, new_rect;
@@ -3257,6 +3264,10 @@ meta_window_unmaximize (MetaWindow *window,
target_rect.height);
}
/* Make sure user_rect is current.
*/
force_save_user_window_placement (window);
recalc_window_features (window);
set_net_wm_state (window);
}
@@ -7067,9 +7078,12 @@ menu_callback (MetaWindowMenu *menu,
{
meta_verbose ("Menu op %u on %s\n", op, window->desc);
/* op can be 0 for none */
switch (op)
{
case META_MENU_OP_NONE:
/* nothing */
break;
case META_MENU_OP_DELETE:
meta_window_delete (window, timestamp);
break;
@@ -7157,10 +7171,6 @@ menu_callback (MetaWindowMenu *menu,
meta_window_shove_titlebar_onscreen (window);
break;
case 0:
/* nothing */
break;
default:
meta_warning (G_STRLOC": Unknown window op\n");
break;
@@ -7213,8 +7223,8 @@ meta_window_show_menu (MetaWindow *window,
window->display->window_with_menu = NULL;
}
ops = 0;
insensitive = 0;
ops = META_MENU_OP_NONE;
insensitive = META_MENU_OP_NONE;
ops |= (META_MENU_OP_DELETE | META_MENU_OP_MINIMIZE | META_MENU_OP_MOVE | META_MENU_OP_RESIZE);
@@ -8248,10 +8258,22 @@ meta_window_refresh_resize_popup (MetaWindow *window)
}
}
/**
* meta_window_foreach_transient:
* @window: a #MetaWindow
* @func: (scope call): Called for each window which is a transient of @window (transitively)
* @user_data: (closure): User data
*
* Call @func for every window which is either transient for @window, or is
* a transient of a window which is in turn transient for @window.
* The order of window enumeration is not defined.
*
* Iteration will stop if @func at any point returns %FALSE.
*/
void
meta_window_foreach_transient (MetaWindow *window,
MetaWindowForeachFunc func,
void *data)
void *user_data)
{
GSList *windows;
GSList *tmp;
@@ -8265,7 +8287,7 @@ meta_window_foreach_transient (MetaWindow *window,
if (meta_window_is_ancestor_of_transient (window, transient))
{
if (!(* func) (transient, data))
if (!(* func) (transient, user_data))
break;
}
@@ -8275,10 +8297,19 @@ meta_window_foreach_transient (MetaWindow *window,
g_slist_free (windows);
}
/**
* meta_window_foreach_ancestor:
* @window: a #MetaWindow
* @func: (scope call): Called for each window which is a transient parent of @window
* @user_data: (closure): User data
*
* If @window is transient, call @func with the window for which it's transient,
* repeatedly until either we find a non-transient window, or @func returns %FALSE.
*/
void
meta_window_foreach_ancestor (MetaWindow *window,
MetaWindowForeachFunc func,
void *data)
void *user_data)
{
MetaWindow *w;
MetaWindow *tortoise;
@@ -8296,7 +8327,7 @@ meta_window_foreach_ancestor (MetaWindow *window,
if (w == NULL || w == tortoise)
break;
if (!(* func) (w, data))
if (!(* func) (w, user_data))
break;
if (w->xtransient_for == None ||
@@ -8308,7 +8339,7 @@ meta_window_foreach_ancestor (MetaWindow *window,
if (w == NULL || w == tortoise)
break;
if (!(* func) (w, data))
if (!(* func) (w, user_data))
break;
tortoise = meta_display_lookup_x_window (tortoise->display,
@@ -8923,8 +8954,8 @@ meta_window_get_description (MetaWindow *window)
/**
* meta_window_get_wm_class:
* @window: a #MetaWindow
*
* Return the current value of the WM_CLASS X property.
*
* Return the current value of the name part of WM_CLASS X property.
*/
const char *
meta_window_get_wm_class (MetaWindow *window)
@@ -8935,6 +8966,21 @@ meta_window_get_wm_class (MetaWindow *window)
return window->res_class;
}
/**
* meta_window_get_wm_class_instance:
* @window: a #MetaWindow
*
* Return the current value of the instance part of WM_CLASS X property.
*/
const char *
meta_window_get_wm_class_instance (MetaWindow *window)
{
if (!window)
return NULL;
return window->res_name;
}
/**
* meta_window_get_compositor_private:
* @window: a #MetaWindow
@@ -9069,6 +9115,21 @@ meta_window_get_client_machine (MetaWindow *window)
return window->wm_client_machine;
}
/**
* meta_window_is_remote:
* @window: a #MetaWindow
*
* Returns: %TRUE if this window originates from a host
* different from the one running mutter.
*/
gboolean
meta_window_is_remote (MetaWindow *window)
{
g_return_val_if_fail (META_IS_WINDOW (window), FALSE);
return g_strcmp0 (window->wm_client_machine, window->display->hostname) != 0;
}
/**
* meta_window_is_modal:
* @window: a #MetaWindow
@@ -9085,3 +9146,29 @@ meta_window_is_modal (MetaWindow *window)
return window->wm_state_modal;
}
/**
* meta_window_get_mutter_hints:
* @window: a #MetaWindow
*
* Gets the current value of the _MUTTER_HINTS property.
*
* The purpose of the hints is to allow fine-tuning of the Window Manager and
* Compositor behaviour on per-window basis, and is intended primarily for
* hints that are plugin-specific.
*
* The property is a list of colon-separated key=value pairs. The key names for
* any plugin-specific hints must be suitably namespaced to allow for shared
* use; 'mutter-' key prefix is reserved for internal use, and must not be used
* by plugins.
*
* Return value: (transfer none): the _MUTTER_HINTS string, or %NULL if no hints
* are set.
*/
const char *
meta_window_get_mutter_hints (MetaWindow *window)
{
g_return_val_if_fail (META_IS_WINDOW (window), NULL);
return window->mutter_hints;
}

26
src/gtk-compat.h Normal file
View File

@@ -0,0 +1,26 @@
#ifndef __GTK_COMPAT_H__
#define __GTK_COMPAT_H__
#include <gtk/gtk.h>
/* Provide a compatibility layer for accessor function introduces
* in GTK+ 2.20 which we need to build with GSEAL_ENABLE.
* That way it is still possible to build with GTK+ 2.18 when not
* using GSEAL_ENABLE
*/
#if !GTK_CHECK_VERSION (2, 20, 0)
#define gtk_widget_get_realized(w) GTK_WIDGET_REALIZED (w)
#define gtk_widget_get_requisition(w,r) (*r = GTK_WIDGET (w)->requisition)
#define gtk_widget_set_mapped(w,m) \
G_STMT_START { \
if (m) \
GTK_WIDGET_SET_FLAGS (w, GTK_MAPPED); \
else \
GTK_WIDGET_UNSET_FLAGS (w, GTK_MAPPED); \
} G_STMT_END
#endif /* GTK_CHECK_VERSION */
#endif /* __GTK_COMPAT_H__ */

View File

@@ -58,6 +58,7 @@ item(_MUTTER_RESTART_MESSAGE)
item(_MUTTER_RELOAD_THEME_MESSAGE)
item(_MUTTER_SET_KEYBINDINGS_MESSAGE)
item(_MUTTER_TOGGLE_VERBOSE)
item(_MUTTER_HINTS)
item(_GNOME_WM_KEYBINDINGS)
item(_GNOME_PANEL_ACTION)
item(_GNOME_PANEL_ACTION_MAIN_MENU)

View File

@@ -52,6 +52,7 @@ typedef enum
typedef enum
{
META_MENU_OP_NONE = 0,
META_MENU_OP_DELETE = 1 << 0,
META_MENU_OP_MINIMIZE = 1 << 1,
META_MENU_OP_UNMAXIMIZE = 1 << 2,

View File

@@ -26,6 +26,7 @@
#include <X11/Xlib.h>
#include "types.h"
#include "prefs.h"
#include "common.h"
typedef enum
@@ -81,6 +82,12 @@ gboolean meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display,
int meta_display_get_damage_event_base (MetaDisplay *display);
int meta_display_get_shape_event_base (MetaDisplay *display);
Atom meta_display_get_atom (MetaDisplay *display, MetaAtom meta_atom);
gboolean meta_display_xserver_time_is_before (MetaDisplay *display,
guint32 time1,
guint32 time2);
guint32 meta_display_get_last_user_time (MetaDisplay *display);
guint32 meta_display_get_current_time (MetaDisplay *display);
guint32 meta_display_get_current_time_roundtrip (MetaDisplay *display);
@@ -117,6 +124,10 @@ void meta_display_end_grab_op (MetaDisplay *display,
MetaGrabOp meta_display_get_grab_op (MetaDisplay *display);
MetaKeyBindingAction meta_display_get_keybinding_action (MetaDisplay *display,
unsigned int keysym,
unsigned int keycode,
unsigned long mask);
/* meta_display_set_input_focus_window is like XSetInputFocus, except
* that (a) it can't detect timestamps later than the current time,
@@ -140,4 +151,9 @@ void meta_display_focus_the_no_focus_window (MetaDisplay *display,
MetaScreen *screen,
guint32 timestamp);
GSList *meta_display_sort_windows_by_stacking (MetaDisplay *display,
GSList *windows);
Window meta_display_get_leader_window (MetaDisplay *display);
#endif

View File

@@ -32,19 +32,6 @@
#include <X11/extensions/Xfixes.h>
#include <gmodule.h>
/*
* FIXME -- move these to a private include
* Required by plugin manager.
*/
#define MUTTER_PLUGIN_MINIMIZE (1<<0)
#define MUTTER_PLUGIN_MAXIMIZE (1<<1)
#define MUTTER_PLUGIN_UNMAXIMIZE (1<<2)
#define MUTTER_PLUGIN_MAP (1<<3)
#define MUTTER_PLUGIN_DESTROY (1<<4)
#define MUTTER_PLUGIN_SWITCH_WORKSPACE (1<<5)
#define MUTTER_PLUGIN_ALL_EFFECTS (~0)
#define MUTTER_TYPE_PLUGIN (mutter_plugin_get_type ())
#define MUTTER_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MUTTER_TYPE_PLUGIN, MutterPlugin))
#define MUTTER_PLUGIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MUTTER_TYPE_PLUGIN, MutterPluginClass))
@@ -69,6 +56,8 @@ struct _MutterPluginClass
{
GObjectClass parent_class;
void (*start) (MutterPlugin *plugin);
void (*minimize) (MutterPlugin *plugin,
MutterWindow *actor);
@@ -93,20 +82,18 @@ struct _MutterPluginClass
MutterWindow *actor);
void (*switch_workspace) (MutterPlugin *plugin,
const GList **actors,
gint from,
gint to,
MetaMotionDirection direction);
/*
* Called if an effect should be killed prematurely; the plugin must
* Called if an effects should be killed prematurely; the plugin must
* call the completed() callback as if the effect terminated naturally.
* The events parameter is a bitmask indicating which effects are to be
* killed.
*/
void (*kill_effect) (MutterPlugin *plugin,
MutterWindow *actor,
gulong events);
void (*kill_window_effects) (MutterPlugin *plugin,
MutterWindow *actor);
void (*kill_switch_workspace) (MutterPlugin *plugin);
/* General XEvent filter. This is fired *before* mutter itself handles
* an event. Return TRUE to block any further processing.
@@ -225,9 +212,27 @@ struct _MutterPluginVersion
} \
void
mutter_plugin_effect_completed (MutterPlugin *plugin,
MutterWindow *actor,
unsigned long event);
mutter_plugin_switch_workspace_completed (MutterPlugin *plugin);
void
mutter_plugin_minimize_completed (MutterPlugin *plugin,
MutterWindow *actor);
void
mutter_plugin_maximize_completed (MutterPlugin *plugin,
MutterWindow *actor);
void
mutter_plugin_unmaximize_completed (MutterPlugin *plugin,
MutterWindow *actor);
void
mutter_plugin_map_completed (MutterPlugin *plugin,
MutterWindow *actor);
void
mutter_plugin_destroy_completed (MutterPlugin *plugin,
MutterWindow *actor);
ClutterActor *
mutter_plugin_get_overlay_group (MutterPlugin *plugin);

View File

@@ -74,6 +74,10 @@ void meta_prefs_remove_listener (MetaPrefsChangedFunc func,
gpointer data);
void meta_prefs_init (void);
void meta_prefs_override_preference_location (const char *original_key,
const char *new_key);
const char* meta_preference_to_string (MetaPreference pref);
MetaVirtualModifier meta_prefs_get_mouse_button_mods (void);

View File

@@ -51,6 +51,7 @@ void meta_fatal (const char *format,
typedef enum
{
META_DEBUG_VERBOSE = -1,
META_DEBUG_FOCUS = 1 << 0,
META_DEBUG_WORKAREA = 1 << 1,
META_DEBUG_STACK = 1 << 2,
@@ -78,6 +79,8 @@ typedef enum
void meta_topic_real (MetaDebugTopic topic,
const char *format,
...) G_GNUC_PRINTF (2, 3);
void meta_add_verbose_topic (MetaDebugTopic topic);
void meta_remove_verbose_topic (MetaDebugTopic topic);
void meta_push_no_msg_prefix (void);
void meta_pop_no_msg_prefix (void);

View File

@@ -88,9 +88,13 @@ void meta_window_activate_with_workspace (MetaWindow *window,
MetaWorkspace *workspace);
const char * meta_window_get_description (MetaWindow *window);
const char * meta_window_get_wm_class (MetaWindow *window);
const char * meta_window_get_wm_class_instance (MetaWindow *window);
/* Return whether the window would be showing if we were on its workspace */
gboolean meta_window_showing_on_its_workspace (MetaWindow *window);
void meta_window_set_demands_attention (MetaWindow *window);
void meta_window_unset_demands_attention (MetaWindow *window);
const char* meta_window_get_startup_id (MetaWindow *window);
void meta_window_change_workspace_by_index (MetaWindow *window,
gint space_index,
@@ -104,6 +108,17 @@ MetaStackLayer meta_window_get_layer (MetaWindow *window);
MetaWindow* meta_window_find_root_ancestor (MetaWindow *window);
gboolean meta_window_is_ancestor_of_transient (MetaWindow *window,
MetaWindow *transient);
typedef gboolean (*MetaWindowForeachFunc) (MetaWindow *window,
void *data);
void meta_window_foreach_transient (MetaWindow *window,
MetaWindowForeachFunc func,
void *user_data);
void meta_window_foreach_ancestor (MetaWindow *window,
MetaWindowForeachFunc func,
void *user_data);
gboolean meta_window_is_mapped (MetaWindow *window);
gboolean meta_window_toplevel_is_mapped (MetaWindow *window);
gboolean meta_window_get_icon_geometry (MetaWindow *window,
@@ -114,6 +129,8 @@ void meta_window_unmaximize (MetaWindow *window,
MetaMaximizeFlags directions);
void meta_window_minimize (MetaWindow *window);
void meta_window_unminimize (MetaWindow *window);
void meta_window_raise (MetaWindow *window);
void meta_window_lower (MetaWindow *window);
const char *meta_window_get_title (MetaWindow *window);
MetaWindow *meta_window_get_transient_for (MetaWindow *window);
Window meta_window_get_transient_for_as_xid (MetaWindow *window);
@@ -123,5 +140,7 @@ guint meta_window_get_stable_sequence (MetaWindow *window);
guint32 meta_window_get_user_time (MetaWindow *window);
int meta_window_get_pid (MetaWindow *window);
const char *meta_window_get_client_machine (MetaWindow *window);
gboolean meta_window_is_remote (MetaWindow *window);
gboolean meta_window_is_modal (MetaWindow *window);
const char *meta_window_get_mutter_hints (MetaWindow *window);
#endif

View File

@@ -4,6 +4,7 @@ icondir=$(pkgdatadir)/icons
icon_DATA=mutter-window-demo.png
INCLUDES=@MUTTER_WINDOW_DEMO_CFLAGS@ @MUTTER_MESSAGE_CFLAGS@ \
-I$(top_srcdir)/src \
-DMUTTER_ICON_DIR=\"$(pkgdatadir)/icons\" \
-DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\"

View File

@@ -76,14 +76,17 @@ get_pixbuf (void)
static gboolean
regrab_idle (GtkWidget *image)
{
GtkAllocation allocation;
GdkPixbuf *magnified;
if (image->allocation.width != last_grab_allocation.width ||
image->allocation.height != last_grab_allocation.height)
gtk_widget_get_allocation (image, &allocation);
if (allocation.width != last_grab_allocation.width ||
allocation.height != last_grab_allocation.height)
{
last_grab_width = rint (image->allocation.width / width_factor);
last_grab_height = rint (image->allocation.height / height_factor);
last_grab_allocation = image->allocation;
last_grab_width = rint (allocation.width / width_factor);
last_grab_height = rint (allocation.height / height_factor);
last_grab_allocation = allocation;
magnified = get_pixbuf ();
@@ -224,6 +227,8 @@ mouse_press (GtkWidget *invisible,
static void
begin_area_grab (void)
{
GdkWindow *window;
if (grab_widget == NULL)
{
grab_widget = gtk_invisible_new ();
@@ -234,7 +239,9 @@ begin_area_grab (void)
gtk_widget_show (grab_widget);
}
if (gdk_keyboard_grab (grab_widget->window,
window = gtk_widget_get_window (grab_widget);
if (gdk_keyboard_grab (window,
FALSE,
gtk_get_current_event_time ()) != GDK_GRAB_SUCCESS)
{
@@ -242,7 +249,7 @@ begin_area_grab (void)
return;
}
if (gdk_pointer_grab (grab_widget->window,
if (gdk_pointer_grab (window,
FALSE,
GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_POINTER_MOTION_MASK,
NULL,

View File

@@ -24,6 +24,8 @@
#include <X11/Xatom.h>
#include <unistd.h>
#include "gtk-compat.h"
static GtkWidget* do_appwindow (void);
static gboolean aspect_on;
@@ -62,19 +64,22 @@ static void
on_realize_set_struts (GtkWindow *window,
gpointer data)
{
GtkWidget *widget;
int left;
int right;
int top;
int bottom;
g_return_if_fail (GTK_WIDGET_REALIZED (window));
widget = GTK_WIDGET (window);
g_return_if_fail (gtk_widget_get_realized (widget));
left = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-left"));
right = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-right"));
top = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-top"));
bottom = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (window), "meta-strut-bottom"));
set_gdk_window_struts (GTK_WIDGET (window)->window,
set_gdk_window_struts (gtk_widget_get_window (widget),
left, right, top, bottom);
}
@@ -85,6 +90,10 @@ set_gtk_window_struts (GtkWidget *window,
int top,
int bottom)
{
GtkWidget *widget;
widget = GTK_WIDGET (window);
g_object_set_data (G_OBJECT (window), "meta-strut-left",
GINT_TO_POINTER (left));
g_object_set_data (G_OBJECT (window), "meta-strut-right",
@@ -93,18 +102,18 @@ set_gtk_window_struts (GtkWidget *window,
GINT_TO_POINTER (top));
g_object_set_data (G_OBJECT (window), "meta-strut-bottom",
GINT_TO_POINTER (bottom));
g_signal_handlers_disconnect_by_func (G_OBJECT (window),
on_realize_set_struts,
NULL);
g_signal_connect_after (G_OBJECT (window),
"realize",
G_CALLBACK (on_realize_set_struts),
NULL);
if (GTK_WIDGET_REALIZED (window))
set_gdk_window_struts (GTK_WIDGET (window)->window,
if (gtk_widget_get_realized (widget))
set_gdk_window_struts (gtk_widget_get_window (widget),
left, right, top, bottom);
}
@@ -129,15 +138,18 @@ static void
on_realize_set_type (GtkWindow *window,
gpointer data)
{
GtkWidget *widget;
const char *type;
g_return_if_fail (GTK_WIDGET_REALIZED (window));
widget = GTK_WIDGET (window);
g_return_if_fail (gtk_widget_get_realized (widget));
type = g_object_get_data (G_OBJECT (window), "meta-window-type");
g_return_if_fail (type != NULL);
set_gdk_window_type (GTK_WIDGET (window)->window,
set_gdk_window_type (gtk_widget_get_window (widget),
type);
}
@@ -145,6 +157,10 @@ static void
set_gtk_window_type (GtkWindow *window,
const char *type)
{
GtkWidget *widget;
widget = GTK_WIDGET (window);
g_object_set_data (G_OBJECT (window), "meta-window-type", (char*) type);
g_signal_handlers_disconnect_by_func (G_OBJECT (window),
@@ -156,8 +172,8 @@ set_gtk_window_type (GtkWindow *window,
G_CALLBACK (on_realize_set_type),
NULL);
if (GTK_WIDGET_REALIZED (window))
set_gdk_window_type (GTK_WIDGET (window)->window,
if (gtk_widget_get_realized (widget))
set_gdk_window_type (gtk_widget_get_window (widget),
type);
}
@@ -171,14 +187,22 @@ static void
on_realize_set_border_only (GtkWindow *window,
gpointer data)
{
g_return_if_fail (GTK_WIDGET_REALIZED (window));
GtkWidget *widget;
widget = GTK_WIDGET (window);
g_return_if_fail (gtk_widget_get_realized (widget));
set_gdk_window_border_only (GTK_WIDGET (window)->window);
set_gdk_window_border_only (gtk_widget_get_window (widget));
}
static void
set_gtk_window_border_only (GtkWindow *window)
{
GtkWidget *widget;
widget = GTK_WIDGET (window);
g_signal_handlers_disconnect_by_func (G_OBJECT (window),
on_realize_set_border_only,
NULL);
@@ -188,8 +212,8 @@ set_gtk_window_border_only (GtkWindow *window)
G_CALLBACK (on_realize_set_border_only),
NULL);
if (GTK_WIDGET_REALIZED (window))
set_gdk_window_border_only (GTK_WIDGET (window)->window);
if (gtk_widget_get_realized (widget))
set_gdk_window_border_only (gtk_widget_get_window (widget));
}
int

View File

@@ -77,6 +77,7 @@ draw_window (GtkWidget *widget,
int icon_x, icon_y, icon_w, icon_h;
gboolean is_active;
GdkColor *color;
GtkStyle *style;
is_active = win->is_active;
@@ -84,10 +85,11 @@ draw_window (GtkWidget *widget,
cairo_rectangle (cr, winrect->x, winrect->y, winrect->width, winrect->height);
cairo_clip (cr);
style = gtk_widget_get_style (widget);
if (is_active)
color = &widget->style->light[state];
color = &style->light[state];
else
color = &widget->style->bg[state];
color = &style->bg[state];
cairo_set_source_rgb (cr,
color->red / 65535.,
color->green / 65535.,
@@ -141,11 +143,11 @@ draw_window (GtkWidget *widget,
cairo_paint (cr);
cairo_restore (cr);
}
if (is_active)
color = &widget->style->fg[state];
color = &style->fg[state];
else
color = &widget->style->fg[state];
color = &style->fg[state];
cairo_set_source_rgb (cr,
color->red / 65535.,
@@ -177,6 +179,7 @@ wnck_draw_workspace (GtkWidget *widget,
int i;
GdkRectangle workspace_rect;
GtkStateType state;
GtkStyle *style;
workspace_rect.x = x;
workspace_rect.y = y;
@@ -189,11 +192,13 @@ wnck_draw_workspace (GtkWidget *widget,
state = GTK_STATE_PRELIGHT;
else
state = GTK_STATE_NORMAL;
style = gtk_widget_get_style (widget);
if (workspace_background)
{
gdk_draw_pixbuf (drawable,
GTK_WIDGET (widget)->style->dark_gc[state],
style->dark_gc[state],
workspace_background,
0, 0,
x, y,
@@ -205,8 +210,8 @@ wnck_draw_workspace (GtkWidget *widget,
{
cairo_t *cr;
cr = gdk_cairo_create (widget->window);
gdk_cairo_set_source_color (cr, &widget->style->dark[state]);
cr = gdk_cairo_create (gtk_widget_get_window (widget));
gdk_cairo_set_source_color (cr, &style->dark[state]);
cairo_rectangle (cr, x, y, width, height);
cairo_fill (cr);
cairo_destroy (cr);

View File

@@ -53,7 +53,8 @@ static int screen_bottom_edge = 0;
static gint
expose_handler (GtkTooltips *tooltips)
{
gtk_paint_flat_box (tip->style, tip->window,
gtk_paint_flat_box (gtk_widget_get_style (tip),
gtk_widget_get_window (tip),
GTK_STATE_NORMAL, GTK_SHADOW_OUT,
NULL, tip, "tooltip",
0, 0, -1, -1);

View File

@@ -35,6 +35,8 @@
#include "prefs.h"
#include "ui.h"
#include "gtk-compat.h"
#ifdef HAVE_SHAPE
#include <X11/extensions/shape.h>
#endif
@@ -133,6 +135,24 @@ meta_frames_get_type (void)
return frames_type;
}
static GObject *
meta_frames_constructor (GType gtype,
guint n_properties,
GObjectConstructParam *properties)
{
GObject *object;
GObjectClass *gobject_class;
gobject_class = G_OBJECT_CLASS (parent_class);
object = gobject_class->constructor (gtype, n_properties, properties);
g_object_set (object,
"type", GTK_WINDOW_POPUP,
NULL);
return object;
}
static void
meta_frames_class_init (MetaFramesClass *class)
{
@@ -146,6 +166,7 @@ meta_frames_class_init (MetaFramesClass *class)
parent_class = g_type_class_peek_parent (class);
gobject_class->constructor = meta_frames_constructor;
gobject_class->finalize = meta_frames_finalize;
object_class->destroy = meta_frames_destroy;
@@ -203,8 +224,6 @@ prefs_changed_callback (MetaPreference pref,
static void
meta_frames_init (MetaFrames *frames)
{
GTK_WINDOW (frames)->type = GTK_WINDOW_POPUP;
frames->text_heights = g_hash_table_new (NULL, NULL);
frames->frames = g_hash_table_new (unsigned_long_hash, unsigned_long_equal);
@@ -459,10 +478,10 @@ meta_frames_ensure_layout (MetaFrames *frames,
MetaFrameFlags flags;
MetaFrameType type;
MetaFrameStyle *style;
g_return_if_fail (GTK_WIDGET_REALIZED (frames));
widget = GTK_WIDGET (frames);
g_return_if_fail (gtk_widget_get_realized (widget));
meta_core_get (gdk_display, frame->xwindow,
META_CORE_GET_FRAME_FLAGS, &flags,
@@ -501,6 +520,7 @@ meta_frames_ensure_layout (MetaFrames *frames,
frame->layout = gtk_widget_create_pango_layout (widget, frame->title);
pango_layout_set_ellipsize (frame->layout, PANGO_ELLIPSIZE_END);
pango_layout_set_auto_dir (frame->layout, FALSE);
font_desc = meta_gtk_widget_get_font_desc (widget, scale,
@@ -593,8 +613,9 @@ meta_frames_attach_style (MetaFrames *frames,
gtk_style_detach (frame->style);
/* Weirdly, gtk_style_attach() steals a reference count from the style passed in */
g_object_ref (GTK_WIDGET (frames)->style);
frame->style = gtk_style_attach (GTK_WIDGET (frames)->style, frame->window);
g_object_ref (gtk_widget_get_style (GTK_WIDGET (frames)));
frame->style = gtk_style_attach (gtk_widget_get_style (GTK_WIDGET (frames)),
frame->window);
}
void

View File

@@ -386,6 +386,7 @@ meta_window_menu_new (MetaFrames *frames,
Display *display;
Window xroot;
GdkScreen *screen;
GdkWindow *window;
GtkWidget *submenu;
int j;
@@ -398,9 +399,10 @@ meta_window_menu_new (MetaFrames *frames,
meta_verbose ("Creating %d-workspace menu current space %lu\n",
n_workspaces, active_workspace);
display = gdk_x11_drawable_get_xdisplay (GTK_WIDGET (frames)->window);
window = gtk_widget_get_window (GTK_WIDGET (frames));
display = gdk_x11_drawable_get_xdisplay (window);
screen = gdk_drawable_get_screen (GTK_WIDGET (frames)->window);
screen = gdk_drawable_get_screen (window);
xroot = GDK_DRAWABLE_XID (gdk_screen_get_root_window (screen));
submenu = gtk_menu_new ();
@@ -520,7 +522,7 @@ meta_window_menu_popup (MetaWindowMenu *menu,
button,
timestamp);
if (!GTK_MENU_SHELL (menu->menu)->have_xgrab)
if (!gtk_widget_get_visible (menu->menu))
meta_warning ("GtkMenu failed to grab the pointer\n");
}

View File

@@ -37,6 +37,8 @@
#include <string.h>
#include "util.h"
#include "gtk-compat.h"
static void meta_accel_label_class_init (MetaAccelLabelClass *klass);
static void meta_accel_label_init (MetaAccelLabel *accel_label);
static void meta_accel_label_destroy (GtkObject *object);
@@ -262,52 +264,61 @@ meta_accel_label_expose_event (GtkWidget *widget,
GtkMisc *misc = GTK_MISC (accel_label);
PangoLayout *layout;
if (GTK_WIDGET_DRAWABLE (accel_label))
if (gtk_widget_is_drawable (GTK_WIDGET (accel_label)))
{
GtkAllocation allocation;
GtkRequisition requisition;
int ac_width;
gtk_widget_get_allocation (widget, &allocation);
gtk_widget_get_requisition (widget, &requisition);
ac_width = meta_accel_label_get_accel_width (accel_label);
if (widget->allocation.width >= widget->requisition.width + ac_width)
if (allocation.width >= requisition.width + ac_width)
{
GtkTextDirection direction = gtk_widget_get_direction (widget);
gint x;
gint y;
gfloat xalign, yalign;
gint x, y;
gint xpad, ypad;
gtk_misc_get_padding (misc, &xpad, &ypad);
gtk_misc_get_alignment (misc, &xalign, &yalign);
if (direction == GTK_TEXT_DIR_RTL)
{
widget->allocation.x += ac_width;
allocation.x += ac_width;
}
widget->allocation.width -= ac_width;
allocation.width -= ac_width;
gtk_widget_set_allocation (widget, &allocation);
if (GTK_WIDGET_CLASS (parent_class)->expose_event)
GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event);
if (direction == GTK_TEXT_DIR_RTL)
{
widget->allocation.x -= ac_width;
allocation.x -= ac_width;
}
widget->allocation.width += ac_width;
allocation.width += ac_width;
gtk_widget_set_allocation (widget, &allocation);
if (direction == GTK_TEXT_DIR_RTL)
{
x = widget->allocation.x + misc->xpad;
x = allocation.x + xpad;
}
else
{
x = widget->allocation.x + widget->allocation.width - misc->xpad - ac_width;
x = allocation.x + allocation.width - xpad - ac_width;
}
y = (widget->allocation.y * (1.0 - misc->yalign) +
(widget->allocation.y + widget->allocation.height -
(widget->requisition.height - misc->ypad * 2)) *
misc->yalign) + 1.5;
y = (allocation.y * (1.0 - yalign) +
(allocation.y + allocation.height -
(requisition.height - ypad * 2)) * yalign) + 1.5;
layout = gtk_widget_create_pango_layout (widget, accel_label->accel_string);
gtk_paint_layout (widget->style,
widget->window,
GTK_WIDGET_STATE (widget),
gtk_paint_layout (gtk_widget_get_style (widget),
gtk_widget_get_window (widget),
gtk_widget_get_state (widget),
FALSE,
&event->area,
widget,

View File

@@ -85,8 +85,8 @@ static void
meta_preview_init (MetaPreview *preview)
{
int i;
GTK_WIDGET_SET_FLAGS (preview, GTK_NO_WINDOW);
gtk_widget_set_has_window (GTK_WIDGET (preview), FALSE);
i = 0;
while (i < MAX_BUTTONS_PER_CORNER)
@@ -216,6 +216,7 @@ meta_preview_expose (GtkWidget *widget,
GdkEventExpose *event)
{
MetaPreview *preview;
GtkAllocation allocation;
int border_width;
int client_width;
int client_height;
@@ -234,10 +235,11 @@ meta_preview_expose (GtkWidget *widget,
ensure_info (preview);
border_width = GTK_CONTAINER (widget)->border_width;
client_width = widget->allocation.width - preview->left_width - preview->right_width - border_width * 2;
client_height = widget->allocation.height - preview->top_height - preview->bottom_height - border_width * 2;
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
gtk_widget_get_allocation (widget, &allocation);
client_width = allocation.width - preview->left_width - preview->right_width - border_width * 2;
client_height = allocation.height - preview->top_height - preview->bottom_height - border_width * 2;
if (client_width < 0)
client_width = 1;
@@ -246,14 +248,12 @@ meta_preview_expose (GtkWidget *widget,
if (preview->theme)
{
border_width = GTK_CONTAINER (widget)->border_width;
meta_theme_draw_frame (preview->theme,
widget,
widget->window,
gtk_widget_get_window (widget),
&event->area,
widget->allocation.x + border_width,
widget->allocation.y + border_width,
allocation.x + border_width,
allocation.y + border_width,
preview->type,
preview->flags,
client_width, client_height,
@@ -274,6 +274,8 @@ meta_preview_size_request (GtkWidget *widget,
GtkRequisition *req)
{
MetaPreview *preview;
GtkWidget *child;
guint border_width;
preview = META_PREVIEW (widget);
@@ -281,13 +283,13 @@ meta_preview_size_request (GtkWidget *widget,
req->width = preview->left_width + preview->right_width;
req->height = preview->top_height + preview->bottom_height;
if (GTK_BIN (preview)->child &&
GTK_WIDGET_VISIBLE (GTK_BIN (preview)->child))
child = gtk_bin_get_child (GTK_BIN (preview));
if (child && gtk_widget_get_visible (child))
{
GtkRequisition child_requisition;
gtk_widget_size_request (GTK_BIN (preview)->child, &child_requisition);
gtk_widget_size_request (child, &child_requisition);
req->width += child_requisition.width;
req->height += child_requisition.height;
@@ -300,8 +302,9 @@ meta_preview_size_request (GtkWidget *widget,
req->height += NO_CHILD_HEIGHT;
}
req->width += GTK_CONTAINER (widget)->border_width * 2;
req->height += GTK_CONTAINER (widget)->border_width * 2;
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
req->width += border_width * 2;
req->height += border_width * 2;
}
static void
@@ -309,27 +312,29 @@ meta_preview_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
MetaPreview *preview;
int border_width;
GtkAllocation child_allocation;
GtkAllocation widget_allocation, child_allocation;
GtkWidget *child;
guint border_width;
preview = META_PREVIEW (widget);
ensure_info (preview);
widget->allocation = *allocation;
border_width = GTK_CONTAINER (widget)->border_width;
if (GTK_BIN (widget)->child &&
GTK_WIDGET_VISIBLE (GTK_BIN (widget)->child))
gtk_widget_set_allocation (widget, allocation);
border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
child = gtk_bin_get_child (GTK_BIN (widget));
if (child && gtk_widget_get_visible (child))
{
child_allocation.x = widget->allocation.x + border_width + preview->left_width;
child_allocation.y = widget->allocation.y + border_width + preview->top_height;
gtk_widget_get_allocation (widget, &widget_allocation);
child_allocation.x = widget_allocation.x + border_width + preview->left_width;
child_allocation.y = widget_allocation.y + border_width + preview->top_height;
child_allocation.width = MAX (1, widget->allocation.width - border_width * 2 - preview->left_width - preview->right_width);
child_allocation.height = MAX (1, widget->allocation.height - border_width * 2 - preview->top_height - preview->bottom_height);
child_allocation.width = MAX (1, widget_allocation.width - border_width * 2 - preview->left_width - preview->right_width);
child_allocation.height = MAX (1, widget_allocation.height - border_width * 2 - preview->top_height - preview->bottom_height);
gtk_widget_size_allocate (GTK_BIN (widget)->child, &child_allocation);
gtk_widget_size_allocate (child, &child_allocation);
}
}

View File

@@ -26,6 +26,7 @@
#include "util.h"
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include "gtk-compat.h"
struct _MetaResizePopup
{
@@ -123,10 +124,10 @@ update_size_window (MetaResizePopup *popup)
x = popup->rect.x + (popup->rect.width - width) / 2;
y = popup->rect.y + (popup->rect.height - height) / 2;
if (GTK_WIDGET_REALIZED (popup->size_window))
if (gtk_widget_get_realized (popup->size_window))
{
/* using move_resize to avoid jumpiness */
gdk_window_move_resize (popup->size_window->window,
gdk_window_move_resize (gtk_widget_get_window (popup->size_window),
x, y,
width, height);
}
@@ -145,8 +146,8 @@ sync_showing (MetaResizePopup *popup)
if (popup->size_window)
gtk_widget_show (popup->size_window);
if (popup->size_window && GTK_WIDGET_REALIZED (popup->size_window))
gdk_window_raise (popup->size_window->window);
if (popup->size_window && gtk_widget_get_realized (popup->size_window))
gdk_window_raise (gtk_widget_get_window (popup->size_window));
}
else
{

View File

@@ -36,6 +36,8 @@
#include <gtk/gtk.h>
#include <math.h>
#include "gtk-compat.h"
#define OUTSIDE_SELECT_RECT 2
#define INSIDE_SELECT_RECT 2
@@ -77,7 +79,9 @@ outline_window_expose (GtkWidget *widget,
gpointer data)
{
MetaTabPopup *popup;
TabEntry *te;
TabEntry *te;
GtkStyle *style;
GdkWindow *window;
popup = data;
@@ -85,16 +89,18 @@ outline_window_expose (GtkWidget *widget,
return FALSE;
te = popup->current_selected_entry;
window = gtk_widget_get_window (widget);
style = gtk_widget_get_style (widget);
gdk_draw_rectangle (widget->window,
widget->style->white_gc,
gdk_draw_rectangle (window,
style->white_gc,
FALSE,
0, 0,
te->rect.width - 1,
te->rect.height - 1);
gdk_draw_rectangle (widget->window,
widget->style->white_gc,
gdk_draw_rectangle (window,
style->white_gc,
FALSE,
te->inner_rect.x - 1, te->inner_rect.y - 1,
te->inner_rect.width + 1,
@@ -439,7 +445,7 @@ meta_ui_tab_popup_set_showing (MetaTabPopup *popup,
}
else
{
if (GTK_WIDGET_VISIBLE (popup->window))
if (gtk_widget_get_visible (popup->window))
{
meta_verbose ("Hiding tab popup window\n");
gtk_widget_hide (popup->window);
@@ -455,6 +461,7 @@ display_entry (MetaTabPopup *popup,
GdkRectangle rect;
GdkRegion *region;
GdkRegion *inner_region;
GdkWindow *window;
if (popup->current_selected_entry)
@@ -474,27 +481,29 @@ display_entry (MetaTabPopup *popup,
if (popup->outline)
{
window = gtk_widget_get_window (popup->outline_window);
/* Do stuff behind gtk's back */
gdk_window_hide (popup->outline_window->window);
gdk_window_hide (window);
meta_core_increment_event_serial (gdk_display);
rect = te->rect;
rect.x = 0;
rect.y = 0;
gdk_window_move_resize (popup->outline_window->window,
gdk_window_move_resize (window,
te->rect.x, te->rect.y,
te->rect.width, te->rect.height);
gdk_window_set_background (popup->outline_window->window,
&popup->outline_window->style->black);
gdk_window_set_background (window,
&gtk_widget_get_style (popup->outline_window)->black);
region = gdk_region_rectangle (&rect);
inner_region = gdk_region_rectangle (&te->inner_rect);
gdk_region_subtract (region, inner_region);
gdk_region_destroy (inner_region);
gdk_window_shape_combine_region (popup->outline_window->window,
gdk_window_shape_combine_region (window,
region,
0, 0);
@@ -505,8 +514,8 @@ display_entry (MetaTabPopup *popup,
* we manually set the window as mapped and then manually map it
* with gdk functions.
*/
GTK_WIDGET_SET_FLAGS (popup->outline_window, GTK_MAPPED);
gdk_window_show_unraised (popup->outline_window->window);
gtk_widget_set_mapped (popup->outline_window, TRUE);
gdk_window_show_unraised (window);
}
/* Must be before we handle an expose for the outline window */
@@ -691,32 +700,46 @@ meta_select_image_expose_event (GtkWidget *widget,
{
if (META_SELECT_IMAGE (widget)->selected)
{
int x, y, w, h;
GtkAllocation allocation;
GtkMisc *misc;
GtkRequisition requisition;
GtkStyle *style;
GtkStateType state;
GdkWindow *window;
int x, y, w, h;
gint xpad, ypad;
gfloat xalign, yalign;
misc = GTK_MISC (widget);
gtk_widget_get_allocation (widget, &allocation);
gtk_widget_get_requisition (widget, &requisition);
gtk_misc_get_alignment (misc, &xalign, &yalign);
gtk_misc_get_padding (misc, &xpad, &ypad);
x = (widget->allocation.x * (1.0 - misc->xalign) +
(widget->allocation.x + widget->allocation.width
- (widget->requisition.width - misc->xpad * 2)) *
misc->xalign) + 0.5;
y = (widget->allocation.y * (1.0 - misc->yalign) +
(widget->allocation.y + widget->allocation.height
- (widget->requisition.height - misc->ypad * 2)) *
misc->yalign) + 0.5;
x = (allocation.x * (1.0 - xalign) +
(allocation.x + allocation.width
- (requisition.width - xpad * 2)) * xalign) + 0.5;
y = (allocation.y * (1.0 - yalign) +
(allocation.y + allocation.height
- (requisition.height - ypad * 2)) * yalign) + 0.5;
x -= INSIDE_SELECT_RECT + 1;
y -= INSIDE_SELECT_RECT + 1;
w = widget->requisition.width - OUTSIDE_SELECT_RECT * 2 - 1;
h = widget->requisition.height - OUTSIDE_SELECT_RECT * 2 - 1;
w = requisition.width - OUTSIDE_SELECT_RECT * 2 - 1;
h = requisition.height - OUTSIDE_SELECT_RECT * 2 - 1;
gdk_draw_rectangle (widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
window = gtk_widget_get_window (widget);
style = gtk_widget_get_style (widget);
state = gtk_widget_get_state (widget);
gdk_draw_rectangle (window,
style->fg_gc[state],
FALSE,
x, y, w, h);
gdk_draw_rectangle (widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
gdk_draw_rectangle (window,
style->fg_gc[state],
FALSE,
x - 1, y - 1, w + 2, h + 2);
@@ -879,6 +902,9 @@ meta_select_workspace_expose_event (GtkWidget *widget,
{
MetaWorkspace *workspace;
WnckWindowDisplayInfo *windows;
GtkAllocation allocation;
GtkStyle *style;
GdkWindow *window;
int i, n_windows;
GList *tmp, *list;
@@ -917,12 +943,15 @@ meta_select_workspace_expose_event (GtkWidget *widget,
g_list_free (list);
window = gtk_widget_get_window (widget);
gtk_widget_get_allocation (widget, &allocation);
wnck_draw_workspace (widget,
widget->window,
window,
SELECT_OUTLINE_WIDTH,
SELECT_OUTLINE_WIDTH,
widget->allocation.width - SELECT_OUTLINE_WIDTH * 2,
widget->allocation.height - SELECT_OUTLINE_WIDTH * 2,
allocation.width - SELECT_OUTLINE_WIDTH * 2,
allocation.height - SELECT_OUTLINE_WIDTH * 2,
workspace->screen->rect.width,
workspace->screen->rect.height,
NULL,
@@ -934,16 +963,18 @@ meta_select_workspace_expose_event (GtkWidget *widget,
if (META_SELECT_WORKSPACE (widget)->selected)
{
style = gtk_widget_get_style (widget);
i = SELECT_OUTLINE_WIDTH - 1;
while (i >= 0)
{
gdk_draw_rectangle (widget->window,
widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
gdk_draw_rectangle (window,
style->fg_gc[gtk_widget_get_state (widget)],
FALSE,
i,
i,
widget->allocation.width - i * 2 - 1,
widget->allocation.height - i * 2 - 1);
allocation.width - i * 2 - 1,
allocation.height - i * 2 - 1);
--i;
}

View File

@@ -267,11 +267,16 @@ expose_callback (GtkWidget *widget,
gpointer data)
{
RenderGradientFunc func = data;
GtkAllocation allocation;
GtkStyle *style;
(* func) (widget->window,
widget->style->fg_gc[widget->state],
widget->allocation.width,
widget->allocation.height);
style = gtk_widget_get_style (widget);
gtk_widget_get_allocation (widget, &allocation);
(* func) (gtk_widget_get_window (widget),
style->fg_gc[gtk_widget_get_state (widget)],
allocation.width,
allocation.height);
return TRUE;
}

View File

@@ -27,6 +27,22 @@
#include <string.h>
#include <stdlib.h>
/* We were intending to put the version number
* in the subdirectory name, but we ended up
* using the filename instead. The "-1" survives
* as a fossil.
*/
#define THEME_SUBDIR "metacity-1"
/* Highest version of the theme format to
* look out for.
*/
#define THEME_MAJOR_VERSION 3
#define THEME_MINOR_VERSION 1
#define THEME_VERSION (1000 * THEME_MAJOR_VERSION + THEME_MINOR_VERSION)
#define METACITY_THEME_FILENAME_FORMAT "metacity-theme-%d.xml"
typedef enum
{
STATE_START,
@@ -79,11 +95,15 @@ typedef enum
typedef struct
{
/* This two lists contain stacks of state and required version
* (cast to pointers.) There is one list item for each currently
* open element. */
GSList *states;
GSList *required_versions;
const char *theme_name; /* name of theme (directory it's in) */
char *theme_file; /* theme filename */
char *theme_dir; /* dir the theme is inside */
const char *theme_file; /* theme filename */
const char *theme_dir; /* dir the theme is inside */
MetaTheme *theme; /* theme being parsed */
guint format_version; /* version of format of theme file */
char *name; /* name of named thing being parsed */
@@ -95,8 +115,22 @@ typedef struct
MetaFramePiece piece; /* position of piece being parsed */
MetaButtonType button_type; /* type of button/menuitem being parsed */
MetaButtonState button_state; /* state of button being parsed */
int skip_level; /* depth of elements that we're ignoring */
} ParseInfo;
typedef enum {
THEME_PARSE_ERROR_TOO_OLD,
THEME_PARSE_ERROR_TOO_FAILED
} ThemeParseError;
static GQuark
theme_parse_error_quark (void)
{
return g_quark_from_static_string ("theme-parse-error-quark");
}
#define THEME_PARSE_ERROR (theme_parse_error_quark ())
static void set_error (GError **err,
GMarkupParseContext *context,
int error_domain,
@@ -257,6 +291,7 @@ parse_info_init (ParseInfo *info)
{
info->theme_file = NULL;
info->states = g_slist_prepend (NULL, GINT_TO_POINTER (STATE_START));
info->required_versions = NULL;
info->theme = NULL;
info->name = NULL;
info->layout = NULL;
@@ -267,15 +302,14 @@ parse_info_init (ParseInfo *info)
info->piece = META_FRAME_PIECE_LAST;
info->button_type = META_BUTTON_TYPE_LAST;
info->button_state = META_BUTTON_STATE_LAST;
info->skip_level = 0;
}
static void
parse_info_free (ParseInfo *info)
{
g_free (info->theme_file);
g_free (info->theme_dir);
g_slist_free (info->states);
g_slist_free (info->required_versions);
if (info->theme)
meta_theme_free (info->theme);
@@ -319,6 +353,31 @@ peek_state (ParseInfo *info)
return GPOINTER_TO_INT (info->states->data);
}
static void
push_required_version (ParseInfo *info,
int version)
{
info->required_versions = g_slist_prepend (info->required_versions,
GINT_TO_POINTER (version));
}
static void
pop_required_version (ParseInfo *info)
{
g_return_if_fail (info->required_versions != NULL);
info->required_versions = g_slist_delete_link (info->required_versions, info->required_versions);
}
static int
peek_required_version (ParseInfo *info)
{
if (info->required_versions)
return GPOINTER_TO_INT (info->required_versions->data);
else
return info->format_version;
}
#define ELEMENT_IS(name) (strcmp (element_name, (name)) == 0)
typedef struct
@@ -396,6 +455,13 @@ locate_attributes (GMarkupParseContext *context,
int j;
gboolean found;
/* Can be present anywhere */
if (strcmp (attribute_names[i], "version") == 0)
{
++i;
continue;
}
found = FALSE;
j = 0;
while (j < n_attrs)
@@ -472,7 +538,13 @@ check_no_attributes (GMarkupParseContext *context,
const char **attribute_values,
GError **error)
{
if (attribute_names[0] != NULL)
int i = 0;
/* Can be present anywhere */
if (attribute_names[0] && strcmp (attribute_names[i], "version") == 0)
i++;
if (attribute_names[i] != NULL)
{
set_error (error, context,
G_MARKUP_ERROR,
@@ -2512,12 +2584,14 @@ parse_draw_op_element (GMarkupParseContext *context,
const char *color;
const char *x;
const char *y;
const char *ellipsize_width;
MetaColorSpec *color_spec;
if (!locate_attributes (context, element_name, attribute_names, attribute_values,
error,
"!color", &color,
"!x", &x, "!y", &y,
"ellipsize_width", &ellipsize_width,
NULL))
return;
@@ -2527,8 +2601,18 @@ parse_draw_op_element (GMarkupParseContext *context,
if (!check_expression (y, FALSE, info->theme, context, error))
return;
if (!check_expression (ellipsize_width, FALSE, info->theme, context, error))
return;
#endif
if (ellipsize_width && peek_required_version (info) < 3001)
{
set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
ATTRIBUTE_NOT_FOUND, "ellipsize_width", element_name);
return;
}
/* Check last so we don't have to free it when other
* stuff fails
*/
@@ -2545,6 +2629,8 @@ parse_draw_op_element (GMarkupParseContext *context,
op->data.title.x = meta_draw_spec_new (info->theme, x, NULL);
op->data.title.y = meta_draw_spec_new (info->theme, y, NULL);
if (ellipsize_width)
op->data.title.ellipsize_width = meta_draw_spec_new (info->theme, ellipsize_width, NULL);
g_assert (info->op_list);
@@ -3242,6 +3328,91 @@ parse_menu_icon_element (GMarkupParseContext *context,
}
}
static const char *
find_version (const char **attribute_names,
const char **attribute_values)
{
int i;
for (i = 0; attribute_names[i]; i++)
{
if (strcmp (attribute_names[i], "version") == 0)
return attribute_values[i];
}
return NULL;
}
/* Returns whether the version element was successfully parsed.
* If successfully parsed, then two additional items are returned:
*
* satisfied: whether this version of Mutter meets the version check
* minimum_required: minimum version of theme format required by version check
*/
static gboolean
check_version (GMarkupParseContext *context,
const char *version_str,
gboolean *satisfied,
guint *minimum_required,
GError **error)
{
static GRegex *version_regex;
GMatchInfo *info;
char *comparison_str, *major_str, *minor_str;
guint version;
*minimum_required = 0;
if (!version_regex)
version_regex = g_regex_new ("^\\s*([<>]=?)\\s*(\\d+)(\\.\\d+)?\\s*$", 0, 0, NULL);
if (!g_regex_match (version_regex, version_str, 0, &info))
{
g_match_info_free (info);
set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
_("Bad version specification '%s'"), version_str);
return FALSE;
}
comparison_str = g_match_info_fetch (info, 1);
major_str = g_match_info_fetch (info, 2);
minor_str = g_match_info_fetch (info, 3);
version = 1000 * atoi (major_str);
/* might get NULL, see: https://bugzilla.gnome.org/review?bug=588217 */
if (minor_str && minor_str[0])
version += atoi (minor_str + 1);
if (comparison_str[0] == '<')
{
if (comparison_str[1] == '=')
*satisfied = THEME_VERSION <= version;
else
{
*satisfied = THEME_VERSION < version;
}
}
else
{
if (comparison_str[1] == '=')
{
*satisfied = THEME_VERSION >= version;
*minimum_required = version;
}
else
{
*satisfied = THEME_VERSION > version;
*minimum_required = version + 1;
}
}
g_free (comparison_str);
g_free (major_str);
g_free (minor_str);
g_match_info_free (info);
return TRUE;
}
static void
start_element_handler (GMarkupParseContext *context,
@@ -3252,6 +3423,65 @@ start_element_handler (GMarkupParseContext *context,
GError **error)
{
ParseInfo *info = user_data;
const char *version;
guint required_version = 0;
if (info->skip_level > 0)
{
info->skip_level++;
return;
}
required_version = peek_required_version (info);
version = find_version (attribute_names, attribute_values);
if (version != NULL)
{
gboolean satisfied;
guint element_required;
if (required_version < 3000)
{
set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
_("\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-theme-2.xml"));
return;
}
if (!check_version (context, version, &satisfied, &element_required, error))
return;
/* Two different ways of handling an unsatisfied version check:
* for the toplevel element of a file, we throw an error back so
* that the controlling code can go ahead and look for an
* alternate metacity-theme-1.xml or metacity-theme-2.xml; for
* other elements we just silently skip the element and children.
*/
if (peek_state (info) == STATE_START)
{
if (satisfied)
{
if (element_required > info->format_version)
info->format_version = element_required;
}
else
{
set_error (error, context, THEME_PARSE_ERROR, THEME_PARSE_ERROR_TOO_OLD,
_("Theme requires version %s but latest supported theme version is %d.%d"),
version, THEME_VERSION, THEME_MINOR_VERSION);
return;
}
}
else if (!satisfied)
{
info->skip_level = 1;
return;
}
if (element_required > required_version)
required_version = element_required;
}
push_required_version (info, required_version);
switch (peek_state (info))
{
@@ -3391,6 +3621,12 @@ end_element_handler (GMarkupParseContext *context,
{
ParseInfo *info = user_data;
if (info->skip_level > 0)
{
info->skip_level--;
return;
}
switch (peek_state (info))
{
case STATE_START:
@@ -3664,6 +3900,8 @@ end_element_handler (GMarkupParseContext *context,
g_assert (peek_state (info) == STATE_THEME);
break;
}
pop_required_version (info);
}
#define NO_TEXT(element_name) set_error (error, context, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, _("No text is allowed inside element <%s>"), element_name)
@@ -3698,6 +3936,9 @@ text_handler (GMarkupParseContext *context,
{
ParseInfo *info = user_data;
if (info->skip_level > 0)
return;
if (all_whitespace (text, text_len))
return;
@@ -3866,80 +4107,133 @@ text_handler (GMarkupParseContext *context,
}
}
/* We were intending to put the version number
* in the subdirectory name, but we ended up
* using the filename instead. The "-1" survives
* as a fossil.
/* If the theme is not-corrupt, keep looking for alternate versions
* in other locations we might be compatible with
*/
#define THEME_SUBDIR "metacity-1"
static gboolean
theme_error_is_fatal (GError *error)
{
return !(error->domain == G_FILE_ERROR ||
(error->domain == THEME_PARSE_ERROR &&
error->code == THEME_PARSE_ERROR_TOO_OLD));
}
/* Highest version of the theme format to
* look out for.
*/
#define THEME_VERSION 2
static MetaTheme *
load_theme (const char *theme_dir,
const char *theme_name,
guint major_version,
GError **error)
{
GMarkupParseContext *context;
ParseInfo info;
char *text;
gsize length;
char *theme_filename;
char *theme_file;
MetaTheme *retval;
#define METACITY_THEME_FILENAME_FORMAT "metacity-theme-%d.xml"
g_return_val_if_fail (error && *error == NULL, NULL);
text = NULL;
retval = NULL;
context = NULL;
theme_filename = g_strdup_printf (METACITY_THEME_FILENAME_FORMAT, major_version);
theme_file = g_build_filename (theme_dir, theme_filename, NULL);
if (!g_file_get_contents (theme_file,
&text,
&length,
error))
goto out;
meta_topic (META_DEBUG_THEMES, "Parsing theme file %s\n", theme_file);
parse_info_init (&info);
info.theme_name = theme_name;
info.theme_file = theme_file;
info.theme_dir = theme_dir;
info.format_version = 1000 * major_version;
context = g_markup_parse_context_new (&metacity_theme_parser,
0, &info, NULL);
if (!g_markup_parse_context_parse (context,
text,
length,
error))
goto out;
if (!g_markup_parse_context_end_parse (context, error))
goto out;
retval = info.theme;
info.theme = NULL;
out:
if (*error && !theme_error_is_fatal (*error))
{
meta_topic (META_DEBUG_THEMES, "Failed to read theme from file %s: %s\n",
theme_file, (*error)->message);
}
g_free (theme_filename);
g_free (theme_file);
g_free (text);
if (context)
{
g_markup_parse_context_free (context);
parse_info_free (&info);
}
return retval;
}
static gboolean
keep_trying (GError **error)
{
if (*error && !theme_error_is_fatal (*error))
{
g_clear_error (error);
return TRUE;
}
return FALSE;
}
MetaTheme*
meta_theme_load (const char *theme_name,
GError **err)
{
GMarkupParseContext *context;
GError *error;
ParseInfo info;
char *text;
gsize length;
char *theme_file;
GError *error = NULL;
char *theme_dir;
MetaTheme *retval;
guint version;
const gchar* const* xdg_data_dirs;
int major_version;
int i;
text = NULL;
length = 0;
retval = NULL;
context = NULL;
theme_dir = NULL;
theme_file = NULL;
if (meta_is_debugging ())
{
gchar *theme_filename = g_strdup_printf (METACITY_THEME_FILENAME_FORMAT,
THEME_VERSION);
/* Try in themes in our source tree */
theme_dir = g_build_filename ("./themes", theme_name, NULL);
theme_file = g_build_filename (theme_dir,
theme_filename,
NULL);
error = NULL;
if (!g_file_get_contents (theme_file,
&text,
&length,
&error))
/* We try all supported major versions from current to oldest */
for (major_version = THEME_MAJOR_VERSION; (major_version > 0); major_version--)
{
meta_topic (META_DEBUG_THEMES, "Failed to read theme from file %s: %s\n",
theme_file, error->message);
g_error_free (error);
theme_dir = g_build_filename ("./themes", theme_name, NULL);
retval = load_theme (theme_dir, theme_name, major_version, &error);
g_free (theme_dir);
g_free (theme_file);
theme_file = NULL;
if (!keep_trying (&error))
goto out;
}
version = THEME_VERSION;
g_free (theme_filename);
}
/* We try all supported versions from current to oldest */
for (version = THEME_VERSION; (version > 0) && (text == NULL); version--)
/* We try all supported major versions from current to oldest */
for (major_version = THEME_MAJOR_VERSION; (major_version > 0); major_version--)
{
gchar *theme_filename = g_strdup_printf (METACITY_THEME_FILENAME_FORMAT,
version);
/* We try first in home dir, XDG_DATA_DIRS, then system dir for themes */
/* Try home dir for themes */
@@ -3948,156 +4242,51 @@ meta_theme_load (const char *theme_name,
theme_name,
THEME_SUBDIR,
NULL);
theme_file = g_build_filename (theme_dir,
theme_filename,
NULL);
error = NULL;
if (!g_file_get_contents (theme_file,
&text,
&length,
&error))
{
meta_topic (META_DEBUG_THEMES, "Failed to read theme from file %s: %s\n",
theme_file, error->message);
g_error_free (error);
g_free (theme_dir);
g_free (theme_file);
theme_file = NULL;
}
retval = load_theme (theme_dir, theme_name, major_version, &error);
g_free (theme_dir);
if (!keep_trying (&error))
goto out;
/* Try each XDG_DATA_DIRS for theme */
xdg_data_dirs = g_get_system_data_dirs();
for(i = 0; xdg_data_dirs[i] != NULL; i++)
{
if (text == NULL)
{
theme_dir = g_build_filename (xdg_data_dirs[i],
"themes",
theme_name,
THEME_SUBDIR,
NULL);
theme_file = g_build_filename (theme_dir,
theme_filename,
NULL);
error = NULL;
if (!g_file_get_contents (theme_file,
&text,
&length,
&error))
{
meta_topic (META_DEBUG_THEMES, "Failed to read theme from file %s: %s\n",
theme_file, error->message);
g_error_free (error);
g_free (theme_dir);
g_free (theme_file);
theme_file = NULL;
}
else
{
break;
}
}
}
/* Look for themes in MUTTER_DATADIR */
if (text == NULL)
{
theme_dir = g_build_filename (MUTTER_DATADIR,
theme_dir = g_build_filename (xdg_data_dirs[i],
"themes",
theme_name,
THEME_SUBDIR,
NULL);
theme_file = g_build_filename (theme_dir,
theme_filename,
NULL);
error = NULL;
if (!g_file_get_contents (theme_file,
&text,
&length,
&error))
{
meta_topic (META_DEBUG_THEMES, "Failed to read theme from file %s: %s\n",
theme_file, error->message);
g_error_free (error);
g_free (theme_dir);
g_free (theme_file);
theme_file = NULL;
}
retval = load_theme (theme_dir, theme_name, major_version, &error);
g_free (theme_dir);
if (!keep_trying (&error))
goto out;
}
g_free (theme_filename);
/* Look for themes in MUTTER_DATADIR */
theme_dir = g_build_filename (MUTTER_DATADIR,
"themes",
theme_name,
THEME_SUBDIR,
NULL);
retval = load_theme (theme_dir, theme_name, major_version, &error);
g_free (theme_dir);
if (!keep_trying (&error))
goto out;
}
if (text == NULL)
{
g_set_error (err, META_THEME_ERROR, META_THEME_ERROR_FAILED,
_("Failed to find a valid file for theme %s\n"),
theme_name);
return NULL; /* all fallbacks failed */
}
meta_topic (META_DEBUG_THEMES, "Parsing theme file %s\n", theme_file);
parse_info_init (&info);
info.theme_name = theme_name;
/* pass ownership to info so we free it with the info */
info.theme_file = theme_file;
info.theme_dir = theme_dir;
info.format_version = version + 1;
context = g_markup_parse_context_new (&metacity_theme_parser,
0, &info, NULL);
error = NULL;
if (!g_markup_parse_context_parse (context,
text,
length,
&error))
goto out;
error = NULL;
if (!g_markup_parse_context_end_parse (context, &error))
goto out;
goto out;
out:
if (context)
g_markup_parse_context_free (context);
g_free (text);
if (info.theme)
info.theme->format_version = info.format_version;
if (!error && !retval)
g_set_error (&error, META_THEME_ERROR, META_THEME_ERROR_FAILED,
_("Failed to find a valid file for theme %s\n"),
theme_name);
if (error)
{
g_propagate_error (err, error);
}
else if (info.theme)
{
/* Steal theme from info */
retval = info.theme;
info.theme = NULL;
}
else
{
g_set_error (err, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE,
_("Theme file %s did not contain a root <metacity_theme> element"),
info.theme_file);
}
parse_info_free (&info);
return retval;
}

View File

@@ -766,6 +766,7 @@ benchmark_summary (void)
int
main (int argc, char **argv)
{
GtkStyle *style;
GtkWidget *window;
GtkWidget *collection;
GError *err;
@@ -842,26 +843,28 @@ main (int argc, char **argv)
G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_realize (window);
g_assert (window->style);
g_assert (window->style->font_desc);
style = gtk_widget_get_style (window);
g_assert (style);
g_assert (style->font_desc);
notebook = gtk_notebook_new ();
gtk_container_add (GTK_CONTAINER (window), notebook);
collection = preview_collection (FONT_SIZE_NORMAL,
window->style->font_desc);
style->font_desc);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
collection,
gtk_label_new (_("Normal Title Font")));
collection = preview_collection (FONT_SIZE_SMALL,
window->style->font_desc);
style->font_desc);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
collection,
gtk_label_new (_("Small Title Font")));
collection = preview_collection (FONT_SIZE_LARGE,
window->style->font_desc);
style->font_desc);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook),
collection,
gtk_label_new (_("Large Title Font")));
@@ -912,7 +915,7 @@ get_flags (GtkWidget *widget)
static int
get_text_height (GtkWidget *widget)
{
return meta_pango_font_desc_get_text_height (widget->style->font_desc,
return meta_pango_font_desc_get_text_height (gtk_widget_get_style (widget)->font_desc,
gtk_widget_get_pango_context (widget));
}
@@ -993,7 +996,7 @@ run_theme_benchmark (void)
/* Creating the pixmap in the loop is right, since
* GDK does the same with its double buffering.
*/
pixmap = gdk_pixmap_new (widget->window,
pixmap = gdk_pixmap_new (gtk_widget_get_window (widget),
client_width + left_width + right_width,
client_height + top_height + bottom_height,
-1);

View File

@@ -62,6 +62,8 @@
#include <stdlib.h>
#include <math.h>
#include "gtk-compat.h"
#define GDK_COLOR_RGBA(color) \
((guint32) (0xff | \
(((color).red / 256) << 24) | \
@@ -1360,9 +1362,13 @@ meta_color_spec_render (MetaColorSpec *spec,
GtkWidget *widget,
GdkColor *color)
{
GtkStyle *style;
style = gtk_widget_get_style (widget);
g_return_if_fail (spec != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
g_return_if_fail (widget->style != NULL);
g_return_if_fail (style != NULL);
switch (spec->type)
{
@@ -1374,28 +1380,28 @@ meta_color_spec_render (MetaColorSpec *spec,
switch (spec->data.gtk.component)
{
case META_GTK_COLOR_BG:
*color = widget->style->bg[spec->data.gtk.state];
*color = style->bg[spec->data.gtk.state];
break;
case META_GTK_COLOR_FG:
*color = widget->style->fg[spec->data.gtk.state];
*color = style->fg[spec->data.gtk.state];
break;
case META_GTK_COLOR_BASE:
*color = widget->style->base[spec->data.gtk.state];
*color = style->base[spec->data.gtk.state];
break;
case META_GTK_COLOR_TEXT:
*color = widget->style->text[spec->data.gtk.state];
*color = style->text[spec->data.gtk.state];
break;
case META_GTK_COLOR_LIGHT:
*color = widget->style->light[spec->data.gtk.state];
*color = style->light[spec->data.gtk.state];
break;
case META_GTK_COLOR_DARK:
*color = widget->style->dark[spec->data.gtk.state];
*color = style->dark[spec->data.gtk.state];
break;
case META_GTK_COLOR_MID:
*color = widget->style->mid[spec->data.gtk.state];
*color = style->mid[spec->data.gtk.state];
break;
case META_GTK_COLOR_TEXT_AA:
*color = widget->style->text_aa[spec->data.gtk.state];
*color = style->text_aa[spec->data.gtk.state];
break;
case META_GTK_COLOR_LAST:
g_assert_not_reached ();
@@ -2188,6 +2194,10 @@ pos_eval_get_variable (PosToken *t,
*result = env->title_width;
else if (t->d.v.name_quark == env->theme->quark_title_height)
*result = env->title_height;
else if (t->d.v.name_quark == env->theme->quark_frame_x_center)
*result = env->frame_x_center;
else if (t->d.v.name_quark == env->theme->quark_frame_y_center)
*result = env->frame_y_center;
else
{
g_set_error (err, META_THEME_ERROR,
@@ -2229,6 +2239,10 @@ pos_eval_get_variable (PosToken *t,
*result = env->title_width;
else if (strcmp (t->d.v.name, "title_height") == 0)
*result = env->title_height;
else if (strcmp (t->d.v.name, "frame_x_center") == 0)
*result = env->frame_x_center;
else if (strcmp (t->d.v.name, "frame_y_center") == 0)
*result = env->frame_y_center;
else
{
g_set_error (err, META_THEME_ERROR,
@@ -2876,6 +2890,8 @@ meta_draw_op_free (MetaDrawOp *op)
meta_draw_spec_free (op->data.title.x);
meta_draw_spec_free (op->data.title.y);
if (op->data.title.ellipsize_width)
meta_draw_spec_free (op->data.title.ellipsize_width);
break;
case META_DRAW_OP_LIST:
@@ -3437,6 +3453,8 @@ fill_env (MetaPositionExprEnv *env,
env->right_width = info->fgeom->right_width;
env->top_height = info->fgeom->top_height;
env->bottom_height = info->fgeom->bottom_height;
env->frame_x_center = info->fgeom->width / 2 - logical_region.x;
env->frame_y_center = info->fgeom->height / 2 - logical_region.y;
}
else
{
@@ -3444,6 +3462,8 @@ fill_env (MetaPositionExprEnv *env,
env->right_width = 0;
env->top_height = 0;
env->bottom_height = 0;
env->frame_x_center = 0;
env->frame_y_center = 0;
}
env->mini_icon_width = info->mini_icon ? gdk_pixbuf_get_width (info->mini_icon) : 0;
@@ -3744,6 +3764,7 @@ meta_draw_op_draw_with_env (const MetaDrawOp *op,
if (info->title_layout)
{
int rx, ry;
PangoRectangle ink_rect, logical_rect;
gc = get_gc_for_primitive (widget, drawable,
op->data.title.color_spec,
@@ -3752,10 +3773,47 @@ meta_draw_op_draw_with_env (const MetaDrawOp *op,
rx = parse_x_position_unchecked (op->data.title.x, env);
ry = parse_y_position_unchecked (op->data.title.y, env);
if (op->data.title.ellipsize_width)
{
int ellipsize_width;
int right_bearing;
ellipsize_width = parse_x_position_unchecked (op->data.title.ellipsize_width, env);
/* HACK: parse_x_position_unchecked adds in env->rect.x, subtract out again */
ellipsize_width -= env->rect.x;
pango_layout_set_width (info->title_layout, -1);
pango_layout_get_pixel_extents (info->title_layout,
&ink_rect, &logical_rect);
/* Pango's idea of ellipsization is with respect to the logical rect.
* correct for this, by reducing the ellipsization width by the overflow
* of the un-ellipsized text on the right... it's always the visual
* right we want regardless of bidi, since since the X we pass in to
* gdk_draw_layout() is always the left edge of the line.
*/
right_bearing = (ink_rect.x + ink_rect.width) - (logical_rect.x + logical_rect.width);
right_bearing = MAX (right_bearing, 0);
ellipsize_width -= right_bearing;
ellipsize_width = MAX (ellipsize_width, 0);
/* Only ellipsizing when necessary is a performance optimization -
* pango_layout_set_width() will force a relayout if it isn't the
* same as the current width of -1.
*/
if (ellipsize_width < logical_rect.width)
pango_layout_set_width (info->title_layout, PANGO_SCALE * ellipsize_width);
}
gdk_draw_layout (drawable, gc,
rx, ry,
info->title_layout);
/* Remove any ellipsization we might have set; will short-circuit
* if the width is already -1 */
pango_layout_set_width (info->title_layout, -1);
g_object_unref (G_OBJECT (gc));
}
break;
@@ -3855,7 +3913,7 @@ meta_draw_op_draw (const MetaDrawOp *op,
const MetaDrawInfo *info,
MetaRectangle logical_region)
{
meta_draw_op_draw_with_style (op, widget->style, widget,
meta_draw_op_draw_with_style (op, gtk_widget_get_style (widget), widget,
drawable, clip, info, logical_region);
}
@@ -3985,7 +4043,7 @@ meta_draw_op_list_draw (const MetaDrawOpList *op_list,
MetaRectangle rect)
{
meta_draw_op_list_draw_with_style (op_list, widget->style, widget,
meta_draw_op_list_draw_with_style (op_list, gtk_widget_get_style (widget), widget,
drawable, clip, info, rect);
}
@@ -4314,7 +4372,7 @@ meta_frame_style_draw_with_style (MetaFrameStyle *style,
GdkRectangle bottom_titlebar_edge;
GdkRectangle top_titlebar_edge;
GdkRectangle left_edge, right_edge, bottom_edge;
PangoRectangle extents;
PangoRectangle logical_rect;
MetaDrawInfo draw_info;
g_return_if_fail (style_gtk->colormap == gdk_drawable_get_colormap (drawable));
@@ -4361,13 +4419,13 @@ meta_frame_style_draw_with_style (MetaFrameStyle *style,
if (title_layout)
pango_layout_get_pixel_extents (title_layout,
NULL, &extents);
NULL, &logical_rect);
draw_info.mini_icon = mini_icon;
draw_info.icon = icon;
draw_info.title_layout = title_layout;
draw_info.title_layout_width = title_layout ? extents.width : 0;
draw_info.title_layout_height = title_layout ? extents.height : 0;
draw_info.title_layout_width = title_layout ? logical_rect.width : 0;
draw_info.title_layout_height = title_layout ? logical_rect.height : 0;
draw_info.fgeom = fgeom;
/* The enum is in the order the pieces should be rendered. */
@@ -4557,7 +4615,7 @@ meta_frame_style_draw (MetaFrameStyle *style,
GdkPixbuf *mini_icon,
GdkPixbuf *icon)
{
meta_frame_style_draw_with_style (style, widget->style, widget,
meta_frame_style_draw_with_style (style, gtk_widget_get_style (widget), widget,
drawable, x_offset, y_offset,
clip, fgeom, client_width, client_height,
title_layout, text_height,
@@ -4845,6 +4903,8 @@ meta_theme_new (void)
theme->quark_icon_height = g_quark_from_static_string ("icon_height");
theme->quark_title_width = g_quark_from_static_string ("title_width");
theme->quark_title_height = g_quark_from_static_string ("title_height");
theme->quark_frame_x_center = g_quark_from_static_string ("frame_x_center");
theme->quark_frame_y_center = g_quark_from_static_string ("frame_y_center");
return theme;
}
@@ -5180,7 +5240,7 @@ meta_theme_draw_frame (MetaTheme *theme,
GdkPixbuf *mini_icon,
GdkPixbuf *icon)
{
meta_theme_draw_frame_with_style (theme, widget->style, widget,
meta_theme_draw_frame_with_style (theme, gtk_widget_get_style (widget), widget,
drawable, clip, x_offset, y_offset, type,flags,
client_width, client_height,
title_layout, text_height,
@@ -5574,9 +5634,9 @@ meta_gtk_widget_get_font_desc (GtkWidget *widget,
{
PangoFontDescription *font_desc;
g_return_val_if_fail (GTK_WIDGET_REALIZED (widget), NULL);
g_return_val_if_fail (gtk_widget_get_realized (widget), NULL);
font_desc = pango_font_description_copy (widget->style->font_desc);
font_desc = pango_font_description_copy (gtk_widget_get_style (widget)->font_desc);
if (override)
pango_font_description_merge (font_desc, override, TRUE);
@@ -6617,7 +6677,7 @@ meta_theme_earliest_version_with_button (MetaButtonType type)
case META_BUTTON_TYPE_RIGHT_LEFT_BACKGROUND:
case META_BUTTON_TYPE_RIGHT_MIDDLE_BACKGROUND:
case META_BUTTON_TYPE_RIGHT_RIGHT_BACKGROUND:
return 1;
return 1000;
case META_BUTTON_TYPE_SHADE:
case META_BUTTON_TYPE_ABOVE:
@@ -6625,10 +6685,10 @@ meta_theme_earliest_version_with_button (MetaButtonType type)
case META_BUTTON_TYPE_UNSHADE:
case META_BUTTON_TYPE_UNABOVE:
case META_BUTTON_TYPE_UNSTICK:
return 2;
return 2000;
default:
meta_warning("Unknown button %d\n", type);
return 1;
return 1000;
}
}

View File

@@ -534,6 +534,7 @@ struct _MetaDrawOp
MetaColorSpec *color_spec;
MetaDrawSpec *x;
MetaDrawSpec *y;
MetaDrawSpec *ellipsize_width;
} title;
struct {
@@ -819,6 +820,8 @@ struct _MetaTheme
GQuark quark_icon_height;
GQuark quark_title_width;
GQuark quark_title_height;
GQuark quark_frame_x_center;
GQuark quark_frame_y_center;
};
struct _MetaPositionExprEnv
@@ -834,6 +837,8 @@ struct _MetaPositionExprEnv
int bottom_height;
int title_width;
int title_height;
int frame_x_center;
int frame_y_center;
int mini_icon_width;
int mini_icon_height;
int icon_width;

View File

@@ -24,6 +24,8 @@
#include "themewidget.h"
#include <math.h>
#include "gtk-compat.h"
static void meta_area_class_init (MetaAreaClass *klass);
static void meta_area_init (MetaArea *area);
static void meta_area_size_request (GtkWidget *widget,
@@ -80,7 +82,7 @@ meta_area_class_init (MetaAreaClass *class)
static void
meta_area_init (MetaArea *area)
{
GTK_WIDGET_SET_FLAGS (area, GTK_NO_WINDOW);
gtk_widget_set_has_window (GTK_WIDGET (area), FALSE);
}
GtkWidget*
@@ -111,28 +113,34 @@ meta_area_expose (GtkWidget *widget,
GdkEventExpose *event)
{
MetaArea *area;
GtkAllocation allocation;
GtkMisc *misc;
GtkRequisition requisition;
gfloat xalign, yalign;
gint x, y;
gfloat xalign;
gint xpad, ypad;
g_return_val_if_fail (META_IS_AREA (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
if (GTK_WIDGET_DRAWABLE (widget))
if (gtk_widget_is_drawable (widget))
{
area = META_AREA (widget);
misc = GTK_MISC (widget);
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR)
xalign = misc->xalign;
else
xalign = 1.0 - misc->xalign;
gtk_widget_get_allocation (widget, &allocation);
gtk_widget_get_requisition (widget, &requisition);
gtk_misc_get_alignment (misc, &xalign, &yalign);
gtk_misc_get_padding (misc, &xpad, &ypad);
if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
xalign = 1.0 - xalign;
x = floor (widget->allocation.x + misc->xpad
+ ((widget->allocation.width - widget->requisition.width) * xalign)
x = floor (allocation.x + xpad
+ ((allocation.width - requisition.width) * xalign)
+ 0.5);
y = floor (widget->allocation.y + misc->ypad
+ ((widget->allocation.height - widget->requisition.height) * misc->yalign)
y = floor (allocation.y + ypad
+ ((allocation.height - requisition.height) * yalign)
+ 0.5);
if (area->expose_func)

View File

@@ -379,7 +379,7 @@ meta_image_window_new (Display *xdisplay,
gtk_window_set_screen (GTK_WINDOW (iw->window), gscreen);
gtk_widget_realize (iw->window);
iw->pixmap = gdk_pixmap_new (iw->window->window,
iw->pixmap = gdk_pixmap_new (gtk_widget_get_window (iw->window),
max_width, max_height,
-1);
@@ -417,13 +417,15 @@ meta_image_window_set (MetaImageWindow *iw,
int x,
int y)
{
GdkWindow *window;
/* We use a back pixmap to avoid having to handle exposes, because
* it's really too slow for large clients being minimized, etc.
* and this way flicker is genuinely zero.
*/
gdk_draw_pixbuf (iw->pixmap,
iw->window->style->black_gc,
gtk_widget_get_style (iw->window)->black_gc,
pixbuf,
0, 0,
0, 0,
@@ -432,16 +434,18 @@ meta_image_window_set (MetaImageWindow *iw,
GDK_RGB_DITHER_NORMAL,
0, 0);
gdk_window_set_back_pixmap (iw->window->window,
window = gtk_widget_get_window (iw->window);
gdk_window_set_back_pixmap (window,
iw->pixmap,
FALSE);
gdk_window_move_resize (iw->window->window,
gdk_window_move_resize (window,
x, y,
gdk_pixbuf_get_width (pixbuf),
gdk_pixbuf_get_height (pixbuf));
gdk_window_clear (iw->window->window);
gdk_window_clear (window);
}
static GdkColormap*

View File

@@ -120,11 +120,11 @@ evil_timeout (gpointer data)
w = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_uposition (w,
g_random_int_range (0,
gdk_screen_width ()),
g_random_int_range (0,
gdk_screen_height ()));
gtk_window_move (GTK_WINDOW (w),
g_random_int_range (0,
gdk_screen_width ()),
g_random_int_range (0,
gdk_screen_height ()));
parent = NULL;