Compare commits

..

183 Commits

Author SHA1 Message Date
Carlos Garnacho
eac32fb142 frame: disallow frame operations if the popup is open
If some device has a popped up menu, meta_frame_get_flags()
returns 0 to indicate other devices cannot trigger any
actions on the frame.
2011-08-02 18:39:33 +02:00
Carlos Garnacho
b93c72315d ui: Add a MetaDevice arg to meta_window_menu_popup()
This will be the device popping up the menu, gtk_menu_popup()
uses the current GTK+ event device, and that might not even be
filled up with mutter event bypassing.
2011-08-02 18:39:33 +02:00
Carlos Garnacho
f84637d31e window: Make MetaWindow keep a pointer to the popup menu
Multiple windows may now have different popup menus, responding
only to the device pair that popped it up.
2011-08-02 18:39:32 +02:00
Carlos Garnacho
48a88a33ef ui: enable multidevice on frame windows
This is so different pointers may have different
cursors on them.
2011-07-27 00:33:10 +02:00
Carlos Garnacho
8847281c31 frames: Use the triggering device when updating controls 2011-07-27 00:33:10 +02:00
Carlos Garnacho
d05297593f frames: Get coordinates from event
Don't spare a synchronous X call, instead translate
properly the XEvent coordinates in ui.c and use
the event coordinates in MetaFrames
2011-07-27 00:33:09 +02:00
Carlos Garnacho
a285b8ae44 meta: Add device.h
This is real proof noone tried the branch yet
2011-07-27 00:33:09 +02:00
Carlos Garnacho
e6ba5ec298 display: Make focus info persistent
It must not be freed (at least meanwhile the device pair
exists), so ensure it's kept around, and we don't create
info for a same keyboard twice.
2011-07-27 00:33:09 +02:00
Carlos Garnacho
f6d9b29ad0 window: make guess_grab_pointer() more reliable
Now either the current focus keyboard or the client pointer
(i.e. the pointer paired to the last keyboard that had the
window focus) are used to guess the pointer that should be
grabbed.
2011-07-27 00:33:09 +02:00
Carlos Garnacho
e6f0af9abc window: set the corresponding client pointer on focused windows.
The client window determines the device pair that is used for
core protocol calls such as XQueryPointer(), so different
clients using the core protocol can be focused by different
devices simultaneously.
2011-07-19 20:55:05 +02:00
Carlos Garnacho
d32c726967 core: Fix rebase glitch 2011-07-18 12:39:04 +02:00
Carlos Garnacho
2c873990d1 core: enable XInput2 by default
This is nothing but the beginning, things work with a single
pointer/keyboard pair, but will be largely broken with multiple
devices interacting simultaneously, so we first need a policy
to establish a sensible behavior for extra pointer/keyboard
pairs.

the MUTTER_USE_CORE_DEVICES envvar has been added to force use
of Xlib core events for devices in order to check for regressions.
2011-07-15 18:03:47 +02:00
Carlos Garnacho
f15993f940 xi2: Workaround some bugs in XI2 passive grabs
XIAllMasterDevices doesn't quite work for key grabs, so only do
this at the moment for the Virtual Core Keyboard
2011-07-15 18:03:47 +02:00
Carlos Garnacho
d482dbcd16 display: Ignore events from slave devices
Mutter only handles master devices.
2011-07-15 18:03:47 +02:00
Carlos Garnacho
f5334dd6cf compositor: use meta_device_grab() for pointer/keyboard grabs
These happen invariably on the VCP/VCK pair.
2011-07-15 18:03:47 +02:00
Carlos Garnacho
972a9d231f screen: Use meta_device_pointer_set_window_cursor() for startup sequence.
At the moment feedback is only provided for the Virtual Core Pointer
2011-07-15 18:03:47 +02:00
Carlos Garnacho
1dd50cf006 device-map: Add meta_device_map_list_devices()
This function returns a list of the devices currently handled by
the device map.
2011-07-15 18:03:47 +02:00
Carlos Garnacho
855095ad1a core: Make frame handle per-pointer cursors. 2011-07-15 18:03:46 +02:00
Carlos Garnacho
95b2e6fafc workspace: use triggering device to focus the default window on workspace switch 2011-07-15 18:03:46 +02:00
Carlos Garnacho
dfcd079ec2 screen: make "monitor under pointer" logic work for several devices 2011-07-15 18:03:46 +02:00
Carlos Garnacho
e0966e7499 window: query the guessed pointer's modifiers on _NET_WM_MOVERESIZE 2011-07-15 18:03:46 +02:00
Carlos Garnacho
38df2715f2 display: Use the grab pointer for delayed window raising 2011-07-15 18:03:46 +02:00
Carlos Garnacho
5ecbb3ec3b keybindings: use the right device for querying the modifier mask. 2011-07-15 18:03:46 +02:00
Carlos Garnacho
656fa71649 devices: make meta_device_pointer_query_position() return a boolean
like in XQueryPointer/XIQueryPointer, the return value tells whether
the pointer device is on the same screen than the passed window.
2011-07-15 18:03:46 +02:00
Carlos Garnacho
bde0d28f1b core: Make keyboard focus handling happen per-keyboard
MetaFocusInfo is a struct holding all necessary info, code has
been updated to use the per-keyboard focus info instead of the
old fields.
2011-07-15 18:03:46 +02:00
Carlos Garnacho
4cb9a5e3bf core: Add meta_device_keyboard_[gs]et_focus_window()
These functions are meant to replace X[GS]etInputFocus() calls across
the core.
2011-07-15 18:03:45 +02:00
Carlos Garnacho
90c25f0cfe display: Use meta_device_grab() for pointer active grabs. 2011-07-15 18:03:45 +02:00
Carlos Garnacho
2484e8cd64 keybindings: Use meta_device_grab() for keyboard active grabs 2011-07-15 18:03:45 +02:00
Carlos Garnacho
61a7789c83 window: Use meta_device_pointer_warp() 2011-07-15 18:03:45 +02:00
Carlos Garnacho
c352e1078e core: Keep track of per pointer/keyboard grabs
There is now a MetaGrabInfo struct, holding all information about
an ongoing grab, there were unfortunately no means of making this
commit smaller, as things are too intertwined to separate it,

On places where it was most obvious, the correct device has been
used (in reaction to events, for example), in other parts, the
private API has been extended to include the MetaDevice (or device
ID for core.h functions), in other places, the virtual core
pointer/keyboard are used out of cluelessness.
2011-07-15 18:00:01 +02:00
Carlos Garnacho
d664579115 ui: Use input-events.h to translate XEvents to GdkEvents
This is the only use in the UI part of core functions not
exported via core.h, but this is sort of a hack within a hack,
and still better than doing the XInput2 vs core dance again.
2011-07-15 17:58:49 +02:00
Carlos Garnacho
49dfb40b82 devices: Make MetaDevice/MetaDeviceMap partly public
MetaDevice is quite limited outside of the core, mostly useful
to represent a device, and get the paired one.
2011-07-15 17:58:49 +02:00
Carlos Garnacho
e08c4756eb keybindings: Replace XGrabKey() with meta_device_map_grab_key() 2011-07-15 17:58:49 +02:00
Carlos Garnacho
6378527458 display: Replace XGrabButton with meta_device_map_grab_button() 2011-07-15 17:58:49 +02:00
Carlos Garnacho
f0705e142c core: Add XInput2 device map implementation 2011-07-15 17:58:49 +02:00
Carlos Garnacho
3f7193e558 Replace XAllowEvents with meta_device_allow_events() 2011-07-15 17:58:48 +02:00
Carlos Garnacho
3af9de08ab Use meta_core_select_events() for input events 2011-07-15 17:58:48 +02:00
Carlos Garnacho
111c23a6e0 core: Add method to select events on a window
This function handles XInput2 vs core in input events.
2011-07-15 17:58:48 +02:00
Carlos Garnacho
db6ddc4a7f devices-xi2: Export function to translate event mask 2011-07-15 17:58:48 +02:00
Carlos Garnacho
884e13474b Add XInput2 input devices implementation 2011-07-15 17:58:45 +02:00
Carlos Garnacho
722420df3a input-events: Add method to get the device for an event 2011-07-15 17:57:24 +02:00
Carlos Garnacho
50cee11c53 core: Add device map object
It will contain the input devices available
2011-07-15 17:57:24 +02:00
Carlos Garnacho
a727114ac2 core: Add core devices implementation 2011-07-15 17:57:24 +02:00
Carlos Garnacho
722d2d6472 device: Add methods to pair devices 2011-07-15 17:57:24 +02:00
Carlos Garnacho
7b9a26fbd8 Add pointer/keyboard abstract classes 2011-07-15 17:57:24 +02:00
Carlos Garnacho
5819e74c22 compositor: Use helper functions for input events 2011-07-15 17:57:24 +02:00
Carlos Garnacho
36e237cf1e keybindings: Use input event helper functions 2011-07-15 17:57:24 +02:00
Carlos Garnacho
3b0aa9f881 window: use input event helper functions on notify_focus() 2011-07-15 17:57:23 +02:00
Carlos Garnacho
e6d09c9d0b window: use input event helper functions in grab operations. 2011-07-15 17:57:23 +02:00
Carlos Garnacho
e26bf9dcef display: get crossing/focus events details via helper functions 2011-07-11 19:00:46 +02:00
Carlos Garnacho
748954a15e display: get button event coordinates with the helper functions 2011-07-11 19:00:46 +02:00
Carlos Garnacho
4c4f21c001 display: get button events state from helper functions 2011-07-11 19:00:46 +02:00
Carlos Garnacho
166559059a display: get button number from helper input event function 2011-07-11 19:00:46 +02:00
Carlos Garnacho
7566b4ea17 display: Use helper function to get input events' timestamp 2011-07-11 19:00:45 +02:00
Carlos Garnacho
1b7a6ce912 display: Use helper functions for getting window/root in input events 2011-07-11 19:00:45 +02:00
Carlos Garnacho
dc4ecdd0d2 display: Get the right window/time for input events 2011-07-11 19:00:45 +02:00
Carlos Garnacho
d381c0465b display: separate input/non-input events handling in the event callback
We now use meta_input_event_get_type() to discern input events from the
others. This commit has involved plenty of indenting changes, so it's
better seen with git diff -b.
2011-07-11 19:00:45 +02:00
Carlos Garnacho
38a0aecf61 core: Add helper code to handle input events
These will be used with every input event out there so they're
dealt with uniformly.
2011-07-11 19:00:45 +02:00
Carlos Garnacho
7573aae855 display: Add XInput2 variables in private struct 2011-07-11 19:00:45 +02:00
Carlos Garnacho
684d40d1a1 configure: Check for XInput2 2011-07-11 19:00:45 +02:00
Jakub Steiner
47b432bf89 Improve shadow defaults.
- menus have a very subtle shadow, define the outline better. Required for gtk theming.
- focused windows are better identified now as unfocused windows have a subtle shadow.

https://bugzilla.gnome.org/show_bug.cgi?id=649374
2011-07-11 16:00:03 +02:00
Jorge González
b70ccd2a56 Updated Spanish translation 2011-07-10 13:00:04 +02:00
Owen W. Taylor
be8df20675 Fix typo when computing shadow bounds
A x/y typo that was causing shadow bounds to be incorrectly
computed and trails to be left in some circumstances. Behavior
noted by Jakub Steiner.

https://bugzilla.gnome.org/show_bug.cgi?id=649374
2011-07-08 22:38:12 -04:00
Florian Müllner
4a10c95e76 core: Replace lower_beneath_focus_window()
The code assumed that the focus window was always the one at the
top of the window stack, which is not true if an unfocused window
has the above hint set.

Rather than fixing this assumption, rename the function to
lower_beneath_grab_window() and use the display's grab window - the
function is only used for displaying the tile previews, which means
that we want the grab window anyway.

https://bugzilla.gnome.org/show_bug.cgi?id=650661
2011-07-09 01:08:58 +02:00
Florian Müllner
54b2fab849 theme: Allow using custom colors from the GTK+ theme
Add an additional color type to pick up colors defined with
@define-color in the GTK+ theme's CSS:

  gtk:custom(name,fallback)

(where "name" refers to the name defined in GTK+'s CSS, and fallback
refers to an alternative color spec which is used when the color
referenced by "name" is not found)

The main intent of the change is to allow designers to improve
Adwaita's dark theme variant without having to compromise on colors
which work in the light variant as well.

https://bugzilla.gnome.org/show_bug.cgi?id=648709
2011-07-08 22:40:43 +02:00
Thierry Reding
8033184134 Fix out-of-tree build.
This patch fixes an issue encountered when building mutter
out-of-tree:

  * When generating mutter-enum-types.[ch], the glib-mkenums command is
    executed from $(srcdir), so it is wrong to prepend $(srcdir) to the
    template file.

https://bugzilla.gnome.org/show_bug.cgi?id=624910
2011-07-08 16:33:12 -04:00
Florian Müllner
d95da2dfbe theme: Port from GtkStateType to GtkStateFlags
We now use GtkStyleContext exclusively, so it's a bit weird to store
widget state as GtkStateType and translate it always to GtkStateFlags.
Just use GtkStateFlags instead of GtkStateType.

https://bugzilla.gnome.org/show_bug.cgi?id=650586
2011-07-08 21:40:55 +02:00
Florian Müllner
03457029f7 draw-workspace: Update to current GTK style API
Move from GtkStyle to GtkStyleContext.

https://bugzilla.gnome.org/show_bug.cgi?id=650586
2011-07-08 21:40:55 +02:00
Florian Müllner
f8d900c3ea theme: Add helper functions for light/dark colors
GtkStyleContext no longer has dark/light colors GtkStyle used to
have. We already have compatibility code for them in theme.c, so
add two helper functions to make it available outside theme.c.

https://bugzilla.gnome.org/show_bug.cgi?id=650586
2011-07-08 21:40:55 +02:00
Florian Müllner
e16beba111 mutter-window-demo: Port from GdkColor to GdkRGBA
GdkColor is about to be deprecated, so move to GdkRGBA instead.

https://bugzilla.gnome.org/show_bug.cgi?id=650586
2011-07-08 21:40:54 +02:00
Florian Müllner
60ee25d8d5 theme-viewer: Port from GdkColor to GdkRGBA
GdkColor is about to be deprecated, so move to GdkRGBA instead.

https://bugzilla.gnome.org/show_bug.cgi?id=650586
2011-07-08 21:40:54 +02:00
Florian Müllner
ce1369609f theme: Port from GdkColor to GdkRGBA
GdkColor is about to be deprecated, so move to GdkRGBA instead.

https://bugzilla.gnome.org/show_bug.cgi?id=650586
2011-07-08 01:29:54 +02:00
Florian Müllner
8199699e7c gradient: Port from GdkColor to GdkRGBA
GdkColor is about to be deprecated, so move to GdkRGBA instead.
It might be worth considering using cairo patterns for the gradients
rather than using custom code to render gradients to a pixbuf which
is then drawn with cairo, but for now this is just a straight port
of the existing code.

https://bugzilla.gnome.org/show_bug.cgi?id=650586
2011-07-08 01:29:54 +02:00
Dan Winship
48cabd1364 window: fix appears-focused propagation with attached grandchildren
When detaching/attaching a dialog, we were only updating
appears-focused on the parent if the child itself was focused, but in
fact, we need to do it if the child has an attached child which is
focused too.

To simplify the case of detaching a focused subtree from its parent,
we change meta_window_propagate_focus_appearance() to use
@window->display->focus_window as the window to add/remove as the
attached_focus_window, and @window only as the starting point to
propagate from. That way we can propagate focus-removal up to
@window's (soon-to-be-ex-)ancestors without having to remove it from
its descendants as well.

https://bugzilla.gnome.org/show_bug.cgi?id=647712
2011-07-07 16:51:36 -04:00
Dan Winship
6dc79ce60a reload_transient_for: avoid xtransient_for loops
Don't set a window's xtransient_for if it would create a loop. Since
this is the only place we ever set xtransient_for, we can therefore
assume everywhere else that it does not loop.

https://bugzilla.gnome.org/show_bug.cgi?id=647712
2011-07-07 16:51:36 -04:00
Abduxukur Abdurixit
a8cfdc19e2 Added UG translation 2011-07-07 17:12:59 +02:00
Fran Dieguez
db4ae415e3 Updated Galician translations 2011-07-04 22:23:27 +02:00
Matej Urbančič
7842d92995 Updated Slovenian translation 2011-07-02 20:32:15 +02:00
Nguyễn Thái Ngọc Duy
b34c01a95a po/vi: spelling fixes 2011-07-02 13:49:25 +07:00
Jorge González
e4546829e3 Updated Spanish translation 2011-07-02 07:07:44 +02:00
Daniel Mustieles
8dc3de87ad Updated Spanish translation 2011-07-02 07:05:16 +02:00
Takeshi AIHANA
e3094ace05 Updated Japanese translation. 2011-07-02 10:22:29 +09:00
Owen W. Taylor
6f49a00bbe Bump version to 3.1.3.1
Update NEWS
2011-07-01 19:26:50 -04:00
Owen W. Taylor
b5f277bd7b Freeze api_version to 3.0
Back the API version down to 3.0; since we don't make any stability
guarantees, there's no reason to have a merry-go-round of different
directories and filenames that people have to keep up with.
2011-07-01 19:19:11 -04:00
Kjartan Maraas
f798144bea Updated Norwegian bokmål translation 2011-07-02 00:16:49 +02:00
Yaron Shahrabani
699fb0d0f1 Updated Hebrew translation. 2011-07-01 19:39:11 +03:00
Muhammet Kara
5b84f62a89 Updated Turkish translation 2011-07-01 01:52:44 +03:00
Owen W. Taylor
3209e88c6f Bump version to 3.1.3
Update NEWS
2011-06-30 17:03:19 -04:00
Owen W. Taylor
0202a0837d Adding missing file to POTFILES.in 2011-06-30 17:03:17 -04:00
Jasper St. Pierre
2b93c19328 Clip the shaped region to the bounding region
According to the XShape specification, the shaped region should always be
a subset of the bounding region. Certain programs such as wine depended
on this behavior.

https://bugzilla.gnome.org/show_bug.cgi?id=627880
2011-06-30 16:35:13 -04:00
Owen W. Taylor
66a830fd46 Fixes for compositor replacement
* When unmanaging a screen, stop redirecting subwindows explicitly,
  so that we do that before destroying the window manager selection
  window.
* Improve comment in the retry code
* When exiting because the previous compositor couldn't be replaced,
  don't g_error() and drop a core file.

https://bugzilla.gnome.org/show_bug.cgi?id=653121
2011-06-30 16:26:10 -04:00
Jasper St. Pierre
d752096cdf Fix XShape
Commit c3a04bf unintentionally broke XShape handling. By studying the code
extremely carefully, I found this inconsistency with the code that was
there before.

https://bugzilla.gnome.org/show_bug.cgi?id=635268
2011-06-29 16:07:34 -04:00
Owen W. Taylor
fe12294b92 Create the 1x1 texture for the root background unsliced
When there was no root background pixmap, we were using a 1x1 repeating
texture as a simple way of drawing a solid color without adding a
second code path. However, when that 1x1 texture was combined into
a larger "atlas texture", hardware repeat couldn't be used, so a
small inefficiency from this approach became an enormous inefficiency
as clutter drew every pixel of the background as a separate rectangle.

https://bugzilla.gnome.org/show_bug.cgi?id=652507
2011-06-29 12:27:02 -04:00
Ihar Hrachyshka
61b5cfece4 Updated Belarusian translation. 2011-06-28 01:36:02 +03:00
Muhammet Kara
ec5fb2a4ad Updated Turkish translation file header 2011-06-26 03:50:55 +03:00
Muhammet Kara
cdabd517fa Updated Turkish translation 2011-06-26 00:27:38 +03:00
Ihar Hrachyshka
ebfe9a0355 Updated Belarusian translation. 2011-06-25 21:55:02 +03:00
Мирослав Николић
c1a5261e2f Updated Serbian translation 2011-06-25 01:01:27 +02:00
Colin Walters
c18940a5a2 compositor: Loop and retry to get compositor selection when replacing
There are unavoidable race conditions here when another process is
replacing us.  As a band aid, loop for 5 seconds.

https://bugzilla.gnome.org/show_bug.cgi?id=653121
2011-06-21 15:22:31 -04:00
Florian Müllner
b533ad2669 core: Remove META_CORE_IS_TITLEBAR_ONSCREEN
The functionality is no longer needed outside of core/, so remove
the getter.

https://bugzilla.gnome.org/show_bug.cgi?id=652369
2011-06-15 21:34:04 +02:00
Florian Müllner
526bc34bba frames: Always start grab operation on left click
When left-clicking the frame border with the titlebar being
off-screen, rather than starting the expected grab operation the
window menu was popped up.
This behavior is pretty confusing, especially since the menu button
was removed from the default layout, making right-clicking the only
way to get to the window menu.

https://bugzilla.gnome.org/show_bug.cgi?id=652369
2011-06-15 21:34:04 +02:00
Matej Urbančič
35d300b916 Updated Slovenian translation 2011-06-10 20:15:46 +02:00
Dan Winship
c70087db0c meta_quit: ignore repeated calls after it's already quitting
meta_run() calls meta_finalize() after the main loop exits, which ends
up calling meta_display_close(), which calls
meta_quit(META_EXIT_SUCCESS), meaning that any exit status passed to
the original meta_quit() call is lost.

Fix this by ignoring meta_quit() calls after the main loop is no
longer running.

https://bugzilla.gnome.org/show_bug.cgi?id=652010
2011-06-06 16:22:39 -04:00
Fran Diéguez
9804841adb Updated Galician translations 2011-06-06 11:23:06 +02:00
Fran Diéguez
aa92aa08bd Updated Galician translations 2011-06-06 11:13:00 +02:00
Yaron Shahrabani
15e55b2ca1 Updated Hebrew translation. 2011-06-03 11:22:38 +03:00
Florian Müllner
4257b8deff window: Expose minimized state as property
Track the minimized state in a property, so that we can receive
change notifications.

https://bugzilla.gnome.org/show_bug.cgi?id=651568
2011-05-31 21:20:42 +02:00
Carles Ferrando
e21e2c892a [l10n]Updated Catalan (Valencian) translation 2011-05-29 18:56:56 +02:00
Adam Jackson
05662b678e Fix crash in meta_display_get_above_tab_keycode
https://bugzilla.gnome.org/show_bug.cgi?id=647777
2011-05-25 14:20:06 -04:00
Jasper St. Pierre
64f37a3769 window: Add wm-class property and notify it when changed.
https://bugzilla.gnome.org/show_bug.cgi?id=649315
2011-05-25 12:10:03 -04:00
Daniel Mustieles
7c9f492584 Updated Spanish translation 2011-05-21 09:32:57 +02:00
Florian Müllner
7577437167 ui-frames: Delay attaching the style to new frames
Like the setting of new frames' background is delayed until the
frame is associated with its window, delay attaching the initial
style, so that the correct style variant is picked.

https://bugzilla.gnome.org/show_bug.cgi?id=645355
2011-05-18 23:07:23 +02:00
Florian Müllner
be6775767c core: Update frame style when _GTK_THEME_VARIANT changes
When the _GTK_THEME_VARIANT property changes, rather than just
updating the window's theme_variant property, update its frame
style as well, so that the window decoration reflects the requested
variant. As the initial properties of a window may be read before
its frame is created, there will be cases where the change is not
picked up initially.

https://bugzilla.gnome.org/show_bug.cgi?id=645355
2011-05-18 23:07:23 +02:00
Florian Müllner
0d9a9b8d3b theme: Do not create temporary GtkStyle objects
In order to pick up colors from a GtkStyleContext, a temporary
GtkStyle object was created from the context and destroyed after
copying the requested GdkColor. This is slightly inefficient, so
get the appropriate GdkRGBA from the context and translate it to
a GdkColor, based on the compatibility code in gtkstyle.c.

https://bugzilla.gnome.org/show_bug.cgi?id=645355
2011-05-18 23:07:23 +02:00
Florian Müllner
4affd22817 ui-frame: Add support for style variants
Rather than sharing a single style context between all frames, use
a default style and one style per encountered variant (as determined
by the _GTK_THEME_VARIANT property), so that colors from the GTK+ style
are picked from the correct theme variant.

https://bugzilla.gnome.org/show_bug.cgi?id=645355
2011-05-18 23:07:23 +02:00
Florian Müllner
eb17cd9ba9 ui: Add meta_ui_update_frame_style()
This method allows forcing a style update of a particular frame
from the core, so that it can pick up style variants.

https://bugzilla.gnome.org/show_bug.cgi?id=645355
2011-05-18 23:07:23 +02:00
Florian Müllner
0cdac78bd5 core: Allow retrieving the theme variant via core_get()
To associate frames with the correct style variant, the UI will
need access to the window's theme variant property.

https://bugzilla.gnome.org/show_bug.cgi?id=645355
2011-05-18 23:07:23 +02:00
Florian Müllner
4f3b03e13b window: Parse _GTK_THEME_VARIANT property
Since version 3.0, GTK+ has support for style variants. At the moment,
themes may provide a dark variant, which can be requested by
applications via GtkSettings. The requested variant is exported to
X11 via the _GTK_THEME_VARIANT property - support this property, in
order to pick up the correct style variant in the future.

https://bugzilla.gnome.org/show_bug.cgi?id=645355
2011-05-18 23:07:23 +02:00
Florian Müllner
da4486b833 theme: Get GTK+ colors from style context
Rather than using a single widget's style for GTK+ colors in themes,
use the style context parameter of the drawing functions for those
colors. Right now, a single style context is shared between frames,
but this will change to support different style variants.

https://bugzilla.gnome.org/show_bug.cgi?id=645355
2011-05-18 23:07:22 +02:00
Florian Müllner
37aeb5baf1 frame: Delay updating the background until the frame is ready
To determine the correct background style, the UI needs to access
some frame properties via meta_core_get(); this call will bail out
early if window->frame is unset, so delay the call until the
association is made.

https://bugzilla.gnome.org/show_bug.cgi?id=645355
2011-05-18 23:07:22 +02:00
Florian Müllner
a2cb38b382 tile-preview: Use gdk_cairo_set_source_rgba()
gdk_cairo_set_source_rgba() is a convenience function which was
added to GTK+-3.0 after the port to GtkStyleContext, so we ended
up using cairo_set_source_rgba() instead. Save a couple of lines ...
2011-05-18 23:07:22 +02:00
Owen W. Taylor
c573523c4d Filter mirrored monitors from the monitors list
For the purposes of window placement or arranging window manager or
plugin controls, screens that are just mirrors of other screens should
be ignored, so filter them out of the monitors list.

https://bugzilla.gnome.org/show_bug.cgi?id=649299
2011-05-18 13:00:11 -04:00
Dan Winship
64e6b77dc3 window: don't allow side-by-side tiling of non-maximizable windows
If a window is not maximizable, then that probably means it looks dumb
at very large sizes. Even if its hints would allow you to manually
resize it to a large size, don't allow automatically tiling it to half
the screen.

https://bugzilla.gnome.org/show_bug.cgi?id=647901
2011-05-16 10:16:12 -04:00
Colin Walters
d0414a3ea6 theme.c: Squash memory leak
When converting a token to a different type, we need to free its
string.

https://bugzilla.gnome.org/show_bug.cgi?id=649500
2011-05-11 14:15:48 -04:00
Colin Walters
6596374886 region-utils.c: Squash a memory leak
"chunk" was an allocated but unused variable.

https://bugzilla.gnome.org/show_bug.cgi?id=649504
2011-05-11 14:15:48 -04:00
Matej Urbančič
7d70343c6d Updated Slovenian translation 2011-05-09 20:23:20 +02:00
Yaron Shahrabani
cb87908dca Updated Hebrew translation. 2011-05-09 00:22:54 +03:00
Daniel Mustieles
95f33b36a7 Updated Spanish translation 2011-05-04 19:50:12 +02:00
Daniel Korostil
d246d1c971 Uploaded Ukranian 2011-05-03 22:46:17 +03:00
Owen W. Taylor
89dbef9eb3 Fix crash with non-responding application with no title
If a window had no title property set, then the
application-not-responding dialog would cause Mutter to crash
because window->title was NULL; handle that case and use the
string "Application is not responding."

https://bugzilla.gnome.org/show_bug.cgi?id=649114
2011-05-03 11:01:05 -04:00
Owen W. Taylor
60dd31ed48 Fix escaping for application-not-responding dialog
We need to escape markup in the title, or a title "<i>Italic</i>"
will be displayed as italic.

https://bugzilla.gnome.org/show_bug.cgi?id=649114
2011-05-03 11:01:05 -04:00
Owen W. Taylor
40f51114b5 meta_show_dialog: fix encoding of command line arguments
Command line arguments are supposed to be in the locale encoding,
not UTF-8, and Zenity decodes command line string command line
arguments with this assumption using GOption.

There was a half-hearted attempt to deal with this in delete.c,
but it wasn't correct since it immediately mixed the window title,
converted to the locale encoding with a UTF-8 message.

https://bugzilla.gnome.org/show_bug.cgi?id=649114
2011-05-03 11:01:05 -04:00
Dan Winship
d9007a08c9 Don't call textdomain()
As a library, libmutter should not be setting the default translation
domain to point to itself.

Also, move the bindtextdomain() call earlier
(meta_get_option_context), so that translations of command-line
options will be available.

We could call textdomain() in mutter.c, but there's no need to, since
mutter uses dgettext() everywhere anyway.

https://bugzilla.gnome.org/show_bug.cgi?id=649202
2011-05-02 14:37:47 -04:00
Abduxukur Abdurixit
3d05405a78 Added UG translation 2011-05-02 18:48:30 +02:00
Takeshi AIHANA
1ca697a130 Updated Japanese translation. 2011-05-01 13:04:13 +09:00
Matthias Clasen
c248c57b6e Make session saving work a bit better
Previously, the restart command hardcoded "mutter" as the binary name.
This commit changes it to use g_get_prgname() which has a better chance
of being correct (and it does fix session saving for gnome-shell).

Now that mutter is a library, it might be more correct (but also
much higher overhead) to add api for setting these things from
the outside.

https://bugzilla.gnome.org/show_bug.cgi?id=648828
2011-04-29 07:23:30 -04:00
Owen W. Taylor
67c3c93b8f Only shadow ARGB windows with a frame outside the frame
An ARGB window with a frame is likely something like a transparent
terminal. It looks awful (and breaks transparency) to draw a big
opaque black shadow under the window, so clip out the region under
the terminal from the shadow we draw.

Add meta_window_get_frame_bounds() to get a cairo region for the
outer bounds of the frame of a window, and modify the frame handling
code to notice changes to the frame shape and discard a cached
region. meta_frames_apply_shapes() is refactored so we can extract
meta_frames_get_frame_bounds() from it.

https://bugzilla.gnome.org/show_bug.cgi?id=635268
2011-04-26 15:10:02 -04:00
Owen W. Taylor
c3a04bf394 Convert frame region handling to cairo regions
It's useful to get frame shapes and manipulate them within Mutter, for
example so that the compositor can use them to clip drawing.
For this, we'll need the regions as cairo regions not X regions, so
convert frame shaping code to work in terms of cairo_region_t.

https://bugzilla.gnome.org/show_bug.cgi?id=635268
2011-04-26 15:10:02 -04:00
Owen W. Taylor
c30c29b8c3 Make _NET_WM_WINDOW_OPACITY orthogonal to window actor opacity
Using MetaWindowActor.opacity for _NET_WM_WINDOW_OPACITY makes it
difficult to implement effects like fading a window in on map.
Instead, set the opacity on the MetaShadedTexture child and use
it when drawing the shadow.

Since the check MetaWindowGroup does on meta_actor_get_paint_opacity()
no longer covers this, we need to handle the opacity in
meta_window_actor_get_obscured_region() explicitly.

https://bugzilla.gnome.org/show_bug.cgi?id=648613
2011-04-26 15:10:02 -04:00
Owen W. Taylor
5eb8aa655b Bump version to 3.0.1
Update NEWS
2011-04-25 17:21:55 -04:00
Florian Müllner
3543782f39 edge-tiling: Fix cancelling maximize tiling
If a window can not be tiled, e.g. due to its minimum size hints,
dragging away from the top after activating the maximize tile preview
does not cancel the maximization request, the only way to do so is by
hitting Escape.
To fix, reset the tiling state in the maximize-tile code path as
well if necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=646149
2011-04-25 23:12:05 +02:00
Colin Walters
4ff4ebebb6 meta_window_is_remote: If WM_CLIENT_MACHINE not set, don't assume remote
Apparently the "fox" toolkit doesn't set WM_CLIENT_MACHINE; while we
could do gymnastics to attempt to figure this out (talk to the X
server?), better to just default to FALSE.

https://bugzilla.gnome.org/show_bug.cgi?id=647662
2011-04-25 16:43:09 -04:00
Muhammet Kara
a3c96c12d6 Updated Turkish translation 2011-04-23 02:08:10 +03:00
Dan Winship
eb0e658c99 window: fix a case of appears-focused getting stuck
Since appears-focus only propagates up from modal dialogs, if an
application removed the modal hint from a dialog before destroying it,
then its parent would be left with a stray reference to it in
attached_focus_window, causing it to be permanently appears-focused.

The obvious fix, calling meta_window_propagate_focus_appearance() when
the modal hint is removed, tends to cause noticeable flashing, because
the window will get drawn unfocused and then focused again.

So instead we just change meta_window_propagate_focus_appearance() to
check the window type only when focusing in, not when focusing out.

This would also cause flashing, but in this case we can avoid it by
not notifying the change in appears-focus on the parent window if it
is the expected_focus_window (which it will be by this point). (This
does mean though that if something weird happens and the window
doesn't end up becoming the focus window, it won't get redrawn
unfocused until something else forces it to.)

https://bugzilla.gnome.org/show_bug.cgi?id=647613
2011-04-20 14:40:47 -04:00
Kristjan SCHMIDT
4d069650ae Add Esperanto translation 2011-04-19 18:48:55 +02:00
Amitakhya Phukan
d176755926 Updated Assamese translations 2011-04-05 12:00:38 +05:30
Owen W. Taylor
eb2a6946b2 Bump version to 3.0.0 2011-04-04 13:23:45 -04:00
Owen W. Taylor
d067ba4431 Add old NEWS
Add text from previews release announcements to NEWS
2011-04-04 13:22:40 -04:00
Jordi Serratosa
fdf11f10fb [l10n]Fixes on Catalan translation 2011-04-03 23:45:55 +02:00
Petr Kovar
8fd1835d1a Update Czech translation 2011-04-03 17:12:10 +02:00
Ask H. Larsen
c77075833a Updated Danish translation 2011-04-02 22:38:08 +02:00
Shankar Prasad
b2a7ab270c Updated kn translations 2011-04-02 21:00:21 +05:30
Dan Winship
7503d4812c window: don't crash on spurious calls to idle_calc_showing()
If idle_calc_showing() gets called when its queue is empty (which
shouldn't happen), just return rather than crashing.

https://bugzilla.gnome.org/show_bug.cgi?id=642957
2011-04-02 07:34:39 -04:00
Changwoo Ryu
1fd8b0b4c5 Updated Korean translation 2011-04-02 20:10:55 +09:00
Nguyễn Thái Ngọc Duy
8615cf88ab Updated Vietnamese translation 2011-04-02 12:49:13 +07:00
Nguyễn Thái Ngọc Duy
f73a13dc4a po/vi.po: import from Damned Lies 2011-04-02 12:47:56 +07:00
Dr.T.Vasudevan
f973e2effa Updated Tamil translation 2011-04-01 20:49:02 +05:30
Gabor Kelemen
f9fed16608 Updated Hungarian translation 2011-04-01 14:53:23 +02:00
Rodrigo Padula de Oliveira
0578ed0c86 Updated Brazilian Portuguese translation. Reviewed by Antonio Fernandes C. Neto <fernandes@pelivre.org> 2011-04-01 09:18:33 -03:00
Inaki Larranaga Murgoitio
61520f5bd6 Updated Basque language 2011-04-01 13:25:55 +02:00
Inaki Larranaga Murgoitio
be853ec931 Updated Basque language 2011-04-01 13:23:09 +02:00
Joan Duran
440b92adf0 [l10n]Updated Catalan translation 2011-03-30 21:20:29 +02:00
Bruce Cowan
8fa4d22937 Updated British English translation 2011-03-30 15:35:46 +01:00
Chao-Hsiung Liao
397ae90d5c Updated Traditional Chinese translation(Hong Kong and Taiwan) 2011-03-30 21:32:14 +08:00
Wouter Bolsterlee
7f97d0bdc5 Updated Dutch translation by Wouter Bolsterlee 2011-03-29 23:29:27 +02:00
Dirgita
14956abb6e Updated Indonesian translation 2011-03-29 22:16:32 +07:00
Duarte Loreto
61cea18ff0 Updated Portuguese translation 2011-03-29 00:26:27 +01:00
Owen W. Taylor
83a449df95 Bump version to 2.91.93 2011-03-28 18:42:26 -04:00
Christian Kirbach
9c683aaea9 [l10n] Updated German translation 2011-03-29 00:38:27 +02:00
Alexander Larsson
634b76b82c Don't move all window to active workspace if monitors change
https://bugzilla.gnome.org/show_bug.cgi?id=645408
2011-03-28 18:19:25 -04:00
Jasper St. Pierre
a3ea43da52 display: Fix crash with cycle_group
Commit e3ebcc004d introduced an unsafe
access for 'window', which could cause a segfault.

https://bugzilla.gnome.org/show_bug.cgi?id=645843
2011-03-28 17:38:07 -04:00
Dan Winship
f464b85ffc window: add an appears-focused property, redraw shadows when it changes
We need to redraw a window's shadow any time the value of
meta_window_appears_focused() changes. So make that into a property so
we can get notifications on it.

https://bugzilla.gnome.org/show_bug.cgi?id=636904
2011-03-28 12:09:10 -04:00
Rudolfs Mazurs
db055c6029 Updated Latvian translation. 2011-03-28 00:49:45 +03:00
Abduxukur Abdurixit
eedc74943b Added UG translation 2011-03-27 21:38:17 +02:00
Yuri Myasoedov
82b134ed46 Updated Russian translation 2011-03-26 22:13:25 +03:00
A S Alam
cc1de7e7d0 update tranlation for Punjabi by A S Alam 2011-03-26 23:50:11 +05:30
Yaron Shahrabani
a199d74069 Updated Hebrew translation. 2011-03-26 00:36:10 +02:00
Aron Xu
7a23d3024a Update Simplified Chinese translation. 2011-03-24 17:18:27 +00:00
Daniel Nylander
734888406c Updated Swedish translation 2011-03-24 16:14:10 +01:00
Olav Vitters
e0ce24b3f5 Add description to DOAP file 2011-03-24 13:59:56 +01:00
Colin Walters
c13e62f72c Export meta_get_replace_current_wm()
This is necessary for gnome-shell to know whether it should try to
replace the org.gnome.Shell DBus name.

Note: We can't just #include <meta/util.h> because it #defines '_'
at least which obviously conflicts with core gettext.  We should
un-export util.h or fix it.

https://bugzilla.gnome.org/show_bug.cgi?id=645590
2011-03-23 16:08:51 -04:00
Alexander Shopov
3d958de33e Updated Bulgarian translation 2011-03-23 21:39:14 +02:00
Daniel Korostil
4689688af3 Uploaded Ukranian 2011-03-23 15:53:06 +02:00
124 changed files with 31677 additions and 24460 deletions

817
NEWS
View File

@@ -1,3 +1,820 @@
3.1.3.1
=======
* Back API version down to "3.0" - the change to Meta-3.1.gir
was unintentional [Owen]
Translations:
Yaron Shahrabani [he], Kjartan Maraas [nb], Muhammet Kara [tr]
3.1.3
=====
* Support dark window theme variants for windows with a dark
widget theme; this is selected by the _GTK_THEME_VARIANT
property [Florian, #645355]
* Don't draw a shadow under windows with an alpha-channel - this
fixes transparency for GNOME Terminal [Owen, Jasper; #635268]
* Add a MetaWindow:wm-class property for notification [Jasper; #649315]
* Add a MetaWindow:minimized property for notification [Florian]
* Fix handing of unusual window shapes that Wine was setting
causing some applications to draw wrong [Jasper; #627880]
* Improve replacing another compositor and being replaced:
release compositor selection in the right order and wait for
compositors that get it wrong. [Colin, Owen; #653121]
* Remove behavior where left clicking on a window border with
the titlebar offscreen gave the window menu [Florian; #652369]
* Don't set the global default textdomain, since Mutter is
a library as well as an application [Dan; #649202]
* Exit with the right (success or failure) exit status [Dan]
* Code cleanup [Florian]
* Miscellaneous bug fixes [Owen; #649114, #652507]
Contributors:
Florian Müllner, Jasper St. Pierre, Owen Taylor, Colin Walters, Dan Winship
Translations:
Ihar Hrachyshka [be], Daniel Mustieles [es], Yaron Shahrabani [he],
Carles Ferrando [ca@valencia], Takeshi Aihana [ja], Fran Diéguez [gl],
Matej Urbančič [sl], Miroslav Nikolic [sr], Muhammet Kara [tr],
Daniel Korostil [uk]
3.0.2.1
=======
* When saving the session, use the "program name" rather than
harcoding mutter, fixing session saving for gnome-shell [Matthias]
https://bugzilla.gnome.org/show_bug.cgi?id=648828
Contributors:
Matthias Clasen
3.0.2
=====
* Fix a crash when running without XKB support [Adam]
https://bugzilla.gnome.org/show_bug.cgi?id=647777
* Fix smallish memory leaks [Colin]
https://bugzilla.gnome.org/show_bug.cgi?id=649500
https://bugzilla.gnome.org/show_bug.cgi?id=649504
* Ignore mirrored monitors when listing monitors, fixing
drag-and-drop problems in GNOME Shell [Owen]
https://bugzilla.gnome.org/show_bug.cgi?id=649299
* Don't allow side-by-side tiling of non-maximizable windows
like dialogs and utility windows [Dan]
* Fix interaction of _NET_WM_WINDOW_OPACITY with window effects,
making it work again with GNOME Shell
https://bugzilla.gnome.org/show_bug.cgi?id=648613
Contributors:
Adam Jackson, Colin Walters, Dan Winship
Translations:
Abduxukur Abdurixit [ug]
3.0.1
=====
* If WM_CLIENT_MACHINE isn't set, don't assume a window is remote;
fixes behavior of Fox toolkit applications under GNOME Shell.
https://bugzilla.gnome.org/show_bug.cgi?id=647662 [Colin]
* Fix cases where windows could get stuck drawing as focused after
an attached modal dialog was closed. [Dan]
https://bugzilla.gnome.org/show_bug.cgi?id=647613
* Fix a bug where a window that is too big to be tiled side-by-side
would behave strangely when using the gesture of dragging to
the top to maximize. [Florian]
Contributors:
Florian Müllner, Colin Walters, Dan Winship
Translations:
Amitakhya Phukan [as], Kristjan Schmidt [eo], Muhammet Kara [tr]
3.0.0
=====
* Avoid crashing when you have a single window and try to move it between
workspaces. [Dan]
https://bugzilla.gnome.org/show_bug.cgi?id=642957
Contributors:
Dan Winship
Translations:
Jordi Serratosa [ca], Petr Kovar [cz], Ask H. Larsen [da], Bruce Cowan [en_GB],
Inaki Larranaga Murgoitio [eu], Gabor Kelemen [hu], Dirgita [id], Shankar Prasad [kn],
Changwoo Ryu [ko], Wouter Bolsterlee [nl], Duarte Loreto [pt],
Antonio Fernandes C. Neto, Rodrigo Padula de Oliveira [pt_BR], T. Vasudevan [ta],
Nguyễn Thái Ngọc Duy [vi], Chao-Hsiung Liao [zh_HK, zh_TW]
2.91.93
=======
* Fix bug where, when a monitor was hot-plugged, all workspaces
would collapse to a single workspace. (There are still issues
when a secondary monitor is hot-plugged to the left of the
primary monitor.) [Alex]
https://bugzilla.gnome.org/show_bug.cgi?id=645408)
* Fix a crash for the cycle_group action [Jasper]
https://bugzilla.gnome.org/show_bug.cgi?id=645843
* Fix misdrawing of window shadows on some focus changes [Dan]
https://bugzilla.gnome.org/show_bug.cgi?id=636904
* Export meta_get_replace_current_wm() to allow fixing a
GNOME Shell bug with --replace [Colin]
https://bugzilla.gnome.org/show_bug.cgi?id=645590
Contributors:
Alexander Larsson, Jasper St. Pierre, Colin Walters, Dan Winship
Translations:
Alexander Shopov [bg], Christian Kirbach [de], Yaron Shahrabani [he],
Rudolfs Mazurs [lv], A S Alam [pa], Yuri Myasoedov [ru], Daniel Nylander [se],
Abduxukur Abdurixit [ug], Daniel Korostil [uj], Aron Xu [zh_CN]
2.91.92
=======
* Add a workspaces_only_on_primary preferences. When set, this makes
workspaces switching only apply to windows on the primary monitor,
while windows on other monitors are unaffected.
* Export API for monitor handling [Alex]
MetaScreen::monitors-changed signal
meta_screen_get_primary_monitor()
meta_window_is_on_primary_monitor()
meta_window_get_monitor()
MetaWindow::window-entered-monitor, <etaWindow::window-left-monitor
meta_window_move_to_monitor() [Florian]
* Behavior improvemnts for attached modal dialogs:
- Allow dragging dragging on the titlebar to move the parent ["Ron"]
- Allow resizing [Florian]
- Constrain to be on the current monitor [Florian]
* Don't turn on XSMP autorestart [Colin]
* Combine libmutter-wm and libmutter-private into a single libmutter
[Frédéric]
* Export methods to move and resize windows [Jeffery]
meta_window_move(), meta_window_resize(), meta_window_move_frame()
* Add a MUTTER_WM_CLASS_FILTER environment variable to allow existing
windows to be ignored when performance testing. [Owen]
* Add a new compositor-based flash for visual bell [Dan]
* Fix bug where application specified values for properties like
"skip taskbar" were sometimes ignored [Dan]
* Bug fixes [Dan, Florian, Giovanni, Jasper, Owen]
* Build fixes [Rico]
Contributors:
Giovanni Campagna, Florian Müllner, Alexander Larsson, Jeffery Olson,
Frédéric Péters, Owen Taylor, Jasper St. Pierre, Rico Tzschichholz,
"Ron", Colin Walters, Dan Winship
Translations:
Khaled Hosny [ar], David Planella [ca], Mario Blättermann [de],
Bruce Cowan [en_GB], Jorge González, Daniel Mustieles [es], Ivar Smolin [et],
Bruno Brouard [fr], Fran Diéguez [gl], Yaron Shahrabani [he],
Gabor Kelemen [hu], Luca Ferretti [it], Kjartan Maraas [nb], Piotr Drąg [pl],
Duarte Loreto [pt], Lucian Adrian Grijincu, Adi Roiban [ro],
Yuri Myasoedov [ru], Matej Urbančič [sl], Daniel Korostil [uk]
Bugs fixed:
624360 window shows up in when pressing alt+tab, but skip_taskbar_hint is set to True
631308 Dialogs attached to parent sometimes extend out of the screen
638674 [PATCH] Allow moving attached dialogs
639765 a11y: visual alert only works per-window, not screen
641975 Pre-_NET_WM_ICONs look corrupted
642355 patch to expose MetaWindow.move(), .resize() and add/expose .move_frame() to javascript
642787 MetaWindowActor has a dangling reference to its MetaWindow
643597 Attached dialogs not resizable, even by app request
644188 Broken build of 2.91.91
644252 Add MUTTER_WM_CLASS_FILTER environment variable
644529 session: Change XSMP restart style to Never
644565 Kill libmutter-private ?
644961 auto-tiling makes moving already-tiled windows hard
645224 Translation message doesn't make much sense
645247 Methods of Meta.Rectangle are missing annotations.
645455 tiling: Fix dragging windows free from edge-tiling
2.91.91
=======
* Build a libmutter-wm that contains all of the logic and that
can be linked to to create custom executables. The mutter executable
becomes a small stub linked to this library [Dan]
* Move installed headers files into a meta/ subdirectory instead
of polluting the toplevel namespace [Dan]
* Remove various unused complications: [Dan]
- Ability to set the set of plugins via GConf
- Plugin 'params'
- meta_restart() and "mutter-message restart"
* Don't exit when we are requested to exit via XSMP, assume we'll be
killed along with the X server; this avoids visual artifacts from
unmanaging windows when logging out [Colin]
* Build fixes [Dan, Jani, Jeff]
Contributors:
Jani Monoses, Jeff Olson, Colin Walters, Dan Winship
Translations:
Bruno Brouard [fr], Kjartan Maraas [nb], Daniel Korostil [uk]
Bugs fixed:
643194 patch: expose new meta_window_get_window_rect
643437 Don't exit on XSMP request
643959 Make mutter into a library
2.91.90
=======
* Change <Alt>Above_Tab from being a cycle_group binding to
a switch_group binding [Rui]
* Make plugin-loading failure fatal [Colin]
* Add 'position-changed' signal to MetaWindowActor [Owen]
* When 'live_hidden_previews' is enabled, position hidden windows
to allow the creation of workspace previews [Owen]
* Fix bug with opacity of MetaBackgroundActor
Contributors:
Rui Matos, Owen Taylor, Colin Walters
Translations:
Jorge González [es], Mattias Põldaru [et], Sweta Kothari [gu], Luca Ferretti [it],
Changwoo Ryu [ko], Nguyễn Thái Ngọc Duy [vi]
Bugs fixed:
641309 When live_hidden_previews is set, force placement for hidden windows
641310 MetaWindowActor: Add a 'positioned-changed' signal
641979 Visual glitch on workspace selector closing overview mode
641384 Make plugin loading failure fatal
642426 Don't pass handled key events to GTK+
2.91.6
======
* Add meta_screen_override_window_layout() to let a plugin set the workspace
layout [Owen]
* Add a 'size-changed' signal to MetaWindowActor [Florian]
* Add meta_window_actor_is_destroyed() [Adel]
* Fix problems with window tile previews when cancelling a move [Florian]
* Port theme elements that use GTK+ drawing to use GtkStyleContext instead
of the deprecated GtkStyle. [Florian]
* Fix compiler warnings that were causing compilation failures [Jasper, Owen]
* Misc bug fixes [Gabor, Jasper, Owen, Rui]
Contributors:
Adel Gadllah, Gabor Kelemen, Rui Matos, Florian Müllner, Jasper St. Pierre,
Owen Taylor
Translations:
Khaled Hosny [ar], Alexander Shopov [bg], Petr Kovar [cz], Fran Diéguez [gl],
Marios Zindilis [gr], Gabor Kelemen [hu], Kjartan Maraas [nb], A S Alam [pa],
Daniel Nylander [se], Chao-Hsiung Liao [zh_HK, zh_TW]
2.91.5
======
* Add a Above_Tab key symbol that can be used in key bindings to mean
the key above the Tab key. This is now the default binding for
cycle_group in both Mutter and Metacity. [Owen]
* Add new frame states for tiled-on-the-left and tiled-on-the-right [Florian]
* Add new background drawing functions that can be defined in a theme
for single buttons. [Florian]
* Draw the right button backgrounds for all custom button layouts [Florian]
* Remove vestigal --composite/--no-composite command line options [Nickolas]
* Fix building on GLES [Andreas]
* Code cleanups [Adel, Owen]
Contributors:
Adel Gadllah, Nickolas Lloyd, Andreas Mueller, Florian Müllner, Owen Taylor
Translations:
Mattias Põldaru, Ivar Smolin [et], Gheyret T. Kenji [ug]
Bugs fixed:
613124 Invalid visibility-related asserts in MutterWindow
626875 Fix handling of --composite and --no-composite command line options
629282 [PATCH] Fix errors building for gles-systems (clutter-eglx)
635569 Add an "Above_Tab" pseudo-keysym
635683 add specific button background for single button (per side) case
635686 button backgrounds broken with rtl locales
637330 [PATCH] theme: Add tiled_left/tiled_right frame states
2.91.4
======
* Update for GTK+ 3 changes [Benjamin, Colin, Emmanuele, Florian]
* Support maximizing a window by dragging to the top of the screen
in the same way you can tile by dragging to the edge of the screen.
[Ray, Florian]
* Misc bug fixes [Milan, Owen]
Contributors:
Emmanuele Bassi, Milan Bouchet-Valat, Florian Müllner, Benjamin Otte,
Ray Strode, Owen Taylor, Colin Walters
Translations:
Matej Urbančič [sl], Nguyễn Thái Ngọc Duy [vi]
Bugs fixed:
630548 gnome-shell could auto-maximize windows when dragged to top edge of screen
636083 workspace: Consider text direction when switching
636301 Port testgradient example to GTK3
636302 Replace some GDK X11 calls with future-proof ones
636491 valgrind: meta_window_shape_new (meta-window-shape.c:79)
637802 ui: Adapt to GDK API changes
2.91.3
======
* Better shadows: [Owen]
- Shadows can be different for different window types and focus states
- Shadows are larger by default, especially for the currently active
window
- Shadows for attached modal dialogs and menus are drawn not to
overlap the attachment point.
- Shadows follow the shape of shaped windows
* Optimization: [Owen]
- Avoid repainting in situations when windows are potentially restacked
but aren't actually restacked.
- Pay attention to partial stage repaints in obscured window calculations
- Better optimization of painting obscured shadows; turn off shadows
for maximized windows.
- Move background repainting into Mutter; doing it here rather than
in plugins allows not painting obscured parts of the background.
* A new frame type 'attached' is added for attached modal dialogs
and can be referenced in theme files with a theme version of 3.2.
* Fix updating key bindings when the keyboard layout changes
[Derek, Owen, Thomas]
* Bug fixes [Adel, Florian]
* Build fixes [Dan Williams, Diego, Javier, Owen]
Contributors:
Adel Gadllah, Javier Jardón, Florian Müllner, Derek Poon, Owen Taylor,
Thomas Thurman, Diego Escalante Urrelo, Dan Williams
Translations:
Khaled Hosny [ar], Jorge González [es], Fran Diéguez [gl],
Yaron Shahrabani [he], Kjartan Maraas [nb], Gheyret T. Kenji [ug]
Bugs fixed:
634779 MetaWindowGroup: further optimize paints by using current scissor
634833 Draw the root window background
592382 improve shadow effect
628199 Add antialising to arc and line drawing operations
633002 meta-actor-window: Use G_UNLIKELY for TFP check
634771 MetaStackTracker: Avoid queueing resync for obvious no-ops
635421 Fix crash in check_needs_shadow
635493 configure.in: it's git, not Subversion
635528 configure.ac: move call to AM_GNU_GLIB_GETTEXT above cflags modification
635575 meta-window-actor: remove unused meta_window_actor_get_shadow_bounds
636083 workspace: Consider text direction when switching
2.91.2
======
* Remove support for GTK+ 2 [Florian]
* Adapt to deprecation of size_request deprecation in GTK+ [Matthias]
* Include change from Metacity to fix confusion of mouse
tracking when double-clicking on title bar [Owen]
* Fix bug with the the window menu getting stuck when you alt-Tab [Owen]
Contributors:
Matthias Clasen, Florian Müllner, Owen Taylor
Translations:
Petr Kovar [cz]
Bugs fixed:
633133 Remove compatibility for GTK+-2.0
633352 prepare for the demise of size_request
633398 Fix check for events on UI widgets
633401 Fix warning from synthesized events with GdkDevice
2.91.1
======
* Default build is now GTK+ 3 build
* Mutter namespace prefix is removed, in favor of consistent
meta_ namespace prefixing [Owen]. Naming changes:
MutterWindow => MetaWindowActor
mutter_get_windows => meta_get_window_actors
mutter_plugin_get_windows => meta_plugin_get_window_actors
* Add missing values in MetaKeyBindingAction - this fixes a problem where
key binding lookup wasn't working properly for some key bindings. [Dan]
* Remove keysym parameter to meta_display_get_keybinding_action() - the
function expected the default keysym for the keycode to always be passed [Dan]
* Clean up installed header files - in particular, theme-parser.h is merged
into a new public-only theme.h and private internals are moved to
theme-private.h.
* Fix problems with antialiased rendering of themes [Brandon, Owen, Nickolas]
* Fix problem with parsing color constants in themes [Jon, Owen]
* Build fixes [Colin]
* Miscellaneous bug fixes [Giovanni, Rico]
Contributors:
Giovanni Campagna, Nickolas Lloyd, William Jon McCann, Owen Taylor,
Rico Tzschichholz, Colin Walters, Dan Winship, Brandon Wright
Translations:
Fran Diéguez [gl], Yinghua Wang [zh_CN]
Fixed bugs:
628401 tint and line draw ops rendering issues
628520 unfortunate namespacing
631487 Fix drawing of <arc> theme elements
632116 don't clobber gerrors
632149 Fill in missing MetaKeyBindingAction values
632155 meta_display_get_keybinding_action: remove keysym parameter
632474 Remove MetaRegion
632494 introspection: remove --allow-unprefixed
2.91.0
======
* Enable side-by-side tiling via a gesture of dragging to the left or right
edge of the screen. (enabled with an off-by-default GConf key) [Florian]
* Allow breaking out of maximization/tiling using a alt-middle-button window
resize [Owen, Florian]
* Add the ability to have modal dialogs attached to their parent window
(enabled with an off-by-default GConf key) [Maxim]
* Draw with Cairo rather than GDK [Florian, Benjamin]
* Add compatibility for changes in GTK+ 3
[Benjamin, Alban, Florian, Jasper, Matthias, Owen, Thierry]
- libmutter-private is now only installed for GTK+ 3 builds
- Theme parts of libmutter-private API are changed to take cairo_t
rather than GdkDrawable
* Update introspection build and annotations for new behavior of
g-ir-scanner [Colin]
* Fix bug that caused window menu options not to work [Owen]
* Fix misbehavior of Wine windows [Owen, Alban]
* Fix crashes from missing error traps [Adel]
* Build fixes [Colin, Florian, Owen, Rob, Tomas]
* Misc bug fixes [Adel, Jon, Owen, Nickolas, Tomas]
* Cleanups [Adel, Benjamin, Florian]
Contributors:
Alban Browaeys, Matthias Clasen, Maxim Ermilov, Tomas Frydrych, Adel Gadllah,
Nickolas Lloyd, William Jon McCann, Florian Muellner, Benjamin Otte,
Thierry Reding, Rob Staudinger, Jasper St. Pierre, Owen Taylor, Colin Walters
Translations:
Alexander Shopov [bg], Mario Blättermann [de], Ask H. Larsen [dk],
Michael Kotsarinis [el], Philip Withnall [en_UK], Jorge González [es],
Fran Diéguez [gl], Bruno Brouard, Claude Paroz [fr], Yaron Shahrabani [he],
Gabor Kelemen [hu], Luca Ferretti [it], Nils-Christoph Fiedler [nds],
Kjartan Maraas [nb], A S Alam [pa], Piotr Drąg [pl], Duarte Loreto [pt],
Antonio Fernandes C. Neto [pt_BR], Matej Urbančič [sl],
Miloš Popović [sr, sr@latin], Tirumurti Vasudevan [ta], Aron Xu [zh_CN],
Chao-Hsiung Liao [zh_HK, zh_TW]
Fixed Bugs:
597763 With >2 workspaces, Window menu "Move to Another Workspace" menu doesn't work
598603 displays window size when moving terminal window
606158 "Always on top" triggers Window manager warning:
Log level 8: meta_window_set_user_time: assertion `!window->override_redirect' failed
610575 make meta_screen_set_cursor public
613126 Do not cancel Alt+Tab grab due to Shift key events
623235 BadDamage error from XSubtractDamage
624757 Check for TFP usage after actually setting the pixmap
625712 [mutter-shaped-texture] Remove material_workaround
626583 Replace Gdk drawing API with cairo
627087 Mipmap emulation not working
627210 Crash with X error
628544 introspection: Build with --warn-fatal, drop fix-meta-rectangle.py hack
629127 build problem with recent gtk3
629232 Multiple syntax errors in file mutter-message.c when building Mutter for
GNOME Shell dependencies
629350 [mutter-shaped-texture] Use a base material for all instances
629931 Allow breaking out from maximization/tiling during a mouse resize
630195 Use GDK error trapping straight-up
630203 Prepare mutter code for GTK3 rendering-cleanup
630671 prepare mutter for the demise of GtkObject
630843 gtk_window_set_visual was replaced by gtk_widget_set_visua
631147 Adapt to GTK API changes
631175 Mutter error compiling Gnome Shell
2.31.5
======
* Support building with GTK+ 3.0 [Florian]
* Remove deprecated usages for compatibility with GTK+ 3.0
[Claudio, Florian, Nickolas]
* Export a boxed type for MetaRectangle [Owen]
* Allow disabling -Werror with --enable-compile-warnings=yes [Nickolas]
* Build fixes [Andreas, Florian, Owen]
Contributors:
Nickolas Lloyd, Andreas Mueller, Florian Müllner, Claudio Saavedra,
Owen Taylor
Translations:
Petr Kovar [cz], Jorge González [es], Fran Diéguez [gl],
Yaron Shahrabani [he], Matej Urbančič [sl]
Fixed Bugs:
587991 - Remove deprecated GTK+ symbols
616275 - -Werror should not be enabled by default (or should be possible to disable)
622303 - Allow building with Gtk+-3.0
622800 - Make mutter more gtk+ 3.0 friendly
623335 - Make MetaRectangle a boxed type
623639 - Work around g-ir-scanner problem with Gdk.Rectangle
624166 - src/core/util.c: Fix warning in case WITH_VERBOSE_MODE is not set
2.31.4
======
* Clean up MutterPlugin effect interface [Maxim]
* Track damage as the bounding box, a significant optimizations
for rapidly drawing clients [Robert]
* Add meta_window_is_remote() [Colin]
* Add meta_add_debug_topic() for turning on logging of
specific topics [Colin]
* Fix bug with window unmaximization [Owen]
Contributors:
Robert Bragg, Maxim Ermilov, Owen Taylor, Colin Walters
Translations:
Yaron Shahrabani (he), Fran Diéguez (gl), Kjartan Maraas (nb), A S Alam (pa)
Fixed Bugs:
611838 - expose sub-stage redraws by streaming raw updates to ClutterX11TexturePixmap
620585 - Add meta_window_is_remote
620860 - function meta_display_open
621082 - MutterPluginManager should call plugin->switch_workspace,
when screen doesn't have any window. Or function should be renamed.
621413 - Maximize/Unmaximize not behaving properly for some non-gnome based programs
2.31.2
======
* Theme enhancements [Owen]
- Add a flexible version mechanism for themes -
metacity-theme-3.xml is now supported, and can include
version="> 3.2" type attributes on the root element or
any subelement.
- Add frame_x_center/frame_y_center variables
- Allow a theme to turn on title ellipsization
* Performance enhancements:
- Stream raw damage updates to ClutterX11TexturePixmap
to enable partial stage updates when windos change [Robert]
- Don't trap XErrors in meta_compositor_process_event [Adel]
* Add meta_prefs_override_preference_location(); this allows
a plugin like GNOME Shell to redirect preferences to a
plugin-specific location. [Owen]
* Support a _MUTTER_HINTS window property; this is a string
property holding key-value pairs with plugin-specific
interpretation [Tomas]
* Build with GSEAL_ENABLE [Florian, Javier]
* Add meta_display_get_leader_window() [Tomas]
* Add meta_display_sort_windows_by_stacking [Colin]
* Export
meta_display_get_last_user_time()
meta_display_xserver_time_is_before()
meta_window_foreach_ancestor(),
meta_window_foreach_transient()
meta_window_lower()
meta_window_raise()
meta_window_set_demands_attention()
meta_window_unset_demands_attention() [Colin]
* Bug fixes [Dan, Edward, Owen, Tomas]
* Build fixes [Owen, Dominique, Vincent]
Contributors:
Robert Bragg, Adel Gadllah, Tomas Frydrych, Javier Jardón,
Dominique Leuenberger, Florian Müllner, Edward Sheldrake,
Owen Taylor, Vincent Untz, Colin Walters, Dan Winship
Translations:
Xandru Armesto Fernandez (ast), Khaled Hosny (ar), Petr Kovar (cz),
Mario Blättermann, (de), Jorge González (es),
Inaki Larranaga Murgoitio [eu), Claude Paroz (fr), Luca Ferretti (it),
Gintautas Miliauskas (lt), Pavol Šimo (sk), Matej Urbančič (sl)
Fixed Bugs:
591842 - ellipsize titles when oversize
592503 - Add a flexible version mechanism
595496 - Use accessor functions instead direct access (use GSEAL GnomeGoal)
596659 - Fix handling of grabbed key events
613123 - Framework for plugin-specific per-window hint
613125 - Add meta_display_get_leader_window()
613127 - Keep num_workspaces key in sync with the actual workspace number
613136 - remove over-restrictive assert from meta_prefs_get_workspace_name()
613398 - Don't trap XErrors in meta_compositor_process_event
615586 - Allow redirecting preferences to a different GConf key
615672 - cant' compile mutter error: dereferencing pointer p does break
strict-aliasing rules
616050 - alt-tab infrastructure patches
616274 - mutter from git fails with gcc 4.5 (on new warning)
616546 - On dual screen maximized windows dragged to the second screen no
longer update their contents
618138 - Work around COGL bug causing flash for new windows
618613 - Fix crash with --sync option
2.29.1
======
* Support and require Clutter 1.2 (Owen)
* Add meta_display_get_keybinding_action() (Colin, Dan)
* Add meta_window_get_wm_class_instance() (Tomas)
* Remove workaround for bug fixed in intel driver Q2/2009 release (Robert)
* Build fixes (Owen, Brian, Nguyễn Thái Ngọc Duy)
Contributors:
Robert Bragg, Brian Cameron, Tomas Frydrych, Nguyễn Thái Ngọc Duy,
Owen Taylor, Colin Walters, Dan Winship
Translations:
Alexander Shopov (bg), Mario Blättermann (de), Bruno Brouard (fr),
Nils-Christoph Fiedler (nds), Piotr Drąg (pl), Aron Xu (zh_CN)
Fixed Bugs:
610862 Support and require Clutter 1.1
612506 mutter 2.29.0 fails to compile on Solaris
613100 [MetaDisplay] Expose meta_display_get_keybinding_action
613121 Remove workaround for multitexturing with old intel drivers
613128 [MetaWindow] Accessor for the instance part of WM_CLASS property
613278 meta_display_get_keybinding_action: strip out uninteresting modifiers
2.29.0
======
* Improve appearance of scaled down windows using mipmap emulation (Owen)
* Added signals: MetaDisplay::window-created, MetaDisplay::window-marked-urgent,
MetaDisplay::window-demands-attention, MetaWindow::unmanaged (Colin, Tomas)
* Added properties: MetaWindow:demands-attention, MetaWindow:urgent,
MetaWindow:maximized-horizontally, MetaWindow:maximized-vertically (Florian, Tomas)
* Fix nasty crash when workspace "struts" changed during a window move (Jon, Owen)
* Bug fixes (Dan, Maxim, Neil, Owen, Tomas)
* Build fixes (Colin, Emmanuele, Nickolas, Owen, Richard)
* Merge Metacity changes since 2.26. Includes themable sound support
via libcanberra (Owen)
Contributors
Emmanuele Bassi, Maxim Ermilov, Tomas Frydrych, Richard Hughes, Nickolas Lloyd,
Florian Müllner, Jon Nettleton, Neil Roberts, Owen Taylor, Colin Walters,
Dan Winship
Additional Metacity contributors:
Thomas Hindoe Paaboel Andersen, Peter Bloomfield, Matthias Clasen,
Matt Kraai, Claude Paroz, Lennart Poettering, Ray Strode, Thomas Thurman,
Vincent Untz, Tomislav Vujec, Tomeu Vizoso, Travis Watkins, 'alexisdm59'
Translations:
Khaled Hosny (ar), Petr Kovar (cz), Kjartan Maraas (nb), Djavan Fagundes (pt_BR),
Nils-Christoph Fiedler (nds), Matej Urbančič (sl), Vincent Untz
Fixed Bugs:
588065 Adds demands-attention signal to the window class
591913 Fails to skip current window on alt+tab when another window is asking for attention
592567 Dereferencing NULL in mutter_window_get_workspace()
597052 Add signal to MetaDisplay so we know when a window has demanded-attention
598289 Add "window-created" signal to MetaDisplay, "unmanaged" signal for MetaWindow
598473 "XXX specified twice for this theme" messages not in sync with metacity.
598600 "Visual Bell" option in Metacity causes Mutter to crash
600068 notifications for window urgency hint
601228 rdesktop does not get keypress signals
602349 [PATCH] trivial - fix compilation warning in mutter
602740 Remove XOR gc only used in removed reduced-resources mode
602870 Fix compilation with older libGL
604200 Compile issue: Use of deprecated clutter functions
606388 mutter fails to build when using ld with --no-add-needed
607125 Fails to build with latest introspection data
607398 Do not use CGL_* symbols
607746 reduce gconf roundtrips at startup
608800 alt-dragging gimp windows crashes gnome-shell
609350 Mutter does not support the COGL_DEBUG environment variable
609546 meta_workspace_set_builtin_struts(): optimize out non-changes
609585 Merge libcanberra usage from Metacity
609657 Use cogl multitexture API when drawing MutterShapedTexture
609665 Bug fixes from Fedora RPM
609710 screencast recording broke
610391 Fix crash on startup with list bindings
2.28.0
======
* New exported API:
meta_window_get_stable_sequence() [Colin]
meta_window_get_transient_for_as_xid() [Tomas]
MutterScreen::workareas-changed signal [Tomas]
* Fix a problem where changes processed from a Clutter event
callback wouldn't get handled before the screen was next
repainted, causing flashing [Owen]
* Remove MetaAltTabHandler as no longer needed [Dan]
* Bug fixes [Colin, Owen]
Contributors:
Tomas Frydrych, Owen Taylor, Colin Walters, Dan Winship
Translations:
Christian Kirbach (de), Claude Paroz (fr)
2.27.5
======
* Fix bug in GConf schemas where the overview activation key was specified as
'<Super_L>' not 'Super_L'.
Contributors:
Colin Walters
Translation:
Denis Arnaud (br)
2.27.4
======
* Big code cleanup: when talking about multiple monitors, call them
"monitors", not "xineramas". [Dan]
* Accessors added or made public:
meta_screen_get_n_monitors(), meta_screen_get_monitor_geometry()
meta_window_get_user_time() and MetaWindow:user-time property.
[Colin, Dan]
* Set _GNOME_WM_KEYBINDINGS=Metacity,Mutter on the _NET_SUPPORTING_WM_CHECK
window so that gnome-keybinding-properties can figure out to show the
Metacity keybindings when Mutter is running. [Owen]
* Bug and build fixes [Colin, Owen]
Contributors:
Owen Taylor, Colin Walters, Dan Winship
Translation:
Jorge González (es), Inaki Larranaga Murgoitio (eu), Gabor Kelemen (hu)
Bugs fixed:
592393 - Clicking on a minimized window in the overview doesn't focus the window
593399 - Add meta_display_get_grab_op()
593404 - Make MUTTER_DEBUG_XINERAMA override active Xinerama
593407 - Add 'skip-taskbar' accessor to MetaWindow.
593686 - Add meta_screen_get_monitors()
594067 - Export a _GNOME_WM_KEYBINDINGS property
2.27.3
======
* Key handling improvements:
- enforce that every key is handled no more than once.
- mutter_plugin_begin_modal() and mutter_plugin_begin_modal() allow
putting a plugin into a "modal" state where it has exclusive access
to key and pointer events.
- Add "tab_popup_select", "tab_pop_cancel" pseudo-keypress-handlers
that plugins can use to get notification when Alt-Tab ends
[Owen]
* Accessors added or made public:
meta_window_is_override_redirect(), meta_window_is_mapped(),
meta_display_xwindow_is_a_no_focus_window(),
meta_display_get_grab_op(), meta_window_is_skip_taskbar(),
meta_window_is_modal(), all of errors.h
[Colin, Owen, Michael, Steve, Tomas]
* Fix for various GTK+ deprecations [Javier]
* Bug fixes [Colin, Frédéric, Owen, Thomas, Tomas, Volker]
Contributors:
Javier Jardón, Steve Frécinaux, Tomas Frydrych, Michael Meeks,
Frédéric Péters, Volker Sobek, Owen Taylor, Thomas Thurman,
Colin Walters
Translation:
Fran Dieguez (gl), Gabor Kelemen (hu), Daniel Nylander (se)
Bugs fixed:
589457 - Fix up window property notification for "title"
590911 - Do not run plugin effects on WM startup
590978 - API to query whether window is in modal state
591367 - Be silent by default
591566 - install errors.h header ...
591788 - Add meta_window_is_override_redirect
591836 - mutter mishandles opacity
591913 - Fails to skip current window on alt+tab when another window is asking for attention
592393 - Clicking on a minimized window in the overview doesn't focus the window
592699 - Remove deprecated Encoding key from desktop files
592742 - Avoid accessing freed memory when being replaced
593399 - Add meta_display_get_grab_op()
593404 - Make MUTTER_DEBUG_XINERAMA override active Xinerama
593407 - Add 'skip-taskbar' accessor to MetaWindow.
----------------------------- Older Metacity News -----------------------------
2.26.0
======

View File

@@ -1,8 +1,8 @@
AC_PREREQ(2.50)
m4_define([mutter_major_version], [2])
m4_define([mutter_minor_version], [91])
m4_define([mutter_micro_version], [92])
m4_define([mutter_major_version], [3])
m4_define([mutter_minor_version], [1])
m4_define([mutter_micro_version], [3.1])
m4_define([mutter_version],
[mutter_major_version.mutter_minor_version.mutter_micro_version])
@@ -215,7 +215,12 @@ GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
if test x$found_introspection != xno; then
AC_DEFINE(HAVE_INTROSPECTION, 1, [Define if GObject introspection is available])
MUTTER_PC_MODULES="$MUTTER_PC_MODULES gobject-introspection-1.0"
META_GIR=[Meta_]mutter_major_version[_]mutter_minor_version[_gir]
# Since we don't make any guarantees about stability and we don't support
# parallel install, there's no real reason to change directories, filenames,
# etc. as we change the Mutter tarball version. Note that this must match
# api_version in src/Makefile.am
META_GIR=Meta_3_0_gir
# META_GIR=[Meta_]mutter_major_version[_]mutter_minor_version[_gir]
AC_SUBST(META_GIR)
fi
@@ -233,6 +238,33 @@ if test x$have_xcursor = xyes; then
AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support])
fi
XINPUT2_VERSION=1.4.0
AC_ARG_ENABLE(xinput2,
AC_HELP_STRING([--disable-xinput2],
[disable XInput2 usage]),,
enable_xinput2=yes)
if test x$enable_xinput2 = xyes; then
AC_MSG_CHECKING([XInput2])
if $PKG_CONFIG --atleast-version $XINPUT2_VERSION xi; then
have_xinput2=yes
else
have_xinput2=no
fi
AC_MSG_RESULT($have_xinput2)
else
have_xinput2=no
fi
if test x$have_xinput2 = xyes; then
echo "Building with XInput2"
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xi"
AC_DEFINE(HAVE_XINPUT2, , [Building with XInput2 support])
fi
AM_CONDITIONAL(HAVE_XINPUT2, test "$have_xinput2" = "yes")
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
AC_PATH_XTRA
@@ -552,6 +584,7 @@ mutter-$VERSION
Shape extension: ${found_shape}
Xsync: ${found_xsync}
Xcursor: ${have_xcursor}
XInput2: ${have_xinput2}
"

View File

@@ -22,6 +22,18 @@ This document has separate sections for each format version. You may
want to read the document in reverse order, since the base features
are discussed under version 1.
New Features in Theme Format Version 3.4
========================================
An additional color type is added to pick up custom colors defined
in the GTK+ theme's CSS:
gtk:custom(name,fallback)
where <name> refers to a custom color defined with @define-color in
the GTK+ theme, and <fallback> provides an alternative color definition
in case the color referenced by <name> is not found.
New Features in Theme Format Version 3.3
========================================

View File

@@ -6,6 +6,16 @@
<name xml:lang="en">mutter</name>
<shortdesc xml:lang="en">Window and compositing manager based on Clutter</shortdesc>
<description>Mutter is a window and compositing manager that displays and
manages your desktop via OpenGL. Mutter combines a sophisticated display engine
using the Clutter toolkit with solid window-management logic inherited from the
Metacity window manager.
While Mutter can be used stand-alone, it is primarily intended to be used as
the display core of a larger system such as GNOME Shell. For this reason,
Mutter is very extensible via plugins, which are used both to add fancy visual
effects and to rework the window management behaviors to meet the needs of the
environment.</description>
<!--
<homepage rdf:resource="http://www.gnome.org/" />
-->

View File

@@ -22,6 +22,7 @@ dz
el
en_CA
en_GB
eo
es
et
eu

View File

@@ -1,5 +1,6 @@
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
src/compositor/compositor.c
src/core/all-keybindings.h
src/core/bell.c
src/core/core.c

2175
po/as.po

File diff suppressed because it is too large Load Diff

3959
po/be.po

File diff suppressed because it is too large Load Diff

1005
po/bg.po

File diff suppressed because it is too large Load Diff

219
po/ca.po
View File

@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: metacity 2.24\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-08 20:41+0100\n"
"PO-Revision-Date: 2011-03-08 20:41+0100\n"
"POT-Creation-Date: 2011-03-30 21:19+0200\n"
"PO-Revision-Date: 2011-04-03 23:45+0200\n"
"Last-Translator: David Planella <david.planella@gmail.com>\n"
"Language-Team: Softcatalà <tradgnome@softcatala.org>\n"
"Language: \n"
@@ -332,7 +332,7 @@ msgstr "Mou la finestra a la part oest (esquerra) de la pantalla"
msgid "Move window to center of screen"
msgstr "Mou la finestra al centre de la pantalla"
#: ../src/core/bell.c:302
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr "Esdeveniment de campana"
@@ -421,7 +421,7 @@ msgstr "Especifica l'ID de gestió de sessió"
#: ../src/core/main.c:223
msgid "X Display to use"
msgstr "Visualització X per a usar"
msgstr "Visualització X per usar"
#: ../src/core/main.c:229
msgid "Initialize session from savefile"
@@ -431,12 +431,12 @@ msgstr "Inicialitza la sessió des del fitxer desat"
msgid "Make X calls synchronous"
msgstr "Fes que les crides a l'X siguin síncrones"
#: ../src/core/main.c:508
#: ../src/core/main.c:506
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "No s'ha pogut analitzar el directori de temes: %s\n"
#: ../src/core/main.c:524
#: ../src/core/main.c:522
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -455,7 +455,7 @@ msgid ""
msgstr ""
"Mutter %s\n"
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., i d'altres\n"
"Això és programari lliure; vegeu els fitxers de codi font per a conèixer-ne\n"
"Això és programari lliure; vegeu els fitxers de codi font per conèixer-ne\n"
"les condicions de còpia.\n"
"No hi ha CAP garantia; ni tan sols la garantia implícita de COMERCIABILITAT\n"
"o ADEQUACIÓ A PER UN PROPÒSIT PARTICULAR.\n"
@@ -479,37 +479,37 @@ msgstr "Llista separada per comes de connectors de composició"
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:536 ../src/core/prefs.c:697
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "La clau «%s» del GConf està establerta a un valor no vàlid\n"
#: ../src/core/prefs.c:623 ../src/core/prefs.c:866
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr ""
"%d, emmagatzemat a la clau %s del GConf, està fora de l'interval de %d a %d\n"
#: ../src/core/prefs.c:667 ../src/core/prefs.c:744 ../src/core/prefs.c:792
#: ../src/core/prefs.c:856 ../src/core/prefs.c:1317 ../src/core/prefs.c:1333
#: ../src/core/prefs.c:1350 ../src/core/prefs.c:1366
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "La clau «%s» del GConf està establerta a un tipus no vàlid\n"
#: ../src/core/prefs.c:1196
#: ../src/core/prefs.c:1203
#, c-format
msgid "GConf key %s is already in use and can't be used to override %s\n"
msgstr ""
"La clau %s del GConf ja s'està utilitzant i no es pot fer servir per "
"sobreescriure %s\n"
#: ../src/core/prefs.c:1255
#: ../src/core/prefs.c:1262
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "No es pot sobreescriure la clau del GConf; no s'ha trobat %s\n"
#: ../src/core/prefs.c:1440
#: ../src/core/prefs.c:1447
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@@ -517,14 +517,14 @@ msgstr ""
"Les solucions temporals per a aplicacions amb errors estan inhabilitades. "
"Pot ser que certes aplicacions no funcionin correctament.\n"
#: ../src/core/prefs.c:1517
#: ../src/core/prefs.c:1524
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr ""
"No s'ha pogut analitzar la descripció de tipus de lletra «%s» de la clau %s "
"del GConf\n"
#: ../src/core/prefs.c:1579
#: ../src/core/prefs.c:1586
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@@ -533,18 +533,18 @@ msgstr ""
"«%s», trobat a la base de dades de la configuració, no és un valor vàlid per "
"al modificador del botó del ratolí\n"
#: ../src/core/prefs.c:2006
#: ../src/core/prefs.c:2016
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr ""
"S'ha produït un error en establir el nombre d'espais de treball a %d: %s\n"
#: ../src/core/prefs.c:2190 ../src/core/prefs.c:2692
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
#, c-format
msgid "Workspace %d"
msgstr "Espai de treball %d"
#: ../src/core/prefs.c:2222 ../src/core/prefs.c:2400
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@@ -553,42 +553,42 @@ msgstr ""
"«%s» trobat a la base de dades de la configuració no és un valor vàlid per a "
"la vinculació de tecla «%s»\n"
#: ../src/core/prefs.c:2773
#: ../src/core/prefs.c:2783
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr ""
"S'ha produït un error en establir el nom de l'espai de treball %d a «%s»: "
"%s\n"
#: ../src/core/prefs.c:2987
#: ../src/core/prefs.c:2997
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr ""
"S'ha produït un error en establir l'estat de les finestres ocultes en viu: "
"%s\n"
#: ../src/core/prefs.c:3015
#: ../src/core/prefs.c:3032
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr ""
"S'ha produït un error en establir l'estat de les pestanyes sense finestra "
"emergent: %s\n"
#: ../src/core/screen.c:577
#: ../src/core/screen.c:624
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "La pantalla %d en la visualització '%s' no és vàlida\n"
#: ../src/core/screen.c:593
#: ../src/core/screen.c:640
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
"replace option to replace the current window manager.\n"
msgstr ""
"La pantalla %d en la visualització «%s» ja té un gestor de finestres; proveu "
"l'opció --replace per a reemplaçar el gestor de finestres actual.\n"
"l'opció --replace per reemplaçar el gestor de finestres actual.\n"
#: ../src/core/screen.c:620
#: ../src/core/screen.c:667
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
@@ -596,66 +596,66 @@ msgstr ""
"No s'ha pogut adquirir la selecció del gestor de finestres en la pantalla %d "
"visualització «%s»\n"
#: ../src/core/screen.c:675
#: ../src/core/screen.c:722
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "La pantalla %d en la visualització «%s» ja té un gestor de finestres\n"
#: ../src/core/screen.c:860
#: ../src/core/screen.c:907
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "No s'ha pogut alliberar la pantalla %d en la visualització «%s»\n"
#: ../src/core/session.c:863 ../src/core/session.c:870
#: ../src/core/session.c:837 ../src/core/session.c:844
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "No s'ha pogut crear el directori «%s»: %s\n"
#: ../src/core/session.c:880
#: ../src/core/session.c:854
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "No s'ha pogut obrir el fitxer de sessió «%s» per a l'escriptura: %s\n"
#: ../src/core/session.c:1021
#: ../src/core/session.c:995
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "S'ha produït un error en escriure el fitxer de sessió «%s»: %s\n"
#: ../src/core/session.c:1026
#: ../src/core/session.c:1000
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "S'ha produït un error en tancar el fitxer de sessió «%s»: %s\n"
#: ../src/core/session.c:1156
#: ../src/core/session.c:1130
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "No s'ha pogut analitzar el fitxer de sessió desat: %s\n"
#: ../src/core/session.c:1205
#: ../src/core/session.c:1179
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr ""
"S'ha vist l'atribut <mutter_session> però encara hi ha l'identificador de "
"sessió"
#: ../src/core/session.c:1218 ../src/core/session.c:1293
#: ../src/core/session.c:1325 ../src/core/session.c:1397
#: ../src/core/session.c:1457
#: ../src/core/session.c:1192 ../src/core/session.c:1267
#: ../src/core/session.c:1299 ../src/core/session.c:1371
#: ../src/core/session.c:1431
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Atribut %s desconegut a l'element <%s>"
#: ../src/core/session.c:1235
#: ../src/core/session.c:1209
#, c-format
msgid "nested <window> tag"
msgstr "etiqueta <window> imbricada"
#: ../src/core/session.c:1477
#: ../src/core/session.c:1451
#, c-format
msgid "Unknown element %s"
msgstr "Element %s desconegut"
#: ../src/core/session.c:1829
#: ../src/core/session.c:1803
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -700,20 +700,20 @@ msgid "Window manager error: "
msgstr "Error del gestor de finestres: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:616 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6492
#: ../src/core/window.c:6847
#, 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 ""
"La finestra %s estableix SM_CLIENT_ID en ella mateixa, en comptes del "
"WM_CLIENT_LEADER, tal i com s'especifica a ICCCM.\n"
"WM_CLIENT_LEADER, tal com s'especifica a ICCCM.\n"
#. We ignore mwm_has_resize_func because WM_NORMAL_HINTS is the
#. * authoritative source for that info. Some apps such as mplayer or
@@ -722,7 +722,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7155
#: ../src/core/window.c:7510
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
@@ -742,7 +742,7 @@ msgstr "L'aplicació ha definit un _NET_WM_PID %lu fals\n"
msgid "%s (on %s)"
msgstr "%s (a %s)"
#: ../src/core/window-props.c:1478
#: ../src/core/window-props.c:1482
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr ""
@@ -768,7 +768,7 @@ msgstr ""
#: ../src/core/xprops.c:411
#, c-format
msgid "Property %s on window 0x%lx contained invalid UTF-8\n"
msgstr "La propietat %s en la finestra 0x%lx contenia un UTF-8 invàlid\n"
msgstr "La propietat %s en la finestra 0x%lx contenia un UTF-8 no vàlid\n"
#: ../src/core/xprops.c:494
#, c-format
@@ -791,16 +791,24 @@ msgstr ""
"les finestres en altres espais de treball) s'han de mantenir en viu."
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
msgstr ""
"Determina si el canvi d'espai de treball hauria de ser per les finestres en "
"tots els monitors o només en les finestres del monitor primari."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"
msgstr "Finestres ocultes en viu"
#: ../src/mutter.schemas.in.h:4
#: ../src/mutter.schemas.in.h:5
msgid "Modifier to use for extended window management operations"
msgstr ""
"Modificador que s'utilitzarà per les operacions ampliades de gestió de "
"finestres"
#: ../src/mutter.schemas.in.h:5
#: ../src/mutter.schemas.in.h:6
msgid ""
"This key will initiate the \"overlay\", which is a combination window "
"overview and application launching system. The default is intended to be the "
@@ -813,7 +821,7 @@ msgstr ""
"PC. El valor d'aquesta vinculació s'espera que sigui el predeterminat o text "
"en blanc."
#: ../src/mutter.schemas.in.h:6
#: ../src/mutter.schemas.in.h:7
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
@@ -823,6 +831,10 @@ msgstr ""
"diàlegs modals apareixeran adjuntats a la barra de títol de la finestra mare "
"i es mouran juntament amb aquesta."
#: ../src/mutter.schemas.in.h:8
msgid "Workspaces only on primary"
msgstr "Espais de treball només en el primari"
#: ../src/tools/mutter-message.c:123
#, c-format
msgid "Usage: %s\n"
@@ -1623,7 +1635,7 @@ 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 ""
"No es pot tenir dos draw_ops per a un element <piece> (el tema ha "
"No es poden tenir dos draw_ops per a un element <piece> (el tema ha "
"especificat un atribut draw_ops i també un element <draw_ops>, o ha "
"especificat ambdós elements) "
@@ -1632,7 +1644,7 @@ 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 ""
"No es pot tenir dos draw_ops per a un element <button> (el tema ha "
"No es poden tenir dos draw_ops per a un element <button> (el tema ha "
"especificat un atribut draw_ops i també un element <draw_ops>, o ha "
"especificat ambdós elements)"
@@ -1641,7 +1653,7 @@ 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 ""
"No es pot tenir dos draw_ops per a un element <menu_icon> (el tema ha "
"No es poden tenir dos draw_ops per a un element <menu_icon> (el tema ha "
"especificat un atribut draw_ops i també un element <draw_ops>, o ha "
"especificat ambdós elements)"
@@ -1834,7 +1846,7 @@ msgstr "Prova de disposició de botons %d"
#: ../src/ui/theme-viewer.c:773
#, c-format
msgid "%g milliseconds to draw one window frame"
msgstr "%g mil·lisegons per a dibuixar un marc de finestra"
msgstr "%g mil·lisegons per dibuixar un marc de finestra"
#: ../src/ui/theme-viewer.c:818
#, c-format
@@ -2194,7 +2206,7 @@ msgstr ""
#~ "encara no està massa implementat."
#~ msgid "If true, trade off usability for less resource usage"
#~ msgstr "Si és vertader, sacrifica usabilitat per a usar menys recursos"
#~ msgstr "Si és vertader, sacrifica usabilitat per usar menys recursos"
#~ msgid "Name of workspace"
#~ msgstr "Nom de l'espai de treball"
@@ -2543,93 +2555,12 @@ msgstr ""
#~ msgid "Unknown attribute %s on <geometry> element"
#~ msgstr "Atribut %s desconegut a l'element <geometry>"
#, fuzzy
#~ msgid "The keybinding used to toggle fullscreen mode."
#~ msgstr "Si s'utilitza el mode a pantalla completa"
#~ msgid "Toggle always on top state"
#~ msgstr "Canvia l'estat sempre per damunt"
#~ msgid "Unmaximize window"
#~ msgstr "Desmaximitza la finestra"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 1."
#~ msgstr "Mou la finestra a l'espai de treball 1"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 2."
#~ msgstr "Mou la finestra a l'espai de treball 2"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 3."
#~ msgstr "Mou la finestra a l'espai de treball 3"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 4."
#~ msgstr "Mou la finestra a l'espai de treball 4"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 5."
#~ msgstr "Mou la finestra a l'espai de treball 5"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 6."
#~ msgstr "Mou la finestra a l'espai de treball 6"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 7."
#~ msgstr "Mou la finestra a l'espai de treball 7"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 8."
#~ msgstr "Mou la finestra a l'espai de treball 8"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 9."
#~ msgstr "Mou la finestra a l'espai de treball 9"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 10."
#~ msgstr "Mou la finestra a l'espai de treball 10"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 11."
#~ msgstr "Mou la finestra a l'espai de treball 11"
#, fuzzy
#~ msgid "The keybinding used to move a window to workspace 12."
#~ msgstr "Mou la finestra a l'espai de treball 12"
#, fuzzy
#~ msgid "The keybinding used to move a window one workspace to the left."
#~ msgstr "Mou la finestra un espai de treball a l'esquerra"
#, fuzzy
#~ msgid "The keybinding used to move a window one workspace to the right."
#~ msgstr "Mou la finestra un espai de treball a la dreta"
#, fuzzy
#~ msgid "The keybinding used to move a window one workspace up."
#~ msgstr "Mou la finestra un espai de treball amunt"
#, fuzzy
#~ msgid "The keybinding used to move a window one workspace down."
#~ msgstr "Mou la finestra un espai de treball avall"
#, fuzzy
#~ msgid "This keybinding raises the window above other windows."
#~ msgstr "Alça una finestra per damunt de les altres"
#, fuzzy
#~ msgid "This keybinding lowers a window below other windows."
#~ msgstr "Baixa la finestra sota les altres"
#, fuzzy
#~ msgid ""
#~ "This keybinding moves a window against the north (top) side of the screen."
#~ msgstr "Mou la finestra a la part nord de la pantalla"
#~ msgid ""
#~ "Many actions (e.g. clicking in the client area, moving or resizing the "
#~ "window) normally raise the window as a side-effect. Setting this option "
@@ -3635,22 +3566,6 @@ msgstr ""
#~ "Ctrl&gt;». Si establiu l'opció a la cadena especial «disabled», no hi "
#~ "haurà cap vinculació per a aquesta acció."
#, fuzzy
#~ msgid ""
#~ "This keybinding moves a window into the center of the screen. The format "
#~ "looks like \"&lt;Control&gt;a\" or \"&lt;Shift&gt;&lt;Alt&gt;F1\". The "
#~ "parser is fairly liberal and allows lower or upper case, and also "
#~ "abbreviations such as \"&lt;Ctl&gt;\" and \"&lt;Ctrl&gt;\". If you set "
#~ "the option to the special string \"disabled\", then there will be no "
#~ "keybinding for this action."
#~ msgstr ""
#~ "Aquesta vinculació de tecles mou una finestra cap a la part l'oest "
#~ "(esquerra) de la pantalla. El format és semblant a «&lt;Control&gt;a» o "
#~ "«&lt;Shift&gt;&lt;Alt&gt;F1». L'analitzador és prou flexible i permet "
#~ "minúscules i majúscules, i també abreviacions com «&lt;Ctl&gt;» i «&lt;"
#~ "Ctrl&gt;». Si establiu l'opció a la cadena especial «disabled», no hi "
#~ "haurà cap vinculació per a aquesta acció."
#~ msgid ""
#~ "This keybinding moves a window into the east (right) side of the screen. "
#~ "The format looks like \"&lt;Control&gt;a\" or \"&lt;Shift&gt;&lt;Alt&gt;"

File diff suppressed because it is too large Load Diff

951
po/cs.po

File diff suppressed because it is too large Load Diff

1314
po/da.po

File diff suppressed because it is too large Load Diff

143
po/de.po
View File

@@ -3,21 +3,22 @@
# Matthias Warkus <mawarkus@gnome.org>, 2002.
# Christian Neumair <chris@gnome-de.org>, 2002-2004.
# Hendrik Richter <hendrikr@gnome.org>, 2005, 2006, 2007, 2008.
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009.
# Mario Blättermann <mariobl@gnome.org>, 2010, 2011.
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-17 13:27+0000\n"
"PO-Revision-Date: 2011-03-17 15:09+0100\n"
"Last-Translator: Mario Blättermann <mariobl@gnome.org>\n"
"Language-Team: German <gnome-de@gnome.org>\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-29 00:36+0200\n"
"PO-Revision-Date: 2011-03-29 00:38+0200\n"
"Last-Translator: Christian Kirbach <Christian.Kirbach@googlemail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../src/core/all-keybindings.h:88
msgid "Switch to workspace 1"
@@ -339,7 +340,7 @@ msgstr "Fenster zur linken Seite des Bildschirms verschieben"
msgid "Move window to center of screen"
msgstr "Fenster in die Mitte des Bildschirms verschieben"
#: ../src/core/bell.c:302
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr "Klangereignis"
@@ -437,12 +438,12 @@ msgstr "Sitzung anhand gespeicherter Datei starten"
msgid "Make X calls synchronous"
msgstr "X-Aufrufe abgleichen"
#: ../src/core/main.c:508
#: ../src/core/main.c:506
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Der Themenordner konnte nicht eingelesen werden: %s\n"
#: ../src/core/main.c:524
#: ../src/core/main.c:522
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -576,88 +577,89 @@ msgstr "Fehler beim Festlegen des Status des verborgenen Fensters: %s\n"
msgid "Error setting no tab popup status: %s\n"
msgstr "Fehler beim Festlegen des Status des Einblendfensters: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:624
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Bildschirm %d auf Anzeige »%s« ist ungültig\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:640
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
"replace option to replace the current window manager.\n"
msgstr ""
"Bildschirm %d auf Anzeige »%s« hat bereits einen Fensterverwalter; Geben Sie "
"die Option »--replace« an, um zu versuchen, den aktuellen Fensterverwalter zu "
"ersetzen.\n"
"Bildschirm %d auf Anzeige »%s« hat bereits einen Fensterverwalter; Geben "
"Sie die Option »--replace« an, um zu versuchen, den aktuellen "
"Fensterverwalter zu ersetzen.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:667
#, c-format
msgid "Could not acquire window manager selection on screen %d display \"%s\"\n"
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr ""
"Markierung des Fensterverwalters auf Bildschirm %d auf Anzeige »%s« konnte "
"nicht empfangen werden\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:722
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Bildschirm %d auf Anzeige »%s« hat bereits einen Fensterverwalter\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:907
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Bildschirm %d auf Anzeige »%s« konnte nicht freigegeben werden\n"
#: ../src/core/session.c:863 ../src/core/session.c:870
#: ../src/core/session.c:837 ../src/core/session.c:844
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Ordner »%s« konnte nicht angelegt werden: %s\n"
#: ../src/core/session.c:880
#: ../src/core/session.c:854
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Sitzungsdatei »%s« konnte nicht zum Schreiben geöffnet werden: %s\n"
#: ../src/core/session.c:1021
#: ../src/core/session.c:995
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Fehler beim Schreiben der Sitzungsdatei »%s«: %s\n"
#: ../src/core/session.c:1026
#: ../src/core/session.c:1000
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Fehler beim Schließen der Sitzungsdatei »%s«: %s\n"
#: ../src/core/session.c:1156
#: ../src/core/session.c:1130
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Gespeicherte Sitzungsdatei konnte nicht verarbeitet werden: %s\n"
#: ../src/core/session.c:1205
#: ../src/core/session.c:1179
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr ""
"Attribut <metacity_session> ist aufgetaucht, obwohl die Sitzungskennung "
"bereits feststeht"
#: ../src/core/session.c:1218 ../src/core/session.c:1293
#: ../src/core/session.c:1325 ../src/core/session.c:1397
#: ../src/core/session.c:1457
#: ../src/core/session.c:1192 ../src/core/session.c:1267
#: ../src/core/session.c:1299 ../src/core/session.c:1371
#: ../src/core/session.c:1431
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Unbekanntes Attribut %s in Element <%s>"
#: ../src/core/session.c:1235
#: ../src/core/session.c:1209
#, c-format
msgid "nested <window> tag"
msgstr "verschachteltes Element <window>"
#: ../src/core/session.c:1477
#: ../src/core/session.c:1451
#, c-format
msgid "Unknown element %s"
msgstr "Unbekanntes Element %s"
#: ../src/core/session.c:1829
#: ../src/core/session.c:1803
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -702,13 +704,13 @@ msgid "Window manager error: "
msgstr "Fensterverwalter-Fehler:"
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:616 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6651
#: ../src/core/window.c:6847
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -730,15 +732,15 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7314
#: ../src/core/window.c:7510
#, 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 ""
"Fenster %s zeigt durch einen MWM-Hinweis an, dass die Größe nicht veränderbar "
"ist, setzt jedoch die minimale Größe auf %d x %d und die maximale Größe auf "
"%d x %d; dies ergibt keinen Sinn.\n"
"Fenster %s zeigt durch einen MWM-Hinweis an, dass die Größe nicht "
"veränderbar ist, setzt jedoch die minimale Größe auf %d x %d und die "
"maximale Größe auf %d x %d; dies ergibt keinen Sinn.\n"
#: ../src/core/window-props.c:309
#, c-format
@@ -750,7 +752,7 @@ msgstr "Anwendung hat eine unsinnige _NET_WM_PID %lu angegeben\n"
msgid "%s (on %s)"
msgstr "%s (auf %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1482
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Ungültiges WM_TRANSIENT_FOR-Fenster 0x%lx festgelegt für %s.\n"
@@ -799,10 +801,10 @@ msgstr ""
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only the primary window."
"monitors or only for windows on the primary monitor."
msgstr ""
"Legt fest, ob Arbeitsflächenwechsel für Fenster auf allen Bildschirmen oder "
"nur für das primäre Fenster ausgeführt werden soll."
"Legt fest, ob Arbeitsflächenwechsel für alle Fenster auf allen Bildschirmen "
"oder nur für Fenster auf dem primären Bildschirm ausgeführt werden soll."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"
@@ -821,19 +823,19 @@ msgid ""
msgstr ""
"Dieser Schlüssel wird die »Überlagerung« auslösen, d.h. eine kombinierte "
"Fensterübersicht und ein System zum Starten von Anwendungen. Als "
"Voreinstellung ist die Windows-Taste der Tastatur von PC-Hardware vorgesehen. "
"Man geht davon aus, dass diese Tastenverknüpfung entweder die Vorgabe ist "
"oder als leere Zeichenkette gesetzt ist."
"Voreinstellung ist die Windows-Taste der Tastatur von PC-Hardware "
"vorgesehen. Man geht davon aus, dass diese Tastenverknüpfung entweder die "
"Vorgabe ist oder als leere Zeichenkette gesetzt ist."
#: ../src/mutter.schemas.in.h:7
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with the "
"parent window."
"attached to the titlebar of the parent window and are moved together with "
"the parent window."
msgstr ""
"Wenn auf »wahr« gesetzt, erscheinen anstelle unabhängiger Titelleisten an die "
"Titelleisten des Elternfensters angehängte modale Dialoge, welche zusammen "
"mit dem Elternfenster bewegt werden."
"Wenn auf »wahr« gesetzt, erscheinen anstelle unabhängiger Titelleisten an "
"die Titelleisten des Elternfensters angehängte modale Dialoge, welche "
"zusammen mit dem Elternfenster bewegt werden."
#: ../src/mutter.schemas.in.h:8
msgid "Workspaces only on primary"
@@ -1141,8 +1143,8 @@ msgstr ""
#: ../src/ui/theme.c:1216
#, c-format
msgid ""
"GTK color specification must have a close bracket after the state, e.g. gtk:fg"
"[NORMAL] where NORMAL is the state; could not parse \"%s\""
"GTK color specification must have a close bracket after the state, e.g. gtk:"
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
msgstr ""
"GTK-Farbangaben müssen nach dem Zustand eine schließende eckige Klammer "
"enthalten, z.B. gtk:fg[NORMAL], wobei NORMAL der Zustand ist; »%s« konnte "
@@ -1175,7 +1177,8 @@ msgstr "Der Alphawert »%s« in einer Mischfarbe konnte nicht verarbeitet werden
#: ../src/ui/theme.c:1291
#, c-format
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
msgstr "Der Alphawert »%s« in einer Mischfarbe liegt nicht zwischen 0.0 und 1.0"
msgstr ""
"Der Alphawert »%s« in einer Mischfarbe liegt nicht zwischen 0.0 und 1.0"
#: ../src/ui/theme.c:1338
#, c-format
@@ -1246,8 +1249,8 @@ msgstr "Der Koordinatenausdruck führt zu einer Division durch Null"
msgid ""
"Coordinate expression tries to use mod operator on a floating-point number"
msgstr ""
"Der Koordinatenausdruck versucht, den Modulo-Operator auf eine Gleitkommazahl "
"anzuwenden"
"Der Koordinatenausdruck versucht, den Modulo-Operator auf eine "
"Gleitkommazahl anzuwenden"
#: ../src/ui/theme.c:2085
#, c-format
@@ -1261,7 +1264,8 @@ msgstr ""
#, c-format
msgid "Coordinate expression had an operand where an operator was expected"
msgstr ""
"Der Koordinatenausdruck enthält einen Operanden, wo ein Operator stehen müsste"
"Der Koordinatenausdruck enthält einen Operanden, wo ein Operator stehen "
"müsste"
#: ../src/ui/theme.c:2102
#, c-format
@@ -1343,15 +1347,16 @@ msgstr "Kein <%s> für Thema »%s« festgelegt"
#: ../src/ui/theme.c:5185
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window type="
"\"%s\" style_set=\"whatever\"/> element"
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
"type=\"%s\" style_set=\"whatever\"/> element"
msgstr ""
"Kein Rahmenstil für Fenstertyp »%s« in Thema »%s« angegeben; fügen Sie ein "
"Element <window type=\"%s\" style_set=\"irgendwas\"/> hinzu"
#: ../src/ui/theme.c:5635 ../src/ui/theme.c:5697 ../src/ui/theme.c:5760
#, c-format
msgid "User-defined constants must begin with a capital letter; \"%s\" does not"
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
msgstr ""
"Benutzerdefinierte Konstanten müssen mit einem Großbuchstaben beginnen; »%s« "
"jedoch nicht"
@@ -1393,7 +1398,8 @@ msgstr "»%s« konnte nicht als Ganzzahl verarbeitet werden"
#, c-format
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
msgstr ""
"Schließende Zeichen »%s« in Zeichenkette »%s« konnten nicht verarbeitet werden"
"Schließende Zeichen »%s« in Zeichenkette »%s« konnten nicht verarbeitet "
"werden"
#: ../src/ui/theme-parser.c:613
#, c-format
@@ -1433,8 +1439,8 @@ msgid ""
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
"large,x-large,xx-large)\n"
msgstr ""
"Ungültiger Titelmaßstab »%s« (muss xx-small, x-small, small, medium, large, x-"
"large oder xx-large sein)\n"
"Ungültiger Titelmaßstab »%s« (muss xx-small, x-small, small, medium, large, "
"x-large oder xx-large sein)\n"
#: ../src/ui/theme-parser.c:1019 ../src/ui/theme-parser.c:1082
#: ../src/ui/theme-parser.c:1116 ../src/ui/theme-parser.c:1219
@@ -1582,7 +1588,8 @@ msgstr "Unbekannte Knopf-Funktion »%s«"
#: ../src/ui/theme-parser.c:2982
#, c-format
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
msgstr "Knopf-Funktion »%s« existiert in dieser Version nicht (%d, benötigt %d)"
msgstr ""
"Knopf-Funktion »%s« existiert in dieser Version nicht (%d, benötigt %d)"
#: ../src/ui/theme-parser.c:2994
#, c-format
@@ -1620,15 +1627,16 @@ msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized/shaded "
"states"
msgstr ""
"Für die Zustände maximiert/eingerollt sollte es im Element <%s> kein Attribut "
"»resize« geben"
"Für die Zustände maximiert/eingerollt sollte es im Element <%s> kein "
"Attribut »resize« geben"
#: ../src/ui/theme-parser.c:3161
#, c-format
msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized states"
msgstr ""
"Für maximierte Zustände sollte es im Element <%s> kein Attribut »resize« geben"
"Für maximierte Zustände sollte es im Element <%s> kein Attribut »resize« "
"geben"
#: ../src/ui/theme-parser.c:3175 ../src/ui/theme-parser.c:3222
#, c-format
@@ -1655,8 +1663,8 @@ 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 ""
"Es kann keine zwei draw_ops für ein <button>-Element geben (das Thema gab ein "
"draw_ops-Attribut und ein <draw_ops>-Element oder zwei Elemente an)"
"Es kann keine zwei draw_ops für ein <button>-Element geben (das Thema gab "
"ein draw_ops-Attribut und ein <draw_ops>-Element oder zwei Elemente an)"
#: ../src/ui/theme-parser.c:3370
msgid ""
@@ -1946,4 +1954,3 @@ msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
msgstr ""
"%d Koordinatenausdrücke in %g Sekunden verarbeitet (im Durchschnitt %g pro "
"Sekunde)\n"

View File

@@ -9,8 +9,8 @@ msgid ""
msgstr ""
"Project-Id-Version: metacity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-16 17:48+0000\n"
"PO-Revision-Date: 2011-03-16 17:49+0100\n"
"POT-Creation-Date: 2011-03-30 15:35+0100\n"
"PO-Revision-Date: 2011-03-30 15:35+0100\n"
"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
"Language-Team: British English <en@li.org>\n"
"Language: en_GB\n"
@@ -328,7 +328,7 @@ msgstr "Move window to west (left) side of screen"
msgid "Move window to center of screen"
msgstr "Move window to centre of screen"
#: ../src/core/bell.c:302
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr "Bell event"
@@ -426,12 +426,12 @@ msgstr "Initialise session from savefile"
msgid "Make X calls synchronous"
msgstr "Make X calls synchronous"
#: ../src/core/main.c:508
#: ../src/core/main.c:506
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Failed to scan themes directory: %s\n"
#: ../src/core/main.c:524
#: ../src/core/main.c:522
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -472,34 +472,34 @@ msgstr "Comma-separated list of compositor plugins"
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:536 ../src/core/prefs.c:697
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "GConf key '%s' is set to an invalid value\n"
#: ../src/core/prefs.c:623 ../src/core/prefs.c:866
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr "%d stored in GConf key %s is out of range %d to %d\n"
#: ../src/core/prefs.c:667 ../src/core/prefs.c:744 ../src/core/prefs.c:792
#: ../src/core/prefs.c:856 ../src/core/prefs.c:1317 ../src/core/prefs.c:1333
#: ../src/core/prefs.c:1350 ../src/core/prefs.c:1366
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "GConf key \"%s\" is set to an invalid type\n"
#: ../src/core/prefs.c:1196
#: ../src/core/prefs.c:1203
#, c-format
msgid "GConf key %s is already in use and can't be used to override %s\n"
msgstr "GConf key %s is already in use and can't be used to override %s\n"
#: ../src/core/prefs.c:1255
#: ../src/core/prefs.c:1262
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "Can't override GConf key: %s not found\n"
#: ../src/core/prefs.c:1440
#: ../src/core/prefs.c:1447
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@@ -507,12 +507,12 @@ msgstr ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
#: ../src/core/prefs.c:1517
#: ../src/core/prefs.c:1524
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr "Could not parse font description \"%s\" from GConf key %s\n"
#: ../src/core/prefs.c:1579
#: ../src/core/prefs.c:1586
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@@ -521,17 +521,17 @@ msgstr ""
"\"%s\" found in configuration database is not a valid value for mouse button "
"modifier\n"
#: ../src/core/prefs.c:2006
#: ../src/core/prefs.c:2016
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "Error setting number of workspaces to %d: %s\n"
#: ../src/core/prefs.c:2190 ../src/core/prefs.c:2692
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
#, c-format
msgid "Workspace %d"
msgstr "Workspace %d"
#: ../src/core/prefs.c:2222 ../src/core/prefs.c:2400
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@@ -540,27 +540,27 @@ msgstr ""
"\"%s\" found in configuration database is not a valid value for keybinding "
"\"%s\"\n"
#: ../src/core/prefs.c:2773
#: ../src/core/prefs.c:2783
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr "Error setting name for workspace %d to \"%s\": %s\n"
#: ../src/core/prefs.c:2987
#: ../src/core/prefs.c:2997
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr "Error setting live hidden windows status: %s\n"
#: ../src/core/prefs.c:3015
#: ../src/core/prefs.c:3032
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr "Error setting no tab popup status: %s\n"
#: ../src/core/screen.c:587
#: ../src/core/screen.c:624
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Screen %d on display '%s' is invalid\n"
#: ../src/core/screen.c:603
#: ../src/core/screen.c:640
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -569,71 +569,71 @@ msgstr ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
"replace option to replace the current window manager.\n"
#: ../src/core/screen.c:630
#: ../src/core/screen.c:667
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
#: ../src/core/screen.c:685
#: ../src/core/screen.c:722
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Screen %d on display \"%s\" already has a window manager\n"
#: ../src/core/screen.c:870
#: ../src/core/screen.c:907
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Could not release screen %d on display \"%s\"\n"
#: ../src/core/session.c:863 ../src/core/session.c:870
#: ../src/core/session.c:837 ../src/core/session.c:844
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Could not create directory '%s': %s\n"
#: ../src/core/session.c:880
#: ../src/core/session.c:854
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Could not open session file '%s' for writing: %s\n"
#: ../src/core/session.c:1021
#: ../src/core/session.c:995
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Error writing session file '%s': %s\n"
#: ../src/core/session.c:1026
#: ../src/core/session.c:1000
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Error closing session file '%s': %s\n"
#: ../src/core/session.c:1156
#: ../src/core/session.c:1130
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Failed to parse saved session file: %s\n"
#: ../src/core/session.c:1205
#: ../src/core/session.c:1179
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "<mutter_session> attribute seen but we already have the session ID"
#: ../src/core/session.c:1218 ../src/core/session.c:1293
#: ../src/core/session.c:1325 ../src/core/session.c:1397
#: ../src/core/session.c:1457
#: ../src/core/session.c:1192 ../src/core/session.c:1267
#: ../src/core/session.c:1299 ../src/core/session.c:1371
#: ../src/core/session.c:1431
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Unknown attribute %s on <%s> element"
#: ../src/core/session.c:1235
#: ../src/core/session.c:1209
#, c-format
msgid "nested <window> tag"
msgstr "nested <window> tag"
#: ../src/core/session.c:1477
#: ../src/core/session.c:1451
#, c-format
msgid "Unknown element %s"
msgstr "Unknown element %s"
#: ../src/core/session.c:1829
#: ../src/core/session.c:1803
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -678,13 +678,13 @@ msgid "Window manager error: "
msgstr "Window manager error: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:616 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6550
#: ../src/core/window.c:6847
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -700,7 +700,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7213
#: ../src/core/window.c:7510
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
@@ -719,7 +719,7 @@ msgstr "Application set a bogus _NET_WM_PID %lu\n"
msgid "%s (on %s)"
msgstr "%s (on %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1482
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
@@ -764,14 +764,22 @@ msgstr ""
"workspaces other than the current one) should be kept alive."
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
msgstr ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"
msgstr "Live Hidden Windows"
#: ../src/mutter.schemas.in.h:4
#: ../src/mutter.schemas.in.h:5
msgid "Modifier to use for extended window management operations"
msgstr "Modifier to use for extended window management operations"
#: ../src/mutter.schemas.in.h:5
#: ../src/mutter.schemas.in.h:6
msgid ""
"This key will initiate the \"overlay\", which is a combination window "
"overview and application launching system. The default is intended to be the "
@@ -783,7 +791,7 @@ msgstr ""
"\"Windows key\" on PC hardware. It's expected that this binding either the "
"default or set to the empty string."
#: ../src/mutter.schemas.in.h:6
#: ../src/mutter.schemas.in.h:7
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
@@ -793,6 +801,10 @@ msgstr ""
"attached to the titlebar of the parent window and are moved together with "
"the parent window."
#: ../src/mutter.schemas.in.h:8
msgid "Workspaces only on primary"
msgstr "Workspaces only on primary"
#: ../src/tools/mutter-message.c:123
#, c-format
msgid "Usage: %s\n"

1826
po/eo.po Normal file

File diff suppressed because it is too large Load Diff

296
po/es.po
View File

@@ -14,14 +14,25 @@ msgstr ""
"Project-Id-Version: mutter.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-21 19:31+0000\n"
"PO-Revision-Date: 2011-03-21 20:48+0100\n"
"POT-Creation-Date: 2011-07-08 20:41+0000\n"
"PO-Revision-Date: 2011-07-10 12:59+0200\n"
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Content-Transfer-Encoding: 8bits\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
#. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit
#: ../src/compositor/compositor.c:509
#, c-format
msgid ""
"Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr ""
"Ya existe un gestor de composición ejecutándose en la monitor %i, pantalla "
"«%s»."
#: ../src/core/all-keybindings.h:88
msgid "Switch to workspace 1"
@@ -345,13 +356,16 @@ msgstr "Evento de campana"
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:111
#, c-format
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> no está respondiendo."
#: ../src/core/delete.c:99
#: ../src/core/delete.c:114
msgid "Application is not responding."
msgstr "La aplicación no está respondiendo."
#: ../src/core/delete.c:119
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
@@ -359,11 +373,11 @@ 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:126
msgid "_Wait"
msgstr "_Esperar"
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Force Quit"
msgstr "_Forzar la salida"
@@ -434,12 +448,12 @@ msgstr "Inicializar sesión desde el archivo de salvaguarda"
msgid "Make X calls synchronous"
msgstr "Hacer que las llamadas a las X sean síncronas"
#: ../src/core/main.c:506
#: ../src/core/main.c:504
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Falló al inspeccionar el directorio de temas: %s\n"
#: ../src/core/main.c:522
#: ../src/core/main.c:520
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -573,12 +587,12 @@ msgid "Error setting no tab popup status: %s\n"
msgstr ""
"Error al establecer el estado de las pestañas en ventanas emergentes: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:663
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "La ventana %d en la pantalla «%s» no es válida\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:679
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -587,7 +601,7 @@ msgstr ""
"La ventana %d en la pantalla «%s» ya tiene un gestor de ventanas, intente "
"usar la opción «--replace» para reemplazar el gestor de ventanas activo.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:706
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
@@ -595,65 +609,65 @@ msgstr ""
"No se ha podido obtener la selección del gestor de ventanas en la ventana %d "
"en la pantalla «%s»\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:761
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "La ventana %d en la pantalla «%s» ya tiene un gestor de ventanas\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:946
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "No se ha podido liberar el monitor %d en la pantalla «%s»\n"
#: ../src/core/session.c:837 ../src/core/session.c:844
#: ../src/core/session.c:843 ../src/core/session.c:850
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "No se ha podido crear el directorio «%s»: %s\n"
#: ../src/core/session.c:854
#: ../src/core/session.c:860
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "No se ha podido abrir para escritura el archivo de sesión «%s»: %s\n"
#: ../src/core/session.c:995
#: ../src/core/session.c:1001
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Ocurrió un error al escribir en el archivo de sesión «%s»: %s\n"
#: ../src/core/session.c:1000
#: ../src/core/session.c:1006
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Ocurrió un error al cerrar el archivo de sesión «%s»: %s\n"
#: ../src/core/session.c:1130
#: ../src/core/session.c:1136
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Ocurrió un error al interpretar el archivo de sesión guardado: %s\n"
#: ../src/core/session.c:1179
#: ../src/core/session.c:1185
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr ""
"Se ha visto el atributo <mutter_session> pero ya tenemos el ID de la sesión"
#: ../src/core/session.c:1192 ../src/core/session.c:1267
#: ../src/core/session.c:1299 ../src/core/session.c:1371
#: ../src/core/session.c:1431
#: ../src/core/session.c:1198 ../src/core/session.c:1273
#: ../src/core/session.c:1305 ../src/core/session.c:1377
#: ../src/core/session.c:1437
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Atributo desconocido %s en el elemento <%s>"
#: ../src/core/session.c:1209
#: ../src/core/session.c:1215
#, c-format
msgid "nested <window> tag"
msgstr "etiqueta <window> anidada"
#: ../src/core/session.c:1451
#: ../src/core/session.c:1457
#, c-format
msgid "Unknown element %s"
msgstr "Elemento desconocido %s"
#: ../src/core/session.c:1803
#: ../src/core/session.c:1809
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -699,13 +713,13 @@ msgid "Window manager error: "
msgstr "Error del gestor de ventanas: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:632 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6752
#: ../src/core/window.c:6903
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -721,7 +735,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7415
#: ../src/core/window.c:7566
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
@@ -741,12 +755,18 @@ msgstr "La aplicación establecio un _NET_WM_PID %lu erróneo\n"
msgid "%s (on %s)"
msgstr "%s (on %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1488
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr ""
"WM_TRANSIENT_FOR inválido para la ventana 0x%lx especificada para %s.\n"
#: ../src/core/window-props.c:1500
#, c-format
#| msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
msgstr "WM_TRANSIENT_FOR ventana 0x%lx para %s crearía un bucle.\n"
#: ../src/core/xprops.c:155
#, c-format
msgid ""
@@ -788,9 +808,6 @@ msgstr ""
"otros escritorios distintos del actual) deberían mantenerse activas."
#: ../src/mutter.schemas.in.h:3
#| msgid ""
#| "Determines whether workspace switching should happen for windows on all "
#| "monitors or only the primary window."
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
@@ -839,47 +856,47 @@ msgstr "Áreas de trabajo sólo en el primario"
msgid "Usage: %s\n"
msgstr "Uso: %s\n"
#: ../src/ui/frames.c:1099
#: ../src/ui/frames.c:1280
msgid "Close Window"
msgstr "Cerrar la ventana"
#: ../src/ui/frames.c:1102
#: ../src/ui/frames.c:1283
msgid "Window Menu"
msgstr "Menú de la ventana"
#: ../src/ui/frames.c:1105
#: ../src/ui/frames.c:1286
msgid "Minimize Window"
msgstr "Minimizar la ventana"
#: ../src/ui/frames.c:1108
#: ../src/ui/frames.c:1289
msgid "Maximize Window"
msgstr "Maximizar la ventana"
#: ../src/ui/frames.c:1111
#: ../src/ui/frames.c:1292
msgid "Restore Window"
msgstr "Restablecer la ventana"
#: ../src/ui/frames.c:1114
#: ../src/ui/frames.c:1295
msgid "Roll Up Window"
msgstr "Enrollar ventana"
#: ../src/ui/frames.c:1117
#: ../src/ui/frames.c:1298
msgid "Unroll Window"
msgstr "Desenrollar ventana"
#: ../src/ui/frames.c:1120
#: ../src/ui/frames.c:1301
msgid "Keep Window On Top"
msgstr "Mantener la ventana encima"
#: ../src/ui/frames.c:1123
#: ../src/ui/frames.c:1304
msgid "Remove Window From Top"
msgstr "Quitar ventana de encima"
#: ../src/ui/frames.c:1126
#: ../src/ui/frames.c:1307
msgid "Always On Visible Workspace"
msgstr "Siempre en el área de trabajo visible"
#: ../src/ui/frames.c:1129
#: ../src/ui/frames.c:1310
msgid "Put Window On Only One Workspace"
msgstr "Poner la ventana sólo en un área de trabajo"
@@ -1082,49 +1099,83 @@ msgstr "Mod5"
msgid "%d x %d"
msgstr "%d x %d"
#: ../src/ui/theme.c:255
#: ../src/ui/theme.c:252
msgid "top"
msgstr "superior"
#: ../src/ui/theme.c:257
#: ../src/ui/theme.c:254
msgid "bottom"
msgstr "inferior"
#: ../src/ui/theme.c:259
#: ../src/ui/theme.c:256
msgid "left"
msgstr "izquierda"
#: ../src/ui/theme.c:261
#: ../src/ui/theme.c:258
msgid "right"
msgstr "derecha"
#: ../src/ui/theme.c:288
#: ../src/ui/theme.c:285
#, c-format
msgid "frame geometry does not specify \"%s\" dimension"
msgstr "La geometría del marco no especifica la dimensión «%s»"
#: ../src/ui/theme.c:307
#: ../src/ui/theme.c:304
#, c-format
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
msgstr ""
"La geometría del marco no especifica la dimensión «%s» para el borde «%s»"
#: ../src/ui/theme.c:344
#: ../src/ui/theme.c:341
#, c-format
msgid "Button aspect ratio %g is not reasonable"
msgstr "La proporción del botón %g no es razonable"
#: ../src/ui/theme.c:356
#: ../src/ui/theme.c:353
#, c-format
msgid "Frame geometry does not specify size of buttons"
msgstr "La geometría del marco no especifica el tamaño de los botones"
#: ../src/ui/theme.c:1064
#: ../src/ui/theme.c:1061
#, c-format
msgid "Gradients should have at least two colors"
msgstr "Los degradados deben tener al menos dos colores"
#: ../src/ui/theme.c:1202
#: ../src/ui/theme.c:1206
#, c-format
#| msgid ""
#| "GTK color specification must have a close bracket after the state, e.g. "
#| "gtk:fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
msgid ""
"GTK custom color specification must have color name and fallback in "
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
msgstr ""
"La especificación de color GTK debe tener un nombre de color y nombre "
"alternativo entre paréntesis, ejemplo: gtk:custom(foo,bar); no se pudo "
"analizar «%s»"
#: ../src/ui/theme.c:1222
#, c-format
msgid ""
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
"_ are valid"
msgstr ""
"Caracter «%c» no válido en el parámetro «color_name» de «gtk:custom», sólo "
"«A-Za-z0-9-_» son válidos"
#: ../src/ui/theme.c:1236
#, c-format
#| msgid ""
#| "Shade format is \"shade/base_color/factor\", \"%s\" does not fit the "
#| "format"
msgid ""
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
"fit the format"
msgstr ""
"El formato de «gtk:custom» es «gtk:custom(nombre_de_color,"
"nombre_alternativo)», «%s» no respeta el formato"
#: ../src/ui/theme.c:1272
#, c-format
msgid ""
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
@@ -1134,7 +1185,7 @@ msgstr ""
"ejemplo. gtk:fg[NORMAL] donde NORMAL es el estado ; no se ha podido "
"interpretar «%s»"
#: ../src/ui/theme.c:1216
#: ../src/ui/theme.c:1286
#, c-format
msgid ""
"GTK color specification must have a close bracket after the state, e.g. gtk:"
@@ -1144,18 +1195,18 @@ msgstr ""
"estado, ejemplo. gtk:fg[NORMAL] donde NORMAL es el estado ; no se ha podido "
"interpretar «%s»"
#: ../src/ui/theme.c:1227
#: ../src/ui/theme.c:1297
#, c-format
msgid "Did not understand state \"%s\" in color specification"
msgstr "No se entiende el estado «%s» en la especificación del color"
#: ../src/ui/theme.c:1240
#: ../src/ui/theme.c:1310
#, c-format
msgid "Did not understand color component \"%s\" in color specification"
msgstr ""
"No se entiende el componente de color «%s» en la especificación del color"
#: ../src/ui/theme.c:1270
#: ../src/ui/theme.c:1340
#, c-format
msgid ""
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
@@ -1164,17 +1215,17 @@ msgstr ""
"El formato de blend es «blend/bg_color/fg_color/alfa», «%s» no cumple con el "
"formato"
#: ../src/ui/theme.c:1281
#: ../src/ui/theme.c:1351
#, c-format
msgid "Could not parse alpha value \"%s\" in blended color"
msgstr "No se ha podido interpretar el valor alfa «%s» en el color mezclado"
#: ../src/ui/theme.c:1291
#: ../src/ui/theme.c:1361
#, c-format
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
msgstr "El valor alfa «%s» en el color mezclado no está entre 0.0 y 1.0"
#: ../src/ui/theme.c:1338
#: ../src/ui/theme.c:1408
#, c-format
msgid ""
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
@@ -1182,31 +1233,31 @@ msgstr ""
"El formato de sombreado es «shade/base_color/factor», «%s» no coincide con "
"el formato"
#: ../src/ui/theme.c:1349
#: ../src/ui/theme.c:1419
#, c-format
msgid "Could not parse shade factor \"%s\" in shaded color"
msgstr ""
"No se ha podido interpretar el factor de sombreado «%s» en el color del "
"sombreado"
#: ../src/ui/theme.c:1359
#: ../src/ui/theme.c:1429
#, c-format
msgid "Shade factor \"%s\" in shaded color is negative"
msgstr "El factor de sombreado «%s» en el color sombreado es negativo"
#: ../src/ui/theme.c:1388
#: ../src/ui/theme.c:1458
#, c-format
msgid "Could not parse color \"%s\""
msgstr "No se ha podido interpretar el color «%s»"
#: ../src/ui/theme.c:1646
#: ../src/ui/theme.c:1769
#, c-format
msgid "Coordinate expression contains character '%s' which is not allowed"
msgstr ""
"La expresión de coordenadas contenía un carácter «%s» en cual no está "
"permitido"
#: ../src/ui/theme.c:1673
#: ../src/ui/theme.c:1796
#, c-format
msgid ""
"Coordinate expression contains floating point number '%s' which could not be "
@@ -1215,13 +1266,13 @@ msgstr ""
"La expresión de coordenadas contenía un número de coma flotante «%s» en cual "
"no pudo ser analizado"
#: ../src/ui/theme.c:1687
#: ../src/ui/theme.c:1810
#, c-format
msgid "Coordinate expression contains integer '%s' which could not be parsed"
msgstr ""
"La expresión de coordenadas contenía un entero «%s» que no pudo ser analizado"
#: ../src/ui/theme.c:1809
#: ../src/ui/theme.c:1932
#, c-format
msgid ""
"Coordinate expression contained unknown operator at the start of this text: "
@@ -1230,17 +1281,17 @@ msgstr ""
"La expresión de coordenadas contenía un operador inválido al inicio de su "
"texto: «%s»"
#: ../src/ui/theme.c:1866
#: ../src/ui/theme.c:1989
#, c-format
msgid "Coordinate expression was empty or not understood"
msgstr "La expresión de coordenadas estaba vacía o no fue entendida"
#: ../src/ui/theme.c:1977 ../src/ui/theme.c:1987 ../src/ui/theme.c:2021
#: ../src/ui/theme.c:2100 ../src/ui/theme.c:2110 ../src/ui/theme.c:2144
#, c-format
msgid "Coordinate expression results in division by zero"
msgstr "La expresión de coordenadas resultó en un error de división por cero"
#: ../src/ui/theme.c:2029
#: ../src/ui/theme.c:2152
#, c-format
msgid ""
"Coordinate expression tries to use mod operator on a floating-point number"
@@ -1248,7 +1299,7 @@ msgstr ""
"La expresión de coordenadas intentó usar un operador mod con un número de "
"coma flotante"
#: ../src/ui/theme.c:2085
#: ../src/ui/theme.c:2208
#, c-format
msgid ""
"Coordinate expression has an operator \"%s\" where an operand was expected"
@@ -1256,19 +1307,19 @@ msgstr ""
"La expresión de coordenadas tiene un operador «%s» donde se esperaba un "
"operando"
#: ../src/ui/theme.c:2094
#: ../src/ui/theme.c:2217
#, c-format
msgid "Coordinate expression had an operand where an operator was expected"
msgstr ""
"La expresión de coordenadas tiene un operando donde se esperaba un operador"
#: ../src/ui/theme.c:2102
#: ../src/ui/theme.c:2225
#, c-format
msgid "Coordinate expression ended with an operator instead of an operand"
msgstr ""
"La expresión de coordenadas termina con una operador en vez de un operando"
#: ../src/ui/theme.c:2112
#: ../src/ui/theme.c:2235
#, c-format
msgid ""
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
@@ -1277,42 +1328,42 @@ msgstr ""
"La expresión de coordenadas tiene el operador «%c» seguido del operador «%c» "
"sin un operando entre ellos"
#: ../src/ui/theme.c:2263 ../src/ui/theme.c:2308
#: ../src/ui/theme.c:2386 ../src/ui/theme.c:2431
#, c-format
msgid "Coordinate expression had unknown variable or constant \"%s\""
msgstr ""
"La expresión de coordenadas tenía una variable o constante desconocida «%s»"
#: ../src/ui/theme.c:2362
#: ../src/ui/theme.c:2485
#, c-format
msgid "Coordinate expression parser overflowed its buffer."
msgstr "El parser de la expresión de coordenadas desbordó su búfer."
#: ../src/ui/theme.c:2391
#: ../src/ui/theme.c:2514
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr ""
"La expresión de coordenadas tenía un paréntesis cerrado sin un paréntesis "
"abierto"
#: ../src/ui/theme.c:2455
#: ../src/ui/theme.c:2578
#, c-format
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
msgstr ""
"La expresión de coordenadas tenía un paréntesis abierto sin un paréntesis "
"cerrado"
#: ../src/ui/theme.c:2466
#: ../src/ui/theme.c:2589
#, c-format
msgid "Coordinate expression doesn't seem to have any operators or operands"
msgstr "La expresión de coordenadas no parece tener ni operadores ni operandos"
#: ../src/ui/theme.c:2676 ../src/ui/theme.c:2696 ../src/ui/theme.c:2716
#: ../src/ui/theme.c:2801 ../src/ui/theme.c:2821 ../src/ui/theme.c:2841
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "El tema contenía una expresión que ha resultado en un error: %s\n"
#: ../src/ui/theme.c:4410
#: ../src/ui/theme.c:4512
#, c-format
msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
@@ -1321,25 +1372,25 @@ msgstr ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> debe ser "
"especificado para este estilo de marco"
#: ../src/ui/theme.c:4940 ../src/ui/theme.c:4965
#: ../src/ui/theme.c:5042 ../src/ui/theme.c:5067
#, c-format
msgid ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr ""
"Falta <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
#: ../src/ui/theme.c:5013
#: ../src/ui/theme.c:5115
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "Ocurrió un error al cargar el tema «%s»: %s\n"
#: ../src/ui/theme.c:5149 ../src/ui/theme.c:5156 ../src/ui/theme.c:5163
#: ../src/ui/theme.c:5170 ../src/ui/theme.c:5177
#: ../src/ui/theme.c:5251 ../src/ui/theme.c:5258 ../src/ui/theme.c:5265
#: ../src/ui/theme.c:5272 ../src/ui/theme.c:5279
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "No se configuró <%s> para el tema «%s»"
#: ../src/ui/theme.c:5185
#: ../src/ui/theme.c:5287
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
@@ -1348,7 +1399,7 @@ msgstr ""
"No hay un estilo de marco para el tipo de ventana «%s» en el tema «%s», "
"añada un elemento <window type=\"%s\" style_set=\"whatever\"/>"
#: ../src/ui/theme.c:5635 ../src/ui/theme.c:5697 ../src/ui/theme.c:5760
#: ../src/ui/theme.c:5737 ../src/ui/theme.c:5799 ../src/ui/theme.c:5862
#, c-format
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
@@ -1356,7 +1407,7 @@ msgstr ""
"Las constantes definidas por el usuario deben comenzar con una letra "
"mayúscula; «%s» no lo hace"
#: ../src/ui/theme.c:5643 ../src/ui/theme.c:5705 ../src/ui/theme.c:5768
#: ../src/ui/theme.c:5745 ../src/ui/theme.c:5807 ../src/ui/theme.c:5870
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "La constante «%s» ya ha sido definida"
@@ -1817,92 +1868,92 @@ msgstr "Esto es un mensaje de ejemplo en un diálogo de ejemplo"
msgid "Fake menu item %d\n"
msgstr "Elemento de menú de pega %d\n"
#: ../src/ui/theme-viewer.c:370
#: ../src/ui/theme-viewer.c:371
msgid "Border-only window"
msgstr "Ventana con sólo borde"
#: ../src/ui/theme-viewer.c:372
#: ../src/ui/theme-viewer.c:373
msgid "Bar"
msgstr "Barra"
#: ../src/ui/theme-viewer.c:389
#: ../src/ui/theme-viewer.c:390
msgid "Normal Application Window"
msgstr "Ventana de aplicación normal"
#: ../src/ui/theme-viewer.c:393
#: ../src/ui/theme-viewer.c:394
msgid "Dialog Box"
msgstr "Caja de diálogo"
#: ../src/ui/theme-viewer.c:397
#: ../src/ui/theme-viewer.c:398
msgid "Modal Dialog Box"
msgstr "Caja de diálogo modal"
#: ../src/ui/theme-viewer.c:401
#: ../src/ui/theme-viewer.c:402
msgid "Utility Palette"
msgstr "Paleta de utilidades"
#: ../src/ui/theme-viewer.c:405
#: ../src/ui/theme-viewer.c:406
msgid "Torn-off Menu"
msgstr "Menú apagado"
#: ../src/ui/theme-viewer.c:409
#: ../src/ui/theme-viewer.c:410
msgid "Border"
msgstr "Borde"
#: ../src/ui/theme-viewer.c:413
#: ../src/ui/theme-viewer.c:414
msgid "Attached Modal Dialog"
msgstr "Diálogo modal adjunto"
#: ../src/ui/theme-viewer.c:744
#: ../src/ui/theme-viewer.c:747
#, c-format
msgid "Button layout test %d"
msgstr "Test de distribución de botones %d"
#: ../src/ui/theme-viewer.c:773
#: ../src/ui/theme-viewer.c:776
#, c-format
msgid "%g milliseconds to draw one window frame"
msgstr "%g milisegundos para dibujar un marco de ventana"
#: ../src/ui/theme-viewer.c:818
#: ../src/ui/theme-viewer.c:821
#, c-format
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
msgstr "Uso: metacity-theme-viewer [NOMBRETEMA]\n"
#: ../src/ui/theme-viewer.c:825
#: ../src/ui/theme-viewer.c:828
#, c-format
msgid "Error loading theme: %s\n"
msgstr "Ocurrió un error al cargar el tema:«%s»\n"
#: ../src/ui/theme-viewer.c:831
#: ../src/ui/theme-viewer.c:834
#, c-format
msgid "Loaded theme \"%s\" in %g seconds\n"
msgstr "Se cargó el tema «%s» en %g segundos\n"
#: ../src/ui/theme-viewer.c:875
#: ../src/ui/theme-viewer.c:878
msgid "Normal Title Font"
msgstr "Tipografía de título normal"
#: ../src/ui/theme-viewer.c:881
#: ../src/ui/theme-viewer.c:884
msgid "Small Title Font"
msgstr "Tipografía de título pequeña"
#: ../src/ui/theme-viewer.c:887
#: ../src/ui/theme-viewer.c:890
msgid "Large Title Font"
msgstr "Tipografía de título grande"
#: ../src/ui/theme-viewer.c:892
#: ../src/ui/theme-viewer.c:895
msgid "Button Layouts"
msgstr "Distribución de botones"
#: ../src/ui/theme-viewer.c:897
#: ../src/ui/theme-viewer.c:900
msgid "Benchmark"
msgstr "Banco de pruebas"
#: ../src/ui/theme-viewer.c:949
#: ../src/ui/theme-viewer.c:952
msgid "Window Title Goes Here"
msgstr "El título de la ventana va aquí"
#: ../src/ui/theme-viewer.c:1055
#: ../src/ui/theme-viewer.c:1058
#, c-format
msgid ""
"Drew %d frames in %g client-side seconds (%g milliseconds per frame) and %g "
@@ -1913,47 +1964,50 @@ msgstr ""
"marco) y %g segundos de tiempo estándar incluyendo recursos del servidor X "
"(%g milisegundos por marco)\n"
#: ../src/ui/theme-viewer.c:1274
#: ../src/ui/theme-viewer.c:1277
msgid "position expression test returned TRUE but set error"
msgstr ""
"prueba de expresión de la posición devolvió TRUE pero estableció un error"
#: ../src/ui/theme-viewer.c:1276
#: ../src/ui/theme-viewer.c:1279
msgid "position expression test returned FALSE but didn't set error"
msgstr ""
"prueba de expresión de la posición devolvió FASE pero no estableció un error"
#: ../src/ui/theme-viewer.c:1280
#: ../src/ui/theme-viewer.c:1283
msgid "Error was expected but none given"
msgstr "Se esperaba un error, pero no se dio ninguno"
#: ../src/ui/theme-viewer.c:1282
#: ../src/ui/theme-viewer.c:1285
#, c-format
msgid "Error %d was expected but %d given"
msgstr "Se esperaba el error %d pero se dio el %d"
#: ../src/ui/theme-viewer.c:1288
#: ../src/ui/theme-viewer.c:1291
#, c-format
msgid "Error not expected but one was returned: %s"
msgstr "No se esperaba un error pero se devolvió uno: %s"
#: ../src/ui/theme-viewer.c:1292
#: ../src/ui/theme-viewer.c:1295
#, c-format
msgid "x value was %d, %d was expected"
msgstr "el valor x era %d, se esperaba %d"
#: ../src/ui/theme-viewer.c:1295
#: ../src/ui/theme-viewer.c:1298
#, c-format
msgid "y value was %d, %d was expected"
msgstr "el valor y era %d, se esperaba %d"
#: ../src/ui/theme-viewer.c:1360
#: ../src/ui/theme-viewer.c:1363
#, c-format
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
msgstr ""
"%d expresiones de coordenadas interpretadas en %g segundos (%g segundos de "
"media)\n"
#~ msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
#~ msgstr "Falló al obtener el color %s[%s] del tema de GTK+.\n"
#~ msgid ""
#~ "Don't make fullscreen windows that are maximized and have no decorations"
#~ msgstr ""

1418
po/eu.po

File diff suppressed because it is too large Load Diff

154
po/gl.po
View File

@@ -9,13 +9,14 @@
# Mancomún - Centro de Referencia e Servizos de Software Libre <g11n@mancomun.org>, 2009.
# Fran Dieguez <fran.dieguez@glug.es>, 2009.
# Fran Diéguez <frandieguez@gnome.org>, 2010, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: gl\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-22 00:53+0100\n"
"PO-Revision-Date: 2011-03-22 00:54+0100\n"
"Last-Translator: \n"
"POT-Creation-Date: 2011-07-04 22:23+0200\n"
"PO-Revision-Date: 2011-07-04 22:23+0200\n"
"Last-Translator: Fran Diéguez <frandieguez@gnome.org>\n"
"Language-Team: Galician <gnome-l10n-gl@gnome.org>\n"
"Language: gl\n"
"MIME-Version: 1.0\n"
@@ -24,6 +25,17 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.2\n"
#. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit
#: ../src/compositor/compositor.c:509
#, c-format
msgid ""
"Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr ""
"Non foi posíbel obter a selección do xestor de xanelas na pantalla %i na "
"visualización «%s»"
#: ../src/core/all-keybindings.h:88
msgid "Switch to workspace 1"
msgstr "Cambiar ao espazo de traballo 1"
@@ -348,13 +360,16 @@ msgstr "Evento de campá"
msgid "Unknown window information request: %d"
msgstr "Petición de información de xanela descoñecida: %d"
#. Translators: %s is a window title
#: ../src/core/delete.c:94
#: ../src/core/delete.c:111
#, c-format
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> non está respondendo."
#: ../src/core/delete.c:99
#: ../src/core/delete.c:114
msgid "Application is not responding."
msgstr "O Aplicativo non está respondendo."
#: ../src/core/delete.c:119
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
@@ -362,11 +377,11 @@ msgstr ""
"Pode elixir esperar un momento para ver se continúa ou forzar ao aplicativo "
"a pechar completamente."
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Wait"
msgstr "Espe_rar"
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Force Quit"
msgstr "_Forzar a saída"
@@ -437,12 +452,12 @@ msgstr "Iniciar sesión desde o ficheiro de salvagarda"
msgid "Make X calls synchronous"
msgstr "Facer que as chamadas a X sexan sincrónicas"
#: ../src/core/main.c:506
#: ../src/core/main.c:504
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Fallou ao dixitalizar o directorio de temas: %s\n"
#: ../src/core/main.c:522
#: ../src/core/main.c:520
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -574,12 +589,12 @@ msgstr ""
"Produciuse un erro ao estabelecer o estado das lapelas en xanelas emerxentes "
"%s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:663
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "A pantalla %d na visualización «%s» non é válida\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:679
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -588,7 +603,7 @@ msgstr ""
"A visualización %d na pantalla «%s» ten xa un xestor de xanelas, tente usar "
"a opción --replace para substituír o xestor de xanelas.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:706
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
@@ -596,64 +611,64 @@ msgstr ""
"Non foi posíbel obter a selección do xestor de xanelas na pantalla %d na "
"visualización «%s»\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:761
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "A visualización %d na pantalla «%s» ten xa un xestor de xanelas\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:946
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Non foi posíbel liberar a visualización %d na pantalla «%s»\n"
#: ../src/core/session.c:837 ../src/core/session.c:844
#: ../src/core/session.c:843 ../src/core/session.c:850
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Non foi posíbel crear o directorio «%s»: %s\n"
#: ../src/core/session.c:854
#: ../src/core/session.c:860
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Non foi posíbel abrir o ficheiro de sesión «%s» para escritura: %s\n"
#: ../src/core/session.c:995
#: ../src/core/session.c:1001
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Erro ao escribir o ficheiro de sesión «%s»: %s\n"
#: ../src/core/session.c:1000
#: ../src/core/session.c:1006
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Erro ao pechar o ficheiro de sesión «%s»: %s\n"
#: ../src/core/session.c:1130
#: ../src/core/session.c:1136
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Produciuse un fallo ao analizar o ficheiro de sesión gardado: %s\n"
#: ../src/core/session.c:1179
#: ../src/core/session.c:1185
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "O atributo <mutter_session> foi visto pero xa temos o ID de sesión"
#: ../src/core/session.c:1192 ../src/core/session.c:1267
#: ../src/core/session.c:1299 ../src/core/session.c:1371
#: ../src/core/session.c:1431
#: ../src/core/session.c:1198 ../src/core/session.c:1273
#: ../src/core/session.c:1305 ../src/core/session.c:1377
#: ../src/core/session.c:1437
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Atributo descoñecido %s no elemento <%s>"
#: ../src/core/session.c:1209
#: ../src/core/session.c:1215
#, c-format
msgid "nested <window> tag"
msgstr "etiqueta <window> aniñada"
#: ../src/core/session.c:1451
#: ../src/core/session.c:1457
#, c-format
msgid "Unknown element %s"
msgstr "Elemento descoñecido %s"
#: ../src/core/session.c:1803
#: ../src/core/session.c:1809
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -698,13 +713,13 @@ msgid "Window manager error: "
msgstr "Erro do xestor de xanelas: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:632 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6752
#: ../src/core/window.c:6886
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -720,7 +735,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7415
#: ../src/core/window.c:7549
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
@@ -740,7 +755,7 @@ msgstr "O aplicativo configurou un _NET_WM_PID %lu falso\n"
msgid "%s (on %s)"
msgstr "%s (en %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1484
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr ""
@@ -834,47 +849,47 @@ msgstr "Espazos de traballo só no principal"
msgid "Usage: %s\n"
msgstr "Uso: %s\n"
#: ../src/ui/frames.c:1099
#: ../src/ui/frames.c:1280
msgid "Close Window"
msgstr "Pechar a xanela"
#: ../src/ui/frames.c:1102
#: ../src/ui/frames.c:1283
msgid "Window Menu"
msgstr "Menú da xanela"
#: ../src/ui/frames.c:1105
#: ../src/ui/frames.c:1286
msgid "Minimize Window"
msgstr "Minimizar a xanela"
#: ../src/ui/frames.c:1108
#: ../src/ui/frames.c:1289
msgid "Maximize Window"
msgstr "Maximizar a xanela"
#: ../src/ui/frames.c:1111
#: ../src/ui/frames.c:1292
msgid "Restore Window"
msgstr "Restaurar a xanela"
#: ../src/ui/frames.c:1114
#: ../src/ui/frames.c:1295
msgid "Roll Up Window"
msgstr "Pregar a xanela"
#: ../src/ui/frames.c:1117
#: ../src/ui/frames.c:1298
msgid "Unroll Window"
msgstr "Despregar a xanela"
#: ../src/ui/frames.c:1120
#: ../src/ui/frames.c:1301
msgid "Keep Window On Top"
msgstr "Manter a xanela na parte superior"
#: ../src/ui/frames.c:1123
#: ../src/ui/frames.c:1304
msgid "Remove Window From Top"
msgstr "Quitar a xanela da parte superior"
#: ../src/ui/frames.c:1126
#: ../src/ui/frames.c:1307
msgid "Always On Visible Workspace"
msgstr "Sempre no espazo de traballo visíbel"
#: ../src/ui/frames.c:1129
#: ../src/ui/frames.c:1310
msgid "Put Window On Only One Workspace"
msgstr "Pór a xanela nun só espazo de traballo"
@@ -1189,13 +1204,18 @@ msgstr "O factor de sombreado «%s» na cor sombreada é negativo"
msgid "Could not parse color \"%s\""
msgstr "Non foi posíbel analizar a cor «%s»"
#: ../src/ui/theme.c:1646
#: ../src/ui/theme.c:1481
#, c-format
msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
msgstr "Produciuse un fallo ao obter a cor %s[%s] desde o tema de GTK+.\n"
#: ../src/ui/theme.c:1713
#, c-format
msgid "Coordinate expression contains character '%s' which is not allowed"
msgstr ""
"A expresión de coordenadas contén un carácter «%s» que non está permitido"
#: ../src/ui/theme.c:1673
#: ../src/ui/theme.c:1740
#, c-format
msgid ""
"Coordinate expression contains floating point number '%s' which could not be "
@@ -1204,14 +1224,14 @@ msgstr ""
"A expresión de coordenadas contén un número de coma flotante «%s» que non "
"foi posíbel analizar"
#: ../src/ui/theme.c:1687
#: ../src/ui/theme.c:1754
#, c-format
msgid "Coordinate expression contains integer '%s' which could not be parsed"
msgstr ""
"A expresión de coordenadas contén un enteiro «%s» que non foi posíbel "
"analizar"
#: ../src/ui/theme.c:1809
#: ../src/ui/theme.c:1876
#, c-format
msgid ""
"Coordinate expression contained unknown operator at the start of this text: "
@@ -1220,17 +1240,17 @@ msgstr ""
"A expresión de coordenadas contén un operador non válido ao inicio do seu "
"texto: «%s»"
#: ../src/ui/theme.c:1866
#: ../src/ui/theme.c:1933
#, c-format
msgid "Coordinate expression was empty or not understood"
msgstr "A expresión de coordenadas está baleira ou non se entendeu"
#: ../src/ui/theme.c:1977 ../src/ui/theme.c:1987 ../src/ui/theme.c:2021
#: ../src/ui/theme.c:2044 ../src/ui/theme.c:2054 ../src/ui/theme.c:2088
#, c-format
msgid "Coordinate expression results in division by zero"
msgstr "A expresión de coordenadas resultou nun erro de división por cero"
#: ../src/ui/theme.c:2029
#: ../src/ui/theme.c:2096
#, c-format
msgid ""
"Coordinate expression tries to use mod operator on a floating-point number"
@@ -1238,25 +1258,25 @@ msgstr ""
"A expresión de coordenadas tentou usar un operador mod cun número de coma "
"flotante"
#: ../src/ui/theme.c:2085
#: ../src/ui/theme.c:2152
#, c-format
msgid ""
"Coordinate expression has an operator \"%s\" where an operand was expected"
msgstr ""
"A expresión de coordenadas ten un operador «%s» onde se esperaba un operando"
#: ../src/ui/theme.c:2094
#: ../src/ui/theme.c:2161
#, c-format
msgid "Coordinate expression had an operand where an operator was expected"
msgstr ""
"A expresión de coordenadas ten un operando onde se esperaba un operador"
#: ../src/ui/theme.c:2102
#: ../src/ui/theme.c:2169
#, c-format
msgid "Coordinate expression ended with an operator instead of an operand"
msgstr "A expresión de coordenadas remata cun operador en vez dun operando"
#: ../src/ui/theme.c:2112
#: ../src/ui/theme.c:2179
#, c-format
msgid ""
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
@@ -1265,42 +1285,42 @@ msgstr ""
"A expresión de coordenadas ten un operador \"%c\" seguido do operador \"%c\" "
"sen un operando entre eles"
#: ../src/ui/theme.c:2263 ../src/ui/theme.c:2308
#: ../src/ui/theme.c:2330 ../src/ui/theme.c:2375
#, c-format
msgid "Coordinate expression had unknown variable or constant \"%s\""
msgstr ""
"A expresión de coordenadas ten unha variábel ou constante descoñecida «%s»"
#: ../src/ui/theme.c:2362
#: ../src/ui/theme.c:2429
#, c-format
msgid "Coordinate expression parser overflowed its buffer."
msgstr "O analizador da expresión de coordenadas desbordou o seu búfer."
#: ../src/ui/theme.c:2391
#: ../src/ui/theme.c:2458
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr ""
"A expresión de coordenadas ten unha paréntese pechada sen unha paréntese "
"aberta"
#: ../src/ui/theme.c:2455
#: ../src/ui/theme.c:2522
#, c-format
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
msgstr ""
"A expresión de coordenadas ten unha paréntese aberta sen unha paréntese "
"pechada"
#: ../src/ui/theme.c:2466
#: ../src/ui/theme.c:2533
#, c-format
msgid "Coordinate expression doesn't seem to have any operators or operands"
msgstr "A expresión de coordenadas non parece ter nin operadores nin operandos"
#: ../src/ui/theme.c:2676 ../src/ui/theme.c:2696 ../src/ui/theme.c:2716
#: ../src/ui/theme.c:2745 ../src/ui/theme.c:2765 ../src/ui/theme.c:2785
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "O tema contiña unha expresión que resultou ser un erro: %s\n"
#: ../src/ui/theme.c:4410
#: ../src/ui/theme.c:4482
#, c-format
msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
@@ -1309,24 +1329,24 @@ msgstr ""
"<button function=«%s» state=«%s» draw_ops=\"whatever\"/> débese especificar "
"para este estilo de marco"
#: ../src/ui/theme.c:4940 ../src/ui/theme.c:4965
#: ../src/ui/theme.c:5012 ../src/ui/theme.c:5037
#, c-format
msgid ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr "Falta <frame state=«%s» resize=«%s» focus=«%s» style=\"whatever\"/>"
#: ../src/ui/theme.c:5013
#: ../src/ui/theme.c:5085
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "Produciuse un fallo ao cargar o tema «%s»: %s\n"
#: ../src/ui/theme.c:5149 ../src/ui/theme.c:5156 ../src/ui/theme.c:5163
#: ../src/ui/theme.c:5170 ../src/ui/theme.c:5177
#: ../src/ui/theme.c:5221 ../src/ui/theme.c:5228 ../src/ui/theme.c:5235
#: ../src/ui/theme.c:5242 ../src/ui/theme.c:5249
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "Non se configurou <%s> para o tema «%s»"
#: ../src/ui/theme.c:5185
#: ../src/ui/theme.c:5257
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
@@ -1335,7 +1355,7 @@ msgstr ""
"Non hai un estilo de marco para o tipo de xanela «%s» no tema «%s», engada "
"un elemento <window type=«%s» style_set=\"whatever\"/>"
#: ../src/ui/theme.c:5635 ../src/ui/theme.c:5697 ../src/ui/theme.c:5760
#: ../src/ui/theme.c:5707 ../src/ui/theme.c:5769 ../src/ui/theme.c:5832
#, c-format
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
@@ -1343,7 +1363,7 @@ msgstr ""
"As constantes definidas polo usuario deben comezar cunha letra maiúscula; "
"«%s» non o fai"
#: ../src/ui/theme.c:5643 ../src/ui/theme.c:5705 ../src/ui/theme.c:5768
#: ../src/ui/theme.c:5715 ../src/ui/theme.c:5777 ../src/ui/theme.c:5840
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "A constante «%s» xa foi definida"

250
po/he.po
View File

@@ -9,62 +9,72 @@ msgid ""
msgstr ""
"Project-Id-Version: metacity.HEAD.he\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-10 18:31+0200\n"
"PO-Revision-Date: 2011-03-10 18:31+0200\n"
"POT-Creation-Date: 2011-07-01 19:31+0300\n"
"PO-Revision-Date: 2011-07-01 19:33+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <he@li.org>\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: KBabel 1.10.2\n"
#. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit
#: ../src/compositor/compositor.c:509
#, c-format
msgid ""
"Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr "מנהל תצוגת חלונות אחר כבר פועל במסך %i בתצוגה \"%s\"."
#: ../src/core/all-keybindings.h:88
msgid "Switch to workspace 1"
msgstr "Switch to workspace 1"
msgstr "מעבר למרחב עבודה 1"
#: ../src/core/all-keybindings.h:90
msgid "Switch to workspace 2"
msgstr "Switch to workspace 2"
msgstr "מעבר למרחב עבודה 2"
#: ../src/core/all-keybindings.h:92
msgid "Switch to workspace 3"
msgstr "Switch to workspace 3"
msgstr "מעבר למרחב עבודה 3"
#: ../src/core/all-keybindings.h:94
msgid "Switch to workspace 4"
msgstr "Switch to workspace 4"
msgstr "מעבר למרחב עבודה 4"
#: ../src/core/all-keybindings.h:96
msgid "Switch to workspace 5"
msgstr "Switch to workspace 5"
msgstr "מעבר למרחב עבודה 5"
#: ../src/core/all-keybindings.h:98
msgid "Switch to workspace 6"
msgstr "Switch to workspace 6"
msgstr "מעבר למרחב עבודה 6"
#: ../src/core/all-keybindings.h:100
msgid "Switch to workspace 7"
msgstr "Switch to workspace 7"
msgstr "מעבר למרחב עבודה 7"
#: ../src/core/all-keybindings.h:102
msgid "Switch to workspace 8"
msgstr "Switch to workspace 8"
msgstr "מעבר למרחב עבודה 8"
#: ../src/core/all-keybindings.h:104
msgid "Switch to workspace 9"
msgstr "Switch to workspace 9"
msgstr "מעבר למרחב עבודה 9"
#: ../src/core/all-keybindings.h:106
msgid "Switch to workspace 10"
msgstr "Switch to workspace 10"
msgstr "מעבר למרחב עבודה 10"
#: ../src/core/all-keybindings.h:108
msgid "Switch to workspace 11"
msgstr "Switch to workspace 11"
msgstr "מעבר למרחב עבודה 11"
#: ../src/core/all-keybindings.h:110
msgid "Switch to workspace 12"
msgstr "Switch to workspace 12"
msgstr "מעבר למרחב עבודה 12"
#: ../src/core/all-keybindings.h:122
msgid "Switch to workspace on the left of the current workspace"
@@ -136,7 +146,7 @@ msgstr "Hide all normal windows and set focus to the desktop"
#: ../src/core/all-keybindings.h:206
msgid "Show the panel's main menu"
msgstr "Show the panel's main menu"
msgstr "הצגת התפריט הראשי של הלוח"
#: ../src/core/all-keybindings.h:209
msgid "Show the panel's \"Run Application\" dialog box"
@@ -144,31 +154,31 @@ msgstr "Show the panel's \"Run Application\" dialog box"
#: ../src/core/all-keybindings.h:211
msgid "Start or stop recording the session"
msgstr "התחלה או עצירה של צילום ההפעלה"
msgstr "התחלה או עצירה של הקלטת ההפעלה"
#: ../src/core/all-keybindings.h:252
msgid "Take a screenshot"
msgstr "Take a screenshot"
msgstr "צילום תמונת מסך"
#: ../src/core/all-keybindings.h:254
msgid "Take a screenshot of a window"
msgstr "Take a screenshot of a window"
msgstr "צילום החלון"
#: ../src/core/all-keybindings.h:256
msgid "Run a terminal"
msgstr "Run a terminal"
msgstr "הפעלת מסוף"
#: ../src/core/all-keybindings.h:271
msgid "Activate the window menu"
msgstr "Activate the window menu"
msgstr "הפעלת תפריט החלון"
#: ../src/core/all-keybindings.h:274
msgid "Toggle fullscreen mode"
msgstr "Toggle fullscreen mode"
msgstr "כניסה למצב מסך מלא"
#: ../src/core/all-keybindings.h:276
msgid "Toggle maximization state"
msgstr "Toggle maximization state"
msgstr "הפעלה/כיבוי מצב הגדלה"
#: ../src/core/all-keybindings.h:278
msgid "Toggle whether a window will always be visible over other windows"
@@ -326,7 +336,7 @@ msgstr "Move window to west (left) side of screen"
msgid "Move window to center of screen"
msgstr "Move window to center of screen"
#: ../src/core/bell.c:302
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr "אירוע פעמון"
@@ -335,24 +345,27 @@ msgstr "אירוע פעמון"
msgid "Unknown window information request: %d"
msgstr "Unknown window information request: %d"
#. Translators: %s is a window title
#: ../src/core/delete.c:94
#: ../src/core/delete.c:111
#, c-format
msgid "<tt>%s</tt> is not responding."
msgstr " <tt>%s</tt> אינו מגיב"
#: ../src/core/delete.c:99
#: ../src/core/delete.c:114
msgid "Application is not responding."
msgstr "היישום אינו מגיב."
#: ../src/core/delete.c:119
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"באפשרותך להמתין זמן קצר ולתת ליישום להמשיך או להכריח את היישום להסתיים."
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Wait"
msgstr "ה_מתנה"
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Force Quit"
msgstr "_אילוץ סגירה"
@@ -421,12 +434,12 @@ msgstr "Initialize session from savefile"
msgid "Make X calls synchronous"
msgstr "Make X calls synchronous"
#: ../src/core/main.c:508
#: ../src/core/main.c:504
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Failed to scan themes directory: %s\n"
#: ../src/core/main.c:524
#: ../src/core/main.c:520
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -466,34 +479,34 @@ msgstr "Comma-separated list of compositor plugins"
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:536 ../src/core/prefs.c:697
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "GConf key '%s' is set to an invalid value\n"
#: ../src/core/prefs.c:623 ../src/core/prefs.c:866
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr "%d stored in GConf key %s is out of range %d to %d\n"
#: ../src/core/prefs.c:667 ../src/core/prefs.c:744 ../src/core/prefs.c:792
#: ../src/core/prefs.c:856 ../src/core/prefs.c:1317 ../src/core/prefs.c:1333
#: ../src/core/prefs.c:1350 ../src/core/prefs.c:1366
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "GConf key \"%s\" is set to an invalid type\n"
#: ../src/core/prefs.c:1196
#: ../src/core/prefs.c:1203
#, c-format
msgid "GConf key %s is already in use and can't be used to override %s\n"
msgstr "מפתח ה־GConf %s כבר נמצא בשימוש ולא ניתן להשתמש בו לדריסת %s\n"
#: ../src/core/prefs.c:1255
#: ../src/core/prefs.c:1262
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "לא ניתן לדרוס את מפתח ה־ GConf, %s לא נמצא\n"
#: ../src/core/prefs.c:1440
#: ../src/core/prefs.c:1447
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@@ -501,12 +514,12 @@ msgstr ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
#: ../src/core/prefs.c:1517
#: ../src/core/prefs.c:1524
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr "Could not parse font description \"%s\" from GConf key %s\n"
#: ../src/core/prefs.c:1579
#: ../src/core/prefs.c:1586
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@@ -515,17 +528,17 @@ msgstr ""
"\"%s\" found in configuration database is not a valid value for mouse button "
"modifier\n"
#: ../src/core/prefs.c:2006
#: ../src/core/prefs.c:2016
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "Error setting number of workspaces to %d: %s\n"
#: ../src/core/prefs.c:2190 ../src/core/prefs.c:2692
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
#, c-format
msgid "Workspace %d"
msgstr "סביבת עבודה %d"
#: ../src/core/prefs.c:2222 ../src/core/prefs.c:2400
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@@ -534,27 +547,27 @@ msgstr ""
"\"%s\" found in configuration database is not a valid value for keybinding "
"\"%s\"\n"
#: ../src/core/prefs.c:2773
#: ../src/core/prefs.c:2783
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr "Error setting name for workspace %d to \"%s\": %s\n"
#: ../src/core/prefs.c:2987
#: ../src/core/prefs.c:2997
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr "שגיאה בהגדרת מצב מצב החלונות החיים המוסתרים: %s\n"
#: ../src/core/prefs.c:3015
#: ../src/core/prefs.c:3032
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr "שגיאה בהגדרת מצב ללא לשוניות מוקפצות: %s\n"
#: ../src/core/screen.c:577
#: ../src/core/screen.c:663
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Screen %d on display '%s' is invalid\n"
#: ../src/core/screen.c:593
#: ../src/core/screen.c:679
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -563,71 +576,71 @@ msgstr ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
"replace option to replace the current window manager.\n"
#: ../src/core/screen.c:620
#: ../src/core/screen.c:706
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
#: ../src/core/screen.c:675
#: ../src/core/screen.c:761
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Screen %d on display \"%s\" already has a window manager\n"
#: ../src/core/screen.c:860
#: ../src/core/screen.c:946
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Could not release screen %d on display \"%s\"\n"
#: ../src/core/session.c:863 ../src/core/session.c:870
#: ../src/core/session.c:843 ../src/core/session.c:850
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Could not create directory '%s': %s\n"
#: ../src/core/session.c:880
#: ../src/core/session.c:860
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Could not open session file '%s' for writing: %s\n"
#: ../src/core/session.c:1021
#: ../src/core/session.c:1001
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Error writing session file '%s': %s\n"
#: ../src/core/session.c:1026
#: ../src/core/session.c:1006
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Error closing session file '%s': %s\n"
#: ../src/core/session.c:1156
#: ../src/core/session.c:1136
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Failed to parse saved session file: %s\n"
#: ../src/core/session.c:1205
#: ../src/core/session.c:1185
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "התכונה <mutter_session> מופיעה אך כבר יש בידינו את מספר זיהוי ההפעלה"
#: ../src/core/session.c:1218 ../src/core/session.c:1293
#: ../src/core/session.c:1325 ../src/core/session.c:1397
#: ../src/core/session.c:1457
#: ../src/core/session.c:1198 ../src/core/session.c:1273
#: ../src/core/session.c:1305 ../src/core/session.c:1377
#: ../src/core/session.c:1437
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Unknown attribute %s on <%s> element"
#: ../src/core/session.c:1235
#: ../src/core/session.c:1215
#, c-format
msgid "nested <window> tag"
msgstr "nested <window> tag"
#: ../src/core/session.c:1477
#: ../src/core/session.c:1457
#, c-format
msgid "Unknown element %s"
msgstr "Unknown element %s"
#: ../src/core/session.c:1829
#: ../src/core/session.c:1809
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -672,13 +685,13 @@ msgid "Window manager error: "
msgstr "Window manager error: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:616 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:632 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6550
#: ../src/core/window.c:6886
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -694,14 +707,14 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7213
#: ../src/core/window.c:7549
#, 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"
"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 ""
"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"
"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"
#: ../src/core/window-props.c:309
#, c-format
@@ -713,7 +726,7 @@ msgstr "Application set a bogus _NET_WM_PID %lu\n"
msgid "%s (on %s)"
msgstr "%s (מעל %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1484
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
@@ -758,14 +771,22 @@ msgstr ""
"other workspaces than the current one) should be kept alive."
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
msgstr ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"
msgstr "Live Hidden Windows"
#: ../src/mutter.schemas.in.h:4
#: ../src/mutter.schemas.in.h:5
msgid "Modifier to use for extended window management operations"
msgstr "Modifier to use for extended window management operations"
#: ../src/mutter.schemas.in.h:5
#: ../src/mutter.schemas.in.h:6
msgid ""
"This key will initiate the \"overlay\", which is a combination window "
"overview and application launching system. The default is intended to be the "
@@ -777,7 +798,7 @@ msgstr ""
"\"Windows key\" on PC hardware. It's expected that this binding either the "
"default or set to the empty string."
#: ../src/mutter.schemas.in.h:6
#: ../src/mutter.schemas.in.h:7
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
@@ -787,52 +808,56 @@ msgstr ""
"attached to the titlebar of the parent window and are moved together with "
"the parent window."
#: ../src/mutter.schemas.in.h:8
msgid "Workspaces only on primary"
msgstr "Workspaces only on primary"
#: ../src/tools/mutter-message.c:123
#, c-format
msgid "Usage: %s\n"
msgstr "שימוש: %s\n"
#: ../src/ui/frames.c:1099
#: ../src/ui/frames.c:1280
msgid "Close Window"
msgstr "סגור חלון"
#: ../src/ui/frames.c:1102
#: ../src/ui/frames.c:1283
msgid "Window Menu"
msgstr "תפריט חלון"
#: ../src/ui/frames.c:1105
#: ../src/ui/frames.c:1286
msgid "Minimize Window"
msgstr "מזער חלון"
#: ../src/ui/frames.c:1108
#: ../src/ui/frames.c:1289
msgid "Maximize Window"
msgstr "הגדל חלון"
#: ../src/ui/frames.c:1111
#: ../src/ui/frames.c:1292
msgid "Restore Window"
msgstr "שחזר חלון"
#: ../src/ui/frames.c:1114
#: ../src/ui/frames.c:1295
msgid "Roll Up Window"
msgstr "גלול חלון מעלה"
#: ../src/ui/frames.c:1117
#: ../src/ui/frames.c:1298
msgid "Unroll Window"
msgstr "בטל גלילה"
#: ../src/ui/frames.c:1120
#: ../src/ui/frames.c:1301
msgid "Keep Window On Top"
msgstr "שמור על החלון גלוי"
#: ../src/ui/frames.c:1123
#: ../src/ui/frames.c:1304
msgid "Remove Window From Top"
msgstr "בטל שמירת החלון גלוי"
#: ../src/ui/frames.c:1126
#: ../src/ui/frames.c:1307
msgid "Always On Visible Workspace"
msgstr "הראה בכל סביבות העבודה"
#: ../src/ui/frames.c:1129
#: ../src/ui/frames.c:1310
msgid "Put Window On Only One Workspace"
msgstr "הראה את החלון על סביבת עבודה אחת בלבד"
@@ -1145,12 +1170,17 @@ msgstr "Shade factor \"%s\" in shaded color is negative"
msgid "Could not parse color \"%s\""
msgstr "Could not parse color \"%s\""
#: ../src/ui/theme.c:1646
#: ../src/ui/theme.c:1481
#, c-format
msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
msgstr "Failed to retrieve color %s[%s] from GTK+ theme.\n"
#: ../src/ui/theme.c:1713
#, c-format
msgid "Coordinate expression contains character '%s' which is not allowed"
msgstr "Coordinate expression contains character '%s' which is not allowed"
#: ../src/ui/theme.c:1673
#: ../src/ui/theme.c:1740
#, c-format
msgid ""
"Coordinate expression contains floating point number '%s' which could not be "
@@ -1159,12 +1189,12 @@ msgstr ""
"Coordinate expression contains floating point number '%s' which could not be "
"parsed"
#: ../src/ui/theme.c:1687
#: ../src/ui/theme.c:1754
#, c-format
msgid "Coordinate expression contains integer '%s' which could not be parsed"
msgstr "Coordinate expression contains integer '%s' which could not be parsed"
#: ../src/ui/theme.c:1809
#: ../src/ui/theme.c:1876
#, c-format
msgid ""
"Coordinate expression contained unknown operator at the start of this text: "
@@ -1173,41 +1203,41 @@ msgstr ""
"Coordinate expression contained unknown operator at the start of this text: "
"\"%s\""
#: ../src/ui/theme.c:1866
#: ../src/ui/theme.c:1933
#, c-format
msgid "Coordinate expression was empty or not understood"
msgstr "Coordinate expression was empty or not understood"
#: ../src/ui/theme.c:1977 ../src/ui/theme.c:1987 ../src/ui/theme.c:2021
#: ../src/ui/theme.c:2044 ../src/ui/theme.c:2054 ../src/ui/theme.c:2088
#, c-format
msgid "Coordinate expression results in division by zero"
msgstr "Coordinate expression results in division by zero"
#: ../src/ui/theme.c:2029
#: ../src/ui/theme.c:2096
#, c-format
msgid ""
"Coordinate expression tries to use mod operator on a floating-point number"
msgstr ""
"Coordinate expression tries to use mod operator on a floating-point number"
#: ../src/ui/theme.c:2085
#: ../src/ui/theme.c:2152
#, c-format
msgid ""
"Coordinate expression has an operator \"%s\" where an operand was expected"
msgstr ""
"Coordinate expression has an operator \"%s\" where an operand was expected"
#: ../src/ui/theme.c:2094
#: ../src/ui/theme.c:2161
#, c-format
msgid "Coordinate expression had an operand where an operator was expected"
msgstr "Coordinate expression had an operand where an operator was expected"
#: ../src/ui/theme.c:2102
#: ../src/ui/theme.c:2169
#, c-format
msgid "Coordinate expression ended with an operator instead of an operand"
msgstr "Coordinate expression ended with an operator instead of an operand"
#: ../src/ui/theme.c:2112
#: ../src/ui/theme.c:2179
#, c-format
msgid ""
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
@@ -1216,38 +1246,38 @@ msgstr ""
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
"operand in between"
#: ../src/ui/theme.c:2263 ../src/ui/theme.c:2308
#: ../src/ui/theme.c:2330 ../src/ui/theme.c:2375
#, c-format
msgid "Coordinate expression had unknown variable or constant \"%s\""
msgstr "Coordinate expression had unknown variable or constant \"%s\""
#: ../src/ui/theme.c:2362
#: ../src/ui/theme.c:2429
#, c-format
msgid "Coordinate expression parser overflowed its buffer."
msgstr "Coordinate expression parser overflowed its buffer."
#: ../src/ui/theme.c:2391
#: ../src/ui/theme.c:2458
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr "Coordinate expression had a close parenthesis with no open parenthesis"
#: ../src/ui/theme.c:2455
#: ../src/ui/theme.c:2522
#, c-format
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
msgstr ""
"Coordinate expression had an open parenthesis with no close parenthesis"
#: ../src/ui/theme.c:2466
#: ../src/ui/theme.c:2533
#, c-format
msgid "Coordinate expression doesn't seem to have any operators or operands"
msgstr "Coordinate expression doesn't seem to have any operators or operands"
#: ../src/ui/theme.c:2676 ../src/ui/theme.c:2696 ../src/ui/theme.c:2716
#: ../src/ui/theme.c:2745 ../src/ui/theme.c:2765 ../src/ui/theme.c:2785
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "Theme contained an expression that resulted in an error: %s\n"
#: ../src/ui/theme.c:4410
#: ../src/ui/theme.c:4482
#, c-format
msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
@@ -1256,25 +1286,25 @@ msgstr ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
"specified for this frame style"
#: ../src/ui/theme.c:4940 ../src/ui/theme.c:4965
#: ../src/ui/theme.c:5012 ../src/ui/theme.c:5037
#, c-format
msgid ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
#: ../src/ui/theme.c:5013
#: ../src/ui/theme.c:5085
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "Failed to load theme \"%s\": %s\n"
#: ../src/ui/theme.c:5149 ../src/ui/theme.c:5156 ../src/ui/theme.c:5163
#: ../src/ui/theme.c:5170 ../src/ui/theme.c:5177
#: ../src/ui/theme.c:5221 ../src/ui/theme.c:5228 ../src/ui/theme.c:5235
#: ../src/ui/theme.c:5242 ../src/ui/theme.c:5249
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "No <%s> set for theme \"%s\""
#: ../src/ui/theme.c:5185
#: ../src/ui/theme.c:5257
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
@@ -1283,14 +1313,14 @@ msgstr ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
"type=\"%s\" style_set=\"whatever\"/> element"
#: ../src/ui/theme.c:5635 ../src/ui/theme.c:5697 ../src/ui/theme.c:5760
#: ../src/ui/theme.c:5707 ../src/ui/theme.c:5769 ../src/ui/theme.c:5832
#, c-format
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
msgstr ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
#: ../src/ui/theme.c:5643 ../src/ui/theme.c:5705 ../src/ui/theme.c:5768
#: ../src/ui/theme.c:5715 ../src/ui/theme.c:5777 ../src/ui/theme.c:5840
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "Constant \"%s\" has already been defined"

View File

@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-18 17:23+0100\n"
"PO-Revision-Date: 2011-03-18 18:03+0100\n"
"POT-Creation-Date: 2011-04-01 14:50+0200\n"
"PO-Revision-Date: 2011-04-01 14:53+0200\n"
"Last-Translator: Gabor Kelemen <kelemeng at gnome dot hu>\n"
"Language-Team: Hungarian <gnome at fsf dot hu>\n"
"Language: \n"
@@ -329,7 +329,7 @@ msgstr "Ablak áthelyezése a képernyő nyugati (bal) oldalához"
msgid "Move window to center of screen"
msgstr "Ablak áthelyezése a képernyő közepére"
#: ../src/core/bell.c:302
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr "Csengetés esemény"
@@ -562,12 +562,12 @@ msgstr "Hiba az élő rejtett ablakok állapot beállításakor: %s\n"
msgid "Error setting no tab popup status: %s\n"
msgstr "Hiba a nincs tab felugró állapot beállításakor: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:624
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "A(z) %d képernyő a(z) „%s” megjelenítőn érvénytelen\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:640
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -576,19 +576,19 @@ msgstr ""
"A(z) %d képernyő a(z) „%s” megjelenítőn már rendelkezik egy ablakkezelővel; "
"próbálja a --replace opcióval helyettesíteni a jelenlegi ablakkezelőt.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:667
#, c-format
msgid "Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr ""
"Nem sikerült beolvasni az ablakkezelő kiválasztását a(z) %d képernyőn a(z) "
"„%s” megjelenítőn\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:722
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "A(z) %d képernyőnek a(z) „%s” megjelenítőn már van ablakkezelője\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:907
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Nem sikerült elengedni a(z) %d képernyőt a(z) „%s” kijelzőn\n"
@@ -686,13 +686,13 @@ msgid "Window manager error: "
msgstr "Hibaüzenet az ablakkezelőtől: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:616 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6651
#: ../src/core/window.c:6847
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -708,7 +708,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7314
#: ../src/core/window.c:7510
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
@@ -728,7 +728,7 @@ msgstr "Az alkalmazás hibás _NET_WM_PID-értéket állított be: %lu\n"
msgid "%s (on %s)"
msgstr "%s (ezen: %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1482
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr ""
@@ -777,8 +777,8 @@ msgstr ""
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only the primary window."
msgstr "A munkaterület-váltás minden monitor ablakaihoz, vagy csak az elsődleges ablakhoz történjen meg."
"monitors or only for windows on the primary monitor."
msgstr "A munkaterület-váltás minden monitor ablakaihoz, vagy csak az elsődleges monitor ablakaihoz történjen meg."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"

View File

@@ -10,10 +10,10 @@ msgstr ""
"Project-Id-Version: metacity HEAD\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-18 18:57+0000\n"
"PO-Revision-Date: 2011-03-05 22:05+0700\n"
"POT-Creation-Date: 2011-03-28 22:21+0000\n"
"PO-Revision-Date: 2011-03-27 13:15+0700\n"
"Last-Translator: Dirgita <dirgitadevina@yahoo.co.id>\n"
"Language-Team: GNOME Indonesian Translation Team <gnome@i15n.org>\n"
"Language-Team: Indonesian <gnome@i15n.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -179,9 +179,8 @@ msgid "Toggle maximization state"
msgstr "Ubah kondisi maksimal"
#: ../src/core/all-keybindings.h:278
#, fuzzy
msgid "Toggle whether a window will always be visible over other windows"
msgstr "Turunkan jendela di bawah jendela lain"
msgstr "Membuat apakah jendela selalu terlihat di antara jendela yang lain"
#: ../src/core/all-keybindings.h:280
msgid "Maximize window"
@@ -212,9 +211,8 @@ msgid "Resize window"
msgstr "Rubah ukuran jendela"
#: ../src/core/all-keybindings.h:295
#, fuzzy
msgid "Toggle whether window is on all workspaces or just one"
msgstr "Togel jendela pada semua workspace"
msgstr "Membuat apakah jendela hanya ada di satu atau semua area kerja"
#: ../src/core/all-keybindings.h:299
msgid "Move window to workspace 1"
@@ -338,7 +336,7 @@ msgstr "Pindahkan jendela ke tengah layar"
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr ""
msgstr "Bel peristiwa"
#: ../src/core/core.c:157
#, c-format
@@ -412,10 +410,8 @@ msgid "Disable connection to session manager"
msgstr "Menonaktifkan koneksi ke manajer sesi"
#: ../src/core/main.c:212
#, fuzzy
#| msgid "Replace the running window manager with Mutter"
msgid "Replace the running window manager"
msgstr "Mengganti manajer program yang berjalan dengan Mutter"
msgstr "Mengganti manajer jendela yang tengah berjalan"
#: ../src/core/main.c:218
msgid "Specify session management ID"
@@ -431,7 +427,7 @@ msgstr "Aktifkan sesi dari berkas simpanan"
#: ../src/core/main.c:235
msgid "Make X calls synchronous"
msgstr ""
msgstr "Buat panggilan X selaras"
#: ../src/core/main.c:506
#, c-format
@@ -466,7 +462,7 @@ msgstr "Cetak versi"
#: ../src/core/mutter.c:62
msgid "Comma-separated list of compositor plugins"
msgstr ""
msgstr "Daftar kompositor pengaya yang dipisahkan koma"
#.
#. * We found it, but it was invalid. Complain.
@@ -557,19 +553,19 @@ msgstr "Ada error saat melakukan seting nama workspace %d ke \"%s\": %s\n"
#: ../src/core/prefs.c:2997
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr ""
msgstr "Galat ketika menyetel status jendela tersembunyi: %s\n"
#: ../src/core/prefs.c:3032
#, fuzzy, c-format
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr "Ada error saat melakukan seting nama workspace %d ke \"%s\": %s\n"
msgstr "Galat ketika menyetel status popup tanpa tab: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:624
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Layar %d pada tampilan '%s' tidak benar\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:640
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -578,7 +574,7 @@ msgstr ""
"Layar %d pada tampilan \"%s\" sudah memiliki pengatur jendela. Cobalah "
"gunakan pilihan --replace untuk mengganti pengatur jendela yang aktif.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:667
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
@@ -586,12 +582,12 @@ msgstr ""
"Tidak dapat mendapatkan pilihan pengatur jendela pada layar %d tampilan \"%s"
"\"\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:722
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Layar %d pada tampilan \"%s\" sudah ada pengatur jendelanya\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:907
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Layar %d pada tampilan \"%s\" tidak dapat dilepas\n"
@@ -624,7 +620,7 @@ msgstr "Gagal membaca berkas sesi simpanan: %s\n"
#: ../src/core/session.c:1179
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr ""
msgstr "Atribut <mutter_session> terlihat tapi kode sesi sudah ada sebelumnya"
#: ../src/core/session.c:1192 ../src/core/session.c:1267
#: ../src/core/session.c:1299 ../src/core/session.c:1371
@@ -694,7 +690,7 @@ msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6752
#: ../src/core/window.c:6847
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -710,7 +706,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7415
#: ../src/core/window.c:7510
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
@@ -730,7 +726,7 @@ msgstr "Aplikasi telah membuat _NET_WM_PID %lu bohongan\n"
msgid "%s (on %s)"
msgstr "%s (pada %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1482
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "WM_TRANSIENT_FOR salah jendela 0x%lx ditentukan untuk %s.\n"
@@ -764,29 +760,31 @@ msgstr ""
#: ../src/mutter.schemas.in.h:1
msgid "Attach modal dialogs"
msgstr ""
msgstr "Lampirkan dialog modal"
#: ../src/mutter.schemas.in.h:2
msgid ""
"Determines whether hidden windows (i.e., minimized windows and windows on "
"other workspaces than the current one) should be kept alive."
msgstr ""
"Menentukan apakah jendela yang tersembunyi (cth. jendela yang dikecilkan dan "
"jendela pada area kerja lain) tetap hidup/dipertahankan."
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only the primary window."
"monitors or only for windows on the primary monitor."
msgstr ""
"Menentukan apakah perpindahan area kerja hanya terjadi pada jendela aplikasi "
"di semua monitor atau hanya untuk jendela pada monitor utama."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"
msgstr ""
msgstr "Kelangsungan Jendela Tersembunyi"
#: ../src/mutter.schemas.in.h:5
#, fuzzy
msgid "Modifier to use for extended window management operations"
msgstr ""
"Tombol yang digunakan untuk menjalankan suatu perintah apabila jendela diklik"
msgstr "Tombol yang digunakan untuk memperluas operasi manajemen jendela"
#: ../src/mutter.schemas.in.h:6
msgid ""
@@ -802,6 +800,8 @@ msgid ""
"attached to the titlebar of the parent window and are moved together with "
"the parent window."
msgstr ""
"Jika bernilai \"true\", maka dialog modal akan muncul menempel pada baris "
"judul jendela utama dan bergerak seiring perpindahan jendela utama tersebut."
#: ../src/mutter.schemas.in.h:8
msgid "Workspaces only on primary"
@@ -833,22 +833,20 @@ msgid "Restore Window"
msgstr "Kembalikan Ukuran jendela"
#: ../src/ui/frames.c:1114
#, fuzzy
msgid "Roll Up Window"
msgstr "G_ulung"
msgstr "Menggulung Jendela"
#: ../src/ui/frames.c:1117
#, fuzzy
msgid "Unroll Window"
msgstr "Tutup Jendela"
msgstr "Tidak Menggulung Jendela"
#: ../src/ui/frames.c:1120
msgid "Keep Window On Top"
msgstr ""
msgstr "Jaga Jendela Di Atas"
#: ../src/ui/frames.c:1123
msgid "Remove Window From Top"
msgstr ""
msgstr "Hapus Jendela Dari Atas"
#: ../src/ui/frames.c:1126
msgid "Always On Visible Workspace"
@@ -1266,9 +1264,9 @@ msgid "Coordinate expression doesn't seem to have any operators or operands"
msgstr "Ekspresi koordinat sepertinya tidak memiliki operator atau operan"
#: ../src/ui/theme.c:2676 ../src/ui/theme.c:2696 ../src/ui/theme.c:2716
#, fuzzy, c-format
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "Tema berisi ekspresi \"%s\" yang menghasilkan error: %s\n"
msgstr "Tema mengandung ekspresi yang menghasilkan galat: %s\n"
#: ../src/ui/theme.c:4410
#, c-format
@@ -1417,6 +1415,7 @@ msgstr "<%s> harus menentukan geometri atau induk yang ada geometrinya"
#: ../src/ui/theme-parser.c:1196
msgid "You must specify a background for an alpha value to be meaningful"
msgstr ""
"Anda mesti menyatakan suatu latar belakang bagi nilai alfa agar berarti"
#: ../src/ui/theme-parser.c:1264
#, c-format
@@ -1626,7 +1625,7 @@ msgstr ""
#: ../src/ui/theme-parser.c:3434
#, c-format
msgid "Bad version specification '%s'"
msgstr ""
msgstr "Spesifikasi versi '%s' jelek"
#: ../src/ui/theme-parser.c:3507
msgid ""
@@ -1639,7 +1638,7 @@ msgstr ""
#: ../src/ui/theme-parser.c:3530
#, c-format
msgid "Theme requires version %s but latest supported theme version is %d.%d"
msgstr ""
msgstr "Tema memerlukan versi %s tetapi versi yang didukung adalah %d.%d"
#: ../src/ui/theme-parser.c:3562
#, c-format
@@ -1799,9 +1798,8 @@ msgid "Border"
msgstr "Batas"
#: ../src/ui/theme-viewer.c:413
#, fuzzy
msgid "Attached Modal Dialog"
msgstr "Kotak Dialog Modal"
msgstr "Dialog Modal yang Dilampirkan"
#: ../src/ui/theme-viewer.c:744
#, c-format

2119
po/ja.po

File diff suppressed because it is too large Load Diff

5596
po/kn.po

File diff suppressed because it is too large Load Diff

View File

@@ -18,8 +18,8 @@ msgstr ""
"Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-17 13:27+0000\n"
"PO-Revision-Date: 2011-03-19 23:39+0900\n"
"POT-Creation-Date: 2011-03-21 19:31+0000\n"
"PO-Revision-Date: 2011-04-02 20:10+0900\n"
"Last-Translator: Changwoo Ryu <cwryu@debian.org>\n"
"Language-Team: GNOME Korea <gnome-kr@googlegroups.com>\n"
"MIME-Version: 1.0\n"
@@ -336,7 +336,7 @@ msgstr "창을 화면 왼쪽 가장자리로 옮기기"
msgid "Move window to center of screen"
msgstr "창을 화면 가운데로 옮기기"
#: ../src/core/bell.c:302
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr "삑소리 이벤트"
@@ -431,12 +431,12 @@ msgstr "저장 파일에서 세션을 초기화 합니다"
msgid "Make X calls synchronous"
msgstr "동기 X 호출을 합니다"
#: ../src/core/main.c:508
#: ../src/core/main.c:506
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "테마 디렉터리를 읽는 데 실패했습니다: %s\n"
#: ../src/core/main.c:524
#: ../src/core/main.c:522
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -594,54 +594,54 @@ msgstr ""
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "디스플레이 \"%2$s\"의 화면 %1$d을(를) 떼어 놓을수 없습니다\n"
#: ../src/core/session.c:863 ../src/core/session.c:870
#: ../src/core/session.c:837 ../src/core/session.c:844
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "디렉터리 '%s'을(를) 만들 수 없습니다: %s\n"
#: ../src/core/session.c:880
#: ../src/core/session.c:854
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "세션 파일 '%s'을(를) 쓰기위해 열 수 없습니다: %s\n"
#: ../src/core/session.c:1021
#: ../src/core/session.c:995
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "세션 파일 '%s'을(를) 쓰는 중 오류: %s\n"
#: ../src/core/session.c:1026
#: ../src/core/session.c:1000
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "세션 파일 '%s'을(를) 닫는 중 오류: %s\n"
#: ../src/core/session.c:1156
#: ../src/core/session.c:1130
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "저장된 세션파일을 분석하기 실패: %s\n"
#: ../src/core/session.c:1205
#: ../src/core/session.c:1179
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "이미 세션 ID를 가지고 있는데 <mutter_session> 속성이 나왔습니다."
#: ../src/core/session.c:1218 ../src/core/session.c:1293
#: ../src/core/session.c:1325 ../src/core/session.c:1397
#: ../src/core/session.c:1457
#: ../src/core/session.c:1192 ../src/core/session.c:1267
#: ../src/core/session.c:1299 ../src/core/session.c:1371
#: ../src/core/session.c:1431
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "<%2$s> 엘리먼트에 알 수 없는 속성 %1$s"
#: ../src/core/session.c:1235
#: ../src/core/session.c:1209
#, c-format
msgid "nested <window> tag"
msgstr "포함된 <window> 태그"
#: ../src/core/session.c:1477
#: ../src/core/session.c:1451
#, c-format
msgid "Unknown element %s"
msgstr "알 수 없는 속성 %s"
#: ../src/core/session.c:1829
#: ../src/core/session.c:1803
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -686,13 +686,13 @@ msgid "Window manager error: "
msgstr "장 관리자 오류: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:616 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "머터"
#. first time through
#: ../src/core/window.c:6651
#: ../src/core/window.c:6752
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -708,7 +708,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7314
#: ../src/core/window.c:7415
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
@@ -776,8 +776,10 @@ msgstr ""
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only the primary window."
msgstr "작업 공간을 전환할 때 모든 모니터의 창에 대해 할지 주 모니터의 창에서만 할지 결정합니다."
"monitors or only for windows on the primary monitor."
msgstr ""
"작업 공간을 전환할 때 모든 모니터의 창에 대해 할지 주 모니터의 창에서만 할지 "
"결정합니다."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"

225
po/lv.po
View File

@@ -10,14 +10,15 @@ msgstr ""
"Project-Id-Version: lv\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-17 13:27+0000\n"
"PO-Revision-Date: 2011-03-17 18:06+0200\n"
"POT-Creation-Date: 2011-03-21 19:31+0000\n"
"PO-Revision-Date: 2011-03-26 13:54+0200\n"
"Last-Translator: Rudolfs <rudolfs.mazurs@gmail.com>\n"
"Language-Team: Latvian <locale@laka.lv>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : "
"2);\n"
"X-Generator: Lokalize 1.1\n"
#: ../src/core/all-keybindings.h:88
@@ -106,7 +107,8 @@ msgstr "Pārvietoties starp paneļiem un darbvirsmu, lietojot izlecošo logu"
#: ../src/core/all-keybindings.h:166
msgid "Move backward between panels and the desktop, using a popup window"
msgstr "Pārvietoties atpakaļ starp paneļiem un darbvirsmu, lietojot izlecošo logu"
msgstr ""
"Pārvietoties atpakaļ starp paneļiem un darbvirsmu, lietojot izlecošo logu"
#: ../src/core/all-keybindings.h:171
msgid "Move between windows of an application immediately"
@@ -133,7 +135,6 @@ msgid "Move backward between panels and the desktop immediately"
msgstr "Nekavējoties pārvietoties atpakaļ starp paneļiem un darbvirsmu"
#: ../src/core/all-keybindings.h:203
#| msgid "Hide all normal windows and set focus to the desktop background"
msgid "Hide all normal windows and set focus to the desktop"
msgstr "Paslēpt visus logus un fokusēties uz darbvirsmu"
@@ -329,7 +330,7 @@ msgstr "Pārvietot logu uz ekrāna rietumu (kreiso) malu"
msgid "Move window to center of screen"
msgstr "Pārvietot logu uz ekrāna centru"
#: ../src/core/bell.c:302
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr "Zvana notikums"
@@ -341,8 +342,6 @@ msgstr "Nezināms logu informācijas pieprasījums: %d"
#. Translators: %s is a window title
#: ../src/core/delete.c:94
#, c-format
#, c-format
#| msgid "\"%s\" is not responding."
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> nereaģē."
@@ -377,7 +376,8 @@ msgstr "Neizdevās atvērt X logu sistēmas displeju '%s'\n"
msgid ""
"Some other program is already using the key %s with modifiers %x as a "
"binding\n"
msgstr "Kāda cita programma jau lieto taustiņu %s ar modificētājiem %x kā sasaisti\n"
msgstr ""
"Kāda cita programma jau lieto taustiņu %s ar modificētājiem %x kā sasaisti\n"
#. Displayed when a keybinding which is
#. * supposed to launch a program fails.
@@ -408,7 +408,6 @@ msgid "Disable connection to session manager"
msgstr "Atslēgt savienojumu ar sesiju pārvaldnieku"
#: ../src/core/main.c:212
#| msgid "Replace the running window manager with Metacity"
msgid "Replace the running window manager"
msgstr "Aizvietot darbojošos logu pārvaldnieku"
@@ -428,27 +427,21 @@ msgstr "Inicializēt sesiju no saglabātā faila"
msgid "Make X calls synchronous"
msgstr "Padarīt X izsaukumus sinhronus"
#: ../src/core/main.c:508
#: ../src/core/main.c:506
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Neizdevās noskanēt tēmu direktoriju: %s\n"
#: ../src/core/main.c:524
#: ../src/core/main.c:522
#, c-format
msgid "Could not find a theme! Be sure %s exists and contains the usual themes.\n"
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
msgstr ""
"Neizdevās atrast tēmu! Pārliecinieties, ka %s eksistē un satur parastās "
"tēmas.\n"
#: ../src/core/mutter.c:42
#, c-format
#, c-format
#| msgid ""
#| "metacity %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"
@@ -482,15 +475,11 @@ msgstr "Ar komatu atdalīts kompozīcijas spraudņu saraksts"
#.
#.
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
#: ../src/core/prefs.c:536
#: ../src/core/prefs.c:697
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "GConf atslēga '%s' ir iestatīta uz nederīgu vērtību\n"
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
#: ../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, kas saglabāts GConf atslēgā %s, ir ārpus %d līdz %d diapazona\n"
@@ -498,34 +487,23 @@ msgstr "%d, kas saglabāts GConf atslēgā %s, ir ārpus %d līdz %d diapazona\n
#: ../src/core/prefs.c:674 ../src/core/prefs.c:751 ../src/core/prefs.c:799
#: ../src/core/prefs.c:863 ../src/core/prefs.c:1324 ../src/core/prefs.c:1340
#: ../src/core/prefs.c:1357 ../src/core/prefs.c:1373
#: ../src/core/prefs.c:667
#: ../src/core/prefs.c:744
#: ../src/core/prefs.c:792
#: ../src/core/prefs.c:856
#: ../src/core/prefs.c:1317
#: ../src/core/prefs.c:1333
#: ../src/core/prefs.c:1350
#: ../src/core/prefs.c:1366
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "GConf atslēga \"%s\" ir iestatīta uz nederīgu tipu\n"
#: ../src/core/prefs.c:1203
#: ../src/core/prefs.c:1196
#, c-format
msgid "GConf key %s is already in use and can't be used to override %s\n"
msgstr ""
"GConf atslēga \"%s\" jau tiek izmantota un to nevar izmantot, lai pārrakstītu "
"%s\n"
"GConf atslēga \"%s\" jau tiek izmantota un to nevar izmantot, lai "
"pārrakstītu %s\n"
#: ../src/core/prefs.c:1262
#: ../src/core/prefs.c:1255
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "Nevar pārrakstīt GConf atslēgu, %s nav atrasts\n"
#: ../src/core/prefs.c:1447
#: ../src/core/prefs.c:1440
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@@ -534,13 +512,11 @@ msgstr ""
"pareizi.\n"
#: ../src/core/prefs.c:1524
#: ../src/core/prefs.c:1517
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr "Neizdevās parsēt fonta aprakstu \"%s\" no GConf atslēgas %s\n"
#: ../src/core/prefs.c:1586
#: ../src/core/prefs.c:1579
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@@ -550,21 +526,16 @@ msgstr ""
"modifikatoram\n"
#: ../src/core/prefs.c:2016
#: ../src/core/prefs.c:2006
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "Kļūda, iestatot darbvietu daudzumu uz %d: %s\n"
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
#: ../src/core/prefs.c:2190
#: ../src/core/prefs.c:2692
#, c-format
msgid "Workspace %d"
msgstr "Darbvieta %d"
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
#: ../src/core/prefs.c:2222
#: ../src/core/prefs.c:2400
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@@ -574,114 +545,98 @@ msgstr ""
"taustiņsasaistei \"%s\"\n"
#: ../src/core/prefs.c:2783
#: ../src/core/prefs.c:2773
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr "Kļūda, iestatot darbvietas %d nosaukumu uz \"%s\": %s\n"
#: ../src/core/prefs.c:2997
#: ../src/core/prefs.c:2987
#, c-format
#, c-format
#| msgid "Error setting compositor status: %s\n"
msgid "Error setting live hidden windows status status: %s\n"
msgstr "Kļūda, iestatot dzīvo slēptā loga statusu: %s\n"
#: ../src/core/prefs.c:3032
#: ../src/core/prefs.c:3015
#, c-format
#, c-format
#| msgid "Error setting compositor status: %s\n"
msgid "Error setting no tab popup status: %s\n"
msgstr "Kļūda, iestatot bez ciļņu uzvednes statusu: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:577
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Ekrāna %d displejs \"%s\" ir nederīgs\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:593
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
"replace option to replace the current window manager.\n"
msgstr ""
"Ekrāna %d displejam \"%s\" jau ir logu pārvaldnieks; mēģiniet lietot --replace "
"iespēju, lai aizvietotu pašreizējo logu pārvaldnieku.\n"
"Ekrāna %d displejam \"%s\" jau ir logu pārvaldnieks; mēģiniet lietot --"
"replace iespēju, lai aizvietotu pašreizējo logu pārvaldnieku.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:620
#, c-format
msgid "Could not acquire window manager selection on screen %d display \"%s\"\n"
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr "Neizdevās iegūt logu pārvaldnieka izvēli ekrāna %d displejā \"%s\"\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:675
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Ekrāna %d displejam \"%s\" jau ir logu pārvaldnieks\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:860
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Neizdevās atlaist ekrānu %d uz displeja \"%s\"\n"
#: ../src/core/session.c:863 ../src/core/session.c:870
#: ../src/core/session.c:837 ../src/core/session.c:844
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Neizdevās izveidot mapi '%s': %s\n"
#: ../src/core/session.c:880
#: ../src/core/session.c:854
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Neizdevās atvērt sesijas failu '%s' rakstīšanai: %s\n"
#: ../src/core/session.c:1021
#: ../src/core/session.c:995
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Kļūda, ierakstot sesijas failu '%s': %s\n"
#: ../src/core/session.c:1026
#: ../src/core/session.c:1000
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Kļūda, aizverot sesijas failu '%s': %s\n"
#: ../src/core/session.c:1156
#: ../src/core/session.c:1130
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Kļūda, parsējot saglabāto sesijas failu: %s\n"
#: ../src/core/session.c:1205
#: ../src/core/session.c:1179
#, c-format
#, c-format
#| msgid "<metacity_session> attribute seen but we already have the session ID"
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "<mutter_session> atribūts pamanits, bet mums jau ir sesijas ID"
#: ../src/core/session.c:1218 ../src/core/session.c:1293
#: ../src/core/session.c:1325 ../src/core/session.c:1397
#: ../src/core/session.c:1457
#: ../src/core/session.c:1192 ../src/core/session.c:1267
#: ../src/core/session.c:1299 ../src/core/session.c:1371
#: ../src/core/session.c:1431
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Nezināms atribūts %s <%s> elementam"
#: ../src/core/session.c:1235
#: ../src/core/session.c:1209
#, c-format
msgid "nested <window> tag"
msgstr "ligzdota <window> birka"
#: ../src/core/session.c:1477
#: ../src/core/session.c:1451
#, c-format
msgid "Unknown element %s"
msgstr "Nezināms elements %s"
#: ../src/core/session.c:1829
#| msgid ""
#| "These windows do not support \"save current setup\" and will have to be "
#| "restarted manually next time you log in."
#: ../src/core/session.c:1803
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -706,8 +661,6 @@ msgstr "Atvērtais žurnāla fails %s\n"
#: ../src/core/util.c:146 ../src/tools/mutter-message.c:149
#, c-format
#, c-format
#| msgid "Metacity was compiled without support for verbose mode\n"
msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mutter tika kompilēts bez vārdiskā režīma atbalsta\n"
@@ -728,14 +681,13 @@ msgid "Window manager error: "
msgstr "Logu pārvaldnieka kļūda: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:616 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6651
#: ../src/core/window.c:6492
#: ../src/core/window.c:6752
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -751,8 +703,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7314
#: ../src/core/window.c:7155
#: ../src/core/window.c:7415
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
@@ -772,7 +723,6 @@ msgid "%s (on %s)"
msgstr "%s (uz %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1478
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Nederīgs WM_TRANSIENT_FOR logs 0x%lx norādīts %s.\n"
@@ -799,8 +749,10 @@ msgstr "Rekvizīts %s logā 0x%lx saturēja nederīgu UTF-8\n"
#: ../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 "Rekvizīts %slogā 0x%lx saturēja nederīgu UTF-8 priekšmetam %d no saraksta\n"
msgid ""
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
msgstr ""
"Rekvizīts %slogā 0x%lx saturēja nederīgu UTF-8 priekšmetam %d no saraksta\n"
#: ../src/mutter.schemas.in.h:1
msgid "Attach modal dialogs"
@@ -815,19 +767,21 @@ msgstr ""
"atrodas citās darbvietās) uzturēt pie dzīvības."
#: ../src/mutter.schemas.in.h:3
#| msgid ""
#| "Determines whether workspace switching should happen for windows on all "
#| "monitors or only the primary window."
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only the primary window."
"monitors or only for windows on the primary monitor."
msgstr ""
"Nosaka, vai darbvietu pārslēgšanai vajadzētu notikt visiem logiem visos monitoros, "
"vai tikai galvenajam logam."
"Nosaka, vai darbvietu pārslēgšanai vajadzētu notikt visiem logiem visos "
"monitoros, vai tikai logiem galvenajā monitorā."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"
msgstr "Dzīvie slēptie logi"
#: ../src/mutter.schemas.in.h:5
#| msgid "Modifier to use for modified window click actions"
msgid "Modifier to use for extended window management operations"
msgstr "Modifikators, kuru lietot paplašinātām loga pārvaldības darbībām"
@@ -839,8 +793,9 @@ msgid ""
"default or set to the empty string."
msgstr ""
"Šis taustiņš inicializēs \"pārklāšanu\", kas ir kombināciju loga pārskats un "
"lietotnes palaišanas sistēma. Noklusētais parasti ir \"Windows taustiņš\" uz PC "
"aparatūras. Tiek sagaidīts, ka šī sasaite ir vai nu noklusētā, vai tukša virkne."
"lietotnes palaišanas sistēma. Noklusētais parasti ir \"Windows taustiņš\" uz "
"PC aparatūras. Tiek sagaidīts, ka šī sasaite ir vai nu noklusētā, vai tukša "
"virkne."
#: ../src/mutter.schemas.in.h:7
msgid ""
@@ -848,8 +803,9 @@ msgid ""
"attached to the titlebar of the parent window and are moved together with "
"the parent window."
msgstr ""
"Ja patiess, vietā, lai būtu neatkarīgas virsraksta joslas, modālais dialogs būs "
"piesaistīts virsraksta joslai vecāka logam un tiks pārvietots kopā ar vecāka logu."
"Ja patiess, vietā, lai būtu neatkarīgas virsraksta joslas, modālais dialogs "
"būs piesaistīts virsraksta joslai vecāka logam un tiks pārvietots kopā ar "
"vecāka logu."
#: ../src/mutter.schemas.in.h:8
msgid "Workspaces only on primary"
@@ -1159,8 +1115,8 @@ msgid ""
"GTK color specification must have a close bracket after the state, e.g. gtk:"
"fg[NORMAL] where NORMAL is the state; could not parse \"%s\""
msgstr ""
"GTK krāsas specifikācijā ir jābūt kvadrātiekavām pēc stāvokļa, piem., "
"gtk:fg[NORMAL], kur NORMAL ir stāvoklis; neizdevās parsēt \"%s\""
"GTK krāsas specifikācijā ir jābūt kvadrātiekavām pēc stāvokļa, piem., gtk:fg"
"[NORMAL], kur NORMAL ir stāvoklis; neizdevās parsēt \"%s\""
#: ../src/ui/theme.c:1227
#, c-format
@@ -1193,8 +1149,10 @@ msgstr "Alfa vērtība \"%s\" sapludinātajā krāsā nav starp 0.0 un 1.0"
#: ../src/ui/theme.c:1338
#, c-format
msgid "Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
msgstr "Ēnošanas formāts ir \"shade/base_color/factor\", \"%s\" neatbilst formātam"
msgid ""
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
msgstr ""
"Ēnošanas formāts ir \"shade/base_color/factor\", \"%s\" neatbilst formātam"
#: ../src/ui/theme.c:1349
#, c-format
@@ -1247,12 +1205,15 @@ msgstr "Koordinātu izteiksme noved pie dalīšanas ar nulli"
#: ../src/ui/theme.c:2029
#, c-format
msgid "Coordinate expression tries to use mod operator on a floating-point number"
msgstr "Koordinātu izteiksme mēģina lietot mod operatoru uz peldošā punkta skaitļa"
msgid ""
"Coordinate expression tries to use mod operator on a floating-point number"
msgstr ""
"Koordinātu izteiksme mēģina lietot mod operatoru uz peldošā punkta skaitļa"
#: ../src/ui/theme.c:2085
#, c-format
msgid "Coordinate expression has an operator \"%s\" where an operand was expected"
msgid ""
"Coordinate expression has an operator \"%s\" where an operand was expected"
msgstr "Koordinātu izteiksmei ir operators \"%s\", kur tika gaidīts operands"
#: ../src/ui/theme.c:2094
@@ -1287,12 +1248,14 @@ msgstr "Koordinātu izteiksme pārpildīja parsera buferi."
#: ../src/ui/theme.c:2391
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr "Koordinātu izteiksmei bija aizvērtās iekavas bez nevienas atvērtās iekavas"
msgstr ""
"Koordinātu izteiksmei bija aizvērtās iekavas bez nevienas atvērtās iekavas"
#: ../src/ui/theme.c:2455
#, c-format
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
msgstr "Koordinātu izteiksmei bija atvērtās iekavas bez nevienas aizvērtās iekavas"
msgstr ""
"Koordinātu izteiksmei bija atvērtās iekavas bez nevienas aizvērtās iekavas"
#: ../src/ui/theme.c:2466
#, c-format
@@ -1310,13 +1273,15 @@ msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
"specified for this frame style"
msgstr ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"jebkas\"/> jābūt noteiktam šajā "
"rāmja stilā"
"<button function=\"%s\" state=\"%s\" draw_ops=\"jebkas\"/> jābūt noteiktam "
"šajā rāmja stilā"
#: ../src/ui/theme.c:4940 ../src/ui/theme.c:4965
#, c-format
msgid "Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr "Iztrūkst <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"jebkas\"/>"
msgid ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr ""
"Iztrūkst <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"jebkas\"/>"
#: ../src/ui/theme.c:5013
#, c-format
@@ -1335,13 +1300,15 @@ msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
"type=\"%s\" style_set=\"whatever\"/> element"
msgstr ""
"Nav rāmja stila kopas loga tipam \"%s\" tēmā \"%s\"; pievienojiet <window type=\""
"%s\" style_set=\"jebkas\"/> elementu"
"Nav rāmja stila kopas loga tipam \"%s\" tēmā \"%s\"; pievienojiet <window "
"type=\"%s\" style_set=\"jebkas\"/> elementu"
#: ../src/ui/theme.c:5635 ../src/ui/theme.c:5697 ../src/ui/theme.c:5760
#, c-format
msgid "User-defined constants must begin with a capital letter; \"%s\" does not"
msgstr "Lietotāja definētajām konstantēm jāsākas ar lielo burtu; \"%s\" nesākas"
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
msgstr ""
"Lietotāja definētajām konstantēm jāsākas ar lielo burtu; \"%s\" nesākas"
#: ../src/ui/theme.c:5643 ../src/ui/theme.c:5705 ../src/ui/theme.c:5768
#, c-format
@@ -1409,7 +1376,8 @@ msgstr "Leņķim jābūt starp 0.0 un 360.0, bija %g\n"
#: ../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 jābūt starp 0.0 (neredzams) un 1.0 (pilnībā necaurredzams), bija %g\n"
msgstr ""
"Alfa jābūt starp 0.0 (neredzams) un 1.0 (pilnībā necaurredzams), bija %g\n"
#: ../src/ui/theme-parser.c:863
#, c-format
@@ -1417,8 +1385,8 @@ msgid ""
"Invalid title scale \"%s\" (must be one of xx-small,x-small,small,medium,"
"large,x-large,xx-large)\n"
msgstr ""
"Nederīgs virsraksta mērogs \"%s\" (var būt: xx-"
"small,x-small,small,medium,large,x-large,xx-large)\n"
"Nederīgs virsraksta mērogs \"%s\" (var būt: xx-small,x-small,small,medium,"
"large,x-large,xx-large)\n"
#: ../src/ui/theme-parser.c:1019 ../src/ui/theme-parser.c:1082
#: ../src/ui/theme-parser.c:1116 ../src/ui/theme-parser.c:1219
@@ -1476,7 +1444,8 @@ msgid ""
"Cannot specify both \"button_width\"/\"button_height\" and \"aspect_ratio\" "
"for buttons"
msgstr ""
"Nevar noteikt gan \"button_width\"/\"button_height\", gan \"aspect_ratio\" pogām"
"Nevar noteikt gan \"button_width\"/\"button_height\", gan \"aspect_ratio\" "
"pogām"
#: ../src/ui/theme-parser.c:1450
#, c-format
@@ -1605,8 +1574,10 @@ msgstr ""
#: ../src/ui/theme-parser.c:3161
#, c-format
msgid "Should not have \"resize\" attribute on <%s> element for maximized states"
msgstr "Elementam <%s> nevajadzētu būt \"resize\" atribūtam maksimizētajos stāvokļos"
msgid ""
"Should not have \"resize\" attribute on <%s> element for maximized states"
msgstr ""
"Elementam <%s> nevajadzētu būt \"resize\" atribūtam maksimizētajos stāvokļos"
#: ../src/ui/theme-parser.c:3175 ../src/ui/theme-parser.c:3222
#, c-format
@@ -1671,7 +1642,8 @@ msgstr "Ārējam tēmas elementam jābūt <metacity_theme>, nevis <%s>"
#: ../src/ui/theme-parser.c:3582
#, c-format
msgid "Element <%s> is not allowed inside a name/author/date/description element"
msgid ""
"Element <%s> is not allowed inside a name/author/date/description element"
msgstr "Elements <%s> netiek atļauts elementā name/author/date/description"
#: ../src/ui/theme-parser.c:3587
@@ -1681,7 +1653,8 @@ msgstr "Elements <%s> netiek atļauts elementā <constant>"
#: ../src/ui/theme-parser.c:3599
#, c-format
msgid "Element <%s> is not allowed inside a distance/border/aspect_ratio element"
msgid ""
"Element <%s> is not allowed inside a distance/border/aspect_ratio element"
msgstr "Elements <%s> netiek atļauts distance/border/aspect_ratio elementā"
#: ../src/ui/theme-parser.c:3621
@@ -1712,8 +1685,6 @@ msgstr "Teksts nav atļauts elementā <%s>"
#: ../src/ui/theme-parser.c:4050 ../src/ui/theme-parser.c:4062
#: ../src/ui/theme-parser.c:4074
#, c-format
#, c-format
#| msgid "<name> specified twice for this theme"
msgid "<%s> specified twice for this theme"
msgstr "<%s> šai tēmai noteikts divreiz"
@@ -1723,57 +1694,46 @@ msgid "Failed to find a valid file for theme %s\n"
msgstr "Neizdevās atrast derīgu faila nosaukumu tēmai %s\n"
#: ../src/ui/theme-viewer.c:99
#| msgid "/_Windows"
msgid "_Windows"
msgstr "_Windows"
#: ../src/ui/theme-viewer.c:100
#| msgid "Dialog Box"
msgid "_Dialog"
msgstr "_Dialoglodziņš"
#: ../src/ui/theme-viewer.c:101
#| msgid "Modal Dialog Box"
msgid "_Modal dialog"
msgstr "_Modālais dialogs"
#: ../src/ui/theme-viewer.c:102
#| msgid "/Windows/_Utility"
msgid "_Utility"
msgstr "_Utilīta"
#: ../src/ui/theme-viewer.c:103
#| msgid "/Windows/_Splashscreen"
msgid "_Splashscreen"
msgstr "Uzplaik_snījuma ekrāns"
#: ../src/ui/theme-viewer.c:104
#| msgid "/Windows/_Top dock"
msgid "_Top dock"
msgstr "Au_gšējais doks"
#: ../src/ui/theme-viewer.c:105
#| msgid "/Windows/_Bottom dock"
msgid "_Bottom dock"
msgstr "Apakšējais _doks"
#: ../src/ui/theme-viewer.c:106
#| msgid "/Windows/_Left dock"
msgid "_Left dock"
msgstr "_Kreisais doks"
#: ../src/ui/theme-viewer.c:107
#| msgid "/Windows/_Right dock"
msgid "_Right dock"
msgstr "La_bais doks"
#: ../src/ui/theme-viewer.c:108
#| msgid "/Windows/_All docks"
msgid "_All docks"
msgstr "_Visi doki"
#: ../src/ui/theme-viewer.c:109
#| msgid "Desktop"
msgid "Des_ktop"
msgstr "Darbvi_rsma"
@@ -1831,7 +1791,6 @@ msgid "Border"
msgstr "Apmale"
#: ../src/ui/theme-viewer.c:413
#| msgid "Modal Dialog Box"
msgid "Attached Modal Dialog"
msgstr "Piesaistītais modālais dialogs"

153
po/nb.po
View File

@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: mutter 2.91.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-22 11:13+0100\n"
"PO-Revision-Date: 2011-03-22 11:13+0100\n"
"POT-Creation-Date: 2011-07-02 00:15+0200\n"
"PO-Revision-Date: 2011-07-02 00:16+0200\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-no@lister.ping.uio.no>\n"
"Language: \n"
@@ -15,6 +15,15 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit
#: ../src/compositor/compositor.c:509
#, c-format
msgid ""
"Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr "En annen compositing manager kjører skjerm %i på display «%s»."
#: ../src/core/all-keybindings.h:88
msgid "Switch to workspace 1"
msgstr "Bytt til arbeidsområde 1"
@@ -332,13 +341,16 @@ msgstr "Klokkehendelse"
msgid "Unknown window information request: %d"
msgstr "Ukjent forespørsel om vindusinformasjon: %d"
#. Translators: %s is a window title
#: ../src/core/delete.c:94
#: ../src/core/delete.c:111
#, c-format
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> svarer ikke."
#: ../src/core/delete.c:99
#: ../src/core/delete.c:114
msgid "Application is not responding."
msgstr "Programmet svarer ikke."
#: ../src/core/delete.c:119
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
@@ -346,11 +358,11 @@ msgstr ""
"Du kan velge å vente en kort stund for å se om det fortsetter eller tvinge "
"programmet til å avslutte helt."
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Wait"
msgstr "_Vent"
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Force Quit"
msgstr "_Tvungen nedstenging"
@@ -421,12 +433,12 @@ msgstr "Initier sesjonen fra en lagret fil"
msgid "Make X calls synchronous"
msgstr "Gjør X-kall synkrone"
#: ../src/core/main.c:506
#: ../src/core/main.c:504
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Feil under søk i temakatalog: %s\n"
#: ../src/core/main.c:522
#: ../src/core/main.c:520
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -552,12 +564,12 @@ msgstr ""
msgid "Error setting no tab popup status: %s\n"
msgstr "Feil under setting av status for popup uten faner: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:663
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Skjerm %d på display «%s» er ugyldig\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:679
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -566,71 +578,71 @@ msgstr ""
"Skjerm %d på display «%s» har allerede en vindushåndterer; prøv å bruke "
"flagget --replace for å erstatte aktiv vindushåndterer.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:706
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr ""
"Kunne ikke hente utvalg fra vinduhåndterer på skjerm %d, display «%s»\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:761
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Skjerm %d på display «%s» har allerede en vinduhåndterer\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:946
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Kunne ikke slippe skjerm %d på display «%s»\n"
#: ../src/core/session.c:837 ../src/core/session.c:844
#: ../src/core/session.c:843 ../src/core/session.c:850
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Kunne ikke opprette katalog «%s»: %s\n"
#: ../src/core/session.c:854
#: ../src/core/session.c:860
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Kunne ikke åpne sesjonsfil «%s» for skriving: %s\n"
#: ../src/core/session.c:995
#: ../src/core/session.c:1001
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Feil under skriving av sesjonsfil «%s»: %s\n"
#: ../src/core/session.c:1000
#: ../src/core/session.c:1006
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Feil under lukking av sesjonsfil «%s»: %s\n"
#: ../src/core/session.c:1130
#: ../src/core/session.c:1136
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Feil under tolking av lagret sesjonsfil: %s\n"
#: ../src/core/session.c:1179
#: ../src/core/session.c:1185
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "<mutter_session>-attributt sett men vi har allerede sesjons-ID"
#: ../src/core/session.c:1192 ../src/core/session.c:1267
#: ../src/core/session.c:1299 ../src/core/session.c:1371
#: ../src/core/session.c:1431
#: ../src/core/session.c:1198 ../src/core/session.c:1273
#: ../src/core/session.c:1305 ../src/core/session.c:1377
#: ../src/core/session.c:1437
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Ukjent attributt %s på <%s>-element"
#: ../src/core/session.c:1209
#: ../src/core/session.c:1215
#, c-format
msgid "nested <window> tag"
msgstr "<window> tag med flere nivåer"
#: ../src/core/session.c:1451
#: ../src/core/session.c:1457
#, c-format
msgid "Unknown element %s"
msgstr "Ukjent element %s"
#: ../src/core/session.c:1803
#: ../src/core/session.c:1809
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -675,13 +687,13 @@ msgid "Window manager error: "
msgstr "Feil i vindushåndterer: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:615 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:632 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6795
#: ../src/core/window.c:6886
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -697,7 +709,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7458
#: ../src/core/window.c:7549
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
@@ -717,7 +729,7 @@ msgstr "Programmet satte en feil _NET_WM_PID %lu\n"
msgid "%s (on %s)"
msgstr "%s (på %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1484
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Ugyldig WM_TRANSIENT_FOR vindu 0x%lx oppgitt for %s.\n"
@@ -766,7 +778,9 @@ msgstr ""
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
msgstr "Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle skjermer eller kun på primær skjerm."
msgstr ""
"Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle "
"skjermer eller kun på primær skjerm."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"
@@ -807,47 +821,47 @@ msgstr "Arbeidsområder kun på primær skjerm"
msgid "Usage: %s\n"
msgstr " Bruk: %s\n"
#: ../src/ui/frames.c:1099
#: ../src/ui/frames.c:1280
msgid "Close Window"
msgstr "Lukk vindu"
#: ../src/ui/frames.c:1102
#: ../src/ui/frames.c:1283
msgid "Window Menu"
msgstr "Vindumeny"
#: ../src/ui/frames.c:1105
#: ../src/ui/frames.c:1286
msgid "Minimize Window"
msgstr "Minimer vindu"
#: ../src/ui/frames.c:1108
#: ../src/ui/frames.c:1289
msgid "Maximize Window"
msgstr "Maksimer vindu"
#: ../src/ui/frames.c:1111
#: ../src/ui/frames.c:1292
msgid "Restore Window"
msgstr "Gjenopprett vindu"
#: ../src/ui/frames.c:1114
#: ../src/ui/frames.c:1295
msgid "Roll Up Window"
msgstr "Rull opp vindu"
#: ../src/ui/frames.c:1117
#: ../src/ui/frames.c:1298
msgid "Unroll Window"
msgstr "Rull ned vindu"
#: ../src/ui/frames.c:1120
#: ../src/ui/frames.c:1301
msgid "Keep Window On Top"
msgstr "Plasser vindu i forgrunnen"
#: ../src/ui/frames.c:1123
#: ../src/ui/frames.c:1304
msgid "Remove Window From Top"
msgstr "Fjern vindu fra forgrunnen"
#: ../src/ui/frames.c:1126
#: ../src/ui/frames.c:1307
msgid "Always On Visible Workspace"
msgstr "Alltid på synlig arbeidsområde"
#: ../src/ui/frames.c:1129
#: ../src/ui/frames.c:1310
msgid "Put Window On Only One Workspace"
msgstr "Plasser vindu kun på ett arbeidsområde"
@@ -1160,24 +1174,29 @@ msgstr "Skyggefaktor «%s» i skyggelagt farge er negativ"
msgid "Could not parse color \"%s\""
msgstr "Kunne ikke lese farge «%s»"
#: ../src/ui/theme.c:1646
#: ../src/ui/theme.c:1481
#, c-format
msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
msgstr "Klarte ikke å hente farge %s[%s] fra GTK+-tema.\n"
#: ../src/ui/theme.c:1713
#, c-format
msgid "Coordinate expression contains character '%s' which is not allowed"
msgstr "Koordinatuttrykk inneholder tegn «%s» som ikke er tillatt"
#: ../src/ui/theme.c:1673
#: ../src/ui/theme.c:1740
#, c-format
msgid ""
"Coordinate expression contains floating point number '%s' which could not be "
"parsed"
msgstr "Koordinatuttrykk inneholder flyttall «%s» som ikke kunne tolkes"
#: ../src/ui/theme.c:1687
#: ../src/ui/theme.c:1754
#, c-format
msgid "Coordinate expression contains integer '%s' which could not be parsed"
msgstr "Koordinatuttrykk inneholder heltall «%s» som ikke kunne tolkes"
#: ../src/ui/theme.c:1809
#: ../src/ui/theme.c:1876
#, c-format
msgid ""
"Coordinate expression contained unknown operator at the start of this text: "
@@ -1186,39 +1205,39 @@ msgstr ""
"Koordinatuttrykket inneholdt en ukjent operator ved begynnelsen av denne "
"teksten: «%s»"
#: ../src/ui/theme.c:1866
#: ../src/ui/theme.c:1933
#, c-format
msgid "Coordinate expression was empty or not understood"
msgstr "Koordinatuttrykket var tomt eller ble ikke forstått"
#: ../src/ui/theme.c:1977 ../src/ui/theme.c:1987 ../src/ui/theme.c:2021
#: ../src/ui/theme.c:2044 ../src/ui/theme.c:2054 ../src/ui/theme.c:2088
#, c-format
msgid "Coordinate expression results in division by zero"
msgstr "Koordinatuttrykket resulterer i divisjon med null"
#: ../src/ui/theme.c:2029
#: ../src/ui/theme.c:2096
#, c-format
msgid ""
"Coordinate expression tries to use mod operator on a floating-point number"
msgstr "Koordinatuttrykket prøver å bruke mod-operator på et flyttall"
#: ../src/ui/theme.c:2085
#: ../src/ui/theme.c:2152
#, c-format
msgid ""
"Coordinate expression has an operator \"%s\" where an operand was expected"
msgstr "Koordinatuttrykket har en operator «%s» hvor en operand var ventet"
#: ../src/ui/theme.c:2094
#: ../src/ui/theme.c:2161
#, c-format
msgid "Coordinate expression had an operand where an operator was expected"
msgstr "Koordinatuttrykket hadde en operand hvor en operator var ventet"
#: ../src/ui/theme.c:2102
#: ../src/ui/theme.c:2169
#, c-format
msgid "Coordinate expression ended with an operator instead of an operand"
msgstr "Koordinatuttrykket sluttet med en operator i stedet for en operand"
#: ../src/ui/theme.c:2112
#: ../src/ui/theme.c:2179
#, c-format
msgid ""
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
@@ -1227,38 +1246,38 @@ msgstr ""
"Koordinatuttrykket har en operator «%c» etter en operator «%c» og ingen "
"operand mellom dem."
#: ../src/ui/theme.c:2263 ../src/ui/theme.c:2308
#: ../src/ui/theme.c:2330 ../src/ui/theme.c:2375
#, c-format
msgid "Coordinate expression had unknown variable or constant \"%s\""
msgstr "Koordinatuttrykket haddeen ukjent variabel eller konstant «%s»"
#: ../src/ui/theme.c:2362
#: ../src/ui/theme.c:2429
#, c-format
msgid "Coordinate expression parser overflowed its buffer."
msgstr "Tolkeren for koordinatuttrykk oversteg buffergrensen."
#: ../src/ui/theme.c:2391
#: ../src/ui/theme.c:2458
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr "Koordinatuttrykket hadde en parantes slutt uten parantes start"
#: ../src/ui/theme.c:2455
#: ../src/ui/theme.c:2522
#, c-format
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
msgstr "Koordinatuttrykket hadde en åpen parantes uten en avsluttende parantes"
#: ../src/ui/theme.c:2466
#: ../src/ui/theme.c:2533
#, c-format
msgid "Coordinate expression doesn't seem to have any operators or operands"
msgstr ""
"Koordinatuttrykket ser ikke ut til å ha noen operatorer eller operander"
#: ../src/ui/theme.c:2676 ../src/ui/theme.c:2696 ../src/ui/theme.c:2716
#: ../src/ui/theme.c:2745 ../src/ui/theme.c:2765 ../src/ui/theme.c:2785
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "Tema inneholdt et uttrykk som resulterte i en feil: %s\n"
#: ../src/ui/theme.c:4410
#: ../src/ui/theme.c:4482
#, c-format
msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
@@ -1267,25 +1286,25 @@ msgstr ""
"<button function=«%s» state=«%s» draw_ops=«ett-eller-annet»/> må "
"spesifiseres for denne rammestilen"
#: ../src/ui/theme.c:4940 ../src/ui/theme.c:4965
#: ../src/ui/theme.c:5012 ../src/ui/theme.c:5037
#, c-format
msgid ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr ""
"Mangler <frame state=«%s» resize=«%s» focus=«%s» stil=«ett-eller-annet»/>"
#: ../src/ui/theme.c:5013
#: ../src/ui/theme.c:5085
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "Klarte ikke å laste tema «%s»: %s\n"
#: ../src/ui/theme.c:5149 ../src/ui/theme.c:5156 ../src/ui/theme.c:5163
#: ../src/ui/theme.c:5170 ../src/ui/theme.c:5177
#: ../src/ui/theme.c:5221 ../src/ui/theme.c:5228 ../src/ui/theme.c:5235
#: ../src/ui/theme.c:5242 ../src/ui/theme.c:5249
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "<%s> er ikke satt for tema «%s»"
#: ../src/ui/theme.c:5185
#: ../src/ui/theme.c:5257
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
@@ -1294,14 +1313,14 @@ msgstr ""
"Ingen rammestil satt for vindutype «%s» i tema «%s», legg til et <window "
"type=«%s» style_set=«ett-eller-annet»/>-element"
#: ../src/ui/theme.c:5635 ../src/ui/theme.c:5697 ../src/ui/theme.c:5760
#: ../src/ui/theme.c:5707 ../src/ui/theme.c:5769 ../src/ui/theme.c:5832
#, c-format
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
msgstr ""
"Brukerdefinerte konstanter må begynne med stor bokstav; «%s» gjør ikke det"
#: ../src/ui/theme.c:5643 ../src/ui/theme.c:5705 ../src/ui/theme.c:5768
#: ../src/ui/theme.c:5715 ../src/ui/theme.c:5777 ../src/ui/theme.c:5840
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "Konstant «%s» er allerede definert"

View File

@@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-19 16:01+0100\n"
"PO-Revision-Date: 2011-03-19 16:00+0100\n"
"POT-Creation-Date: 2011-03-29 23:28+0200\n"
"PO-Revision-Date: 2011-03-29 23:29+0200\n"
"Last-Translator: Wouter Bolsterlee <wbolster@gnome.org>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
"Language: nl\n"
@@ -563,12 +563,12 @@ msgstr "Fout bij het instellen van live-status voor verborgen vensters: %s
msgid "Error setting no tab popup status: %s\n"
msgstr "Fout bij het instellen van no tab popup-status: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:624
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Scherm %d op display '%s' is ongeldig\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:640
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -577,19 +577,19 @@ msgstr ""
"Scherm %d op display %s heeft al een window manager; probeer de optie: --"
"replace te gebruiken om de huidige window manager te vervangen.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:667
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr ""
"Kon window manager-selectie niet verkrijgen op scherm %d display %s\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:722
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Scherm %d op display %s heeft al een window manager\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:907
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Kon scherm %d op display %s niet vrijmaken\n"
@@ -692,7 +692,7 @@ msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6752
#: ../src/core/window.c:6847
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -708,7 +708,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7415
#: ../src/core/window.c:7510
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
@@ -728,7 +728,7 @@ msgstr "Toepassing heeft een overbodige _NET_WM_PID %lu ingesteld\n"
msgid "%s (on %s)"
msgstr "%s (op %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1482
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Ongeldig WM_TRANSIENT_FOR venster 0x%lx opgegeven voor %s.\n"
@@ -777,10 +777,10 @@ msgstr ""
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only the primary window."
"monitors or only for windows on the primary monitor."
msgstr ""
"Geeft aan of wisselen van werkblad voor vensters op alle monitoren of alleen "
"het primaire venster moet gebeuren."
"Geeft aan of wisselen van werkblad voor vensters op alle schermen of alleen "
"voor vensters op het hoofdscherm moet gebeuren."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"

1121
po/pa.po

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 3.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-20 23:53+0000\n"
"PO-Revision-Date: 2011-03-20 23:55+0000\n"
"POT-Creation-Date: 2011-03-29 00:25+0100\n"
"PO-Revision-Date: 2011-03-29 00:25+0000\n"
"Last-Translator: Duarte Loreto <happyguy_pt@hotmail.com>\n"
"Language-Team: Portuguese <gnome_pt@yahoogroups.com>\n"
"Language: pt\n"
@@ -562,12 +562,12 @@ msgstr "Erro ao definir o estado das janelas escondidas activas: %s\n"
msgid "Error setting no tab popup status: %s\n"
msgstr "Erro ao definir o estado de popup ao ciclar: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:624
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Ecrã %d no monitor '%s' é inválido\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:640
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -576,19 +576,19 @@ msgstr ""
"Ecrã %d no monitor \"%s\" já tem um gestor de janelas; tente utilizar a "
"opção --replace para substituir o gestor de janelas actual.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:667
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr ""
"Incapaz de obter selecção do gestor de janelas no ecrã %d monitor \"%s\"\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:722
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Ecrã %d no monitor \"%s\" já tem um gestor de janelas\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:907
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Incapaz libertar ecrã %d no monitor \"%s\"\n"
@@ -692,7 +692,7 @@ msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6752
#: ../src/core/window.c:6847
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -708,7 +708,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7415
#: ../src/core/window.c:7510
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
@@ -728,7 +728,7 @@ msgstr "Aplicação definiu um _NET_WM_PID %lu fictício\n"
msgid "%s (on %s)"
msgstr "%s (em %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1482
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Janela 0x%lx de WM_TRANSIENT_FOR inválido especificada para %s.\n"
@@ -777,10 +777,10 @@ msgstr ""
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only the primary window."
"monitors or only for windows on the primary monitor."
msgstr ""
"Determina se a troca de área de trabalho deverá ocorrer para janelas em "
"todos os monitores ou apenas a janela principal."
"todos os monitores ou apenas para janelas no monitor principal."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"

File diff suppressed because it is too large Load Diff

View File

@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: metacity ru\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-17 13:27+0000\n"
"PO-Revision-Date: 2011-03-21 21:49+0400\n"
"POT-Creation-Date: 2011-03-21 19:31+0000\n"
"PO-Revision-Date: 2011-03-26 22:12+0400\n"
"Last-Translator: Yuri Myaseodov <omerta13@yandex.ru>\n"
"Language-Team: Russian <gnome-cyr@gnome.org>\n"
"MIME-Version: 1.0\n"
@@ -327,7 +327,7 @@ msgstr "Переместить окно к восточной (левой) ст
msgid "Move window to center of screen"
msgstr "Переместить окно в центр экрана"
#: ../src/core/bell.c:302
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr "Событие звонка"
@@ -339,7 +339,6 @@ msgstr "Неизвестный запрос сведений об окне: %d"
#. Translators: %s is a window title
#: ../src/core/delete.c:94
#, c-format
#| msgid "\"%s\" is not responding."
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> не отвечает."
@@ -399,7 +398,6 @@ msgid "Disable connection to session manager"
msgstr "Запретить подключение к менеджеру сеансов"
#: ../src/core/main.c:212
#| msgid "Replace the running window manager with Metacity"
msgid "Replace the running window manager"
msgstr "Заменить запущенный оконный менеджер"
@@ -419,24 +417,18 @@ msgstr "Инициализировать сеанс из сохранённог
msgid "Make X calls synchronous"
msgstr "Сделать X-вызовы синхронными"
#: ../src/core/main.c:508
#: ../src/core/main.c:506
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Не удалось прочитать каталог тем: %s\n"
#: ../src/core/main.c:524
#: ../src/core/main.c:522
#, c-format
msgid "Could not find a theme! Be sure %s exists and contains the usual themes.\n"
msgstr "Не удалось найти тему! Убедитесь, что «%s» существует и содержит обычные темы.\n"
#: ../src/core/mutter.c:42
#, c-format
#| msgid ""
#| "metacity %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"
@@ -539,13 +531,11 @@ msgstr "Произошла ошибка при установке имени р
#: ../src/core/prefs.c:2997
#, c-format
#| msgid "Error setting compositor status: %s\n"
msgid "Error setting live hidden windows status status: %s\n"
msgstr "Ошибка установки состояния существования скрытых окон: %s\n"
#: ../src/core/prefs.c:3032
#, c-format
#| msgid "Error setting compositor status: %s\n"
msgid "Error setting no tab popup status: %s\n"
msgstr "Ошибка установки состояния всплывающего окна вкладки: %s\n"
@@ -574,61 +564,57 @@ msgstr "У экрана %d дисплея «%s» уже есть менедже
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Не удалось освободить экран %d дисплея «%s»\n"
#: ../src/core/session.c:863
#: ../src/core/session.c:870
#: ../src/core/session.c:837
#: ../src/core/session.c:844
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Не удалось создать каталог «%s»: %s\n"
#: ../src/core/session.c:880
#: ../src/core/session.c:854
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Не удалось открыть для записи файл сеанса «%s»: %s\n"
#: ../src/core/session.c:1021
#: ../src/core/session.c:995
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Произошла ошибка при записи файла сеанса «%s»: %s\n"
#: ../src/core/session.c:1026
#: ../src/core/session.c:1000
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Произошла ошибка при закрытии файла сеанса «%s»: %s\n"
#: ../src/core/session.c:1156
#: ../src/core/session.c:1130
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Не удалось разобрать сохранённый файл сеанса: %s\n"
#: ../src/core/session.c:1205
#: ../src/core/session.c:1179
#, c-format
#| msgid "<metacity_session> attribute seen but we already have the session ID"
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "Атрибут <mutter_session> обнаружен, но у нас уже есть ID сеанса"
#: ../src/core/session.c:1218
#: ../src/core/session.c:1293
#: ../src/core/session.c:1325
#: ../src/core/session.c:1397
#: ../src/core/session.c:1457
#: ../src/core/session.c:1192
#: ../src/core/session.c:1267
#: ../src/core/session.c:1299
#: ../src/core/session.c:1371
#: ../src/core/session.c:1431
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Атрибут %s элемента <%s> неизвестен"
#: ../src/core/session.c:1235
#: ../src/core/session.c:1209
#, c-format
msgid "nested <window> tag"
msgstr "вложенный тег <window>"
#: ../src/core/session.c:1477
#: ../src/core/session.c:1451
#, c-format
msgid "Unknown element %s"
msgstr "Элемент %s неизвестен"
#: ../src/core/session.c:1829
#| msgid ""
#| "These windows do not support \"save current setup\" and will have to be "
#| "restarted manually next time you log in."
#: ../src/core/session.c:1803
msgid "These windows do not support &quot;save current setup&quot; and will have to be restarted manually next time you log in."
msgstr "Эти окна не поддерживают команду «Сохранить текущие настройки». При следующем входе в систему их придётся перезапустить вручную."
@@ -650,7 +636,6 @@ msgstr "Открыт журнал отладочной информации %s\n
#: ../src/core/util.c:146
#: ../src/tools/mutter-message.c:149
#, c-format
#| msgid "Metacity was compiled without support for verbose mode\n"
msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Metacity собран без поддержки режима подробных сообщений\n"
@@ -671,14 +656,14 @@ msgid "Window manager error: "
msgstr "Ошибка менеджера окон: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:616
#: ../src/core/util.c:615
#: ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6651
#: ../src/core/window.c:6752
#, 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 "Окно %s установило на себя значение SM_CLIENT_ID вместо окна с значением WM_CLIENT_LEADER, как это определено в ICCCM.\n"
@@ -690,7 +675,7 @@ msgstr "Окно %s установило на себя значение SM_CLIEN
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7314
#: ../src/core/window.c:7415
#, 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 "Окно %s установило подсказку MWM, определяющую, что его размер не меняется, но установило минимальный размер %d × %d и максимальный размер %d × %d, что не имеет смысла.\n"
@@ -744,15 +729,17 @@ msgid "Determines whether hidden windows (i.e., minimized windows and windows on
msgstr "Определяет, должны ли существовать скрытые окна (например, минимизированные окна и окна, находящиеся на другом рабочем месте)."
#: ../src/mutter.schemas.in.h:3
msgid "Determines whether workspace switching should happen for windows on all monitors or only the primary window."
msgstr "Определяет, должно ли переключение рабочего места происходить для окон на всех мониторах или только главного окна."
#| msgid ""
#| "Determines whether workspace switching should happen for windows on all "
#| "monitors or only the primary window."
msgid "Determines whether workspace switching should happen for windows on all monitors or only for windows on the primary monitor."
msgstr "Определяет, должно ли переключение рабочего места происходить для окон на всех мониторах или только для окон на главном мониторе."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"
msgstr "Существование скрытых окон"
#: ../src/mutter.schemas.in.h:5
#| msgid "Modifier to use for modified window click actions"
msgid "Modifier to use for extended window management operations"
msgstr "Модификатор для использования дополнительных действий управления окнами"
@@ -1611,7 +1598,6 @@ msgstr "Использование текста внутри элемента <%
#: ../src/ui/theme-parser.c:4062
#: ../src/ui/theme-parser.c:4074
#, c-format
#| msgid "<name> specified twice for this theme"
msgid "<%s> specified twice for this theme"
msgstr "<%s> указан для этой темы дважды"
@@ -1621,57 +1607,46 @@ msgid "Failed to find a valid file for theme %s\n"
msgstr "Не удалось найти допустимый файл для темы %s\n"
#: ../src/ui/theme-viewer.c:99
#| msgid "/_Windows"
msgid "_Windows"
msgstr "_Окна"
#: ../src/ui/theme-viewer.c:100
#| msgid "Dialog Box"
msgid "_Dialog"
msgstr "_Диалоговое окно"
#: ../src/ui/theme-viewer.c:101
#| msgid "Modal Dialog Box"
msgid "_Modal dialog"
msgstr "_Модальное диалоговое окно"
#: ../src/ui/theme-viewer.c:102
#| msgid "/Windows/_Utility"
msgid "_Utility"
msgstr "_Утилита"
#: ../src/ui/theme-viewer.c:103
#| msgid "/Windows/_Splashscreen"
msgid "_Splashscreen"
msgstr "_Экран-заставка"
#: ../src/ui/theme-viewer.c:104
#| msgid "/Windows/_Top dock"
msgid "_Top dock"
msgstr "_Верхний док"
#: ../src/ui/theme-viewer.c:105
#| msgid "/Windows/_Bottom dock"
msgid "_Bottom dock"
msgstr "_Нижний док"
#: ../src/ui/theme-viewer.c:106
#| msgid "/Windows/_Left dock"
msgid "_Left dock"
msgstr "_Левый док"
#: ../src/ui/theme-viewer.c:107
#| msgid "/Windows/_Right dock"
msgid "_Right dock"
msgstr "_Правый док"
#: ../src/ui/theme-viewer.c:108
#| msgid "/Windows/_All docks"
msgid "_All docks"
msgstr "В_се доки"
#: ../src/ui/theme-viewer.c:109
#| msgid "Desktop"
msgid "Des_ktop"
msgstr "_Рабочий стол"
@@ -1729,7 +1704,6 @@ msgid "Border"
msgstr "Рамка"
#: ../src/ui/theme-viewer.c:413
#| msgid "Modal Dialog Box"
msgid "Attached Modal Dialog"
msgstr "Прикреплённый модальный диалог"

191
po/sl.po
View File

@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-03-22 10:13+0000\n"
"PO-Revision-Date: 2011-03-22 21:47+0100\n"
"POT-Creation-Date: 2011-07-02 06:54+0000\n"
"PO-Revision-Date: 2011-07-02 20:25+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: \n"
@@ -23,6 +23,13 @@ msgstr ""
"X-Poedit-Country: SLOVENIA\n"
"X-Poedit-SourceCharset: utf-8\n"
#. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit
#: ../src/compositor/compositor.c:509
#, c-format
msgid "Another compositing manager is already running on screen %i on display \"%s\"."
msgstr "Drug upravljalnik sestavljanja je že zagnan na zaslonu %i prikaza \"%s\"."
#: ../src/core/all-keybindings.h:88
msgid "Switch to workspace 1"
msgstr "Preklopi na delovno površino 1"
@@ -345,21 +352,24 @@ msgstr "Dogodek zvonjenja"
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:111
#, 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:114
msgid "Application is not responding."
msgstr "Program se ne odziva."
#: ../src/core/delete.c:119
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 program morda spet začne delovati, ali pa vsilite končanje delovanja."
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Wait"
msgstr "_Počakaj"
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Force Quit"
msgstr "_Vsili konec"
@@ -427,12 +437,12 @@ msgstr "Začni sejo iz shranjene datoteke"
msgid "Make X calls synchronous"
msgstr "Uskladi klice X"
#: ../src/core/main.c:506
#: ../src/core/main.c:504
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Ni mogoče preiskati mape tem: %s\n"
#: ../src/core/main.c:522
#: ../src/core/main.c:520
#, 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čajni zapis teme.\n"
@@ -551,84 +561,84 @@ msgstr "Napaka med nastavljanjem stanja skritih oken: %s\n"
msgid "Error setting no tab popup status: %s\n"
msgstr "Napaka med nastavljanjem stanja pojavnih oken: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:663
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Zaslon %d na prikazu '%s' ni veljaven\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:679
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager; try using the --replace option to replace the current window manager.\n"
msgstr "Zaslon %d na prikazu \"%s\" je že upravljan z upravljalnikom oken; poskušajte uporabiti možnost --replace za zamenjavo trenutnega.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:706
#, c-format
msgid "Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr "Ni mogoče dobiti izbire upravljalnika oken na zaslonu %d prikaza \"%s\"\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:761
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Zaslon %d na prikazu \"%s\" je že upravljan z upravljalnikom oken\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:946
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Ni mogoče opustiti zaslona %d na prikazu \"%s\"\n"
#: ../src/core/session.c:837
#: ../src/core/session.c:844
#: ../src/core/session.c:843
#: ../src/core/session.c:850
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Ni mogoče ustvariti imenika '%s': %s\n"
# G:2 K:0 O:0
#: ../src/core/session.c:854
#: ../src/core/session.c:860
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Ni mogoče odpreti datoteke seje '%s' za pisanje: %s\n"
#: ../src/core/session.c:995
#: ../src/core/session.c:1001
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Napaka med zapisovanjem datoteke seje '%s': %s\n"
#: ../src/core/session.c:1000
#: ../src/core/session.c:1006
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Napaka med zapiranjem datoteke seje '%s': %s\n"
#: ../src/core/session.c:1130
#: ../src/core/session.c:1136
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Ni mogoče razčleniti datoteke shranjene seje: %s\n"
#: ../src/core/session.c:1179
#: ../src/core/session.c:1185
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "atribut <mutter_session> je zaznan, vendar pa ima sistem že določen ID seje"
#: ../src/core/session.c:1192
#: ../src/core/session.c:1267
#: ../src/core/session.c:1299
#: ../src/core/session.c:1371
#: ../src/core/session.c:1431
#: ../src/core/session.c:1198
#: ../src/core/session.c:1273
#: ../src/core/session.c:1305
#: ../src/core/session.c:1377
#: ../src/core/session.c:1437
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Neznan atribut %s predmeta <%s>"
#: ../src/core/session.c:1209
#: ../src/core/session.c:1215
#, c-format
msgid "nested <window> tag"
msgstr "gnezdena označba <window>"
#: ../src/core/session.c:1451
#: ../src/core/session.c:1457
#, c-format
msgid "Unknown element %s"
msgstr "Neznan predmet %s"
# G:2 K:6 O:0
#: ../src/core/session.c:1803
#: ../src/core/session.c:1809
msgid "These windows do not support &quot;save current setup&quot; and will have to be restarted manually next time you log in."
msgstr "Ta okna ne podpirajo možnosti &quot;shranjevanja trenutnih nastavitev&quot;, zato jih bo treba ob naslednji prijavi zagnati ročno."
@@ -671,14 +681,14 @@ msgid "Window manager error: "
msgstr "Napaka upravljalnika oken: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:615
#: ../src/core/util.c:632
#: ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6795
#: ../src/core/window.c:6886
#, 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"
@@ -690,7 +700,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:7458
#: ../src/core/window.c:7549
#, 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"
@@ -705,7 +715,7 @@ msgstr "Program je nastavil pokvarjen _NET_WM_PID %lu\n"
msgid "%s (on %s)"
msgstr "%s (na %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1484
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Neveljaven WM_TRANSIENT_FOR za okno 0x%lx naveden za %s.\n"
@@ -772,51 +782,51 @@ msgstr "Delovne površine le na prvem zaslonu"
msgid "Usage: %s\n"
msgstr "Uporaba: %s\n"
#: ../src/ui/frames.c:1099
#: ../src/ui/frames.c:1280
msgid "Close Window"
msgstr "Zapri okno"
# G:1 K:1 O:0
#: ../src/ui/frames.c:1102
#: ../src/ui/frames.c:1283
msgid "Window Menu"
msgstr "Meni okna"
# G:0 K:1 O:0
#: ../src/ui/frames.c:1105
#: ../src/ui/frames.c:1286
msgid "Minimize Window"
msgstr "Skrči okno"
#: ../src/ui/frames.c:1108
#: ../src/ui/frames.c:1289
msgid "Maximize Window"
msgstr "Razpni okno"
#: ../src/ui/frames.c:1111
#: ../src/ui/frames.c:1292
msgid "Restore Window"
msgstr "Obnovi okno"
# G:2 K:0 O:0
#: ../src/ui/frames.c:1114
#: ../src/ui/frames.c:1295
msgid "Roll Up Window"
msgstr "Zavij okno"
#: ../src/ui/frames.c:1117
#: ../src/ui/frames.c:1298
msgid "Unroll Window"
msgstr "Odvij okno"
#: ../src/ui/frames.c:1120
#: ../src/ui/frames.c:1301
msgid "Keep Window On Top"
msgstr "Ohrani okno na vrhu"
#: ../src/ui/frames.c:1123
#: ../src/ui/frames.c:1304
msgid "Remove Window From Top"
msgstr "Odstrani okno z vrha"
# G:1 K:0 O:0
#: ../src/ui/frames.c:1126
#: ../src/ui/frames.c:1307
msgid "Always On Visible Workspace"
msgstr "Vedno na vidni delovni površini"
#: ../src/ui/frames.c:1129
#: ../src/ui/frames.c:1310
msgid "Put Window On Only One Workspace"
msgstr "Postavi okno na samo eno delovno površino"
@@ -1138,136 +1148,141 @@ msgstr "V senčeni barvi je vrednost senčenja \"%s\" negativna"
msgid "Could not parse color \"%s\""
msgstr "Ni mogoče razčleniti barve \"%s\""
#: ../src/ui/theme.c:1646
#: ../src/ui/theme.c:1481
#, c-format
msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
msgstr "Pridobivanje barve %s[%s] iz teme GTK+ je spodletelo.\n"
#: ../src/ui/theme.c:1713
#, c-format
msgid "Coordinate expression contains character '%s' which is not allowed"
msgstr "Izraz koordinat vsebuje znak '%s', ki pa ni dovoljen"
#: ../src/ui/theme.c:1673
#: ../src/ui/theme.c:1740
#, c-format
msgid "Coordinate expression contains floating point number '%s' which could not be parsed"
msgstr "Izraz koordinat vsebuje številko s plavajočo vejico '%s', ki je ni mogoče razčleniti"
#: ../src/ui/theme.c:1687
#: ../src/ui/theme.c:1754
#, c-format
msgid "Coordinate expression contains integer '%s' which could not be parsed"
msgstr "Izraz koordinat vsebuje celo število '%s', ki ga ni mogoče razčleniti"
#: ../src/ui/theme.c:1809
#: ../src/ui/theme.c:1876
#, c-format
msgid "Coordinate expression contained unknown operator at the start of this text: \"%s\""
msgstr "Izraz koordinat vsebuje neznan operator na začetku besedila: \"%s\""
#: ../src/ui/theme.c:1866
#: ../src/ui/theme.c:1933
#, c-format
msgid "Coordinate expression was empty or not understood"
msgstr "Izraz koordinat je prazen ali pa ni v razumljivem zapisu"
#: ../src/ui/theme.c:1977
#: ../src/ui/theme.c:1987
#: ../src/ui/theme.c:2021
#: ../src/ui/theme.c:2044
#: ../src/ui/theme.c:2054
#: ../src/ui/theme.c:2088
#, c-format
msgid "Coordinate expression results in division by zero"
msgstr "Izraz koordinat povzroči deljenje z vrednostjo nič"
#: ../src/ui/theme.c:2029
#: ../src/ui/theme.c:2096
#, c-format
msgid "Coordinate expression tries to use mod operator on a floating-point number"
msgstr "Izraz koordinat poskuša uporabiti operator mod ali številko s plavajočo vejico"
#: ../src/ui/theme.c:2085
#: ../src/ui/theme.c:2152
#, c-format
msgid "Coordinate expression has an operator \"%s\" where an operand was expected"
msgstr "Izraz koordinat vsebuje operator \"%s\", kjer je pričakovan operand"
#: ../src/ui/theme.c:2094
#: ../src/ui/theme.c:2161
#, c-format
msgid "Coordinate expression had an operand where an operator was expected"
msgstr "Izraz koordinat vsebuje operand kjer je pričakovan operator"
#: ../src/ui/theme.c:2102
#: ../src/ui/theme.c:2169
#, c-format
msgid "Coordinate expression ended with an operator instead of an operand"
msgstr "Izraz koordinat se konča z operatorjem namesto z operandom"
#: ../src/ui/theme.c:2112
#: ../src/ui/theme.c:2179
#, c-format
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:2263
#: ../src/ui/theme.c:2308
#: ../src/ui/theme.c:2330
#: ../src/ui/theme.c:2375
#, c-format
msgid "Coordinate expression had unknown variable or constant \"%s\""
msgstr "Izraz koordinat vsebuje neznano spremenljivko ali konstanto \"%s\""
#: ../src/ui/theme.c:2362
#: ../src/ui/theme.c:2429
#, c-format
msgid "Coordinate expression parser overflowed its buffer."
msgstr "Razčlenjevalnik izrazov koordinat je preplavil medpomnilnik."
#: ../src/ui/theme.c:2391
#: ../src/ui/theme.c:2458
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr "Izraz koordinat vsebuje zaklepaj, ne pa tudi uklepaja"
#: ../src/ui/theme.c:2455
#: ../src/ui/theme.c:2522
#, 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:2466
#: ../src/ui/theme.c:2533
#, 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:2676
#: ../src/ui/theme.c:2696
#: ../src/ui/theme.c:2716
#: ../src/ui/theme.c:2745
#: ../src/ui/theme.c:2765
#: ../src/ui/theme.c:2785
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "Tema vsebuje izraz, ki povzroča napako: %s\n"
#: ../src/ui/theme.c:4410
#: ../src/ui/theme.c:4482
#, 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:4940
#: ../src/ui/theme.c:4965
#: ../src/ui/theme.c:5012
#: ../src/ui/theme.c:5037
#, 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:5013
#: ../src/ui/theme.c:5085
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "Napaka med nalaganjem teme \"%s\": %s\n"
#: ../src/ui/theme.c:5149
#: ../src/ui/theme.c:5156
#: ../src/ui/theme.c:5163
#: ../src/ui/theme.c:5170
#: ../src/ui/theme.c:5177
#: ../src/ui/theme.c:5221
#: ../src/ui/theme.c:5228
#: ../src/ui/theme.c:5235
#: ../src/ui/theme.c:5242
#: ../src/ui/theme.c:5249
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "Ni nastavljena vrednost <%s> za temo \"%s\""
#: ../src/ui/theme.c:5185
#: ../src/ui/theme.c:5257
#, c-format
msgid "No frame style set for window type \"%s\" in theme \"%s\", add a <window type=\"%s\" style_set=\"whatever\"/> element"
msgstr "Ni določenega sloga okvirja okna vrste \"%s\" v temi \"%s\". Dodajte predmet <window type=\"%s\" style_set=\"whatever\"/>"
#: ../src/ui/theme.c:5635
#: ../src/ui/theme.c:5697
#: ../src/ui/theme.c:5760
#: ../src/ui/theme.c:5707
#: ../src/ui/theme.c:5769
#: ../src/ui/theme.c:5832
#, 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; vrednost \"%s\" se ne"
#: ../src/ui/theme.c:5643
#: ../src/ui/theme.c:5705
#: ../src/ui/theme.c:5768
#: ../src/ui/theme.c:5715
#: ../src/ui/theme.c:5777
#: ../src/ui/theme.c:5840
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "Konstanta \"%s\" je že določena"
@@ -1838,25 +1853,35 @@ msgstr "%d izjav koordinat razčlenjenih v %g sekundah (%g sekund v povprečju)\
#~ msgid "Turn compositing on"
#~ msgstr "Vključi skladanje"
#~ msgid "Turn compositing off"
#~ msgstr "Izključi skladanje"
#~ msgid ""
#~ "Don't make fullscreen windows that are maximized and have no decorations"
#~ msgstr "Ne ustvari celozaslonskih oken, ki so razpeti in nimajo gumbov"
#~ msgid "Whether window popup/frame should be shown when cycling windows."
#~ msgstr "Ali naj bo prikazan okvir okna med kroženjem oken."
#~ msgid "Internal argument for GObject introspection"
#~ msgstr "Notranji argument za GObject"
#~ msgid "Failed to restart: %s\n"
#~ msgstr "Spodletelo začenjanje: %s\n"
#~ msgid "Error setting compositor status: %s\n"
#~ msgstr "Napaka med nastavljanjem stanja skladanja: %s\n"
#~ msgid "Error setting clutter plugin list: %s\n"
#~ msgstr "Napaka med nastavljanjem seznama vstavkov clutter: %s\n"
#~ msgid "Clutter Plugins"
#~ msgstr "Vstavki Clutter"
#~ msgid "Plugins to load for the Clutter-based compositing manager."
#~ msgstr "Vstavki za Clutter upravljalnik sestavljanja"
#~ msgid ""
#~ "Lost connection to the display '%s';\n"
#~ "most likely the X server was shut down or you killed/destroyed\n"
@@ -1865,6 +1890,6 @@ msgstr "%d izjav koordinat razčlenjenih v %g sekundah (%g sekund v povprečju)\
#~ "Izgubljena povezava z zaslonom '%s';\n"
#~ "najverjetneje se je strežnik X končal ali pa je vsiljeno izklopljen\n"
#~ "upravljalnik oken.\n"
#~ msgid "Fatal IO error %d (%s) on display '%s'.\n"
#~ msgstr "Usodna napaka VI %d (%s) na zaslonu '%s'.\n"

1316
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

958
po/sv.po

File diff suppressed because it is too large Load Diff

1263
po/ta.po

File diff suppressed because it is too large Load Diff

2629
po/tr.po

File diff suppressed because it is too large Load Diff

1503
po/ug.po

File diff suppressed because it is too large Load Diff

View File

@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: metacity\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-17 18:21+0200\n"
"PO-Revision-Date: 2011-03-17 18:24+0300\n"
"POT-Creation-Date: 2011-05-03 22:43+0300\n"
"PO-Revision-Date: 2011-05-03 22:46+0300\n"
"Last-Translator: Korostil Daniel <ted.korostiled@gmail.com>\n"
"Language-Team: translation@linux.org.ua\n"
"Language: uk\n"
@@ -328,7 +328,7 @@ msgstr "Перемістити вікно у лівий бік екрана"
msgid "Move window to center of screen"
msgstr "Перемістити вікно у центр екрана"
#: ../src/core/bell.c:302
#: ../src/core/bell.c:310
msgid "Bell event"
msgstr "Подія гудка"
@@ -337,24 +337,27 @@ msgstr "Подія гудка"
msgid "Unknown window information request: %d"
msgstr "Запит інформації невідомого вікна: %d"
#. Translators: %s is a window title
#: ../src/core/delete.c:94
#: ../src/core/delete.c:111
#, c-format
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> не відповідає."
#: ../src/core/delete.c:99
#: ../src/core/delete.c:114
msgid "Application is not responding."
msgstr "Програма не відповідає."
#: ../src/core/delete.c:119
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
msgstr ""
"Можете трошки зачекати відновлення активності або примусово закрити програму."
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Wait"
msgstr "_Зачекати"
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Force Quit"
msgstr "_Завершити примусово"
@@ -423,12 +426,12 @@ msgstr "Розпочати сеанс зі збереженого файла"
msgid "Make X calls synchronous"
msgstr "Зробити виклики X синхронними"
#: ../src/core/main.c:508
#: ../src/core/main.c:504
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Помилка зчитування каталогу тем: %s\n"
#: ../src/core/main.c:524
#: ../src/core/main.c:520
#, c-format
msgid ""
"Could not find a theme! Be sure %s exists and contains the usual themes.\n"
@@ -553,12 +556,12 @@ msgstr "Помилка налаштування стану схованих ві
msgid "Error setting no tab popup status: %s\n"
msgstr "Помилка налаштування стану контекстних вкладок: %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:624
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Екран %d на дисплеї «%s» не правильний\n"
#: ../src/core/screen.c:639
#: ../src/core/screen.c:640
#, c-format
msgid ""
"Screen %d on display \"%s\" already has a window manager; try using the --"
@@ -567,7 +570,7 @@ msgstr ""
"Екран %d на дисплеї «%s» вже має менеджера вікон; спробуйте вказати параметр "
"--replace, щоб замінити поточний менеджер вікон.\n"
#: ../src/core/screen.c:666
#: ../src/core/screen.c:667
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
@@ -575,64 +578,64 @@ msgstr ""
"Не вдалось одержати функцію виділення менеджеру вікон на екрані %d дисплею "
"«%s»\n"
#: ../src/core/screen.c:721
#: ../src/core/screen.c:722
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr "Екран %d на дисплеї «%s» вже має менеджера вікон\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:907
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Не вдалось відпустити екран %d на дисплеї «%s»\n"
#: ../src/core/session.c:863 ../src/core/session.c:870
#: ../src/core/session.c:843 ../src/core/session.c:850
#, c-format
msgid "Could not create directory '%s': %s\n"
msgstr "Не вдалось створити каталог «%s»: %s\n"
#: ../src/core/session.c:880
#: ../src/core/session.c:860
#, c-format
msgid "Could not open session file '%s' for writing: %s\n"
msgstr "Не вдалось відкрити для запису файл сеансу «%s»: %s\n"
#: ../src/core/session.c:1021
#: ../src/core/session.c:1001
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Помилка запису файла сеансу \"%s\": %s\n"
#: ../src/core/session.c:1026
#: ../src/core/session.c:1006
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Помилка закриття файла сеансу «%s»: %s\n"
#: ../src/core/session.c:1156
#: ../src/core/session.c:1136
#, c-format
msgid "Failed to parse saved session file: %s\n"
msgstr "Збій аналізування збереженого файла сеансу: %s\n"
#: ../src/core/session.c:1205
#: ../src/core/session.c:1185
#, c-format
msgid "<mutter_session> attribute seen but we already have the session ID"
msgstr "Прочитано атрибут <mutter_session>, але вже є ідентифікатор сеансу"
#: ../src/core/session.c:1218 ../src/core/session.c:1293
#: ../src/core/session.c:1325 ../src/core/session.c:1397
#: ../src/core/session.c:1457
#: ../src/core/session.c:1198 ../src/core/session.c:1273
#: ../src/core/session.c:1305 ../src/core/session.c:1377
#: ../src/core/session.c:1437
#, c-format
msgid "Unknown attribute %s on <%s> element"
msgstr "Невідомий атрибут %s у елементі <%s>"
#: ../src/core/session.c:1235
#: ../src/core/session.c:1215
#, c-format
msgid "nested <window> tag"
msgstr "вкладена мітка <window>"
#: ../src/core/session.c:1477
#: ../src/core/session.c:1457
#, c-format
msgid "Unknown element %s"
msgstr "Невідомий елемент %s"
#: ../src/core/session.c:1829
#: ../src/core/session.c:1809
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -677,13 +680,13 @@ msgid "Window manager error: "
msgstr "Помилка віконного менеджера:"
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:616 ../src/mutter.desktop.in.h:1
#: ../src/core/util.c:632 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6651
#: ../src/core/window.c:6860
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@@ -699,7 +702,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7314
#: ../src/core/window.c:7523
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size "
@@ -719,7 +722,7 @@ msgstr "Програма встановила неправильне значе
msgid "%s (on %s)"
msgstr "%s (на %s)"
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1482
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Неправильний параметр WM_TRANSIENT_FOR вікна 0x%lx вказано для %s.\n"
@@ -766,10 +769,10 @@ msgstr ""
#: ../src/mutter.schemas.in.h:3
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only the primary window."
"monitors or only for windows on the primary monitor."
msgstr ""
"Визначає, чи перемикання робочого простору повинно здійснюватись для вікон "
"на всіх моніторах, чи лише для первинного вікна."
"на всіх моніторах, чи лише для вікон на первинному моніторі."
#: ../src/mutter.schemas.in.h:4
msgid "Live Hidden Windows"
@@ -810,47 +813,47 @@ msgstr "Робочий простір лише на первинному"
msgid "Usage: %s\n"
msgstr "Використання: %s\n"
#: ../src/ui/frames.c:1099
#: ../src/ui/frames.c:1177
msgid "Close Window"
msgstr "Закрити вікно"
#: ../src/ui/frames.c:1102
#: ../src/ui/frames.c:1180
msgid "Window Menu"
msgstr "Меню вікна"
#: ../src/ui/frames.c:1105
#: ../src/ui/frames.c:1183
msgid "Minimize Window"
msgstr "Згорнути вікно"
#: ../src/ui/frames.c:1108
#: ../src/ui/frames.c:1186
msgid "Maximize Window"
msgstr "Розгорнути вікно"
#: ../src/ui/frames.c:1111
#: ../src/ui/frames.c:1189
msgid "Restore Window"
msgstr "Відновити вікно"
#: ../src/ui/frames.c:1114
#: ../src/ui/frames.c:1192
msgid "Roll Up Window"
msgstr "Скотити вікно"
#: ../src/ui/frames.c:1117
#: ../src/ui/frames.c:1195
msgid "Unroll Window"
msgstr "Розкотити вікно"
#: ../src/ui/frames.c:1120
#: ../src/ui/frames.c:1198
msgid "Keep Window On Top"
msgstr "Тримати вікно нагорі"
#: ../src/ui/frames.c:1123
#: ../src/ui/frames.c:1201
msgid "Remove Window From Top"
msgstr "Прибрати вікно з гори"
#: ../src/ui/frames.c:1126
#: ../src/ui/frames.c:1204
msgid "Always On Visible Workspace"
msgstr "Завжди на видимому робочому просторі"
#: ../src/ui/frames.c:1129
#: ../src/ui/frames.c:1207
msgid "Put Window On Only One Workspace"
msgstr "Розміщувати вікно лише на одному робочому просторі"

1213
po/vi.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -75,6 +75,20 @@ libmutter_la_SOURCES = \
core/constraints.h \
core/core.c \
core/delete.c \
core/device.c \
meta/device.h \
core/device-keyboard.c \
core/device-keyboard.h \
core/device-pointer.c \
core/device-pointer.h \
core/device-private.h \
core/device-map.c \
meta/device-map.h \
core/device-map-private.h \
core/device-map-core.c \
core/device-map-core.h \
core/devices-core.c \
core/devices-core.h \
core/display.c \
core/display-private.h \
meta/display.h \
@@ -97,6 +111,8 @@ libmutter_la_SOURCES = \
meta/group.h \
core/iconcache.c \
core/iconcache.h \
core/input-events.c \
core/input-events.h \
core/keybindings.c \
core/keybindings-private.h \
core/main.c \
@@ -154,6 +170,14 @@ libmutter_la_SOURCES = \
ui/preview-widget.c \
$(mutter_built_sources)
if HAVE_XINPUT2
libmutter_la_SOURCES += \
core/device-map-xi2.c \
core/device-map-xi2.h \
core/devices-xi2.c \
core/devices-xi2.h
endif
libmutter_la_LDFLAGS = -no-undefined
libmutter_la_LIBADD = $(MUTTER_LIBS)
@@ -164,6 +188,8 @@ libmutterinclude_base_headers = \
meta/common.h \
meta/compositor-mutter.h \
meta/compositor.h \
meta/device.h \
meta/device-map.h \
meta/display.h \
meta/errors.h \
meta/gradient.h \
@@ -204,7 +230,11 @@ mutter_LDADD = $(MUTTER_LIBS) libmutter.la
if HAVE_INTROSPECTION
include $(INTROSPECTION_MAKEFILE)
api_version = $(MUTTER_MAJOR_VERSION).$(MUTTER_MINOR_VERSION)
# Since we don't make any guarantees about stability and we don't support
# parallel install, there's no real reason to change directories, filenames,
# etc. as we change the Mutter tarball version.
#api_version = $(MUTTER_MAJOR_VERSION).$(MUTTER_MINOR_VERSION)
api_version = 3.0
# These files are in package-private directories, even though they may be used
# by plugins. If you're writing a plugin, use g-ir-compiler --add-include-path
@@ -332,7 +362,7 @@ mutter-enum-types.h: stamp-mutter-enum-types.h Makefile
stamp-mutter-enum-types.h: $(libmutterinclude_base_headers) mutter-enum-types.h.in
$(AM_V_GEN) ( cd $(srcdir) && \
$(GLIB_MKENUMS) \
--template $(srcdir)/mutter-enum-types.h.in \
--template mutter-enum-types.h.in \
$(libmutterinclude_base_headers) ) >> xgen-teth && \
(cmp -s xgen-teth mutter-enum-types.h || cp xgen-teth mutter-enum-types.h) && \
rm -f xgen-teth && \
@@ -341,7 +371,7 @@ stamp-mutter-enum-types.h: $(libmutterinclude_base_headers) mutter-enum-types.h.
mutter-enum-types.c: stamp-mutter-enum-types.h mutter-enum-types.c.in
$(AM_V_GEN) ( cd $(srcdir) && \
$(GLIB_MKENUMS) \
--template $(srcdir)/mutter-enum-types.c.in \
--template mutter-enum-types.c.in \
$(libmutterinclude_base_headers) ) >> xgen-tetc && \
cp xgen-tetc mutter-enum-types.c && \
rm -f xgen-tetc

View File

@@ -29,6 +29,10 @@
* @green:
* @blue:
* @alpha:
* @flags: Optional flags for the texture, or %COGL_TEXTURE_NONE;
* %COGL_TEXTURE_NO_SLICING is useful if the texture will be
* repeated to create a constant color fill, since hardware
* repeat can't be used for a sliced texture.
*
* Creates a texture that is a single pixel with the specified
* unpremultiplied color components.
@@ -36,10 +40,11 @@
* Return value: (transfer full): a newly created Cogl texture
*/
CoglHandle
meta_create_color_texture_4ub (guint8 red,
guint8 green,
guint8 blue,
guint8 alpha)
meta_create_color_texture_4ub (guint8 red,
guint8 green,
guint8 blue,
guint8 alpha,
CoglTextureFlags flags)
{
CoglColor color;
guint8 pixel[4];
@@ -53,7 +58,7 @@ meta_create_color_texture_4ub (guint8 red,
pixel[3] = cogl_color_get_alpha_byte (&color);
return cogl_texture_new_from_data (1, 1,
COGL_TEXTURE_NONE,
flags,
COGL_PIXEL_FORMAT_RGBA_8888_PRE,
COGL_PIXEL_FORMAT_ANY,
4, pixel);
@@ -88,7 +93,8 @@ meta_create_texture_material (CoglHandle src_texture)
{
CoglHandle dummy_texture;
dummy_texture = meta_create_color_texture_4ub (0xff, 0xff, 0xff, 0xff);
dummy_texture = meta_create_color_texture_4ub (0xff, 0xff, 0xff, 0xff,
COGL_TEXTURE_NONE);
texture_material_template = cogl_material_new ();
cogl_material_set_layer (texture_material_template, 0, dummy_texture);

View File

@@ -25,10 +25,11 @@
#include <cogl/cogl.h>
CoglHandle meta_create_color_texture_4ub (guint8 red,
guint8 green,
guint8 blue,
guint8 alpha);
CoglHandle meta_create_color_texture_4ub (guint8 red,
guint8 green,
guint8 blue,
guint8 alpha,
CoglTextureFlags flags);
CoglHandle meta_create_texture_material (CoglHandle src_texture);
#endif /* __META_COGL_UTILS_H__ */

View File

@@ -11,12 +11,15 @@
#include <meta/compositor-mutter.h>
#include "xprops.h"
#include <meta/prefs.h>
#include <meta/main.h>
#include <meta/meta-shadow-factory.h>
#include "meta-window-actor-private.h"
#include "meta-window-group.h"
#include "meta-background-actor.h"
#include "window-private.h" /* to check window->hidden */
#include "display-private.h" /* for meta_display_lookup_x_window() */
#include "core.h" /* for meta_core_select_events() */
#include "input-events.h"
#include <X11/extensions/shape.h>
#include <X11/extensions/Xcomposite.h>
@@ -177,7 +180,6 @@ get_output_window (MetaScreen *screen)
MetaDisplay *display = meta_screen_get_display (screen);
Display *xdisplay = meta_display_get_xdisplay (display);
Window output, xroot;
XWindowAttributes attr;
long event_mask;
xroot = meta_screen_get_xroot (screen);
@@ -191,13 +193,7 @@ get_output_window (MetaScreen *screen)
KeyPressMask | KeyReleaseMask;
output = XCompositeGetOverlayWindow (xdisplay, xroot);
if (XGetWindowAttributes (xdisplay, output, &attr))
{
event_mask |= attr.your_event_mask;
}
XSelectInput (xdisplay, output, event_mask);
meta_core_select_events (xdisplay, output, event_mask, TRUE);
return output;
}
@@ -363,26 +359,34 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
* merge the two.
*/
MetaDisplay *display = meta_screen_get_display (screen);
Display *xdpy = meta_display_get_xdisplay (display);
MetaCompositor *compositor = display->compositor;
gboolean pointer_grabbed = FALSE;
gboolean keyboard_grabbed = FALSE;
int result;
gboolean result;
MetaDevice *device;
MetaGrabInfo *grab_info;
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
/* FIXME: need a real device here, and probably
* some exclusion mode for other devices */
device = meta_device_map_lookup (display->device_map,
META_CORE_POINTER_ID);
grab_info = meta_display_get_grab_info (display, device);
if (compositor->modal_plugin != NULL || grab_info != NULL)
return FALSE;
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
{
result = XGrabPointer (xdpy, grab_window,
False, /* owner_events */
(ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask | PointerMotionMask),
GrabModeAsync, GrabModeAsync,
None, /* confine to */
cursor,
timestamp);
if (result != Success)
result = meta_device_grab (device,
grab_window,
(ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask | PointerMotionMask),
cursor,
FALSE,
FALSE,
timestamp);
if (!result)
goto fail;
pointer_grabbed = TRUE;
@@ -390,22 +394,25 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0)
{
result = XGrabKeyboard (xdpy, grab_window,
False, /* owner_events */
GrabModeAsync, GrabModeAsync,
timestamp);
if (result != Success)
result = meta_device_grab (meta_device_get_paired_device (device),
grab_window,
(KeyPressMask | KeyReleaseMask),
META_CURSOR_DEFAULT,
FALSE, FALSE,
timestamp);
if (!result)
goto fail;
keyboard_grabbed = TRUE;
}
display->grab_op = META_GRAB_OP_COMPOSITOR;
display->grab_window = NULL;
display->grab_screen = screen;
display->grab_have_pointer = TRUE;
display->grab_have_keyboard = TRUE;
grab_info = meta_display_create_grab_info (display, device);
grab_info->grab_op = META_GRAB_OP_COMPOSITOR;
grab_info->grab_window = NULL;
grab_info->grab_screen = screen;
grab_info->grab_have_pointer = TRUE;
grab_info->grab_have_keyboard = TRUE;
compositor->modal_plugin = plugin;
@@ -413,9 +420,9 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
fail:
if (pointer_grabbed)
XUngrabPointer (xdpy, timestamp);
meta_device_ungrab (device, timestamp);
if (keyboard_grabbed)
XUngrabKeyboard (xdpy, timestamp);
meta_device_ungrab (meta_device_get_paired_device (device), timestamp);
return FALSE;
}
@@ -426,20 +433,19 @@ meta_end_modal_for_plugin (MetaScreen *screen,
guint32 timestamp)
{
MetaDisplay *display = meta_screen_get_display (screen);
Display *xdpy = meta_display_get_xdisplay (display);
MetaCompositor *compositor = display->compositor;
MetaDevice *device;
g_return_if_fail (compositor->modal_plugin == plugin);
XUngrabPointer (xdpy, timestamp);
XUngrabKeyboard (xdpy, timestamp);
/* FIXME: need a real device here */
device = meta_device_map_lookup (display->device_map,
META_CORE_POINTER_ID);
display->grab_op = META_GRAB_OP_NONE;
display->grab_window = NULL;
display->grab_screen = NULL;
display->grab_have_pointer = FALSE;
display->grab_have_keyboard = FALSE;
meta_device_ungrab (device, timestamp);
meta_device_ungrab (meta_device_get_paired_device (device), timestamp);
meta_display_remove_grab_info (display, device);
compositor->modal_plugin = NULL;
}
@@ -472,22 +478,44 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
Window xroot = meta_screen_get_xroot (screen);
Window xwin;
gint width, height;
XWindowAttributes attr;
long event_mask;
guint n_retries;
guint max_retries;
/* Check if the screen is already managed */
if (meta_screen_get_compositor_data (screen))
return;
meta_error_trap_push_with_return (display);
XCompositeRedirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
XSync (xdisplay, FALSE);
if (meta_get_replace_current_wm ())
max_retries = 5;
else
max_retries = 1;
if (meta_error_trap_pop_with_return (display))
n_retries = 0;
/* Some compositors (like old versions of Mutter) might not properly unredirect
* subwindows before destroying the WM selection window; so we wait a while
* for such a compositor to exit before giving up.
*/
while (TRUE)
{
g_warning ("Another compositing manager is running on screen %i",
screen_number);
return;
meta_error_trap_push_with_return (display);
XCompositeRedirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
XSync (xdisplay, FALSE);
if (!meta_error_trap_pop_with_return (display))
break;
if (n_retries == max_retries)
{
/* This probably means that a non-WM compositor like xcompmgr is running;
* we have no way to get it to exit */
meta_fatal (_("Another compositing manager is already running on screen %i on display \"%s\"."),
screen_number, display->name);
}
n_retries++;
g_usleep (G_USEC_PER_SEC);
}
info = g_new0 (MetaCompScreen, 1);
@@ -524,12 +552,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
KeyPressMask | KeyReleaseMask |
StructureNotifyMask;
if (XGetWindowAttributes (xdisplay, xwin, &attr))
{
event_mask |= attr.your_event_mask;
}
XSelectInput (xdisplay, xwin, event_mask);
meta_core_select_events (xdisplay, xwin, event_mask, TRUE);
info->window_group = meta_window_group_new (screen);
info->background_actor = meta_background_actor_new (screen);
@@ -587,6 +610,14 @@ void
meta_compositor_unmanage_screen (MetaCompositor *compositor,
MetaScreen *screen)
{
MetaDisplay *display = meta_screen_get_display (screen);
Display *xdisplay = meta_display_get_xdisplay (display);
Window xroot = meta_screen_get_xroot (screen);
/* This is the most important part of cleanup - we have to do this
* before giving up the window manager selection or the next
* window manager won't be able to redirect subwindows */
XCompositeUnredirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
}
void
@@ -626,9 +657,15 @@ meta_compositor_set_updates (MetaCompositor *compositor,
}
static gboolean
is_grabbed_event (XEvent *event)
is_grabbed_event (MetaDisplay *display,
XEvent *event)
{
switch (event->xany.type)
guint evtype;
if (!meta_input_event_get_type (display, event, &evtype))
return FALSE;
switch (evtype)
{
case ButtonPress:
case ButtonRelease:
@@ -651,7 +688,8 @@ meta_compositor_process_event (MetaCompositor *compositor,
XEvent *event,
MetaWindow *window)
{
if (compositor->modal_plugin && is_grabbed_event (event))
if (compositor->modal_plugin &&
is_grabbed_event (compositor->display, event))
{
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (compositor->modal_plugin);

View File

@@ -113,8 +113,13 @@ set_texture_to_stage_color (MetaBackgroundActor *self)
CoglHandle texture;
clutter_stage_get_color (CLUTTER_STAGE (stage), &color);
/* Slicing will prevent COGL from using hardware texturing for
* the tiled 1x1 pixmap, and will cause it to draw the window
* background in millions of separate 1x1 rectangles */
texture = meta_create_color_texture_4ub (color.red, color.green,
color.blue, 0xff);
color.blue, 0xff,
COGL_TEXTURE_NO_SLICING);
set_texture (self, texture);
cogl_handle_unref (texture);
}

View File

@@ -47,7 +47,8 @@ void meta_shadow_paint (MetaShadow *shadow,
int window_width,
int window_height,
guint8 opacity,
cairo_region_t *clip);
cairo_region_t *clip,
gboolean clip_strictly);
void meta_shadow_get_bounds (MetaShadow *shadow,
int window_x,
int window_y,

View File

@@ -120,17 +120,17 @@ static guint signals[LAST_SIGNAL] = { 0 };
/* The first element in this array also defines the default parameters
* for newly created classes */
MetaShadowClassInfo default_shadow_classes[] = {
{ "normal", { 12, -1, 0, 8, 255 }, { 6, -1, 0, 4, 255 } },
{ "dialog", { 12, -1, 0, 8, 255 }, { 6, -1, 0, 4, 255 } },
{ "modal_dialog", { 12, -1, 0, 8, 255 }, { 6, -1, 0, 4, 255 } },
{ "utility", { 12, -1, 0, 8, 255 }, { 6, -1, 0, 4, 255 } },
{ "border", { 12, -1, 0, 8, 255 }, { 6, -1, 0, 4, 255 } },
{ "menu", { 12, -1, 0, 8, 255 }, { 6, -1, 0, 4, 255 } },
{ "normal", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
{ "dialog", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
{ "modal_dialog", { 6, -1, 0, 1, 255 }, { 3, -1, 0, 3, 128 } },
{ "utility", { 3, -1, 0, 1, 255 }, { 3, -1, 0, 1, 128 } },
{ "border", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 3, 128 } },
{ "menu", { 6, -1, 0, 3, 255 }, { 3, -1, 0, 0, 128 } },
{ "popup-menu", { 6, -1, 0, 4, 255 }, { 6, -1, 0, 4, 255 } },
{ "popup-menu", { 1, -1, 0, 1, 128 }, { 1, -1, 0, 1, 128 } },
{ "dropdown-menu", { 6, 25, 0, 4, 255 }, { 6, 100, 0, 4, 255 } },
{ "attached", { 6, 25, 0, 4, 255 }, { 6, 100, 0, 4, 255 } }
{ "dropdown-menu", { 1, 10, 0, 1, 128 }, { 1, 10, 0, 1, 128 } },
{ "attached", { 2, 50, 0, 1, 255 }, { 1, 50, 0, 1, 128 } }
};
G_DEFINE_TYPE (MetaShadowFactory, meta_shadow_factory, G_TYPE_OBJECT);
@@ -189,8 +189,10 @@ meta_shadow_unref (MetaShadow *shadow)
* @window_width: actual width of the region to paint a shadow for
* @window_height: actual height of the region to paint a shadow for
* @clip: (allow-none): if non-%NULL specifies the visible portion
* of the shadow. Drawing won't be strictly clipped to this region
* but it will be used to optimize what is drawn.
* of the shadow.
* @clip_strictly: if %TRUE, drawing will be clipped strictly
* to @clip, otherwise, it will be only used to optimize
* drawing.
*
* Paints the shadow at the given position, for the specified actual
* size of the region. (Since a #MetaShadow can be shared between
@@ -204,7 +206,8 @@ meta_shadow_paint (MetaShadow *shadow,
int window_width,
int window_height,
guint8 opacity,
cairo_region_t *clip)
cairo_region_t *clip,
gboolean clip_strictly)
{
float texture_width = cogl_texture_get_width (shadow->texture);
float texture_height = cogl_texture_get_height (shadow->texture);
@@ -276,6 +279,9 @@ meta_shadow_paint (MetaShadow *shadow,
dest_rect.y = dest_y[j];
dest_rect.height = dest_y[j + 1] - dest_y[j];
if (dest_rect.height == 0)
continue;
for (i = 0; i < n_x; i++)
{
cairo_region_overlap_t overlap;
@@ -283,16 +289,64 @@ meta_shadow_paint (MetaShadow *shadow,
dest_rect.x = dest_x[i];
dest_rect.width = dest_x[i + 1] - dest_x[i];
if (dest_rect.width == 0)
continue;
if (clip)
overlap = cairo_region_contains_rectangle (clip, &dest_rect);
else
overlap = CAIRO_REGION_OVERLAP_PART;
overlap = CAIRO_REGION_OVERLAP_IN;
if (overlap != CAIRO_REGION_OVERLAP_OUT)
cogl_rectangle_with_texture_coords (dest_x[i], dest_y[j],
dest_x[i + 1], dest_y[j + 1],
src_x[i], src_y[j],
src_x[i + 1], src_y[j + 1]);
/* There's quite a bit of overhead from allocating a new
* region in order to find an exact intersection and
* generating more geometry - we make the assumption that
* unless we have to clip strictly it will be cheaper to
* just draw the entire rectangle.
*/
if (overlap == CAIRO_REGION_OVERLAP_IN ||
(overlap == CAIRO_REGION_OVERLAP_PART && !clip_strictly))
{
cogl_rectangle_with_texture_coords (dest_x[i], dest_y[j],
dest_x[i + 1], dest_y[j + 1],
src_x[i], src_y[j],
src_x[i + 1], src_y[j + 1]);
}
else if (overlap == CAIRO_REGION_OVERLAP_PART)
{
cairo_region_t *intersection;
int n_rectangles, k;
intersection = cairo_region_create_rectangle (&dest_rect);
cairo_region_intersect (intersection, clip);
n_rectangles = cairo_region_num_rectangles (intersection);
for (k = 0; k < n_rectangles; k++)
{
cairo_rectangle_int_t rect;
float src_x1, src_x2, src_y1, src_y2;
cairo_region_get_rectangle (intersection, k, &rect);
/* Separately linear interpolate X and Y coordinates in the source
* based on the destination X and Y coordinates */
src_x1 = (src_x[i] * (dest_rect.x + dest_rect.width - rect.x) +
src_x[i + 1] * (rect.x - dest_rect.x)) / dest_rect.width;
src_x2 = (src_x[i] * (dest_rect.x + dest_rect.width - (rect.x + rect.width)) +
src_x[i + 1] * (rect.x + rect.width - dest_rect.x)) / dest_rect.width;
src_y1 = (src_y[j] * (dest_rect.y + dest_rect.height - rect.y) +
src_y[j + 1] * (rect.y - dest_rect.y)) / dest_rect.height;
src_y2 = (src_y[j] * (dest_rect.y + dest_rect.height - (rect.y + rect.height)) +
src_y[j + 1] * (rect.y + rect.height - dest_rect.y)) / dest_rect.height;
cogl_rectangle_with_texture_coords (rect.x, rect.y,
rect.x + rect.width, rect.y + rect.height,
src_x1, src_y1, src_x2, src_y2);
}
cairo_region_destroy (intersection);
}
}
}
}
@@ -317,7 +371,7 @@ meta_shadow_get_bounds (MetaShadow *shadow,
cairo_rectangle_int_t *bounds)
{
bounds->x = window_x - shadow->outer_border_left;
bounds->y = window_x - shadow->outer_border_top;
bounds->y = window_y - shadow->outer_border_top;
bounds->width = window_width + shadow->outer_border_left + shadow->outer_border_right;
bounds->height = window_height + shadow->outer_border_top + shadow->outer_border_bottom;
}

View File

@@ -373,6 +373,14 @@ window_decorated_notify (MetaWindow *mw,
meta_window_actor_constructed (G_OBJECT (self));
}
static void
window_appears_focused_notify (MetaWindow *mw,
GParamSpec *arg1,
gpointer data)
{
clutter_actor_queue_redraw (CLUTTER_ACTOR (data));
}
static void
meta_window_actor_constructed (GObject *object)
{
@@ -403,8 +411,6 @@ meta_window_actor_constructed (GObject *object)
if (format && format->type == PictTypeDirect && format->direct.alphaMask)
priv->argb32 = TRUE;
meta_window_actor_update_opacity (self);
if (!priv->actor)
{
priv->actor = meta_shaped_texture_new ();
@@ -422,6 +428,8 @@ meta_window_actor_constructed (GObject *object)
g_signal_connect (priv->window, "notify::decorated",
G_CALLBACK (window_decorated_notify), self);
g_signal_connect (priv->window, "notify::appears-focused",
G_CALLBACK (window_appears_focused_notify), self);
}
else
{
@@ -432,7 +440,7 @@ meta_window_actor_constructed (GObject *object)
clutter_actor_raise_top (priv->actor);
}
meta_window_actor_update_opacity (self);
meta_window_actor_update_shape (self, priv->shaped);
}
@@ -694,6 +702,26 @@ meta_window_actor_get_shadow_bounds (MetaWindowActor *self,
}
#endif
/* If we have an ARGB32 window that we decorate with a frame, it's
* probably something like a translucent terminal - something where
* the alpha channel represents transparency rather than a shape. We
* don't want to show the shadow through the translucent areas since
* the shadow is wrong for translucent windows (it should be
* translucent itself and colored), and not only that, will /look/
* horribly wrong - a misplaced big black blob. As a hack, what we
* want to do is just draw the shadow as normal outside the frame, and
* inside the frame draw no shadow. This is also not even close to
* the right result, but looks OK. We also apply this approach to
* windows set to be partially translucent with _NET_WM_WINDOW_OPACITY.
*/
static gboolean
clip_shadow_under_window (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;
return (priv->argb32 || priv->opacity != 0xff) && priv->window->frame;
}
static void
meta_window_actor_paint (ClutterActor *actor)
{
@@ -706,17 +734,36 @@ meta_window_actor_paint (ClutterActor *actor)
{
MetaShadowParams params;
cairo_rectangle_int_t shape_bounds;
cairo_region_t *clip = priv->shadow_clip;
meta_window_actor_get_shape_bounds (self, &shape_bounds);
meta_window_actor_get_shadow_params (self, appears_focused, &params);
/* The frame bounds are already subtracted from priv->shadow_clip
* if that exists.
*/
if (!clip && clip_shadow_under_window (self))
{
cairo_region_t *frame_bounds = meta_window_get_frame_bounds (priv->window);
cairo_rectangle_int_t bounds;
meta_window_actor_get_shadow_bounds (self, appears_focused, &bounds);
clip = cairo_region_create_rectangle (&bounds);
cairo_region_subtract (clip, frame_bounds);
}
meta_shadow_paint (shadow,
params.x_offset + shape_bounds.x,
params.y_offset + shape_bounds.y,
shape_bounds.width,
shape_bounds.height,
(clutter_actor_get_paint_opacity (actor) * params.opacity) / 255,
priv->shadow_clip);
(clutter_actor_get_paint_opacity (actor) * params.opacity * priv->opacity) / (255 * 255),
clip,
clip_shadow_under_window (self)); /* clip_strictly - not just as an optimization */
if (clip && clip != priv->shadow_clip)
cairo_region_destroy (clip);
}
CLUTTER_ACTOR_CLASS (meta_window_actor_parent_class)->paint (actor);
@@ -1636,13 +1683,22 @@ meta_window_actor_update_bounding_region (MetaWindowActor *self,
priv->bounding_region = cairo_region_create_rectangle (&bounding_rectangle);
/* When we're shaped, we use the shape region to generate the shadow; the shape
* region only changes when we get ShapeNotify event; but for unshaped windows
* we generate the shadow from the bounding region, so we need to recompute
* the shadow when the size changes.
*/
if (!priv->shaped)
meta_window_actor_invalidate_shadow (self);
if (priv->shaped)
{
/* If we're shaped, the implicit shape region clipping we need to do needs
* to be updated.
*/
meta_window_actor_update_shape (self, TRUE);
}
else
{
/* When we're shaped, we use the shape region to generate the shadow; the shape
* region only changes when we get ShapeNotify event; but for unshaped windows
* we generate the shadow from the bounding region, so we need to recompute
* the shadow when the size changes.
*/
meta_window_actor_invalidate_shadow (self);
}
g_signal_emit (self, signals[SIZE_CHANGED], 0);
}
@@ -1663,6 +1719,20 @@ meta_window_actor_update_shape_region (MetaWindowActor *self,
cairo_rectangle_int_t rect = { rects[i].x, rects[i].y, rects[i].width, rects[i].height };
cairo_region_union_rectangle (priv->shape_region, &rect);
}
/* Our "shape_region" is called the "bounding region" in the X Shape
* Extension Documentation.
*
* Our "bounding_region" is called the "bounding rectangle", which defines
* the shape of the window as if it the window was unshaped.
*
* The X Shape extension requires that the "bounding region" can never
* extend outside the "bounding rectangle", and says it must be implicitly
* clipped before rendering. The region we get back hasn't been clipped.
* We explicitly clip the region here.
*/
if (priv->bounding_region != NULL)
cairo_region_intersect (priv->shape_region, priv->bounding_region);
}
/**
@@ -1680,7 +1750,7 @@ meta_window_actor_get_obscured_region (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;
if (!priv->argb32 && priv->back_pixmap)
if (!priv->argb32 && priv->opacity == 0xff && priv->back_pixmap)
{
if (priv->shaped)
return priv->shape_region;
@@ -1779,6 +1849,12 @@ meta_window_actor_set_visible_region_beneath (MetaWindowActor *self,
{
meta_window_actor_clear_shadow_clip (self);
priv->shadow_clip = cairo_region_copy (beneath_region);
if (clip_shadow_under_window (self))
{
cairo_region_t *frame_bounds = meta_window_get_frame_bounds (priv->window);
cairo_region_subtract (priv->shadow_clip, frame_bounds);
}
}
}
@@ -2137,5 +2213,5 @@ meta_window_actor_update_opacity (MetaWindowActor *self)
opacity = 255;
self->priv->opacity = opacity;
clutter_actor_set_opacity (CLUTTER_ACTOR (self), opacity);
clutter_actor_set_opacity (self->priv->actor, opacity);
}

View File

@@ -248,7 +248,6 @@ expand_region_inverse (cairo_region_t *region,
MetaRegionBuilder builder;
MetaRegionIterator iter;
cairo_rectangle_int_t extents;
cairo_region_t *chunk;
int last_x;
@@ -268,16 +267,11 @@ expand_region_inverse (cairo_region_t *region,
extents.x, extents.y + extents.height, extents.width, 1,
x_amount, y_amount, flip);
chunk = NULL;
last_x = extents.x;
for (meta_region_iterator_init (&iter, region);
!meta_region_iterator_at_end (&iter);
meta_region_iterator_next (&iter))
{
if (chunk == NULL)
chunk = cairo_region_create ();
if (iter.rectangle.x > last_x)
add_expanded_rect (&builder,
last_x, iter.rectangle.y,

View File

@@ -76,6 +76,8 @@ compute_above_tab_keycode (Display *xdisplay)
keyboard = XkbGetKeyboard (xdisplay,
XkbGBN_ClientSymbolsMask | XkbGBN_KeyNamesMask | XkbGBN_GeometryMask,
XkbUseCoreKbd);
if (!keyboard)
return best_keycode;
geometry = keyboard->geom;

View File

@@ -230,6 +230,35 @@ bell_flash_window_frame (MetaWindow *window)
bell_unflash_frame, window->frame, NULL);
}
static MetaWindow *
get_flash_window (MetaDisplay *display,
XkbAnyEvent *xkb_ev)
{
XkbBellNotifyEvent *xkb_bell_event;
MetaWindow *window;
g_assert (xkb_ev->xkb_type == XkbBellNotify);
xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
if (!window &&
g_hash_table_size (display->focus_info) == 1)
{
GHashTableIter iter;
MetaFocusInfo *info;
/* If there is only one focused window, use it */
g_hash_table_iter_init (&iter, display->focus_info);
if (g_hash_table_iter_next (&iter, NULL, (gpointer *) &info) &&
info->focus_window && info->focus_window->frame)
window = info->focus_window;
}
return window;
}
/**
* Flashes the frame of the focussed window. If there is no focussed window,
* flashes the screen.
@@ -241,15 +270,11 @@ static void
bell_flash_frame (MetaDisplay *display,
XkbAnyEvent *xkb_ev)
{
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent *) xkb_ev;
MetaWindow *window;
g_assert (xkb_ev->xkb_type == XkbBellNotify);
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
if (!window && (display->focus_window))
{
window = display->focus_window;
}
window = get_flash_window (display, xkb_ev);
if (window && window->frame)
{
bell_flash_window_frame (window);
@@ -310,9 +335,7 @@ meta_bell_notify (MetaDisplay *display,
ca_proplist_sets (p, CA_PROP_EVENT_DESCRIPTION, _("Bell event"));
ca_proplist_sets (p, CA_PROP_CANBERRA_CACHE_CONTROL, "permanent");
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
if (!window && (display->focus_window) && (display->focus_window->frame))
window = display->focus_window;
window = get_flash_window (display, xkb_ev);
if (window)
{

View File

@@ -754,7 +754,7 @@ constrain_modal_dialog (MetaWindow *window,
if (!meta_prefs_get_attach_modal_dialogs ())
return TRUE;
if (window->type != META_WINDOW_MODAL_DIALOG || !parent || parent == window)
if (window->type != META_WINDOW_MODAL_DIALOG || !parent)
return TRUE;
x = parent->rect.x + (parent->rect.width / 2 - info->current.width / 2);
@@ -885,6 +885,7 @@ constrain_tiling (MetaWindow *window,
gboolean hminbad, vminbad;
gboolean horiz_equal, vert_equal;
gboolean constraint_already_satisfied;
MetaDevice *pointer;
if (priority > PRIORITY_TILING)
return TRUE;
@@ -893,10 +894,12 @@ constrain_tiling (MetaWindow *window,
if (!META_WINDOW_TILED_SIDE_BY_SIDE (window))
return TRUE;
pointer = meta_window_guess_grab_pointer (window);
/* Calculate target_size - as the tile previews need this as well, we
* use an external function for the actual calculation
*/
meta_window_get_current_tile_area (window, &target_size);
meta_window_get_current_tile_area (window, pointer, &target_size);
unextend_by_frame (&target_size, info->fgeom);
/* Check min size constraints; max size constraints are ignored as for
@@ -1362,15 +1365,18 @@ constrain_titlebar_visible (MetaWindow *window,
int bottom_amount;
int horiz_amount_offscreen, vert_amount_offscreen;
int horiz_amount_onscreen, vert_amount_onscreen;
MetaGrabInfo *grab_info;
if (priority > PRIORITY_TITLEBAR_VISIBLE)
return TRUE;
grab_info = window->cur_grab;
/* Allow the titlebar beyond the top of the screen only if the user wasn't
* clicking on the frame to start the move.
*/
unconstrained_user_action =
info->is_user_action && !window->display->grab_frame_action;
info->is_user_action && (!grab_info || !grab_info->grab_frame_action);
/* Exit early if we know the constraint won't apply--note that this constraint
* is only meant for normal windows (e.g. we don't want docks to be shoved

View File

@@ -30,6 +30,11 @@
#include <meta/prefs.h>
#include <meta/errors.h>
#ifdef HAVE_XINPUT2
#include <X11/extensions/XInput2.h>
#include "devices-xi2.h"
#endif
/* Looks up the MetaWindow representing the frame of the given X window.
* Used as a helper function by a bunch of the functions below.
*
@@ -107,9 +112,6 @@ meta_core_get (Display *xdisplay,
case META_CORE_GET_CLIENT_HEIGHT:
*((gint*)answer) = window->rect.height;
break;
case META_CORE_IS_TITLEBAR_ONSCREEN:
*((gboolean*)answer) = meta_window_titlebar_is_onscreen (window);
break;
case META_CORE_GET_CLIENT_XWINDOW:
*((Window*)answer) = window->xwindow;
break;
@@ -146,6 +148,9 @@ meta_core_get (Display *xdisplay,
case META_CORE_GET_FRAME_HEIGHT:
*((gint*)answer) = window->frame->rect.height;
break;
case META_CORE_GET_THEME_VARIANT:
*((char**)answer) = window->gtk_theme_variant;
break;
case META_CORE_GET_SCREEN_WIDTH:
*((gint*)answer) = window->screen->rect.width;
break;
@@ -245,9 +250,19 @@ lower_window_and_transients (MetaWindow *window,
void
meta_core_user_lower_and_unfocus (Display *xdisplay,
Window frame_xwindow,
int device_id,
guint32 timestamp)
{
MetaWindow *window = get_window (xdisplay, frame_xwindow);
MetaDevice *pointer;
pointer = meta_device_map_lookup (window->display->device_map, device_id);
if (pointer == NULL)
return;
if (!META_IS_DEVICE_POINTER (pointer))
pointer = meta_device_get_paired_device (pointer);
lower_window_and_transients (window, NULL);
@@ -256,30 +271,36 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
* this will be invoked via keyboard action or by a mouse action;
* in either case the window or a modal child will have been focused.) */
meta_workspace_focus_default_window (window->screen->active_workspace,
pointer,
NULL,
timestamp);
}
void
meta_core_lower_beneath_focus_window (Display *xdisplay,
Window xwindow,
guint32 timestamp)
meta_core_lower_beneath_grab_window (Display *xdisplay,
Window xwindow,
int device_id,
guint32 timestamp)
{
XWindowChanges changes;
MetaDisplay *display;
MetaScreen *screen;
MetaWindow *focus_window;
MetaWindow *grab_window;
MetaDevice *pointer;
MetaGrabInfo *grab_info;
display = meta_display_for_x_display (xdisplay);
screen = meta_display_screen_for_xwindow (display, xwindow);
focus_window = meta_stack_get_top (screen->stack);
pointer = meta_device_map_lookup (display->device_map, device_id);
grab_info = meta_display_get_grab_info (display, pointer);
grab_window = grab_info->grab_window;
if (focus_window == NULL)
if (grab_window == NULL)
return;
changes.stack_mode = Below;
changes.sibling = focus_window->frame ? focus_window->frame->xwindow
: focus_window->xwindow;
changes.sibling = grab_window->frame ? grab_window->frame->xwindow
: grab_window->xwindow;
meta_stack_tracker_record_lower_below (screen->stack_tracker,
xwindow,
@@ -491,18 +512,27 @@ meta_core_get_active_workspace (Screen *xscreen)
void
meta_core_show_window_menu (Display *xdisplay,
Window frame_xwindow,
int device_id,
int root_x,
int root_y,
int button,
guint32 timestamp)
{
MetaWindow *window = get_window (xdisplay, frame_xwindow);
MetaDevice *device;
/* There is already a menu popped up,
* most likely from another device
*/
if (window->menu)
return;
if (meta_prefs_get_raise_on_click ())
meta_window_raise (window);
meta_window_focus (window, timestamp);
meta_window_show_menu (window, root_x, root_y, button, timestamp);
device = meta_device_map_lookup (window->display->device_map, device_id);
meta_window_show_menu (window, device, root_x, root_y, button, timestamp);
}
void
@@ -638,6 +668,7 @@ meta_core_get_workspace_name_with_index (Display *xdisplay,
gboolean
meta_core_begin_grab_op (Display *xdisplay,
Window frame_xwindow,
int device_id,
MetaGrabOp op,
gboolean pointer_already_grabbed,
gboolean frame_action,
@@ -650,13 +681,16 @@ meta_core_begin_grab_op (Display *xdisplay,
MetaWindow *window = get_window (xdisplay, frame_xwindow);
MetaDisplay *display;
MetaScreen *screen;
MetaDevice *device;
display = meta_display_for_x_display (xdisplay);
screen = meta_display_screen_for_xwindow (display, frame_xwindow);
g_assert (screen != NULL);
return meta_display_begin_grab_op (display, screen, window,
device = meta_device_map_lookup (display->device_map, device_id);
return meta_display_begin_grab_op (display, screen, window, device,
op, pointer_already_grabbed,
frame_action,
button, modmask,
@@ -665,57 +699,58 @@ meta_core_begin_grab_op (Display *xdisplay,
void
meta_core_end_grab_op (Display *xdisplay,
int device_id,
guint32 timestamp)
{
MetaDisplay *display;
display = meta_display_for_x_display (xdisplay);
MetaDevice *device;
meta_display_end_grab_op (display, timestamp);
display = meta_display_for_x_display (xdisplay);
device = meta_device_map_lookup (display->device_map, device_id);
meta_display_end_grab_op (display, device, timestamp);
}
MetaGrabOp
meta_core_get_grab_op (Display *xdisplay)
meta_core_frame_has_grab (Display *xdisplay,
Window frame_xwindow,
gint *device_id,
gint *button_ret)
{
MetaDisplay *display;
display = meta_display_for_x_display (xdisplay);
MetaWindow *window;
return display->grab_op;
window = get_window (xdisplay, frame_xwindow);
if (window != NULL &&
window->cur_grab != NULL)
{
if (button_ret)
*button_ret = window->cur_grab->grab_button;
if (device_id)
*device_id = meta_device_get_id (window->cur_grab->grab_pointer);
return window->cur_grab->grab_op;
}
return META_GRAB_OP_NONE;
}
Window
meta_core_get_grab_frame (Display *xdisplay)
meta_core_get_frame (Display *xdisplay,
Window client_xwindow)
{
MetaDisplay *display;
MetaWindow *window;
display = meta_display_for_x_display (xdisplay);
window = meta_display_lookup_x_window (display, client_xwindow);
g_assert (display != NULL);
g_assert (display->grab_op == META_GRAB_OP_NONE ||
display->grab_screen != NULL);
g_assert (display->grab_op == META_GRAB_OP_NONE ||
display->grab_screen->display->xdisplay == xdisplay);
if (display->grab_op != META_GRAB_OP_NONE &&
display->grab_window &&
display->grab_window->frame)
return display->grab_window->frame->xwindow;
else
return None;
}
if (window &&
window->frame)
return window->frame->xwindow;
int
meta_core_get_grab_button (Display *xdisplay)
{
MetaDisplay *display;
display = meta_display_for_x_display (xdisplay);
if (display->grab_op == META_GRAB_OP_NONE)
return -1;
return display->grab_button;
return None;
}
void
@@ -731,13 +766,24 @@ meta_core_grab_buttons (Display *xdisplay,
}
void
meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen,
MetaCursor cursor)
meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen,
gint device_id,
MetaCursor cursor)
{
MetaWindow *window = get_window (xdisplay, frame_on_screen);
MetaDevice *pointer;
meta_frame_set_screen_cursor (window->frame, cursor);
pointer = meta_device_map_lookup (window->display->device_map,
device_id);
if (pointer == NULL)
return;
if (!META_IS_DEVICE_POINTER (pointer))
pointer = meta_device_get_paired_device (pointer);
meta_frame_set_screen_cursor (window->frame, pointer, cursor);
}
void
@@ -775,3 +821,69 @@ meta_invalidate_default_icons (void)
g_slist_free (windows);
}
/* Selects events on an xwindow, using XInput2 if available/in use,
* this function doesn't require the xwindow to have a backing
* MetaWindow.
*/
void
meta_core_select_events (Display *xdisplay,
Window xwindow,
gint evmask,
gboolean preserve_old_mask)
{
MetaDisplay *display;
display = meta_display_for_x_display (xdisplay);
#ifdef HAVE_XINPUT2
if (display->have_xinput2)
{
XIEventMask mask;
mask.deviceid = XIAllMasterDevices;
mask.mask = meta_device_xi2_translate_event_mask (evmask,
&mask.mask_len);
if (preserve_old_mask)
{
XIEventMask *prev;
gint n_masks, i, j;
prev = XIGetSelectedEvents (xdisplay, xwindow, &n_masks);
for (i = 0; i < n_masks; i++)
{
if (prev[i].deviceid != XIAllMasterDevices)
continue;
for (j = 0; j < MIN (mask.mask_len, prev[i].mask_len); j++)
mask.mask[j] |= prev[i].mask[j];
}
XFree (prev);
}
XISelectEvents (xdisplay, xwindow, &mask, 1);
/* Unset any input event so they are only handled via XInput2 */
evmask &= ~(KeyPressMask | KeyReleaseMask |
ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask |
PointerMotionMask | PointerMotionHintMask |
Button1MotionMask | Button2MotionMask |
Button3MotionMask | Button4MotionMask |
Button5MotionMask | ButtonMotionMask |
FocusChangeMask);
}
#endif
if (preserve_old_mask)
{
XWindowAttributes attr;
if (XGetWindowAttributes (xdisplay, xwindow, &attr))
evmask |= attr.your_event_mask;
}
XSelectInput (xdisplay, xwindow, evmask);
}

View File

@@ -35,7 +35,6 @@ typedef enum
META_CORE_WINDOW_HAS_FRAME,
META_CORE_GET_CLIENT_WIDTH,
META_CORE_GET_CLIENT_HEIGHT,
META_CORE_IS_TITLEBAR_ONSCREEN,
META_CORE_GET_CLIENT_XWINDOW,
META_CORE_GET_FRAME_FLAGS,
META_CORE_GET_FRAME_TYPE,
@@ -48,6 +47,7 @@ typedef enum
META_CORE_GET_FRAME_Y,
META_CORE_GET_FRAME_WIDTH,
META_CORE_GET_FRAME_HEIGHT,
META_CORE_GET_THEME_VARIANT,
META_CORE_GET_SCREEN_WIDTH,
META_CORE_GET_SCREEN_HEIGHT,
} MetaCoreGetType;
@@ -110,15 +110,17 @@ void meta_core_user_raise (Display *xdisplay,
Window frame_xwindow);
void meta_core_user_lower_and_unfocus (Display *xdisplay,
Window frame_xwindow,
int device_id,
guint32 timestamp);
void meta_core_user_focus (Display *xdisplay,
Window frame_xwindow,
guint32 timestamp);
void meta_core_lower_beneath_focus_window (Display *xdisplay,
Window xwindow,
guint32 timestamp);
void meta_core_lower_beneath_grab_window (Display *xdisplay,
Window xwindow,
int device_id,
guint32 timestamp);
void meta_core_minimize (Display *xdisplay,
Window frame_xwindow);
@@ -163,6 +165,7 @@ const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
void meta_core_show_window_menu (Display *xdisplay,
Window frame_xwindow,
int device_id,
int root_x,
int root_y,
int button,
@@ -175,6 +178,7 @@ void meta_core_get_menu_accelerator (MetaMenuOp menu_op,
gboolean meta_core_begin_grab_op (Display *xdisplay,
Window frame_xwindow,
int device_id,
MetaGrabOp op,
gboolean pointer_already_grabbed,
gboolean frame_action,
@@ -184,18 +188,29 @@ gboolean meta_core_begin_grab_op (Display *xdisplay,
int root_x,
int root_y);
void meta_core_end_grab_op (Display *xdisplay,
int device_id,
guint32 timestamp);
MetaGrabOp meta_core_get_grab_op (Display *xdisplay);
Window meta_core_get_grab_frame (Display *xdisplay);
int meta_core_get_grab_button (Display *xdisplay);
MetaGrabOp meta_core_frame_has_grab (Display *xdisplay,
Window frame_xwindow,
gint *device_id,
gint *button_ret);
Window meta_core_get_frame (Display *xdisplay,
Window client_xwindow);
void meta_core_grab_buttons (Display *xdisplay,
Window frame_xwindow);
void meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen,
MetaCursor cursor);
void meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen,
int device_id,
MetaCursor cursor);
void meta_core_select_events (Display *xdisplay,
Window xwindow,
gint evmask,
gboolean preserve_old_mask);
/* Used because we ignore EnterNotify when a window is unmapped that
* really shouldn't cause focus changes, by comparing the event serial

View File

@@ -88,19 +88,37 @@ delete_ping_timeout_func (MetaDisplay *display,
return;
}
window_title = g_locale_from_utf8 (window->title, -1, NULL, NULL, NULL);
/* This is to get a better string if the title isn't representable
* in the locale encoding; actual conversion to UTF-8 is done inside
* meta_show_dialog */
if (window->title && window->title[0])
{
tmp = g_locale_from_utf8 (window->title, -1, NULL, NULL, NULL);
if (tmp == NULL)
window_title = NULL;
else
window_title = window->title;
g_free (tmp);
}
else
{
window_title = NULL;
}
/* Translators: %s is a window title */
tmp = g_strdup_printf (_("<tt>%s</tt> is not responding."),
window_title);
if (window_title)
tmp = g_markup_printf_escaped (_("<tt>%s</tt> is not responding."),
window_title);
else
tmp = g_strdup (_("Application is not responding."));
window_content = g_strdup_printf (
"<big><b>%s</b></big>\n\n<i>%s</i>",
tmp,
_("You may choose to wait a short while for it to "
"continue or force the application to quit entirely."));
g_free (window_title);
dialog_pid =
meta_show_dialog ("--question",
window_content, NULL,

View File

@@ -0,0 +1,69 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Keyboard device abstraction */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include <config.h>
#include "device-keyboard.h"
G_DEFINE_ABSTRACT_TYPE (MetaDeviceKeyboard,
meta_device_keyboard,
META_TYPE_DEVICE)
static void
meta_device_keyboard_class_init (MetaDeviceKeyboardClass *klass)
{
}
static void
meta_device_keyboard_init (MetaDeviceKeyboard *keyboard)
{
}
Window
meta_device_keyboard_get_focus_window (MetaDeviceKeyboard *keyboard)
{
MetaDeviceKeyboardClass *klass;
g_return_val_if_fail (META_IS_DEVICE_KEYBOARD (keyboard), None);
klass = META_DEVICE_KEYBOARD_GET_CLASS (keyboard);
if (!klass->get_focus_window)
return None;
return (klass->get_focus_window) (keyboard);
}
void
meta_device_keyboard_set_focus_window (MetaDeviceKeyboard *keyboard,
Window xwindow,
Time timestamp)
{
MetaDeviceKeyboardClass *klass;
g_return_if_fail (META_IS_DEVICE_KEYBOARD (keyboard));
klass = META_DEVICE_KEYBOARD_GET_CLASS (keyboard);
if (klass->set_focus_window)
(klass->set_focus_window) (keyboard, xwindow, timestamp);
}

View File

@@ -0,0 +1,69 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file device-keyboard.h Keyboard device abstraction
*
* Input devices.
* This file contains the internal abstraction of keyboard devices so
* XInput2/core events can be handled similarly.
*/
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICE_KEYBOARD_H
#define META_DEVICE_KEYBOARD_H
#include "display-private.h"
#include "device-private.h"
#define META_TYPE_DEVICE_KEYBOARD (meta_device_keyboard_get_type ())
#define META_DEVICE_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_KEYBOARD, MetaDeviceKeyboard))
#define META_DEVICE_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_KEYBOARD, MetaDeviceKeyboardClass))
#define META_IS_DEVICE_KEYBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_KEYBOARD))
#define META_IS_DEVICE_KEYBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_KEYBOARD))
#define META_DEVICE_KEYBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_KEYBOARD, MetaDeviceKeyboardClass))
typedef struct _MetaDeviceKeyboard MetaDeviceKeyboard;
typedef struct _MetaDeviceKeyboardClass MetaDeviceKeyboardClass;
struct _MetaDeviceKeyboard
{
MetaDevice parent_instance;
};
struct _MetaDeviceKeyboardClass
{
MetaDeviceClass parent_instance;
Window (* get_focus_window) (MetaDeviceKeyboard *keyboard);
void (* set_focus_window) (MetaDeviceKeyboard *keyboard,
Window xwindow,
Time timestamp);
};
GType meta_device_keyboard_get_type (void) G_GNUC_CONST;
Window meta_device_keyboard_get_focus_window (MetaDeviceKeyboard *keyboard);
void meta_device_keyboard_set_focus_window (MetaDeviceKeyboard *keyboard,
Window xwindow,
Time timestamp);
#endif /* META_DEVICE_KEYBOARD_H */

134
src/core/device-map-core.c Normal file
View File

@@ -0,0 +1,134 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Input device map, core protocol implementation */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include "config.h"
#include "device-map-core.h"
#include "devices-core.h"
G_DEFINE_TYPE (MetaDeviceMapCore, meta_device_map_core, META_TYPE_DEVICE_MAP)
static gboolean
meta_device_map_core_grab_key (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers,
gboolean sync)
{
MetaDisplay *display;
gint retval;
display = meta_device_map_get_display (device_map);
retval = XGrabKey (display->xdisplay, keycode, modifiers,
xwindow, True,
GrabModeAsync, /* Never care about the other device */
(sync) ? GrabModeSync : GrabModeAsync);
return (retval == Success);
}
static void
meta_device_map_core_ungrab_key (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers)
{
MetaDisplay *display;
display = meta_device_map_get_display (device_map);
XUngrabKey (display->xdisplay, keycode, modifiers, xwindow);
}
static gboolean
meta_device_map_core_grab_button (MetaDeviceMap *device_map,
Window xwindow,
guint n_button,
guint modifiers,
guint evmask,
gboolean sync)
{
MetaDisplay *display;
gint retval;
display = meta_device_map_get_display (device_map);
retval = XGrabButton (display->xdisplay, n_button,
modifiers, xwindow, False,
evmask,
(sync) ? GrabModeSync : GrabModeAsync,
GrabModeAsync, /* Never care about the other device */
None, None);
return (retval == Success);
}
static void
meta_device_map_core_ungrab_button (MetaDeviceMap *device_map,
Window xwindow,
guint n_button,
guint modifiers)
{
MetaDisplay *display;
display = meta_device_map_get_display (device_map);
XUngrabButton (display->xdisplay, n_button, modifiers, xwindow);
}
static void
meta_device_map_core_constructed (GObject *object)
{
MetaDeviceMap *device_map = META_DEVICE_MAP (object);
MetaDevice *pointer, *keyboard;
MetaDisplay *display;
display = meta_device_map_get_display (device_map);
/* Insert core devices */
pointer = meta_device_pointer_core_new (display);
meta_device_map_add_device (device_map, pointer);
keyboard = meta_device_keyboard_core_new (display);
meta_device_map_add_device (device_map, keyboard);
meta_device_pair_devices (pointer, keyboard);
g_object_unref (pointer);
g_object_unref (keyboard);
}
static void
meta_device_map_core_class_init (MetaDeviceMapCoreClass *klass)
{
MetaDeviceMapClass *device_map_class = META_DEVICE_MAP_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = meta_device_map_core_constructed;
device_map_class->grab_key = meta_device_map_core_grab_key;
device_map_class->ungrab_key = meta_device_map_core_ungrab_key;
device_map_class->grab_button = meta_device_map_core_grab_button;
device_map_class->ungrab_button = meta_device_map_core_ungrab_button;
}
static void
meta_device_map_core_init (MetaDeviceMapCore *device_map)
{
}

View File

@@ -0,0 +1,56 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file device-map-core.h device map for core devices
*
* Input devices.
* This file contains the core protocol implementation of the device map
*/
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICE_MAP_CORE_H
#define META_DEVICE_MAP_CORE_H
typedef struct _MetaDeviceMapCore MetaDeviceMapCore;
typedef struct _MetaDeviceMapCoreClass MetaDeviceMapCoreClass;
#include "device-map-private.h"
#define META_TYPE_DEVICE_MAP_CORE (meta_device_map_core_get_type ())
#define META_DEVICE_MAP_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_MAP_CORE, MetaDeviceMapCore))
#define META_DEVICE_MAP_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_MAP_CORE, MetaDeviceMapCoreClass))
#define META_IS_DEVICE_MAP_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_MAP_CORE))
#define META_IS_DEVICE_MAP_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_MAP_CORE))
#define META_DEVICE_MAP_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_MAP_CORE, MetaDeviceMapCoreClass))
struct _MetaDeviceMapCore
{
MetaDeviceMap parent_instance;
};
struct _MetaDeviceMapCoreClass
{
MetaDeviceMapClass parent_class;
};
GType meta_device_map_core_get_type (void) G_GNUC_CONST;
#endif /* META_DEVICE_MAP_CORE_H */

View File

@@ -0,0 +1,111 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file device-map.h object containing input devices
*
* Input devices.
* This file contains the device map, used to find out the device behind
* XInput2/core events.
*/
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICE_MAP_PRIVATE_H
#define META_DEVICE_MAP_PRIVATE_H
#include <meta/device-map.h>
#include <meta/device.h>
#include "display-private.h"
#include "device-private.h"
/* Device IDs for Virtual Core Pointer/Keyboard,
* use only in case of emergency.
*/
#define META_CORE_POINTER_ID 2
#define META_CORE_KEYBOARD_ID 3
struct _MetaDeviceMap
{
GObject parent_instance;
gpointer priv;
};
struct _MetaDeviceMapClass
{
GObjectClass parent_instance;
void (* device_added) (MetaDeviceMap *device_map,
MetaDevice *device);
void (* device_removed) (MetaDeviceMap *device_map,
MetaDevice *device);
gboolean (* grab_key) (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers,
gboolean sync);
void (* ungrab_key) (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers);
gboolean (* grab_button) (MetaDeviceMap *device_map,
Window xwindow,
guint n_button,
guint modifiers,
guint evmask,
gboolean sync);
void (* ungrab_button) (MetaDeviceMap *pointer,
Window xwindow,
guint n_button,
guint modifiers);
};
GType meta_device_map_get_type (void) G_GNUC_CONST;
MetaDeviceMap * meta_device_map_new (MetaDisplay *display,
gboolean force_core);
void meta_device_map_add_device (MetaDeviceMap *device_map,
MetaDevice *device);
void meta_device_map_remove_device (MetaDeviceMap *device_map,
MetaDevice *device);
gboolean meta_device_map_grab_key (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers,
gboolean sync);
void meta_device_map_ungrab_key (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers);
gboolean meta_device_map_grab_button (MetaDeviceMap *device_map,
Window xwindow,
guint n_button,
guint modifiers,
guint evmask,
gboolean sync);
void meta_device_map_ungrab_button (MetaDeviceMap *device_map,
Window xwindow,
guint n_button,
guint modifiers);
#endif /* META_DEVICE_MAP_PRIVATE_H */

269
src/core/device-map-xi2.c Normal file
View File

@@ -0,0 +1,269 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Input device map, XInput2 implementation */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include "config.h"
#include "device-map-xi2.h"
#include <X11/extensions/XInput2.h>
#include "devices-xi2.h"
#define XINPUT2_VERSION_MAJOR 2
#define XINPUT2_VERSION_MINOR 0
G_DEFINE_TYPE (MetaDeviceMapXI2, meta_device_map_xi2, META_TYPE_DEVICE_MAP)
static gboolean
meta_device_map_xi2_grab_key (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers,
gboolean sync)
{
XIGrabModifiers mods = { modifiers, 0 };
MetaDisplay *display;
XIEventMask mask;
gint retval;
display = meta_device_map_get_display (device_map);
mask.deviceid = XIAllMasterDevices;
mask.mask = meta_device_xi2_translate_event_mask (KeyPressMask |
KeyReleaseMask,
&mask.mask_len);
/* FIXME: Doesn't seem to work with
* XIAllMasterDevices, use the VCK
* at the moment
*/
retval = XIGrabKeycode (display->xdisplay,
META_CORE_KEYBOARD_ID,
keycode, xwindow,
(sync) ? GrabModeSync : GrabModeAsync,
GrabModeAsync, /* Never care about the other device */
True, &mask, 1, &mods);
return (retval == Success);
}
static void
meta_device_map_xi2_ungrab_key (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers)
{
XIGrabModifiers mods = { modifiers, 0 };
MetaDisplay *display;
display = meta_device_map_get_display (device_map);
XIUngrabKeycode (display->xdisplay,
META_CORE_KEYBOARD_ID,
keycode, xwindow,
1, &mods);
}
static gboolean
meta_device_map_xi2_grab_button (MetaDeviceMap *device_map,
Window xwindow,
guint n_button,
guint modifiers,
guint evmask,
gboolean sync)
{
XIGrabModifiers mods = { modifiers, 0 };
XIEventMask mask;
MetaDisplay *display;
int retval;
display = meta_device_map_get_display (device_map);
mask.deviceid = XIAllMasterDevices;
mask.mask = meta_device_xi2_translate_event_mask (evmask, &mask.mask_len);
retval = XIGrabButton (display->xdisplay,
XIAllMasterDevices,
n_button, xwindow, None,
(sync) ? GrabModeSync : GrabModeAsync,
GrabModeAsync, /* Never care about the other device */
False, &mask, 1, &mods);
return (retval == Success);
}
static void
meta_device_map_xi2_ungrab_button (MetaDeviceMap *device_map,
Window xwindow,
guint n_button,
guint modifiers)
{
XIGrabModifiers mods = { modifiers, 0 };
MetaDisplay *display;
display = meta_device_map_get_display (device_map);
XIUngrabButton (display->xdisplay,
META_CORE_POINTER_ID,
//XIAllMasterDevices,
n_button, xwindow, 1, &mods);
}
static void
add_device_from_info (MetaDeviceMap *device_map,
gint use,
gint device_id)
{
MetaDevice *device;
MetaDisplay *display;
display = meta_device_map_get_display (device_map);
if (use == XIMasterPointer)
device = meta_device_pointer_xi2_new (display, device_id);
else if (use == XIMasterKeyboard)
device = meta_device_keyboard_xi2_new (display, device_id);
if (device)
{
meta_device_map_add_device (device_map, device);
g_object_unref (device);
}
}
static void
pair_devices (gpointer key,
gpointer value,
gpointer user_data)
{
MetaDevice *device1, *device2;
MetaDeviceMap *device_map;
device_map = user_data;
device1 = meta_device_map_lookup (device_map, GPOINTER_TO_INT (key));
device2 = meta_device_map_lookup (device_map, GPOINTER_TO_INT (value));
meta_device_pair_devices (device1, device2);
}
static void
meta_device_map_xi2_constructed (GObject *object)
{
MetaDeviceMap *device_map = META_DEVICE_MAP (object);
MetaDisplay *display;
XIDeviceInfo *info;
GHashTable *pairs;
int n_devices, i;
display = meta_device_map_get_display (device_map);
/* We're only interested in master devices,
* detached slave devices are left for applications
* to handle.
*/
info = XIQueryDevice (display->xdisplay, XIAllMasterDevices, &n_devices);
pairs = g_hash_table_new (NULL, NULL);
for (i = 0; i < n_devices; i++)
{
add_device_from_info (device_map, info[i].use, info[i].deviceid);
g_hash_table_insert (pairs,
GINT_TO_POINTER (info[i].deviceid),
GINT_TO_POINTER (info[i].attachment));
}
g_hash_table_foreach (pairs, pair_devices, device_map);
g_hash_table_destroy (pairs);
XIFreeDeviceInfo (info);
}
static void
meta_device_map_xi2_class_init (MetaDeviceMapXI2Class *klass)
{
MetaDeviceMapClass *device_map_class = META_DEVICE_MAP_CLASS (klass);
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->constructed = meta_device_map_xi2_constructed;
device_map_class->grab_key = meta_device_map_xi2_grab_key;
device_map_class->ungrab_key = meta_device_map_xi2_ungrab_key;
device_map_class->grab_button = meta_device_map_xi2_grab_button;
device_map_class->ungrab_button = meta_device_map_xi2_ungrab_button;
}
static void
meta_device_map_xi2_init (MetaDeviceMapXI2 *device_map)
{
}
gboolean
meta_device_map_xi2_handle_hierarchy_event (MetaDeviceMapXI2 *device_map,
XEvent *ev)
{
MetaDisplay *display;
display = meta_device_map_get_display (META_DEVICE_MAP (device_map));
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIHierarchyEvent *xev;
GHashTable *pairs;
gint i;
g_assert (display->have_xinput2 == TRUE);
xev = (XIHierarchyEvent *) ev->xcookie.data;
if (xev->evtype != XI_HierarchyChanged)
return FALSE;
pairs = g_hash_table_new (NULL, NULL);
for (i = 0; i < xev->num_info; i++)
{
if (xev->info[i].flags & XIMasterAdded)
{
add_device_from_info (META_DEVICE_MAP (device_map),
xev->info[i].use,
xev->info[i].deviceid);
g_hash_table_insert (pairs,
GINT_TO_POINTER (xev->info[i].deviceid),
GINT_TO_POINTER (xev->info[i].attachment));
}
else if (xev->info[i].flags & XIMasterRemoved)
{
MetaDevice *device;
device = meta_device_map_lookup (META_DEVICE_MAP (device_map),
xev->info[i].deviceid);
if (device)
meta_device_map_remove_device (META_DEVICE_MAP (device_map),
device);
}
}
g_hash_table_foreach (pairs, pair_devices, device_map);
g_hash_table_destroy (pairs);
return TRUE;
}
return FALSE;
}

59
src/core/device-map-xi2.h Normal file
View File

@@ -0,0 +1,59 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file device-map-xi2.h device map for XInput2 devices
*
* Input devices.
* This file contains the XInput2 implementation of the device map
*/
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICE_MAP_XI2_H
#define META_DEVICE_MAP_XI2_H
typedef struct _MetaDeviceMapXI2 MetaDeviceMapXI2;
typedef struct _MetaDeviceMapXI2Class MetaDeviceMapXI2Class;
#include "device-map-private.h"
#define META_TYPE_DEVICE_MAP_XI2 (meta_device_map_xi2_get_type ())
#define META_DEVICE_MAP_XI2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_MAP_XI2, MetaDeviceMapXI2))
#define META_DEVICE_MAP_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_MAP_XI2, MetaDeviceMapXI2Class))
#define META_IS_DEVICE_MAP_XI2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_MAP_XI2))
#define META_IS_DEVICE_MAP_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_MAP_XI2))
#define META_DEVICE_MAP_XI2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_MAP_XI2, MetaDeviceMapXI2Class))
struct _MetaDeviceMapXI2
{
MetaDeviceMap parent_instance;
};
struct _MetaDeviceMapXI2Class
{
MetaDeviceMapClass parent_class;
};
GType meta_device_map_xi2_get_type (void) G_GNUC_CONST;
gboolean meta_device_map_xi2_handle_hierarchy_event (MetaDeviceMapXI2 *device_map,
XEvent *ev);
#endif /* META_DEVICE_MAP_XI2_H */

390
src/core/device-map.c Normal file
View File

@@ -0,0 +1,390 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Input device map */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include "config.h"
#include "device-map-private.h"
#include "device-map-core.h"
#ifdef HAVE_XINPUT2
#include <X11/extensions/XInput2.h>
#include "device-map-xi2.h"
#define XINPUT2_VERSION_MAJOR 2
#define XINPUT2_VERSION_MINOR 0
#endif
G_DEFINE_TYPE (MetaDeviceMap, meta_device_map, G_TYPE_OBJECT)
typedef struct MetaDeviceMapPrivate MetaDeviceMapPrivate;
struct MetaDeviceMapPrivate
{
MetaDisplay *display;
GHashTable *devices;
};
enum {
PROP_0,
PROP_DISPLAY
};
enum {
DEVICE_ADDED,
DEVICE_REMOVED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0 };
static void
meta_device_map_get_property (GObject *object,
guint param_id,
GValue *value,
GParamSpec *pspec)
{
MetaDeviceMapPrivate *priv;
priv = META_DEVICE_MAP (object)->priv;
switch (param_id)
{
case PROP_DISPLAY:
g_value_set_object (value, priv->display);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
}
}
static void
meta_device_map_set_property (GObject *object,
guint param_id,
const GValue *value,
GParamSpec *pspec)
{
MetaDeviceMapPrivate *priv;
priv = META_DEVICE_MAP (object)->priv;
switch (param_id)
{
case PROP_DISPLAY:
priv->display = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
}
}
static void
meta_device_map_finalize (GObject *object)
{
MetaDeviceMapPrivate *priv;
GHashTableIter iter;
MetaDevice *device;
priv = META_DEVICE_MAP (object)->priv;
g_hash_table_iter_init (&iter, priv->devices);
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &device))
{
/* Detach the device */
g_hash_table_iter_steal (&iter);
g_signal_emit (object, signals[DEVICE_REMOVED], 0, device);
g_object_unref (device);
}
g_hash_table_destroy (priv->devices);
G_OBJECT_CLASS (meta_device_map_parent_class)->finalize (object);
}
static void
meta_device_map_class_init (MetaDeviceMapClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->get_property = meta_device_map_get_property;
object_class->set_property = meta_device_map_set_property;
object_class->finalize = meta_device_map_finalize;
g_object_class_install_property (object_class,
PROP_DISPLAY,
g_param_spec_object ("display",
"Display",
"Display",
META_TYPE_DISPLAY,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
signals[DEVICE_ADDED] =
g_signal_new ("device-added",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, META_TYPE_DEVICE);
signals[DEVICE_REMOVED] =
g_signal_new ("device-removed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, META_TYPE_DEVICE);
g_type_class_add_private (klass, sizeof (MetaDeviceMapPrivate));
}
static void
meta_device_map_init (MetaDeviceMap *device_map)
{
MetaDeviceMapPrivate *priv;
priv = device_map->priv = G_TYPE_INSTANCE_GET_PRIVATE (device_map,
META_TYPE_DEVICE_MAP,
MetaDeviceMapPrivate);
priv->devices = g_hash_table_new_full (NULL, NULL, NULL,
(GDestroyNotify) g_object_unref);
}
void
meta_device_map_add_device (MetaDeviceMap *device_map,
MetaDevice *device)
{
MetaDeviceMapPrivate *priv;
priv = device_map->priv;
g_hash_table_insert (priv->devices,
GINT_TO_POINTER (meta_device_get_id (device)),
g_object_ref (device));
g_signal_emit (device_map, signals[DEVICE_ADDED], 0, device);
}
void
meta_device_map_remove_device (MetaDeviceMap *device_map,
MetaDevice *device)
{
MetaDeviceMapPrivate *priv;
priv = device_map->priv;
if (g_hash_table_steal (priv->devices,
GINT_TO_POINTER (meta_device_get_id (device))))
{
g_signal_emit (device_map, signals[DEVICE_REMOVED], 0, device);
g_object_unref (device);
}
}
#ifdef HAVE_XINPUT2
static gboolean
initialize_xinput (MetaDisplay *display)
{
int major, minor, opcode;
int unused;
if (!XQueryExtension (display->xdisplay,
"XInputExtension",
&opcode, &unused, &unused))
return FALSE;
major = XINPUT2_VERSION_MAJOR;
minor = XINPUT2_VERSION_MINOR;
XIQueryVersion (display->xdisplay, &major, &minor);
if (major == XINPUT2_VERSION_MAJOR &&
minor == XINPUT2_VERSION_MINOR)
{
display->have_xinput2 = TRUE;
display->xinput2_opcode = opcode;
return TRUE;
}
return FALSE;
}
#endif /* HAVE_XINPUT2 */
MetaDeviceMap *
meta_device_map_new (MetaDisplay *display,
gboolean force_core)
{
GType type = META_TYPE_DEVICE_MAP_CORE;
#ifdef HAVE_XINPUT2
if (!force_core &&
initialize_xinput (display))
type = META_TYPE_DEVICE_MAP_XI2;
#endif
return g_object_new (type,
"display", display,
NULL);
}
/**
* meta_device_map_lookup:
* @device_map: a #MetaDeviceMap
* @device_id: ID for a device
*
* returns the device corresponding to @device_id
*
* Returns: (transfer none): (allow-none): The matching device, or %NULL.
**/
MetaDevice *
meta_device_map_lookup (MetaDeviceMap *device_map,
gint device_id)
{
MetaDeviceMapPrivate *priv;
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), NULL);
priv = device_map->priv;
return g_hash_table_lookup (priv->devices,
GINT_TO_POINTER (device_id));
}
/**
* meta_device_map_get_display:
* @device_map: a #MetaDeviceMap
*
* Returns the #MetaDisplay to which @device_map belongs to.
*
* Returns: (transfer none): The #MetaDisplay.
**/
MetaDisplay *
meta_device_map_get_display (MetaDeviceMap *device_map)
{
MetaDeviceMapPrivate *priv;
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), NULL);
priv = device_map->priv;
return priv->display;
}
/**
* meta_device_map_list_devices:
* @device_map: a #MetaDeviceMap
*
* Returns the list of devices that @device_map holds.
*
* Returns: (element-type Meta.Device) (transfer container): the list
* of devices, the contained objects are owned by @device_map
* and should not be unref'ed. The list must be freed with
* g_list_free().
**/
GList *
meta_device_map_list_devices (MetaDeviceMap *device_map)
{
MetaDeviceMapPrivate *priv;
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), NULL);
priv = device_map->priv;
return g_hash_table_get_values (priv->devices);
}
gboolean
meta_device_map_grab_key (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers,
gboolean sync)
{
MetaDeviceMapClass *klass;
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), FALSE);
g_return_val_if_fail (xwindow != None, FALSE);
klass = META_DEVICE_MAP_GET_CLASS (device_map);
if (!klass->grab_key)
return FALSE;
return (klass->grab_key) (device_map, xwindow, keycode, modifiers, sync);
}
void
meta_device_map_ungrab_key (MetaDeviceMap *device_map,
Window xwindow,
guint keycode,
guint modifiers)
{
MetaDeviceMapClass *klass;
g_return_if_fail (META_IS_DEVICE_MAP (device_map));
g_return_if_fail (xwindow != None);
klass = META_DEVICE_MAP_GET_CLASS (device_map);
if (klass->ungrab_key)
(klass->ungrab_key) (device_map, xwindow, keycode, modifiers);
}
gboolean
meta_device_map_grab_button (MetaDeviceMap *device_map,
Window xwindow,
guint n_button,
guint modifiers,
guint evmask,
gboolean sync)
{
MetaDeviceMapClass *klass;
g_return_val_if_fail (META_IS_DEVICE_MAP (device_map), FALSE);
g_return_val_if_fail (xwindow != None, FALSE);
klass = META_DEVICE_MAP_GET_CLASS (device_map);
if (!klass->grab_button)
return FALSE;
return (klass->grab_button) (device_map, xwindow, n_button,
modifiers, evmask, sync);
}
void
meta_device_map_ungrab_button (MetaDeviceMap *device_map,
Window xwindow,
guint n_button,
guint modifiers)
{
MetaDeviceMapClass *klass;
g_return_if_fail (META_IS_DEVICE_MAP (device_map));
g_return_if_fail (xwindow != None);
klass = META_DEVICE_MAP_GET_CLASS (device_map);
if (klass->ungrab_button)
(klass->ungrab_button) (device_map, xwindow, n_button, modifiers);
}

124
src/core/device-pointer.c Normal file
View File

@@ -0,0 +1,124 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Pointer device abstraction */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include <config.h>
#include "device-pointer.h"
G_DEFINE_ABSTRACT_TYPE (MetaDevicePointer,
meta_device_pointer,
META_TYPE_DEVICE)
static void
meta_device_pointer_class_init (MetaDevicePointerClass *klass)
{
}
static void
meta_device_pointer_init (MetaDevicePointer *pointer)
{
}
void
meta_device_pointer_warp (MetaDevicePointer *pointer,
MetaScreen *screen,
gint x,
gint y)
{
MetaDevicePointerClass *klass;
g_return_if_fail (META_IS_DEVICE_POINTER (pointer));
g_return_if_fail (META_IS_SCREEN (screen));
klass = META_DEVICE_POINTER_GET_CLASS (pointer);
if (klass->warp)
(klass->warp) (pointer, screen, x, y);
}
void
meta_device_pointer_set_window_cursor (MetaDevicePointer *pointer,
Window xwindow,
MetaCursor cursor)
{
MetaDevicePointerClass *klass;
g_return_if_fail (META_IS_DEVICE_POINTER (pointer));
g_return_if_fail (xwindow != None);
klass = META_DEVICE_POINTER_GET_CLASS (pointer);
if (klass->set_window_cursor)
(klass->set_window_cursor) (pointer, xwindow, cursor);
}
gboolean
meta_device_pointer_query_position (MetaDevicePointer *pointer,
Window xwindow,
Window *root_ret,
Window *child_ret,
gint *root_x_ret,
gint *root_y_ret,
gint *x_ret,
gint *y_ret,
guint *mask_ret)
{
MetaDevicePointerClass *klass;
gint root_x, root_y, x, y;
Window root, child;
gboolean retval;
guint mask;
g_return_val_if_fail (META_IS_DEVICE_POINTER (pointer), FALSE);
g_return_val_if_fail (xwindow != None, FALSE);
klass = META_DEVICE_POINTER_GET_CLASS (pointer);
if (!klass->query_position)
return FALSE;
retval = (klass->query_position) (pointer, xwindow, &root, &child,
&root_x, &root_y, &x, &y, &mask);
if (root_ret)
*root_ret = root;
if (child_ret)
*child_ret = child;
if (root_x_ret)
*root_x_ret = root_x;
if (root_y_ret)
*root_y_ret = root_y;
if (x_ret)
*x_ret = x;
if (y_ret)
*y_ret = y;
if (mask_ret)
*mask_ret = mask;
return retval;
}

95
src/core/device-pointer.h Normal file
View File

@@ -0,0 +1,95 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file device-pointer.h Pointer device abstraction
*
* Input devices.
* This file contains the internal abstraction of pointer devices so
* XInput2/core events can be handled similarly.
*/
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICE_POINTER_H
#define META_DEVICE_POINTER_H
#include "display-private.h"
#include <meta/screen.h>
#include "device-private.h"
#define META_TYPE_DEVICE_POINTER (meta_device_pointer_get_type ())
#define META_DEVICE_POINTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_POINTER, MetaDevicePointer))
#define META_DEVICE_POINTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_POINTER, MetaDevicePointerClass))
#define META_IS_DEVICE_POINTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_POINTER))
#define META_IS_DEVICE_POINTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_POINTER))
#define META_DEVICE_POINTER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_POINTER, MetaDevicePointerClass))
typedef struct _MetaDevicePointer MetaDevicePointer;
typedef struct _MetaDevicePointerClass MetaDevicePointerClass;
struct _MetaDevicePointer
{
MetaDevice parent_instance;
};
struct _MetaDevicePointerClass
{
MetaDeviceClass parent_instance;
void (* warp) (MetaDevicePointer *pointer,
MetaScreen *screen,
gint x,
gint y);
void (* set_window_cursor) (MetaDevicePointer *pointer,
Window xwindow,
MetaCursor cursor);
gboolean (* query_position) (MetaDevicePointer *pointer,
Window xwindow,
Window *root,
Window *child,
gint *root_x,
gint *root_y,
gint *x,
gint *y,
guint *mask);
};
GType meta_device_pointer_get_type (void) G_GNUC_CONST;
void meta_device_pointer_warp (MetaDevicePointer *pointer,
MetaScreen *screen,
gint x,
gint y);
void meta_device_pointer_set_window_cursor (MetaDevicePointer *pointer,
Window xwindow,
MetaCursor cursor);
gboolean meta_device_pointer_query_position (MetaDevicePointer *pointer,
Window xwindow,
Window *root,
Window *child,
gint *root_x,
gint *root_y,
gint *x,
gint *y,
guint *mask);
#endif /* META_DEVICE_POINTER_H */

80
src/core/device-private.h Normal file
View File

@@ -0,0 +1,80 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file device.h Input device abstraction
*
* Input devices.
* This file contains the internal abstraction of input devices so
* XInput2/core events can be handled similarly.
*/
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICE_PRIVATE_H
#define META_DEVICE_PRIVATE_H
#include <meta/device.h>
#include "display-private.h"
struct _MetaDevice
{
GObject parent_instance;
gpointer priv;
};
struct _MetaDeviceClass
{
GObjectClass parent_instance;
void (* allow_events) (MetaDevice *device,
int mode,
Time time);
gboolean (* grab) (MetaDevice *device,
Window xwindow,
guint evmask,
MetaCursor cursor,
gboolean owner_events,
gboolean sync,
Time time);
void (* ungrab) (MetaDevice *device,
Time time);
};
GType meta_device_get_type (void) G_GNUC_CONST;
void meta_device_allow_events (MetaDevice *device,
int mode,
Time time);
gboolean meta_device_grab (MetaDevice *device,
Window xwindow,
guint evmask,
MetaCursor cursor,
gboolean owner_events,
gboolean sync,
Time time);
void meta_device_ungrab (MetaDevice *device,
Time time);
void meta_device_pair_devices (MetaDevice *device,
MetaDevice *other_device);
#endif /* META_DEVICE_PRIVATE_H */

270
src/core/device.c Normal file
View File

@@ -0,0 +1,270 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Input device abstraction */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include <config.h>
#include "device-private.h"
G_DEFINE_ABSTRACT_TYPE (MetaDevice, meta_device, G_TYPE_OBJECT)
enum {
PROP_0,
PROP_DEVICE_ID,
PROP_DISPLAY,
PROP_PAIRED_DEVICE
};
typedef struct MetaDevicePrivate MetaDevicePrivate;
struct MetaDevicePrivate
{
MetaDisplay *display;
MetaDevice *paired_device;
gint device_id;
};
static void
meta_device_get_property (GObject *object,
guint param_id,
GValue *value,
GParamSpec *pspec)
{
switch (param_id)
{
case PROP_DEVICE_ID:
g_value_set_int (value,
meta_device_get_id (META_DEVICE (object)));
break;
case PROP_DISPLAY:
g_value_set_object (value,
meta_device_get_display (META_DEVICE (object)));
break;
case PROP_PAIRED_DEVICE:
g_value_set_object (value,
meta_device_get_paired_device (META_DEVICE (object)));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
}
}
static void
meta_device_set_property (GObject *object,
guint param_id,
const GValue *value,
GParamSpec *pspec)
{
MetaDevicePrivate *priv = META_DEVICE (object)->priv;
switch (param_id)
{
case PROP_DEVICE_ID:
priv->device_id = g_value_get_int (value);
break;
case PROP_DISPLAY:
priv->display = g_value_get_object (value);
break;
case PROP_PAIRED_DEVICE:
meta_device_pair_devices (META_DEVICE (object),
g_value_get_object (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
}
}
static void
meta_device_class_init (MetaDeviceClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->get_property = meta_device_get_property;
object_class->set_property = meta_device_set_property;
g_object_class_install_property (object_class,
PROP_DEVICE_ID,
g_param_spec_int ("device-id",
"Device ID",
"Device ID",
2, G_MAXINT, 2,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
PROP_DISPLAY,
g_param_spec_object ("display",
"Display",
"Display",
META_TYPE_DISPLAY,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
PROP_PAIRED_DEVICE,
g_param_spec_object ("paired-device",
"Paired device",
"Paired device",
META_TYPE_DEVICE,
G_PARAM_READWRITE));
g_type_class_add_private (klass, sizeof (MetaDevicePrivate));
}
static void
meta_device_init (MetaDevice *device)
{
device->priv = G_TYPE_INSTANCE_GET_PRIVATE (device,
META_TYPE_DEVICE,
MetaDevicePrivate);
}
int
meta_device_get_id (MetaDevice *device)
{
MetaDevicePrivate *priv;
g_return_val_if_fail (META_IS_DEVICE (device), 0);
priv = device->priv;
return priv->device_id;
}
/**
* meta_device_get_display:
* @device: a #MetaDevice
*
* Returns the #MetaDisplay to which the device belongs
*
* Returns: (transfer none): the #MetaDisplay to which the device belongs
**/
MetaDisplay *
meta_device_get_display (MetaDevice *device)
{
MetaDevicePrivate *priv;
g_return_val_if_fail (META_IS_DEVICE (device), NULL);
priv = device->priv;
return priv->display;
}
void
meta_device_allow_events (MetaDevice *device,
int mode,
Time time)
{
MetaDeviceClass *klass;
g_return_if_fail (META_IS_DEVICE (device));
klass = META_DEVICE_GET_CLASS (device);
if (klass->allow_events)
(klass->allow_events) (device, mode, time);
}
gboolean
meta_device_grab (MetaDevice *device,
Window xwindow,
guint evmask,
MetaCursor cursor,
gboolean owner_events,
gboolean sync,
Time time)
{
MetaDeviceClass *klass;
g_return_val_if_fail (META_IS_DEVICE (device), FALSE);
g_return_val_if_fail (xwindow != None, FALSE);
klass = META_DEVICE_GET_CLASS (device);
if (!klass->grab)
return FALSE;
return (klass->grab) (device, xwindow, evmask, cursor,
owner_events, sync, time);
}
void
meta_device_ungrab (MetaDevice *device,
Time time)
{
MetaDeviceClass *klass;
g_return_if_fail (META_IS_DEVICE (device));
klass = META_DEVICE_GET_CLASS (device);
if (klass->ungrab)
(klass->ungrab) (device, time);
}
void
meta_device_pair_devices (MetaDevice *device,
MetaDevice *other_device)
{
MetaDevicePrivate *priv1, *priv2;
g_return_if_fail (META_IS_DEVICE (device));
g_return_if_fail (META_IS_DEVICE (other_device));
priv1 = device->priv;
priv2 = other_device->priv;
/* Consider safe multiple calls
* on already paired devices
*/
if (priv1->paired_device != NULL &&
priv2->paired_device != NULL &&
priv1->paired_device == other_device &&
priv2->paired_device == device)
return;
g_return_if_fail (priv1->paired_device == NULL);
g_return_if_fail (priv2->paired_device == NULL);
priv1->paired_device = g_object_ref (other_device);
priv2->paired_device = g_object_ref (device);
g_object_notify (G_OBJECT (device), "paired-device");
g_object_notify (G_OBJECT (other_device), "paired-device");
}
/**
* meta_device_get_paired_device:
* @device: a #MetaDevice
*
* Returns the paired device. Devices come in keyboard/pointer pairs.
*
* Returns: (transfer none): The paired device.
**/
MetaDevice *
meta_device_get_paired_device (MetaDevice *device)
{
MetaDevicePrivate *priv;
g_return_val_if_fail (META_IS_DEVICE (device), NULL);
priv = device->priv;
return priv->paired_device;
}

256
src/core/devices-core.c Normal file
View File

@@ -0,0 +1,256 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Core input devices implementation */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include <config.h>
#include "screen-private.h"
#include "devices-core.h"
#include "device-map-private.h"
/* Common functions */
static void
meta_device_core_common_allow_events (MetaDevice *device,
int mode,
Time time)
{
MetaDisplay *display;
display = meta_device_get_display (device);
XAllowEvents (display->xdisplay, mode, time);
}
/* Core pointer */
G_DEFINE_TYPE (MetaDevicePointerCore,
meta_device_pointer_core,
META_TYPE_DEVICE_POINTER)
static gboolean
meta_device_pointer_core_grab (MetaDevice *device,
Window xwindow,
guint evmask,
MetaCursor cursor,
gboolean owner_events,
gboolean sync,
Time time)
{
MetaDisplay *display;
Cursor xcursor;
int retval;
display = meta_device_get_display (device);
xcursor = meta_display_create_x_cursor (display, cursor);
retval = XGrabPointer (display->xdisplay,
xwindow, owner_events,
evmask,
(sync) ? GrabModeSync : GrabModeAsync,
(sync) ? GrabModeSync : GrabModeAsync,
None, xcursor, time);
if (xcursor != None)
XFreeCursor (display->xdisplay, xcursor);
return (retval == Success);
}
static void
meta_device_pointer_core_ungrab (MetaDevice *device,
Time time)
{
MetaDisplay *display;
display = meta_device_get_display (device);
XUngrabPointer (display->xdisplay, time);
}
static void
meta_device_pointer_core_warp (MetaDevicePointer *pointer,
MetaScreen *screen,
gint x,
gint y)
{
MetaDisplay *display;
display = meta_device_get_display (META_DEVICE (pointer));
XWarpPointer (display->xdisplay,
None, screen->xroot,
0, 0, 0, 0, x, y);
}
static void
meta_device_pointer_core_set_window_cursor (MetaDevicePointer *pointer,
Window xwindow,
MetaCursor cursor)
{
MetaDisplay *display;
Cursor xcursor;
display = meta_device_get_display (META_DEVICE (pointer));
xcursor = meta_display_create_x_cursor (display, cursor);
XDefineCursor (display->xdisplay, xwindow, xcursor);
if (xcursor != None)
XFreeCursor (display->xdisplay, xcursor);
}
static gboolean
meta_device_pointer_core_query_position (MetaDevicePointer *pointer,
Window xwindow,
Window *root,
Window *child,
gint *root_x,
gint *root_y,
gint *x,
gint *y,
guint *mask)
{
MetaDisplay *display;
display = meta_device_get_display (META_DEVICE (pointer));
return XQueryPointer (display->xdisplay, xwindow,
root, child, root_x, root_y,
x, y, mask);
}
static void
meta_device_pointer_core_class_init (MetaDevicePointerCoreClass *klass)
{
MetaDevicePointerClass *pointer_class = META_DEVICE_POINTER_CLASS (klass);
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
device_class->allow_events = meta_device_core_common_allow_events;
device_class->grab = meta_device_pointer_core_grab;
device_class->ungrab = meta_device_pointer_core_ungrab;
pointer_class->warp = meta_device_pointer_core_warp;
pointer_class->set_window_cursor = meta_device_pointer_core_set_window_cursor;
pointer_class->query_position = meta_device_pointer_core_query_position;
}
static void
meta_device_pointer_core_init (MetaDevicePointerCore *pointer)
{
}
MetaDevice *
meta_device_pointer_core_new (MetaDisplay *display)
{
return g_object_new (META_TYPE_DEVICE_POINTER_CORE,
"device-id", META_CORE_POINTER_ID,
"display", display,
NULL);
}
/* Core Keyboard */
G_DEFINE_TYPE (MetaDeviceKeyboardCore,
meta_device_keyboard_core,
META_TYPE_DEVICE_KEYBOARD)
static gboolean
meta_device_keyboard_core_grab (MetaDevice *device,
Window xwindow,
guint evmask,
MetaCursor cursor,
gboolean owner_events,
gboolean sync,
Time time)
{
MetaDisplay *display;
gint retval;
display = meta_device_get_display (device);
retval = XGrabKeyboard (display->xdisplay, xwindow, owner_events,
(sync) ? GrabModeSync : GrabModeAsync,
(sync) ? GrabModeSync : GrabModeAsync,
time);
return (retval == Success);
}
static void
meta_device_keyboard_core_ungrab (MetaDevice *device,
Time time)
{
MetaDisplay *display;
display = meta_device_get_display (device);
XUngrabKeyboard (display->xdisplay, time);
}
static Window
meta_device_keyboard_core_get_focus_window (MetaDeviceKeyboard *keyboard)
{
MetaDisplay *display;
Window xwindow;
int unused;
display = meta_device_get_display (META_DEVICE (keyboard));
XGetInputFocus (display->xdisplay, &xwindow, &unused);
return xwindow;
}
static void
meta_device_keyboard_core_set_focus_window (MetaDeviceKeyboard *keyboard,
Window xwindow,
Time timestamp)
{
MetaDisplay *display;
display = meta_device_get_display (META_DEVICE (keyboard));
XSetInputFocus (display->xdisplay,
xwindow,
RevertToPointerRoot,
timestamp);
}
static void
meta_device_keyboard_core_class_init (MetaDeviceKeyboardCoreClass *klass)
{
MetaDeviceKeyboardClass *keyboard_class = META_DEVICE_KEYBOARD_CLASS (klass);
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
keyboard_class->get_focus_window = meta_device_keyboard_core_get_focus_window;
keyboard_class->set_focus_window = meta_device_keyboard_core_set_focus_window;
device_class->allow_events = meta_device_core_common_allow_events;
device_class->grab = meta_device_keyboard_core_grab;
device_class->ungrab = meta_device_keyboard_core_ungrab;
}
static void
meta_device_keyboard_core_init (MetaDeviceKeyboardCore *keyboard)
{
}
MetaDevice *
meta_device_keyboard_core_new (MetaDisplay *display)
{
return g_object_new (META_TYPE_DEVICE_KEYBOARD_CORE,
"device-id", META_CORE_KEYBOARD_ID,
"display", display,
NULL);
}

85
src/core/devices-core.h Normal file
View File

@@ -0,0 +1,85 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file devices-core.h Core input devices implementation
*
* Input devices.
* This file contains the core X protocol implementation of input devices.
*/
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICES_CORE_H
#define META_DEVICES_CORE_H
#include "device-pointer.h"
#include "device-keyboard.h"
/* Pointer */
#define META_TYPE_DEVICE_POINTER_CORE (meta_device_pointer_core_get_type ())
#define META_DEVICE_POINTER_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_POINTER_CORE, MetaDevicePointerCore))
#define META_DEVICE_POINTER_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_POINTER_CORE, MetaDevicePointerCoreClass))
#define META_IS_DEVICE_POINTER_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_POINTER_CORE))
#define META_IS_DEVICE_POINTER_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_POINTER_CORE))
#define META_DEVICE_POINTER_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_POINTER_CORE, MetaDevicePointerCoreClass))
typedef struct _MetaDevicePointerCore MetaDevicePointerCore;
typedef struct _MetaDevicePointerCoreClass MetaDevicePointerCoreClass;
struct _MetaDevicePointerCore
{
MetaDevicePointer parent_instance;
};
struct _MetaDevicePointerCoreClass
{
MetaDevicePointerClass parent_class;
};
GType meta_device_pointer_core_get_type (void) G_GNUC_CONST;
MetaDevice *meta_device_pointer_core_new (MetaDisplay *display);
/* Keyboard */
#define META_TYPE_DEVICE_KEYBOARD_CORE (meta_device_keyboard_core_get_type ())
#define META_DEVICE_KEYBOARD_CORE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_KEYBOARD_CORE, MetaDeviceKeyboardCore))
#define META_DEVICE_KEYBOARD_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_KEYBOARD_CORE, MetaDeviceKeyboardCoreClass))
#define META_IS_DEVICE_KEYBOARD_CORE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_KEYBOARD_CORE))
#define META_IS_DEVICE_KEYBOARD_CORE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_KEYBOARD_CORE))
#define META_DEVICE_KEYBOARD_CORE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_KEYBOARD_CORE, MetaDeviceKeyboardCoreClass))
typedef struct _MetaDeviceKeyboardCore MetaDeviceKeyboardCore;
typedef struct _MetaDeviceKeyboardCoreClass MetaDeviceKeyboardCoreClass;
struct _MetaDeviceKeyboardCore
{
MetaDeviceKeyboard parent_instance;
};
struct _MetaDeviceKeyboardCoreClass
{
MetaDeviceKeyboardClass parent_class;
};
GType meta_device_keyboard_core_get_type (void) G_GNUC_CONST;
MetaDevice *meta_device_keyboard_core_new (MetaDisplay *display);
#endif /* META_DEVICES_CORE_H */

343
src/core/devices-xi2.c Normal file
View File

@@ -0,0 +1,343 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* XInput2 devices implementation */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include <config.h>
#include "devices-xi2.h"
#include "display-private.h"
#include "screen-private.h"
#include <X11/extensions/XInput2.h>
/* Common functions */
static void
meta_device_xi2_common_allow_events (MetaDevice *device,
int mode,
Time time)
{
MetaDisplay *display;
gint device_id;
display = meta_device_get_display (device);
device_id = meta_device_get_id (device);
switch (mode)
{
case AsyncPointer:
case AsyncKeyboard:
mode = XIAsyncDevice;
break;
case SyncPointer:
case SyncKeyboard:
mode = XISyncDevice;
break;
case ReplayPointer:
case ReplayKeyboard:
mode = XIReplayDevice;
break;
case AsyncBoth:
mode = XIAsyncPair;
break;
case SyncBoth:
mode = XISyncPair;
break;
}
XIAllowEvents (display->xdisplay, device_id, mode, time);
}
guchar *
meta_device_xi2_translate_event_mask (guint evmask,
gint *len)
{
guchar *mask;
*len = XIMaskLen (XI_LASTEVENT);
mask = g_new0 (guchar, *len);
if (evmask & KeyPressMask)
XISetMask (mask, XI_KeyPress);
if (evmask & KeyReleaseMask)
XISetMask (mask, XI_KeyRelease);
if (evmask & ButtonPressMask)
XISetMask (mask, XI_ButtonPress);
if (evmask & ButtonReleaseMask)
XISetMask (mask, XI_ButtonRelease);
if (evmask & EnterWindowMask)
XISetMask (mask, XI_Enter);
if (evmask & LeaveWindowMask)
XISetMask (mask, XI_Leave);
/* No motion hints in XI2 at the moment... */
if (evmask & PointerMotionMask ||
evmask & PointerMotionHintMask)
XISetMask (mask, XI_Motion);
if (evmask & FocusChangeMask)
{
XISetMask (mask, XI_FocusIn);
XISetMask (mask, XI_FocusOut);
}
return mask;
}
static gboolean
meta_device_xi2_common_grab (MetaDevice *device,
Window xwindow,
guint evmask,
MetaCursor cursor,
gboolean owner_events,
gboolean sync,
Time time)
{
MetaDisplay *display;
XIEventMask mask;
gint device_id, retval;
Cursor xcursor;
display = meta_device_get_display (device);
device_id = meta_device_get_id (device);
xcursor = meta_display_create_x_cursor (display, cursor);
mask.deviceid = device_id;
mask.mask = meta_device_xi2_translate_event_mask (evmask, &mask.mask_len);
retval = XIGrabDevice (display->xdisplay,
device_id, xwindow,
time, xcursor,
(sync) ? GrabModeSync : GrabModeAsync,
(sync) ? GrabModeSync : GrabModeAsync,
owner_events, &mask);
if (xcursor != None)
XFreeCursor (display->xdisplay, xcursor);
return (retval == Success);
}
static void
meta_device_xi2_common_ungrab (MetaDevice *device,
Time time)
{
MetaDisplay *display;
gint device_id;
display = meta_device_get_display (device);
device_id = meta_device_get_id (device);
XIUngrabDevice (display->xdisplay, device_id, time);
}
/* Pointer */
G_DEFINE_TYPE (MetaDevicePointerXI2,
meta_device_pointer_xi2,
META_TYPE_DEVICE_POINTER)
static void
meta_device_pointer_xi2_warp (MetaDevicePointer *pointer,
MetaScreen *screen,
gint x,
gint y)
{
MetaDisplay *display;
int device_id;
display = meta_device_get_display (META_DEVICE (pointer));
device_id = meta_device_get_id (META_DEVICE (pointer));
XIWarpPointer (display->xdisplay,
device_id,
None, screen->xroot,
0, 0, 0, 0, x, y);
}
static void
meta_device_pointer_xi2_set_window_cursor (MetaDevicePointer *pointer,
Window xwindow,
MetaCursor cursor)
{
MetaDisplay *display;
Cursor xcursor;
int device_id;
display = meta_device_get_display (META_DEVICE (pointer));
device_id = meta_device_get_id (META_DEVICE (pointer));
xcursor = meta_display_create_x_cursor (display, cursor);
if (xcursor != None)
{
XIDefineCursor (display->xdisplay, device_id, xwindow, xcursor);
XFreeCursor (display->xdisplay, xcursor);
}
else
XIUndefineCursor (display->xdisplay, device_id, xwindow);
}
static gboolean
meta_device_pointer_xi2_query_position (MetaDevicePointer *pointer,
Window xwindow,
Window *root_ret,
Window *child_ret,
gint *root_x_ret,
gint *root_y_ret,
gint *x_ret,
gint *y_ret,
guint *mask_ret)
{
MetaDisplay *display;
XIModifierState mods;
XIGroupState group_unused;
XIButtonState buttons;
gdouble root_x, root_y, x, y;
int device_id;
gboolean retval;
display = meta_device_get_display (META_DEVICE (pointer));
device_id = meta_device_get_id (META_DEVICE (pointer));
retval = XIQueryPointer (display->xdisplay,
device_id, xwindow,
root_ret, child_ret,
&root_x, &root_y, &x, &y,
&buttons, &mods,
&group_unused);
if (mask_ret)
{
*mask_ret = mods.effective;
if (XIMaskIsSet (buttons.mask, 1))
*mask_ret |= Button1Mask;
else if (XIMaskIsSet (buttons.mask, 2))
*mask_ret |= Button2Mask;
else if (XIMaskIsSet (buttons.mask, 3))
*mask_ret |= Button3Mask;
}
if (root_x_ret)
*root_x_ret = (int) root_x;
if (root_y_ret)
*root_y_ret = (int) root_y;
if (x_ret)
*x_ret = (int) x;
if (y_ret)
*y_ret = (int) y;
return retval;
}
static void
meta_device_pointer_xi2_class_init (MetaDevicePointerXI2Class *klass)
{
MetaDevicePointerClass *pointer_class = META_DEVICE_POINTER_CLASS (klass);
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
device_class->allow_events = meta_device_xi2_common_allow_events;
device_class->grab = meta_device_xi2_common_grab;
device_class->ungrab = meta_device_xi2_common_ungrab;
pointer_class->warp = meta_device_pointer_xi2_warp;
pointer_class->set_window_cursor = meta_device_pointer_xi2_set_window_cursor;
pointer_class->query_position = meta_device_pointer_xi2_query_position;
}
static void
meta_device_pointer_xi2_init (MetaDevicePointerXI2 *pointer)
{
}
MetaDevice *
meta_device_pointer_xi2_new (MetaDisplay *display,
gint device_id)
{
return g_object_new (META_TYPE_DEVICE_POINTER_XI2,
"device-id", device_id,
"display", display,
NULL);
}
/* Keyboard */
G_DEFINE_TYPE (MetaDeviceKeyboardXI2,
meta_device_keyboard_xi2,
META_TYPE_DEVICE_KEYBOARD)
static Window
meta_device_keyboard_xi2_get_focus_window (MetaDeviceKeyboard *keyboard)
{
MetaDisplay *display;
Window xwindow;
display = meta_device_get_display (META_DEVICE (keyboard));
XIGetFocus (display->xdisplay,
meta_device_get_id (META_DEVICE (keyboard)),
&xwindow);
return xwindow;
}
static void
meta_device_keyboard_xi2_set_focus_window (MetaDeviceKeyboard *keyboard,
Window xwindow,
Time timestamp)
{
MetaDisplay *display;
display = meta_device_get_display (META_DEVICE (keyboard));
XISetFocus (display->xdisplay,
meta_device_get_id (META_DEVICE (keyboard)),
xwindow,
timestamp);
}
static void
meta_device_keyboard_xi2_class_init (MetaDeviceKeyboardXI2Class *klass)
{
MetaDeviceKeyboardClass *keyboard_class = META_DEVICE_KEYBOARD_CLASS (klass);
MetaDeviceClass *device_class = META_DEVICE_CLASS (klass);
keyboard_class->get_focus_window = meta_device_keyboard_xi2_get_focus_window;
keyboard_class->set_focus_window = meta_device_keyboard_xi2_set_focus_window;
device_class->allow_events = meta_device_xi2_common_allow_events;
device_class->grab = meta_device_xi2_common_grab;
device_class->ungrab = meta_device_xi2_common_ungrab;
}
static void
meta_device_keyboard_xi2_init (MetaDeviceKeyboardXI2 *keyboard)
{
}
MetaDevice *
meta_device_keyboard_xi2_new (MetaDisplay *display,
gint device_id)
{
return g_object_new (META_TYPE_DEVICE_KEYBOARD_XI2,
"device-id", device_id,
"display", display,
NULL);
}

92
src/core/devices-xi2.h Normal file
View File

@@ -0,0 +1,92 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file devices-xi2.h XInput2 input devices implementation
*
* Input devices.
* This file contains the XInput2 implementation of input devices.
*/
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICES_XI2_H
#define META_DEVICES_XI2_H
#include "device-pointer.h"
#include "device-keyboard.h"
/* Pointer */
#define META_TYPE_DEVICE_POINTER_XI2 (meta_device_pointer_xi2_get_type ())
#define META_DEVICE_POINTER_XI2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_POINTER_XI2, MetaDevicePointerXI2))
#define META_DEVICE_POINTER_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_POINTER_XI2, MetaDevicePointerXI2Class))
#define META_IS_DEVICE_POINTER_XI2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_POINTER_XI2))
#define META_IS_DEVICE_POINTER_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_POINTER_XI2))
#define META_DEVICE_POINTER_XI2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_POINTER_XI2, MetaDevicePointerXI2Class))
typedef struct _MetaDevicePointerXI2 MetaDevicePointerXI2;
typedef struct _MetaDevicePointerXI2Class MetaDevicePointerXI2Class;
struct _MetaDevicePointerXI2
{
MetaDevicePointer parent_instance;
};
struct _MetaDevicePointerXI2Class
{
MetaDevicePointerClass parent_class;
};
GType meta_device_pointer_xi2_get_type (void) G_GNUC_CONST;
MetaDevice *meta_device_pointer_xi2_new (MetaDisplay *display,
gint device_id);
/* Keyboard */
#define META_TYPE_DEVICE_KEYBOARD_XI2 (meta_device_keyboard_xi2_get_type ())
#define META_DEVICE_KEYBOARD_XI2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_KEYBOARD_XI2, MetaDeviceKeyboardXI2))
#define META_DEVICE_KEYBOARD_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_KEYBOARD_XI2, MetaDeviceKeyboardXI2Class))
#define META_IS_DEVICE_KEYBOARD_XI2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_KEYBOARD_XI2))
#define META_IS_DEVICE_KEYBOARD_XI2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_KEYBOARD_XI2))
#define META_DEVICE_KEYBOARD_XI2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_KEYBOARD_XI2, MetaDeviceKeyboardXI2Class))
typedef struct _MetaDeviceKeyboardXI2 MetaDeviceKeyboardXI2;
typedef struct _MetaDeviceKeyboardXI2Class MetaDeviceKeyboardXI2Class;
struct _MetaDeviceKeyboardXI2
{
MetaDeviceKeyboard parent_instance;
};
struct _MetaDeviceKeyboardXI2Class
{
MetaDeviceKeyboardClass parent_class;
};
GType meta_device_keyboard_xi2_get_type (void) G_GNUC_CONST;
MetaDevice *meta_device_keyboard_xi2_new (MetaDisplay *display,
gint device_id);
/* Helper function for translating event masks */
guchar * meta_device_xi2_translate_event_mask (guint evmask,
gint *len);
#endif /* META_DEVICES_XI2_H */

View File

@@ -38,6 +38,7 @@
#include <meta/boxes.h>
#include <meta/display.h>
#include "keybindings-private.h"
#include "device-map-private.h"
#include <meta/prefs.h>
#ifdef HAVE_STARTUP_NOTIFICATION
@@ -56,6 +57,9 @@ typedef struct _MetaWindowPropHooks MetaWindowPropHooks;
typedef struct MetaEdgeResistanceData MetaEdgeResistanceData;
typedef struct _MetaGrabInfo MetaGrabInfo;
typedef struct _MetaFocusInfo MetaFocusInfo;
typedef void (* MetaWindowPingFunc) (MetaDisplay *display,
Window xwindow,
guint32 timestamp,
@@ -84,6 +88,65 @@ typedef enum {
META_TILE_MAXIMIZED
} MetaTileMode;
struct _MetaGrabInfo
{
MetaDevice *grab_pointer;
MetaDevice *grab_keyboard;
MetaGrabOp grab_op;
MetaScreen *grab_screen;
MetaWindow *grab_window;
Window grab_xwindow;
int grab_button;
int grab_anchor_root_x;
int grab_anchor_root_y;
MetaRectangle grab_anchor_window_pos;
MetaTileMode grab_tile_mode;
int grab_latest_motion_x;
int grab_latest_motion_y;
gulong grab_mask;
guint grab_have_pointer : 1;
guint grab_have_keyboard : 1;
guint grab_frame_action : 1;
/* During a resize operation, the directions in which we've broken
* out of the initial maximization state */
guint grab_resize_unmaximize : 2; /* MetaMaximizeFlags */
MetaRectangle grab_initial_window_pos;
int grab_initial_x, grab_initial_y; /* These are only relevant for */
gboolean grab_threshold_movement_reached; /* raise_on_click == FALSE. */
MetaResizePopup *grab_resize_popup;
GTimeVal grab_last_moveresize_time;
guint32 grab_motion_notify_time;
GList* grab_old_window_stacking;
unsigned int grab_last_user_action_was_snap;
#ifdef HAVE_XSYNC
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
XSyncAlarm grab_sync_request_alarm;
#endif
int grab_resize_timeout_id;
};
struct _MetaFocusInfo
{
/* This is the actual window from focus events,
* not the one we last set
*/
MetaWindow *focus_window;
/* window we are expecting a FocusIn event for or the current focus
* window if we are not expecting any FocusIn/FocusOut events; not
* perfect because applications can call XSetInputFocus directly.
* (It could also be messed up if a timestamp later than current
* time is sent to meta_display_set_input_focus_window, though that
* would be a programming error). See bug 154598 for more info.
*/
MetaWindow *expected_focus_window;
/* last timestamp passed to XSetInputFocus */
guint32 last_focus_time;
};
struct _MetaDisplay
{
GObject parent_instance;
@@ -102,22 +165,8 @@ struct _MetaDisplay
#include <meta/atomnames.h>
#undef item
/* This is the actual window from focus events,
* not the one we last set
*/
MetaWindow *focus_window;
/* window we are expecting a FocusIn event for or the current focus
* window if we are not expecting any FocusIn/FocusOut events; not
* perfect because applications can call XSetInputFocus directly.
* (It could also be messed up if a timestamp later than current
* time is sent to meta_display_set_input_focus_window, though that
* would be a programming error). See bug 154598 for more info.
*/
MetaWindow *expected_focus_window;
/* last timestamp passed to XSetInputFocus */
guint32 last_focus_time;
/* keyboard -> MetaFocusInfo hashtable */
GHashTable *focus_info;
/* last user interaction time in any app */
guint32 last_user_time;
@@ -177,34 +226,11 @@ struct _MetaDisplay
/* Alt+click button grabs */
unsigned int window_grab_modifiers;
/* current window operation */
MetaGrabOp grab_op;
MetaScreen *grab_screen;
MetaWindow *grab_window;
Window grab_xwindow;
int grab_button;
int grab_anchor_root_x;
int grab_anchor_root_y;
MetaRectangle grab_anchor_window_pos;
MetaTileMode grab_tile_mode;
int grab_latest_motion_x;
int grab_latest_motion_y;
gulong grab_mask;
guint grab_have_pointer : 1;
guint grab_have_keyboard : 1;
guint grab_frame_action : 1;
/* During a resize operation, the directions in which we've broken
* out of the initial maximization state */
guint grab_resize_unmaximize : 2; /* MetaMaximizeFlags */
MetaRectangle grab_initial_window_pos;
int grab_initial_x, grab_initial_y; /* These are only relevant for */
gboolean grab_threshold_movement_reached; /* raise_on_click == FALSE. */
MetaResizePopup *grab_resize_popup;
GTimeVal grab_last_moveresize_time;
guint32 grab_motion_notify_time;
GList* grab_old_window_stacking;
MetaEdgeResistanceData *grab_edge_resistance_data;
unsigned int grab_last_user_action_was_snap;
/* per-device current window operation */
GHashTable *current_grabs;
/* per-screen edge resistance cache */
GHashTable *edge_resistance_info;
/* we use property updates as sentinels for certain window focus events
* to avoid some race conditions on EnterNotify events
@@ -215,11 +241,6 @@ struct _MetaDisplay
int xkb_base_event_type;
guint32 last_bell_time;
#endif
#ifdef HAVE_XSYNC
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
XSyncAlarm grab_sync_request_alarm;
#endif
int grab_resize_timeout_id;
/* Keybindings stuff */
MetaKeyBinding *key_bindings;
@@ -266,6 +287,9 @@ struct _MetaDisplay
/* Managed by compositor.c */
MetaCompositor *compositor;
/* Managed by device-map.c */
MetaDeviceMap *device_map;
int render_event_base;
int render_error_base;
@@ -289,6 +313,12 @@ struct _MetaDisplay
int shape_event_base;
int shape_error_base;
#endif
#ifdef HAVE_XINPUT2
int xinput2_opcode;
unsigned int have_xinput2 : 1;
#endif
#ifdef HAVE_XSYNC
unsigned int have_xsync : 1;
#define META_DISPLAY_HAS_XSYNC(display) ((display)->have_xsync)
@@ -378,12 +408,14 @@ Cursor meta_display_create_x_cursor (MetaDisplay *display,
void meta_display_set_grab_op_cursor (MetaDisplay *display,
MetaScreen *screen,
MetaDevice *device,
MetaGrabOp op,
gboolean change_pointer,
Window grab_xwindow,
guint32 timestamp);
void meta_display_check_threshold_reached (MetaDisplay *display,
MetaDevice *device,
int x,
int y);
void meta_display_grab_window_buttons (MetaDisplay *display,
@@ -397,7 +429,8 @@ void meta_display_ungrab_focus_window_button (MetaDisplay *display,
MetaWindow *window);
/* Next function is defined in edge-resistance.c */
void meta_display_cleanup_edges (MetaDisplay *display);
void meta_display_cleanup_edges (MetaDisplay *display,
MetaScreen *screen);
/* make a request to ensure the event serial has changed */
void meta_display_increment_event_serial (MetaDisplay *display);
@@ -445,4 +478,15 @@ void meta_display_overlay_key_activate (MetaDisplay *display);
/* In above-tab-keycode.c */
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
MetaGrabInfo * meta_display_create_grab_info (MetaDisplay *display,
MetaDevice *device);
void meta_display_remove_grab_info (MetaDisplay *display,
MetaDevice *device);
MetaGrabInfo * meta_display_get_grab_info (MetaDisplay *display,
MetaDevice *device);
MetaFocusInfo * meta_display_get_focus_info (MetaDisplay *display,
MetaDevice *device);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -30,12 +30,12 @@
/* A simple macro for whether a given window's edges are potentially
* relevant for resistance/snapping during a move/resize operation
*/
#define WINDOW_EDGES_RELEVANT(window, display) \
meta_window_should_be_showing (window) && \
window->screen == display->grab_screen && \
window != display->grab_window && \
window->type != META_WINDOW_DESKTOP && \
window->type != META_WINDOW_MENU && \
#define WINDOW_EDGES_RELEVANT(window, display, screen) \
meta_window_should_be_showing (window) && \
window->screen == screen && \
window->cur_grab == NULL && \
window->type != META_WINDOW_DESKTOP && \
window->type != META_WINDOW_MENU && \
window->type != META_WINDOW_SPLASHSCREEN
struct ResistanceDataForAnEdge
@@ -44,8 +44,9 @@ struct ResistanceDataForAnEdge
guint timeout_id;
int timeout_edge_pos;
gboolean timeout_over;
GSourceFunc timeout_func;
MetaEdgeResistanceFunc timeout_func;
MetaWindow *window;
MetaDevice *device;
int keyboard_buildup;
};
typedef struct ResistanceDataForAnEdge ResistanceDataForAnEdge;
@@ -63,7 +64,9 @@ struct MetaEdgeResistanceData
ResistanceDataForAnEdge bottom_data;
};
static void compute_resistance_and_snapping_edges (MetaDisplay *display);
static MetaEdgeResistanceData *
compute_resistance_and_snapping_edges (MetaDisplay *display,
MetaScreen *screen);
/* !WARNING!: this function can return invalid indices (namely, either -1 or
* edges->len); this is by design, but you need to remember this.
@@ -318,20 +321,22 @@ edge_resistance_timeout (gpointer data)
resistance_data->timeout_over = TRUE;
resistance_data->timeout_id = 0;
(*resistance_data->timeout_func)(resistance_data->window);
(*resistance_data->timeout_func) (resistance_data->window,
resistance_data->device);
return FALSE;
}
static int
apply_edge_resistance (MetaWindow *window,
MetaDevice *device,
int old_pos,
int new_pos,
const MetaRectangle *old_rect,
const MetaRectangle *new_rect,
GArray *edges,
ResistanceDataForAnEdge *resistance_data,
GSourceFunc timeout_func,
MetaEdgeResistanceFunc timeout_func,
gboolean xdir,
gboolean keyboard_op)
{
@@ -445,6 +450,7 @@ apply_edge_resistance (MetaWindow *window,
resistance_data->timeout_over = FALSE;
resistance_data->timeout_func = timeout_func;
resistance_data->window = window;
resistance_data->device = device;
}
if (!resistance_data->timeout_over &&
timeout_length_ms != 0)
@@ -533,29 +539,28 @@ apply_edge_snapping (int old_pos,
* a proposed new position (ignoring edge resistance/snapping), and then
* applies edge resistance to EACH edge (separately) updating new_outer.
* It returns true if new_outer is modified, false otherwise.
*
* display->grab_edge_resistance_data MUST already be setup or calling this
* function will cause a crash.
*/
static gboolean
apply_edge_resistance_to_each_side (MetaDisplay *display,
MetaWindow *window,
const MetaRectangle *old_outer,
MetaRectangle *new_outer,
GSourceFunc timeout_func,
gboolean auto_snap,
gboolean keyboard_op,
gboolean is_resize)
apply_edge_resistance_to_each_side (MetaDisplay *display,
MetaWindow *window,
MetaDevice *device,
const MetaRectangle *old_outer,
MetaRectangle *new_outer,
MetaEdgeResistanceFunc timeout_func,
gboolean auto_snap,
gboolean keyboard_op,
gboolean is_resize)
{
MetaEdgeResistanceData *edge_data;
MetaRectangle modified_rect;
gboolean modified;
int new_left, new_right, new_top, new_bottom;
if (display->grab_edge_resistance_data == NULL)
compute_resistance_and_snapping_edges (display);
edge_data = g_hash_table_lookup (display->edge_resistance_info,
window->screen);
edge_data = display->grab_edge_resistance_data;
if (!edge_data)
edge_data = compute_resistance_and_snapping_edges (display, window->screen);
if (auto_snap)
{
@@ -601,7 +606,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
if (!is_resize || window->size_hints.width_inc == 1)
{
/* Now, apply the normal horizontal edge resistance */
new_left = apply_edge_resistance (window,
new_left = apply_edge_resistance (window, device,
BOX_LEFT (*old_outer),
BOX_LEFT (*new_outer),
old_outer,
@@ -611,7 +616,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
timeout_func,
TRUE,
keyboard_op);
new_right = apply_edge_resistance (window,
new_right = apply_edge_resistance (window, device,
BOX_RIGHT (*old_outer),
BOX_RIGHT (*new_outer),
old_outer,
@@ -630,7 +635,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
/* Same for vertical resizes... */
if (!is_resize || window->size_hints.height_inc == 1)
{
new_top = apply_edge_resistance (window,
new_top = apply_edge_resistance (window, device,
BOX_TOP (*old_outer),
BOX_TOP (*new_outer),
old_outer,
@@ -640,7 +645,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
timeout_func,
FALSE,
keyboard_op);
new_bottom = apply_edge_resistance (window,
new_bottom = apply_edge_resistance (window, device,
BOX_BOTTOM (*old_outer),
BOX_BOTTOM (*new_outer),
old_outer,
@@ -669,15 +674,20 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
}
void
meta_display_cleanup_edges (MetaDisplay *display)
meta_display_cleanup_edges (MetaDisplay *display,
MetaScreen *screen)
{
guint i,j;
MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_data;
MetaEdgeResistanceData *edge_data;
GHashTable *edges_to_be_freed;
edge_data = g_hash_table_lookup (display->edge_resistance_info, screen);
if (edge_data == NULL) /* Not currently cached */
return;
g_hash_table_steal (display->edge_resistance_info, screen);
/* We first need to clean out any window edges */
edges_to_be_freed = g_hash_table_new_full (g_direct_hash, g_direct_equal,
g_free, NULL);
@@ -750,8 +760,7 @@ meta_display_cleanup_edges (MetaDisplay *display)
edge_data->bottom_data.timeout_id != 0)
g_source_remove (edge_data->bottom_data.timeout_id);
g_free (display->grab_edge_resistance_data);
display->grab_edge_resistance_data = NULL;
g_free (edge_data);
}
static int
@@ -763,8 +772,9 @@ stupid_sort_requiring_extra_pointer_dereference (gconstpointer a,
return meta_rectangle_edge_cmp_ignore_type (*a_edge, *b_edge);
}
static void
static MetaEdgeResistanceData *
cache_edges (MetaDisplay *display,
MetaScreen *screen,
GList *window_edges,
GList *monitor_edges,
GList *screen_edges)
@@ -848,9 +858,8 @@ cache_edges (MetaDisplay *display,
/*
* 2nd: Allocate the edges
*/
g_assert (display->grab_edge_resistance_data == NULL);
display->grab_edge_resistance_data = g_new0 (MetaEdgeResistanceData, 1);
edge_data = display->grab_edge_resistance_data;
edge_data = g_new0 (MetaEdgeResistanceData, 1);
edge_data->left_edges = g_array_sized_new (FALSE,
FALSE,
sizeof(MetaEdge*),
@@ -917,21 +926,21 @@ cache_edges (MetaDisplay *display,
* avoided this sort by sticking them into the array with some simple
* merging of the lists).
*/
g_array_sort (display->grab_edge_resistance_data->left_edges,
g_array_sort (edge_data->left_edges,
stupid_sort_requiring_extra_pointer_dereference);
g_array_sort (display->grab_edge_resistance_data->right_edges,
g_array_sort (edge_data->right_edges,
stupid_sort_requiring_extra_pointer_dereference);
g_array_sort (display->grab_edge_resistance_data->top_edges,
g_array_sort (edge_data->top_edges,
stupid_sort_requiring_extra_pointer_dereference);
g_array_sort (display->grab_edge_resistance_data->bottom_edges,
g_array_sort (edge_data->bottom_edges,
stupid_sort_requiring_extra_pointer_dereference);
return edge_data;
}
static void
initialize_grab_edge_resistance_data (MetaDisplay *display)
initialize_grab_edge_resistance_data (MetaEdgeResistanceData *edge_data)
{
MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_data;
edge_data->left_data.timeout_setup = FALSE;
edge_data->right_data.timeout_setup = FALSE;
edge_data->top_data.timeout_setup = FALSE;
@@ -943,8 +952,9 @@ initialize_grab_edge_resistance_data (MetaDisplay *display)
edge_data->bottom_data.keyboard_buildup = 0;
}
static void
compute_resistance_and_snapping_edges (MetaDisplay *display)
static MetaEdgeResistanceData *
compute_resistance_and_snapping_edges (MetaDisplay *display,
MetaScreen *screen)
{
GList *stacked_windows;
GList *cur_window_iter;
@@ -956,18 +966,17 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
* in the layer that we are working on
*/
GSList *rem_windows, *rem_win_stacking;
MetaEdgeResistanceData *edge_data;
g_assert (display->grab_window != NULL);
meta_topic (META_DEBUG_WINDOW_OPS,
"Computing edges to resist-movement or snap-to for %s.\n",
display->grab_window->desc);
"Computing edges to resist-movement or snap-to for screen %s.\n",
screen->screen_name);
/*
* 1st: Get the list of relevant windows, from bottom to top
*/
stacked_windows =
meta_stack_list_windows (display->grab_screen->stack,
display->grab_screen->active_workspace);
meta_stack_list_windows (screen->stack, screen->active_workspace);
/*
* 2nd: we need to separate that stacked list into a list of windows that
@@ -981,7 +990,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
while (cur_window_iter != NULL)
{
MetaWindow *cur_window = cur_window_iter->data;
if (WINDOW_EDGES_RELEVANT (cur_window, display))
if (WINDOW_EDGES_RELEVANT (cur_window, display, screen))
{
MetaRectangle *new_rect;
new_rect = g_new (MetaRectangle, 1);
@@ -1016,7 +1025,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
* resistance (note that dock edges are considered screen edges
* which are handled separately
*/
if (WINDOW_EDGES_RELEVANT (cur_window, display) &&
if (WINDOW_EDGES_RELEVANT (cur_window, display, screen) &&
cur_window->type != META_WINDOW_DOCK)
{
GList *new_edges;
@@ -1028,7 +1037,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
* by other windows or DOCKS, but that's handled below).
*/
meta_rectangle_intersect (&cur_rect,
&display->grab_screen->rect,
&screen->rect,
&reduced);
new_edges = NULL;
@@ -1123,32 +1132,36 @@ compute_resistance_and_snapping_edges (MetaDisplay *display)
* monitor edges in an array for quick access. Free the edges since
* they've been cached elsewhere.
*/
cache_edges (display,
edges,
display->grab_screen->active_workspace->monitor_edges,
display->grab_screen->active_workspace->screen_edges);
edge_data = cache_edges (display, screen,
edges,
screen->active_workspace->monitor_edges,
screen->active_workspace->screen_edges);
g_list_free (edges);
/*
* 6th: Initialize the resistance timeouts and buildups
*/
initialize_grab_edge_resistance_data (display);
initialize_grab_edge_resistance_data (edge_data);
return edge_data;
}
/* Note that old_[xy] and new_[xy] are with respect to inner positions of
* the window.
*/
void
meta_window_edge_resistance_for_move (MetaWindow *window,
int old_x,
int old_y,
int *new_x,
int *new_y,
GSourceFunc timeout_func,
gboolean snap,
gboolean is_keyboard_op)
meta_window_edge_resistance_for_move (MetaWindow *window,
MetaDevice *device,
int old_x,
int old_y,
int *new_x,
int *new_y,
MetaEdgeResistanceFunc timeout_func,
gboolean snap,
gboolean is_keyboard_op)
{
MetaRectangle old_outer, proposed_outer, new_outer;
MetaGrabInfo *grab_info;
gboolean is_resize;
meta_window_get_outer_rect (window, &old_outer);
@@ -1158,10 +1171,14 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
proposed_outer.y += (*new_y - old_y);
new_outer = proposed_outer;
window->display->grab_last_user_action_was_snap = snap;
grab_info = meta_display_get_grab_info (window->display, device);
g_assert (grab_info != NULL);
grab_info->grab_last_user_action_was_snap = snap;
is_resize = FALSE;
if (apply_edge_resistance_to_each_side (window->display,
window,
device,
&old_outer,
&new_outer,
timeout_func,
@@ -1223,18 +1240,20 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
* sizes of the inner window.
*/
void
meta_window_edge_resistance_for_resize (MetaWindow *window,
int old_width,
int old_height,
int *new_width,
int *new_height,
int gravity,
GSourceFunc timeout_func,
gboolean snap,
gboolean is_keyboard_op)
meta_window_edge_resistance_for_resize (MetaWindow *window,
MetaDevice *device,
int old_width,
int old_height,
int *new_width,
int *new_height,
int gravity,
MetaEdgeResistanceFunc timeout_func,
gboolean snap,
gboolean is_keyboard_op)
{
MetaRectangle old_outer, new_outer;
int proposed_outer_width, proposed_outer_height;
MetaGrabInfo *grab_info;
gboolean is_resize;
meta_window_get_outer_rect (window, &old_outer);
@@ -1246,10 +1265,14 @@ meta_window_edge_resistance_for_resize (MetaWindow *window,
proposed_outer_width,
proposed_outer_height);
window->display->grab_last_user_action_was_snap = snap;
grab_info = meta_display_get_grab_info (window->display, device);
g_assert (grab_info != NULL);
grab_info->grab_last_user_action_was_snap = snap;
is_resize = TRUE;
if (apply_edge_resistance_to_each_side (window->display,
window,
device,
&old_outer,
&new_outer,
timeout_func,

View File

@@ -26,23 +26,28 @@
#include "window-private.h"
void meta_window_edge_resistance_for_move (MetaWindow *window,
int old_x,
int old_y,
int *new_x,
int *new_y,
GSourceFunc timeout_func,
gboolean snap,
gboolean is_keyboard_op);
void meta_window_edge_resistance_for_resize (MetaWindow *window,
int old_width,
int old_height,
int *new_width,
int *new_height,
int gravity,
GSourceFunc timeout_func,
gboolean snap,
gboolean is_keyboard_op);
typedef gboolean (* MetaEdgeResistanceFunc) (MetaWindow *window,
MetaDevice *device);
void meta_window_edge_resistance_for_move (MetaWindow *window,
MetaDevice *device,
int old_x,
int old_y,
int *new_x,
int *new_y,
MetaEdgeResistanceFunc func,
gboolean snap,
gboolean is_keyboard_op);
void meta_window_edge_resistance_for_resize (MetaWindow *window,
MetaDevice *device,
int old_width,
int old_height,
int *new_width,
int *new_height,
int gravity,
MetaEdgeResistanceFunc func,
gboolean snap,
gboolean is_keyboard_op);
#endif /* META_EDGE_RESISTANCE_H */

View File

@@ -28,6 +28,7 @@
#include "bell.h"
#include <meta/errors.h>
#include "keybindings-private.h"
#include "device-pointer.h"
#include <X11/extensions/Xrender.h>
@@ -64,7 +65,7 @@ meta_window_ensure_frame (MetaWindow *window)
frame->child_y = 0;
frame->bottom_height = 0;
frame->right_width = 0;
frame->current_cursor = 0;
frame->cursors = g_hash_table_new (NULL, NULL);
frame->mapped = FALSE;
frame->need_reapply_frame_shape = TRUE;
@@ -117,11 +118,6 @@ meta_window_ensure_frame (MetaWindow *window)
meta_display_register_x_window (window->display, &frame->xwindow, window);
/* Now that frame->xwindow is registered with window, we can set its
* background.
*/
meta_ui_reset_frame_bg (window->screen->ui, frame->xwindow);
/* Reparent the client window; it may be destroyed,
* thus the error trap. We'll get a destroy notify later
* and free everything. Comment in FVWM source code says
@@ -157,6 +153,12 @@ meta_window_ensure_frame (MetaWindow *window)
/* stick frame to the window */
window->frame = frame;
/* Now that frame->xwindow is registered with window, we can set its
* style and background.
*/
meta_ui_update_frame_style (window->screen->ui, frame->xwindow);
meta_ui_reset_frame_bg (window->screen->ui, frame->xwindow);
if (window->title)
meta_ui_set_frame_title (window->screen->ui,
@@ -228,9 +230,10 @@ meta_window_destroy_frame (MetaWindow *window)
/* Move keybindings to window instead of frame */
meta_window_grab_keys (window);
g_hash_table_destroy (frame->cursors);
g_free (frame);
/* Put our state back where it should be */
meta_window_queue (window, META_QUEUE_CALC_SHOWING);
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
@@ -244,6 +247,12 @@ meta_frame_get_flags (MetaFrame *frame)
flags = 0;
/* Disallow frame operations
* while the popup menu is open.
*/
if (frame->window->menu)
return flags;
if (frame->window->border_only)
{
; /* FIXME this may disable the _function_ as well as decor
@@ -328,7 +337,7 @@ meta_frame_calc_geometry (MetaFrame *frame,
*geomp = geom;
}
static void
static gboolean
update_shape (MetaFrame *frame)
{
if (frame->need_reapply_frame_shape)
@@ -339,10 +348,14 @@ update_shape (MetaFrame *frame)
frame->rect.height,
frame->window->has_shape);
frame->need_reapply_frame_shape = FALSE;
return TRUE;
}
else
return FALSE;
}
void
gboolean
meta_frame_sync_to_window (MetaFrame *frame,
int resize_gravity,
gboolean need_move,
@@ -350,8 +363,7 @@ meta_frame_sync_to_window (MetaFrame *frame,
{
if (!(need_move || need_resize))
{
update_shape (frame);
return;
return update_shape (frame);
}
meta_topic (META_DEBUG_GEOMETRY,
@@ -396,11 +408,21 @@ meta_frame_sync_to_window (MetaFrame *frame,
/* If we're interactively resizing the frame, repaint
* it immediately so we don't start to lag.
*/
if (frame->window->display->grab_window ==
frame->window)
if (frame->window->cur_grab != NULL)
meta_ui_repaint_frame (frame->window->screen->ui,
frame->xwindow);
}
return need_resize;
}
cairo_region_t *
meta_frame_get_frame_bounds (MetaFrame *frame)
{
return meta_ui_get_frame_bounds (frame->window->screen->ui,
frame->xwindow,
frame->rect.width,
frame->rect.height);
}
void
@@ -411,22 +433,22 @@ meta_frame_queue_draw (MetaFrame *frame)
}
void
meta_frame_set_screen_cursor (MetaFrame *frame,
MetaCursor cursor)
meta_frame_set_screen_cursor (MetaFrame *frame,
MetaDevice *pointer,
MetaCursor cursor)
{
Cursor xcursor;
if (cursor == frame->current_cursor)
MetaCursor old_cursor;
old_cursor = GPOINTER_TO_UINT (g_hash_table_lookup (frame->cursors, pointer));
if (cursor == old_cursor)
return;
frame->current_cursor = cursor;
if (cursor == META_CURSOR_DEFAULT)
XUndefineCursor (frame->window->display->xdisplay, frame->xwindow);
else
{
xcursor = meta_display_create_x_cursor (frame->window->display, cursor);
XDefineCursor (frame->window->display->xdisplay, frame->xwindow, xcursor);
XFlush (frame->window->display->xdisplay);
XFreeCursor (frame->window->display->xdisplay, xcursor);
}
g_hash_table_insert (frame->cursors, pointer,
GUINT_TO_POINTER (cursor));
meta_device_pointer_set_window_cursor (META_DEVICE_POINTER (pointer),
frame->xwindow, cursor);
XFlush (frame->window->display->xdisplay);
}
Window

View File

@@ -45,7 +45,7 @@ struct _MetaFrame
/* reparent window */
Window xwindow;
MetaCursor current_cursor;
GHashTable *cursors;
/* This rect is trusted info from where we put the
* frame, not the result of ConfigureNotify
@@ -73,12 +73,15 @@ Window meta_frame_get_xwindow (MetaFrame *frame);
/* These should ONLY be called from meta_window_move_resize_internal */
void meta_frame_calc_geometry (MetaFrame *frame,
MetaFrameGeometry *geomp);
void meta_frame_sync_to_window (MetaFrame *frame,
gboolean meta_frame_sync_to_window (MetaFrame *frame,
int gravity,
gboolean need_move,
gboolean need_resize);
void meta_frame_set_screen_cursor (MetaFrame *frame,
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
void meta_frame_set_screen_cursor (MetaFrame *frame,
MetaDevice *pointer,
MetaCursor cursor);
#endif

677
src/core/input-events.c Normal file
View File

@@ -0,0 +1,677 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* XEvent utility methods */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include <config.h>
#include "input-events.h"
#include "devices-core.h"
#include "device-map-private.h"
#include <X11/Xlib.h>
#ifdef HAVE_XINPUT2
#include <X11/extensions/XInput2.h>
#endif
/* Quite a hack: normalizes XI2 events to their
* core event equivalent, so most code is shared
* for both implementations, code handling input
* events should use the helper functions so
* the actual event is treated correctly.
*/
gboolean
meta_input_event_get_type (MetaDisplay *display,
XEvent *ev,
guint *ev_type)
{
guint type = 0; /* Silence gcc */
gboolean retval = TRUE;
#ifdef HAVE_XINPUT2
if (display->have_xinput2 &&
ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
/* NB: GDK event filters already have generic events
* allocated, so no need to do XGetEventData() on our own
*/
xev = (XIEvent *) ev->xcookie.data;
switch (xev->evtype)
{
case XI_Motion:
type = MotionNotify;
break;
case XI_ButtonPress:
type = ButtonPress;
break;
case XI_ButtonRelease:
type = ButtonRelease;
break;
case XI_KeyPress:
type = KeyPress;
break;
case XI_KeyRelease:
type = KeyRelease;
break;
case XI_FocusIn:
type = FocusIn;
break;
case XI_FocusOut:
type = FocusOut;
break;
case XI_Enter:
type = EnterNotify;
break;
case XI_Leave:
type = LeaveNotify;
break;
default:
retval = FALSE;
break;
}
}
else
#endif /* HAVE_XINPUT2 */
{
switch (ev->type)
{
case MotionNotify:
case ButtonPress:
case ButtonRelease:
case KeyPress:
case KeyRelease:
case FocusIn:
case FocusOut:
case EnterNotify:
case LeaveNotify:
type = ev->type;
break;
default:
retval = FALSE;
break;
}
}
if (retval)
{
if (ev_type)
*ev_type = type;
return TRUE;
}
else
return FALSE;
}
gboolean
meta_input_event_is_type (MetaDisplay *display,
XEvent *ev,
guint ev_type)
{
guint type;
if (!meta_input_event_get_type (display, ev, &type))
return FALSE;
return (type == ev_type);
}
Window
meta_input_event_get_window (MetaDisplay *display,
XEvent *ev)
{
#ifdef HAVE_XINPUT2
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
g_assert (display->have_xinput2 == TRUE);
/* GDK event filters already have generic events allocated */
xev = (XIEvent *) ev->xcookie.data;
switch (xev->evtype)
{
case XI_Motion:
case XI_ButtonPress:
case XI_ButtonRelease:
case XI_KeyPress:
case XI_KeyRelease:
return ((XIDeviceEvent *) xev)->event;
case XI_FocusIn:
case XI_FocusOut:
case XI_Enter:
case XI_Leave:
return ((XIEnterEvent *) xev)->event;
default:
return None;
}
}
else
#endif /* HAVE_XINPUT2 */
return ev->xany.window;
}
Window
meta_input_event_get_root_window (MetaDisplay *display,
XEvent *ev)
{
#ifdef HAVE_XINPUT2
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
g_assert (display->have_xinput2 == TRUE);
xev = (XIEvent *) ev->xcookie.data;
switch (xev->evtype)
{
case XI_Motion:
case XI_ButtonPress:
case XI_ButtonRelease:
case XI_KeyPress:
case XI_KeyRelease:
return ((XIDeviceEvent *) xev)->root;
case XI_FocusIn:
case XI_FocusOut:
case XI_Enter:
case XI_Leave:
return ((XIEnterEvent *) xev)->root;
default:
break;
}
}
else
#endif /* HAVE_XINPUT2 */
{
switch (ev->type)
{
case KeyPress:
case KeyRelease:
return ev->xkey.root;
case ButtonPress:
case ButtonRelease:
return ev->xbutton.root;
case EnterNotify:
case LeaveNotify:
return ev->xcrossing.root;
case MotionNotify:
return ev->xbutton.root;
default:
break;
}
}
return None;
}
Time
meta_input_event_get_time (MetaDisplay *display,
XEvent *ev)
{
#ifdef HAVE_XINPUT2
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
g_assert (display->have_xinput2 == TRUE);
xev = (XIEvent *) ev->xcookie.data;
switch (xev->evtype)
{
case XI_Motion:
case XI_ButtonPress:
case XI_ButtonRelease:
case XI_KeyPress:
case XI_KeyRelease:
return ((XIDeviceEvent *) xev)->time;
case XI_FocusIn:
case XI_FocusOut:
case XI_Enter:
case XI_Leave:
return ((XIEnterEvent *) xev)->time;
default:
break;
}
}
else
#endif /* HAVE_XINPUT2 */
{
switch (ev->type)
{
case KeyPress:
case KeyRelease:
return ev->xkey.time;
case ButtonPress:
case ButtonRelease:
return ev->xbutton.time;
case EnterNotify:
case LeaveNotify:
return ev->xcrossing.time;
case MotionNotify:
return ev->xmotion.time;
default:
break;
}
}
return CurrentTime;
}
gboolean
meta_input_event_get_coordinates (MetaDisplay *display,
XEvent *ev,
gdouble *x_ret,
gdouble *y_ret,
gdouble *x_root_ret,
gdouble *y_root_ret)
{
gdouble x, y, x_root, y_root;
gboolean retval = TRUE;
#ifdef HAVE_XINPUT2
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
g_assert (display->have_xinput2 == TRUE);
xev = (XIEvent *) ev->xcookie.data;
switch (xev->evtype)
{
case XI_Motion:
case XI_ButtonPress:
case XI_ButtonRelease:
case XI_KeyPress:
case XI_KeyRelease:
{
XIDeviceEvent *event = (XIDeviceEvent *) xev;
x = event->event_x;
y = event->event_y;
x_root = event->root_x;
y_root = event->root_y;
}
break;
case XI_FocusIn:
case XI_FocusOut:
case XI_Enter:
case XI_Leave:
{
XIEnterEvent *event = (XIEnterEvent *) xev;
x = event->event_x;
y = event->event_y;
x_root = event->root_x;
y_root = event->root_y;
}
break;
default:
retval = FALSE;
break;
}
}
else
#endif /* HAVE_XINPUT2 */
{
switch (ev->type)
{
case KeyPress:
case KeyRelease:
x = ev->xkey.x;
y = ev->xkey.y;
x_root = ev->xkey.x_root;
y_root = ev->xkey.y_root;
break;
case ButtonPress:
case ButtonRelease:
x = ev->xbutton.x;
y = ev->xbutton.y;
x_root = ev->xbutton.x_root;
y_root = ev->xbutton.y_root;
break;
case EnterNotify:
case LeaveNotify:
x = ev->xcrossing.x;
y = ev->xcrossing.y;
x_root = ev->xcrossing.x_root;
y_root = ev->xcrossing.y_root;
break;
case MotionNotify:
x = ev->xmotion.x;
y = ev->xmotion.y;
x_root = ev->xmotion.x_root;
y_root = ev->xmotion.y_root;
break;
default:
retval = FALSE;
break;
}
}
if (retval)
{
if (x_ret)
*x_ret = x;
if (y_ret)
*y_ret = y;
if (x_root_ret)
*x_root_ret = x_root;
if (y_root_ret)
*y_root_ret = y_root;
}
return retval;
}
gboolean
meta_input_event_get_state (MetaDisplay *display,
XEvent *ev,
guint *state)
{
gboolean retval = TRUE;
guint s;
#ifdef HAVE_XINPUT2
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
g_assert (display->have_xinput2 == TRUE);
xev = (XIEvent *) ev->xcookie.data;
switch (xev->evtype)
{
case XI_Motion:
case XI_ButtonPress:
case XI_ButtonRelease:
case XI_KeyPress:
case XI_KeyRelease:
s = ((XIDeviceEvent *) xev)->mods.effective;
break;
case XI_FocusIn:
case XI_FocusOut:
case XI_Enter:
case XI_Leave:
s = ((XIDeviceEvent *) xev)->mods.effective;
break;
default:
retval = FALSE;
break;
}
}
else
#endif /* HAVE_XINPUT2 */
{
switch (ev->type)
{
case KeyPress:
case KeyRelease:
s = ev->xkey.state;
break;
case ButtonPress:
case ButtonRelease:
s = ev->xbutton.state;
break;
case EnterNotify:
case LeaveNotify:
s = ev->xcrossing.state;
break;
case MotionNotify:
s = ev->xmotion.state;
break;
default:
retval = FALSE;
break;
}
}
if (retval && state)
*state = s;
return retval;
}
gboolean
meta_input_event_get_keycode (MetaDisplay *display,
XEvent *ev,
guint *keycode)
{
#ifdef HAVE_XINPUT2
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
g_assert (display->have_xinput2 == TRUE);
xev = (XIEvent *) ev->xcookie.data;
if (xev->evtype == XI_KeyPress ||
xev->evtype == XI_KeyRelease)
{
if (keycode)
{
/* The detail field contains keycode for key events */
*keycode = ((XIDeviceEvent *) xev)->detail;
}
return TRUE;
}
}
else
#endif /* HAVE_XINPUT2 */
{
if (ev->type == KeyPress ||
ev->type == KeyRelease)
{
if (keycode)
*keycode = ev->xkey.keycode;
return TRUE;
}
}
return FALSE;
}
gboolean
meta_input_event_get_button (MetaDisplay *display,
XEvent *ev,
guint *button)
{
#ifdef HAVE_XINPUT2
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
g_assert (display->have_xinput2 == TRUE);
xev = (XIEvent *) ev->xcookie.data;
if (xev->evtype == XI_ButtonPress ||
xev->evtype == XI_ButtonRelease)
{
if (button)
{
/* The detail field contains
* button number for button events
*/
*button = ((XIDeviceEvent *) xev)->detail;
}
return TRUE;
}
}
else
#endif /* HAVE_XINPUT2 */
{
if (ev->type == ButtonPress ||
ev->type == ButtonRelease)
{
if (button)
*button = ev->xbutton.button;
return TRUE;
}
}
return FALSE;
}
/* NB: Also works for focus in/out events */
gboolean
meta_input_event_get_crossing_details (MetaDisplay *display,
XEvent *ev,
guint *mode_out,
guint *detail_out)
{
gboolean retval = TRUE;
guint mode, detail;
#ifdef HAVE_XINPUT2
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
g_assert (display->have_xinput2 == TRUE);
xev = (XIEvent *) ev->xcookie.data;
if (xev->evtype == XI_Enter ||
xev->evtype == XI_Leave ||
xev->evtype == XI_FocusIn ||
xev->evtype == XI_FocusOut)
{
mode = ((XIEnterEvent *) xev)->mode;
detail = ((XIEnterEvent *) xev)->detail;
}
else
retval = FALSE;
}
else
#endif /* HAVE_XINPUT2 */
{
if (ev->type == EnterNotify ||
ev->type == LeaveNotify)
{
mode = ev->xcrossing.mode;
detail = ev->xcrossing.detail;
}
else if (ev->type == FocusIn ||
ev->type == FocusOut)
{
mode = ev->xfocus.mode;
detail = ev->xfocus.detail;
}
else
retval = FALSE;
}
if (retval)
{
if (mode_out)
*mode_out = mode;
if (detail_out)
*detail_out = detail;
}
return retval;
}
MetaDevice *
meta_input_event_get_device (MetaDisplay *display,
XEvent *ev)
{
guint evtype;
if (!meta_input_event_get_type (display, ev, &evtype))
return NULL;
#ifdef HAVE_XINPUT2
if (ev->type == GenericEvent &&
ev->xcookie.extension == display->xinput2_opcode)
{
XIEvent *xev;
g_assert (display->have_xinput2 == TRUE);
xev = (XIEvent *) ev->xcookie.data;
switch (evtype)
{
case XI_Motion:
case XI_ButtonPress:
case XI_ButtonRelease:
case XI_KeyPress:
case XI_KeyRelease:
return meta_device_map_lookup (display->device_map,
((XIDeviceEvent *) xev)->deviceid);
case XI_FocusIn:
case XI_FocusOut:
case XI_Enter:
case XI_Leave:
return meta_device_map_lookup (display->device_map,
((XIEnterEvent *) xev)->deviceid);
default:
break;
}
}
else
#endif
{
switch (ev->type)
{
case KeyPress:
case KeyRelease:
case FocusIn:
case FocusOut:
return meta_device_map_lookup (display->device_map,
META_CORE_KEYBOARD_ID);
default:
/* All other events are pointers' */
return meta_device_map_lookup (display->device_map,
META_CORE_POINTER_ID);
}
}
return NULL;
}

78
src/core/input-events.h Normal file
View File

@@ -0,0 +1,78 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file event.h Utility functions for handling events
*
* Handling events.
* This file contains helper methods to handle events, specially
* input events, which can be either core or XInput2.
*/
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_EVENT_H
#define META_EVENT_H
#include <config.h>
#include <X11/Xlib.h>
#include "display-private.h"
#include <meta/device-map.h>
gboolean meta_input_event_get_type (MetaDisplay *display,
XEvent *ev,
guint *ev_type);
gboolean meta_input_event_is_type (MetaDisplay *display,
XEvent *ev,
guint ev_type);
Window meta_input_event_get_window (MetaDisplay *display,
XEvent *ev);
Window meta_input_event_get_root_window (MetaDisplay *display,
XEvent *ev);
Time meta_input_event_get_time (MetaDisplay *display,
XEvent *ev);
gboolean meta_input_event_get_coordinates (MetaDisplay *display,
XEvent *ev,
gdouble *x_ret,
gdouble *y_ret,
gdouble *x_root_ret,
gdouble *y_root_ret);
gboolean meta_input_event_get_state (MetaDisplay *display,
XEvent *ev,
guint *state);
gboolean meta_input_event_get_keycode (MetaDisplay *display,
XEvent *ev,
guint *keycode);
gboolean meta_input_event_get_button (MetaDisplay *display,
XEvent *event,
guint *button);
gboolean meta_input_event_get_crossing_details (MetaDisplay *display,
XEvent *ev,
guint *mode_out,
guint *detail_out);
MetaDevice *meta_input_event_get_device (MetaDisplay *display,
XEvent *ev);
#endif /* META_EVENT_H */

View File

@@ -36,14 +36,18 @@ void meta_display_shutdown_keys (MetaDisplay *display);
void meta_screen_grab_keys (MetaScreen *screen);
void meta_screen_ungrab_keys (MetaScreen *screen);
gboolean meta_screen_grab_all_keys (MetaScreen *screen,
MetaDevice *device,
guint32 timestamp);
void meta_screen_ungrab_all_keys (MetaScreen *screen,
void meta_screen_ungrab_all_keys (MetaScreen *screen,
MetaDevice *device,
guint32 timestamp);
void meta_window_grab_keys (MetaWindow *window);
void meta_window_ungrab_keys (MetaWindow *window);
gboolean meta_window_grab_all_keys (MetaWindow *window,
MetaDevice *device,
guint32 timestamp);
void meta_window_ungrab_all_keys (MetaWindow *window,
MetaDevice *device,
guint32 timestamp);
gboolean meta_display_process_key_event (MetaDisplay *display,
MetaWindow *window,

File diff suppressed because it is too large Load Diff

View File

@@ -251,6 +251,11 @@ meta_get_option_context (void)
{
GOptionContext *ctx;
if (setlocale (LC_ALL, "") == NULL)
meta_warning ("Locale not understood by C library, internationalization will not work\n");
bindtextdomain (GETTEXT_PACKAGE, MUTTER_LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
ctx = g_option_context_new (NULL);
g_option_context_add_main_entries (ctx, meta_options, GETTEXT_PACKAGE);
g_option_context_add_group (ctx, clutter_get_option_group_without_init ());
@@ -306,9 +311,12 @@ static GSourceFuncs event_funcs = {
static void
meta_clutter_init (void)
{
if (!meta_get_use_core_devices ())
clutter_x11_enable_xinput ();
clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
clutter_x11_disable_event_retrieval ();
if (CLUTTER_INIT_SUCCESS == clutter_init (NULL, NULL))
{
GSource *source = g_source_new (&event_funcs, sizeof (GSource));
@@ -385,9 +393,6 @@ meta_init (void)
sigset_t empty_mask;
GIOChannel *channel;
if (setlocale (LC_ALL, "") == NULL)
meta_warning ("Locale not understood by C library, internationalization will not work\n");
g_type_init ();
sigemptyset (&empty_mask);
@@ -422,6 +427,8 @@ meta_init (void)
meta_set_verbose (TRUE);
if (g_getenv ("MUTTER_DEBUG"))
meta_set_debugging (TRUE);
if (g_getenv ("MUTTER_USE_CORE_DEVICES"))
meta_set_use_core_devices (TRUE);
if (g_get_home_dir ())
if (chdir (g_get_home_dir ()) < 0)
@@ -430,10 +437,6 @@ meta_init (void)
meta_print_self_identity ();
bindtextdomain (GETTEXT_PACKAGE, MUTTER_LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
#ifdef HAVE_INTROSPECTION
g_irepository_prepend_search_path (MUTTER_PKGLIBDIR);
#endif
@@ -573,10 +576,11 @@ meta_run (void)
void
meta_quit (MetaExitCode code)
{
meta_exit_code = code;
if (g_main_loop_is_running (meta_main_loop))
g_main_loop_quit (meta_main_loop);
{
meta_exit_code = code;
g_main_loop_quit (meta_main_loop);
}
}
/**

View File

@@ -90,6 +90,7 @@ northwestcmp (gconstpointer a, gconstpointer b)
static void
find_next_cascade (MetaWindow *window,
MetaDevice *pointer,
MetaFrameGeometry *fgeom,
/* visible windows on relevant workspaces */
GList *windows,
@@ -136,7 +137,7 @@ find_next_cascade (MetaWindow *window,
* of NW corner of window frame.
*/
current = meta_screen_get_current_monitor (window->screen);
current = meta_screen_get_current_monitor (window->screen, pointer);
meta_window_get_work_area_for_monitor (window, current->number, &work_area);
cascade_x = MAX (0, work_area.x);
@@ -354,10 +355,17 @@ avoid_being_obscured_as_second_modal_dialog (MetaWindow *window,
* know about the modal-to-the-main-window part.
*/
MetaWindow *focus_window;
MetaWindow *focus_window = NULL;
MetaFocusInfo *focus_info;
MetaRectangle overlap;
MetaDevice *pointer, *keyboard;
focus_window = window->display->focus_window;
pointer = meta_window_guess_grab_pointer (window);
keyboard = meta_device_get_paired_device (pointer);
focus_info = meta_display_get_focus_info (window->display, keyboard);
if (focus_window)
focus_window = focus_info->focus_window;
if (window->denied_focus_and_not_transient &&
window->wm_state_modal && /* FIXME: Maybe do this for all transients? */
@@ -660,6 +668,7 @@ meta_window_place (MetaWindow *window,
{
GList *windows;
const MetaMonitorInfo *xi;
MetaDevice *pointer, *keyboard;
/* frame member variables should NEVER be used in here, only
* MetaFrameGeometry. But remember fgeom == NULL
@@ -671,7 +680,9 @@ meta_window_place (MetaWindow *window,
meta_topic (META_DEBUG_PLACEMENT, "Placing window %s\n", window->desc);
windows = NULL;
pointer = meta_window_guess_grab_pointer (window);
keyboard = meta_device_get_paired_device (pointer);
switch (window->type)
{
/* Run placement algorithm on these. */
@@ -815,7 +826,7 @@ meta_window_place (MetaWindow *window,
int w, h;
/* Warning, this function is a round trip! */
xi = meta_screen_get_current_monitor (window->screen);
xi = meta_screen_get_current_monitor (window->screen, pointer);
w = xi->rect.width;
h = xi->rect.height;
@@ -860,8 +871,8 @@ meta_window_place (MetaWindow *window,
}
/* Warning, this is a round trip! */
xi = meta_screen_get_current_monitor (window->screen);
xi = meta_screen_get_current_monitor (window->screen, pointer);
/* "Origin" placement algorithm */
x = xi->rect.x;
y = xi->rect.y;
@@ -899,8 +910,8 @@ meta_window_place (MetaWindow *window,
/* If no placement has been done, revert to cascade to avoid
* fully overlapping window (e.g. starting multiple terminals)
* */
if (x == xi->rect.x && y == xi->rect.y)
find_next_cascade (window, fgeom, windows, x, y, &x, &y);
if (x == xi->rect.x && y == xi->rect.y)
find_next_cascade (window, pointer, fgeom, windows, x, y, &x, &y);
done_check_denied_focus:
/* If the window is being denied focus and isn't a transient of the
@@ -913,8 +924,12 @@ meta_window_place (MetaWindow *window,
gboolean found_fit;
MetaWindow *focus_window;
MetaRectangle overlap;
MetaFocusInfo *focus_info;
focus_window = window->display->focus_window;
focus_info = meta_display_get_focus_info (window->display, keyboard);
g_assert (focus_info != NULL);
focus_window = focus_info->focus_window;
g_assert (focus_window != NULL);
/* No need to do anything if the window doesn't overlap at all */

View File

@@ -90,7 +90,8 @@ struct _MetaScreen
MetaStack *stack;
MetaStackTracker *stack_tracker;
MetaCursor current_cursor;
/* per-pointer cursors */
GHashTable *cursors;
Window flash_window;
@@ -158,8 +159,10 @@ void meta_screen_queue_frame_redraws (MetaScreen *scree
void meta_screen_queue_window_resizes (MetaScreen *screen);
void meta_screen_set_cursor (MetaScreen *screen,
MetaDevice *pointer,
MetaCursor cursor);
void meta_screen_update_cursor (MetaScreen *screen);
void meta_screen_update_cursor (MetaScreen *screen,
MetaDevice *pointer);
void meta_screen_tab_popup_create (MetaScreen *screen,
MetaTabList list_type,
@@ -182,9 +185,11 @@ void meta_screen_tile_preview_update (MetaScreen *screen,
void meta_screen_tile_preview_hide (MetaScreen *screen);
MetaWindow* meta_screen_get_mouse_window (MetaScreen *screen,
MetaDevice *pointer,
MetaWindow *not_this_one);
const MetaMonitorInfo* meta_screen_get_current_monitor (MetaScreen *screen);
const MetaMonitorInfo* meta_screen_get_current_monitor (MetaScreen *screen,
MetaDevice *pointer);
const MetaMonitorInfo* meta_screen_get_monitor_for_rect (MetaScreen *screen,
MetaRectangle *rect);
const MetaMonitorInfo* meta_screen_get_monitor_for_window (MetaScreen *screen,

View File

@@ -28,6 +28,7 @@
#include <config.h>
#include "screen-private.h"
#include <meta/main.h>
#include <meta/util.h>
#include <meta/errors.h>
#include "window-private.h"
@@ -36,10 +37,12 @@
#include "workspace-private.h"
#include "keybindings-private.h"
#include "stack.h"
#include "core.h"
#include "xprops.h"
#include <meta/compositor.h>
#include "mutter-marshal.h"
#include "mutter-enum-types.h"
#include "device-pointer.h"
#ifdef HAVE_SOLARIS_XINERAMA
#include <X11/extensions/xinerama.h>
@@ -348,6 +351,43 @@ set_wm_icon_size_hint (MetaScreen *screen)
#undef N_VALS
}
/* The list of monitors reported by the windowing system might include
* mirrored monitors with identical bounds. Since mirrored monitors
* shouldn't be treated as separate monitors for most purposes, we
* filter them out here. (We ignore the possibility of partially
* overlapping monitors because they are rare and it's hard to come
* up with any sensible interpretation.)
*/
static void
filter_mirrored_monitors (MetaScreen *screen)
{
int i, j;
/* Currently always true and simplifies things */
g_assert (screen->primary_monitor_index == 0);
for (i = 1; i < screen->n_monitor_infos; i++)
{
/* In case we've filtered previous monitors */
screen->monitor_infos[i].number = i;
for (j = 0; j < i; j++)
{
if (meta_rectangle_equal (&screen->monitor_infos[i].rect,
&screen->monitor_infos[j].rect))
{
memmove (&screen->monitor_infos[i],
&screen->monitor_infos[i + 1],
(screen->n_monitor_infos - i - 1) * sizeof (MetaMonitorInfo));
screen->n_monitor_infos--;
i--;
continue;
}
}
}
}
static void
reload_monitor_infos (MetaScreen *screen)
{
@@ -537,6 +577,8 @@ reload_monitor_infos (MetaScreen *screen)
screen->monitor_infos[0].rect = screen->rect;
}
filter_mirrored_monitors (screen);
g_assert (screen->n_monitor_infos > 0);
g_assert (screen->monitor_infos != NULL);
}
@@ -592,7 +634,6 @@ meta_screen_new (MetaDisplay *display,
MetaScreen *screen;
Window xroot;
Display *xdisplay;
XWindowAttributes attr;
Window new_wm_sn_owner;
Window current_wm_sn_owner;
gboolean replace_current_wm;
@@ -707,15 +748,15 @@ meta_screen_new (MetaDisplay *display,
/* We need to or with the existing event mask since
* gtk+ may be interested in other events.
*/
XGetWindowAttributes (xdisplay, xroot, &attr);
XSelectInput (xdisplay,
xroot,
SubstructureRedirectMask | SubstructureNotifyMask |
ColormapChangeMask | PropertyChangeMask |
LeaveWindowMask | EnterWindowMask |
KeyPressMask | KeyReleaseMask |
FocusChangeMask | StructureNotifyMask |
ExposureMask | attr.your_event_mask);
meta_core_select_events (xdisplay, xroot,
(SubstructureRedirectMask | SubstructureNotifyMask |
ColormapChangeMask | PropertyChangeMask |
LeaveWindowMask | EnterWindowMask |
KeyPressMask | KeyReleaseMask |
FocusChangeMask | StructureNotifyMask |
ExposureMask),
TRUE);
if (meta_error_trap_pop_with_return (display) != Success)
{
meta_warning (_("Screen %d on display \"%s\" already has a window manager\n"),
@@ -737,10 +778,10 @@ meta_screen_new (MetaDisplay *display,
screen->rect.x = screen->rect.y = 0;
screen->rect.width = WidthOfScreen (screen->xscreen);
screen->rect.height = HeightOfScreen (screen->xscreen);
screen->current_cursor = -1; /* invalid/unset */
screen->default_xvisual = DefaultVisualOfScreen (screen->xscreen);
screen->default_depth = DefaultDepthOfScreen (screen->xscreen);
screen->flash_window = None;
screen->cursors = g_hash_table_new (NULL, NULL);
screen->wm_sn_selection_window = new_wm_sn_owner;
screen->wm_sn_atom = wm_sn_atom;
@@ -765,8 +806,6 @@ meta_screen_new (MetaDisplay *display,
screen->last_monitor_index = 0;
reload_monitor_infos (screen);
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
/* Handle creating a no_focus_window for this screen */
screen->no_focus_window =
@@ -901,7 +940,10 @@ meta_screen_free (MetaScreen *screen,
meta_stack_tracker_free (screen->stack_tracker);
meta_error_trap_push_with_return (screen->display);
XSelectInput (screen->display->xdisplay, screen->xroot, 0);
meta_core_select_events (screen->display->xdisplay,
screen->xroot, NoEventMask,
FALSE);
if (meta_error_trap_pop_with_return (screen->display) != Success)
meta_warning (_("Could not release screen %d on display \"%s\"\n"),
screen->number, screen->display->name);
@@ -925,6 +967,8 @@ meta_screen_free (MetaScreen *screen,
g_free (screen->screen_name);
g_hash_table_destroy (screen->cursors);
g_object_unref (screen);
XFlush (display->xdisplay);
@@ -1538,31 +1582,33 @@ update_focus_mode (MetaScreen *screen)
void
meta_screen_set_cursor (MetaScreen *screen,
MetaDevice *pointer,
MetaCursor cursor)
{
Cursor xcursor;
MetaCursor old_cursor;
if (cursor == screen->current_cursor)
old_cursor = GPOINTER_TO_UINT (g_hash_table_lookup (screen->cursors, pointer));
if (cursor == old_cursor)
return;
screen->current_cursor = cursor;
xcursor = meta_display_create_x_cursor (screen->display, cursor);
XDefineCursor (screen->display->xdisplay, screen->xroot, xcursor);
XFlush (screen->display->xdisplay);
XFreeCursor (screen->display->xdisplay, xcursor);
g_hash_table_insert (screen->cursors, pointer,
GUINT_TO_POINTER (cursor));
meta_screen_update_cursor (screen, pointer);
}
void
meta_screen_update_cursor (MetaScreen *screen)
meta_screen_update_cursor (MetaScreen *screen,
MetaDevice *pointer)
{
Cursor xcursor;
MetaCursor cursor;
xcursor = meta_display_create_x_cursor (screen->display,
screen->current_cursor);
XDefineCursor (screen->display->xdisplay, screen->xroot, xcursor);
cursor = GPOINTER_TO_UINT (g_hash_table_lookup (screen->cursors, pointer));
meta_device_pointer_set_window_cursor (META_DEVICE_POINTER (pointer),
screen->xroot,
cursor);
XFlush (screen->display->xdisplay);
XFreeCursor (screen->display->xdisplay, xcursor);
}
void
@@ -1816,9 +1862,21 @@ static gboolean
meta_screen_tile_preview_update_timeout (gpointer data)
{
MetaScreen *screen = data;
MetaWindow *window = screen->display->grab_window;
MetaWindow *window = NULL;
gboolean composited = screen->display->compositor != NULL;
gboolean needs_preview = FALSE;
MetaGrabInfo *grab_info;
MetaDevice *pointer = NULL;
GHashTableIter iter;
/* FIXME: we're just handling the first grab we find */
g_hash_table_iter_init (&iter, screen->display->current_grabs);
if (g_hash_table_iter_next (&iter, NULL, (gpointer *) &grab_info))
{
window = grab_info->grab_window;
pointer = grab_info->grab_pointer;
}
screen->tile_preview_timeout_id = 0;
@@ -1861,8 +1919,8 @@ meta_screen_tile_preview_update_timeout (gpointer data)
{
MetaRectangle tile_rect;
meta_window_get_current_tile_area (window, &tile_rect);
meta_tile_preview_show (screen->tile_preview, &tile_rect);
meta_window_get_current_tile_area (window, pointer, &tile_rect);
meta_tile_preview_show (screen->tile_preview, pointer, &tile_rect);
}
else
meta_tile_preview_hide (screen->tile_preview);
@@ -1907,28 +1965,23 @@ meta_screen_tile_preview_hide (MetaScreen *screen)
MetaWindow*
meta_screen_get_mouse_window (MetaScreen *screen,
MetaDevice *pointer,
MetaWindow *not_this_one)
{
MetaWindow *window;
Window root_return, child_return;
int root_x_return, root_y_return;
int win_x_return, win_y_return;
unsigned int mask_return;
if (not_this_one)
meta_topic (META_DEBUG_FOCUS,
"Focusing mouse window excluding %s\n", not_this_one->desc);
meta_error_trap_push (screen->display);
XQueryPointer (screen->display->xdisplay,
screen->xroot,
&root_return,
&child_return,
&root_x_return,
&root_y_return,
&win_x_return,
&win_y_return,
&mask_return);
meta_device_pointer_query_position (META_DEVICE_POINTER (pointer),
screen->xroot,
NULL, NULL,
&root_x_return,
&root_y_return,
NULL, NULL, NULL);
meta_error_trap_pop (screen->display);
window = meta_stack_get_default_focus_window_at_point (screen->stack,
@@ -2024,6 +2077,7 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
const MetaMonitorInfo* current;
const MetaMonitorInfo* tmp;
GQueue* monitor_queue;
MetaDevice *pointer;
int* visited;
int cur = 0;
int i;
@@ -2031,6 +2085,9 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
*n_monitors = screen->n_monitor_infos;
*monitors_list = g_new (int, screen->n_monitor_infos);
pointer = meta_device_map_lookup (screen->display->device_map,
META_CORE_POINTER_ID);
/* we calculate a natural ordering by which to choose monitors for
* window placement. We start at the current monitor, and perform
* a breadth-first search of the monitors starting from that
@@ -2045,7 +2102,7 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
visited[i] = FALSE;
}
current = meta_screen_get_current_monitor (screen);
current = meta_screen_get_current_monitor (screen, pointer);
monitor_queue = g_queue_new ();
g_queue_push_tail (monitor_queue, (gpointer) current);
visited[current->number] = TRUE;
@@ -2112,7 +2169,8 @@ meta_screen_get_natural_monitor_list (MetaScreen *screen,
}
const MetaMonitorInfo*
meta_screen_get_current_monitor (MetaScreen *screen)
meta_screen_get_current_monitor (MetaScreen *screen,
MetaDevice *pointer)
{
if (screen->n_monitor_infos == 1)
return &screen->monitor_infos[0];
@@ -2122,24 +2180,18 @@ meta_screen_get_current_monitor (MetaScreen *screen)
if (screen->display->monitor_cache_invalidated)
{
Window root_return, child_return;
int win_x_return, win_y_return;
unsigned int mask_return;
int i;
MetaRectangle pointer_position;
screen->display->monitor_cache_invalidated = FALSE;
pointer_position.width = pointer_position.height = 1;
XQueryPointer (screen->display->xdisplay,
screen->xroot,
&root_return,
&child_return,
&pointer_position.x,
&pointer_position.y,
&win_x_return,
&win_y_return,
&mask_return);
meta_device_pointer_query_position (META_DEVICE_POINTER (pointer),
screen->xroot,
NULL, NULL,
&pointer_position.x,
&pointer_position.y,
NULL, NULL, NULL);
screen->last_monitor_index = 0;
for (i = 0; i < screen->n_monitor_infos; i++)
@@ -3006,17 +3058,22 @@ static gboolean startup_sequence_timeout (void *data);
static void
update_startup_feedback (MetaScreen *screen)
{
MetaDevice *pointer;
pointer = meta_device_map_lookup (screen->display->device_map,
META_CORE_POINTER_ID);
if (screen->startup_sequences != NULL)
{
meta_topic (META_DEBUG_STARTUP,
"Setting busy cursor\n");
meta_screen_set_cursor (screen, META_CURSOR_BUSY);
meta_screen_set_cursor (screen, pointer, META_CURSOR_BUSY);
}
else
{
meta_topic (META_DEBUG_STARTUP,
"Setting default cursor\n");
meta_screen_set_cursor (screen, META_CURSOR_DEFAULT);
meta_screen_set_cursor (screen, pointer, META_CURSOR_DEFAULT);
}
}

View File

@@ -308,13 +308,16 @@ meta_session_init (const char *previous_client_id,
*/
char hint = SmRestartIfRunning;
char priority = 20; /* low to run before other apps */
const char *prgname;
prgname = g_get_prgname ();
prop1.name = SmProgram;
prop1.type = SmARRAY8;
prop1.num_vals = 1;
prop1.vals = &prop1val;
prop1val.value = "mutter";
prop1val.length = strlen ("mutter");
prop1val.value = (char *)prgname;
prop1val.length = strlen (prgname);
/* twm sets getuid() for this, but the SM spec plainly
* says pw_name, twm is on crack
@@ -573,6 +576,9 @@ set_clone_restart_commands (void)
char *discardv[10];
int i;
SmProp prop1, prop2, prop3, *props[3];
const char *prgname;
prgname = g_get_prgname ();
/* Restart (use same client ID) */
@@ -582,7 +588,7 @@ set_clone_restart_commands (void)
g_return_if_fail (client_id);
i = 0;
restartv[i] = "mutter";
restartv[i] = (char *)prgname;
++i;
restartv[i] = "--sm-client-id";
++i;
@@ -603,7 +609,7 @@ set_clone_restart_commands (void)
/* Clone (no client ID) */
i = 0;
clonev[i] = "mutter";
clonev[i] = (char *)prgname;
++i;
clonev[i] = NULL;

View File

@@ -211,13 +211,23 @@ meta_stack_thaw (MetaStack *stack)
stack_sync_to_server (stack);
}
typedef struct _FocusedForeachData FocusedForeachData;
struct _FocusedForeachData
{
MetaWindow *window;
gboolean focused_transient;
};
static gboolean
is_focused_foreach (MetaWindow *window,
void *data)
{
if (window == window->display->expected_focus_window)
FocusedForeachData *focused_data = data;
if (window == focused_data->window)
{
*((gboolean*) data) = TRUE;
focused_data->focused_transient = TRUE;
return FALSE;
}
return TRUE;
@@ -240,6 +250,9 @@ get_standalone_layer (MetaWindow *window)
{
MetaStackLayer layer;
gboolean focused_transient = FALSE;
MetaFocusInfo *focus_info;
MetaDevice *keyboard;
FocusedForeachData focused_data = { 0 };
switch (window->type)
{
@@ -263,20 +276,30 @@ get_standalone_layer (MetaWindow *window)
case META_WINDOW_OVERRIDE_OTHER:
layer = META_LAYER_OVERRIDE_REDIRECT;
break;
default:
default:
/* FIXME: How about other keyboards? should
* we allow fullscreen for non-VCP/K anyway?
*/
keyboard = meta_device_map_lookup (window->display->device_map,
META_CORE_KEYBOARD_ID);
focus_info = meta_display_get_focus_info (window->display, keyboard);
focused_data.window = focus_info->expected_focus_window;
meta_window_foreach_transient (window,
is_focused_foreach,
&focused_transient);
&focused_data);
if (window->wm_state_below)
layer = META_LAYER_BOTTOM;
else if (window->fullscreen &&
(focused_transient ||
window == window->display->expected_focus_window ||
window->display->expected_focus_window == NULL ||
(window->display->expected_focus_window != NULL &&
!focus_info ||
window == focus_info->expected_focus_window ||
focus_info->expected_focus_window == NULL ||
(focus_info->expected_focus_window != NULL &&
windows_on_different_monitor (window,
window->display->expected_focus_window))))
focus_info->expected_focus_window))))
layer = META_LAYER_FULLSCREEN;
else if (window->wm_state_above)
layer = META_LAYER_TOP;

View File

@@ -81,6 +81,7 @@ meta_print_backtrace (void)
static gint verbose_topics = 0;
static gboolean is_debugging = FALSE;
static gboolean replace_current = FALSE;
static gboolean use_core_devices = FALSE;
static int no_prefix = 0;
#ifdef WITH_VERBOSE_MODE
@@ -209,6 +210,18 @@ meta_set_debugging (gboolean setting)
is_debugging = setting;
}
gboolean
meta_get_use_core_devices (void)
{
return use_core_devices;
}
void
meta_set_use_core_devices (gboolean setting)
{
use_core_devices = setting;
}
gboolean
meta_get_replace_current_wm (void)
{
@@ -584,6 +597,25 @@ meta_gravity_to_string (int gravity)
}
}
/* Command line arguments are passed in the locale encoding; in almost
* all cases, we'd hope that is UTF-8 and no conversion is necessary.
* If it's not UTF-8, then it's possible that the message isn't
* representable in the locale encoding.
*/
static void
append_argument (GPtrArray *args,
const char *arg)
{
char *locale_arg = g_locale_from_utf8 (arg, -1, NULL, NULL, NULL);
/* This is cheesy, but it's better to have a few ???'s in the dialog
* for an unresponsive application than no dialog at all appear */
if (!locale_arg)
locale_arg = g_strdup ("???");
g_ptr_array_add (args, locale_arg);
}
GPid
meta_show_dialog (const char *type,
const char *message,
@@ -597,59 +629,57 @@ meta_show_dialog (const char *type,
{
GError *error = NULL;
GSList *tmp;
int i=0;
GPid child_pid;
const char **argvl = g_malloc(sizeof (char*) *
(17 +
g_slist_length (columns)*2 +
g_slist_length (entries)));
GPtrArray *args;
argvl[i++] = "zenity";
argvl[i++] = type;
argvl[i++] = "--display";
argvl[i++] = display;
argvl[i++] = "--class";
argvl[i++] = "mutter-dialog";
argvl[i++] = "--title";
args = g_ptr_array_new ();
append_argument (args, "zenity");
append_argument (args, type);
append_argument (args, "--display");
append_argument (args, display);
append_argument (args, "--class");
append_argument (args, "mutter-dialog");
append_argument (args, "--title");
/* Translators: This is the title used on dialog boxes */
argvl[i++] = _("Mutter");
argvl[i++] = "--text";
argvl[i++] = message;
append_argument (args, _("Mutter"));
append_argument (args, "--text");
append_argument (args, message);
if (timeout)
{
argvl[i++] = "--timeout";
argvl[i++] = timeout;
append_argument (args, "--timeout");
append_argument (args, timeout);
}
if (ok_text)
{
argvl[i++] = "--ok-label";
argvl[i++] = ok_text;
append_argument (args, "--ok-label");
append_argument (args, ok_text);
}
if (cancel_text)
{
argvl[i++] = "--cancel-label";
argvl[i++] = cancel_text;
append_argument (args, "--cancel-label");
append_argument (args, cancel_text);
}
tmp = columns;
while (tmp)
{
argvl[i++] = "--column";
argvl[i++] = tmp->data;
append_argument (args, "--column");
append_argument (args, tmp->data);
tmp = tmp->next;
}
tmp = entries;
while (tmp)
{
argvl[i++] = tmp->data;
append_argument (args, tmp->data);
tmp = tmp->next;
}
argvl[i] = NULL;
g_ptr_array_add (args, NULL); /* NULL-terminate */
if (transient_for)
{
@@ -660,7 +690,7 @@ meta_show_dialog (const char *type,
g_spawn_async (
"/",
(gchar**) argvl, /* ugh */
(gchar**) args->pdata,
NULL,
G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
NULL, NULL,
@@ -671,7 +701,7 @@ meta_show_dialog (const char *type,
if (transient_for)
unsetenv ("WINDOWID");
g_free (argvl);
g_ptr_array_free (args, TRUE);
if (error)
{

View File

@@ -42,6 +42,7 @@
#include "stack.h"
#include "iconcache.h"
#include <X11/Xutil.h>
#include <cairo.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
typedef struct _MetaWindowQueue MetaWindowQueue;
@@ -98,6 +99,7 @@ struct _MetaWindow
char *wm_client_machine;
char *startup_id;
char *mutter_hints;
char *gtk_theme_variant;
int net_wm_pid;
@@ -105,6 +107,10 @@ struct _MetaWindow
Window xgroup_leader;
Window xclient_leader;
/* window menu if any, and the pointer that popped it up */
MetaWindowMenu *menu;
MetaDevice *menu_device;
/* Initial workspace property */
int initial_workspace;
@@ -253,11 +259,9 @@ struct _MetaWindow
/* EWHH demands attention flag */
guint wm_state_demands_attention : 1;
/* this flag tracks receipt of focus_in focus_out and
* determines whether we draw the focus
*/
/* this flag tracks receipt of focus_in focus_out */
guint has_focus : 1;
/* Have we placed this window? */
guint placed : 1;
@@ -318,6 +322,15 @@ struct _MetaWindow
/* if TRUE, application is buggy and SYNC resizing is turned off */
guint disable_sync : 1;
/* if TRUE, window didn't yet get the FocusIn for window->focus_keyboard */
guint expecting_focus_in : 1;
/* Keyboard currently owning the window focus, or NULL */
MetaDevice *focus_keyboard;
/* if non-NULL, the bounds of the window frame */
cairo_region_t *frame_bounds;
/* Note: can be NULL */
GSList *struts;
@@ -389,6 +402,15 @@ struct _MetaWindow
MetaGroup *group;
GObject *compositor_private;
/* Focused window that is (directly or indirectly) attached to this one */
MetaWindow *attached_focus_window;
/* Current grab op for this window, or NULL */
MetaGrabInfo *cur_grab;
/* Focus info if the window is focused, or NULL */
MetaFocusInfo *cur_focus;
};
struct _MetaWindowClass
@@ -558,6 +580,7 @@ void meta_window_set_current_workspace_hint (MetaWindow *window);
unsigned long meta_window_get_net_wm_desktop (MetaWindow *window);
void meta_window_show_menu (MetaWindow *window,
MetaDevice *device,
int root_x,
int root_y,
int button,
@@ -586,6 +609,7 @@ void meta_window_get_work_area_all_monitors (MetaWindow *window,
MetaRectangle *area);
void meta_window_get_current_tile_area (MetaWindow *window,
MetaDevice *device,
MetaRectangle *tile_area);
@@ -607,13 +631,16 @@ void meta_window_free_delete_dialog (MetaWindow *window);
void meta_window_begin_grab_op (MetaWindow *window,
MetaDevice *device,
MetaGrabOp op,
gboolean frame_action,
guint32 timestamp);
void meta_window_update_keyboard_resize (MetaWindow *window,
MetaDevice *device,
gboolean update_cursor);
void meta_window_update_keyboard_move (MetaWindow *window);
void meta_window_update_keyboard_move (MetaWindow *window,
MetaDevice *device);
void meta_window_update_layer (MetaWindow *window);
@@ -634,4 +661,14 @@ void meta_window_update_net_wm_type (MetaWindow *window);
void meta_window_update_monitor (MetaWindow *window);
void meta_window_update_on_all_workspaces (MetaWindow *window);
void meta_window_propagate_focus_appearance (MetaWindow *window,
MetaDevice *keyboard,
gboolean focused);
void meta_window_set_client_pointer (MetaWindow *window,
MetaDevice *pointer);
MetaDevice * meta_window_get_client_pointer (MetaWindow *window);
MetaDevice * meta_window_guess_grab_pointer (MetaWindow *window);
#endif

View File

@@ -845,6 +845,8 @@ reload_wm_class (MetaWindow *window,
if (value->v.class_hint.res_class)
window->res_class = g_strdup (value->v.class_hint.res_class);
g_object_notify (G_OBJECT (window), "wm-class");
}
meta_verbose ("Window %s class: '%s' name: '%s'\n",
@@ -1466,20 +1468,46 @@ reload_transient_for (MetaWindow *window,
MetaPropValue *value,
gboolean initial)
{
MetaWindow *parent = NULL;
if (meta_window_appears_focused (window) && window->xtransient_for != None)
meta_window_propagate_focus_appearance (window,
window->focus_keyboard,
FALSE);
window->xtransient_for = None;
if (value->type != META_PROP_VALUE_INVALID)
window->xtransient_for = value->v.xwindow;
/* Make sure transient_for is valid */
if (window->xtransient_for != None &&
meta_display_lookup_x_window (window->display,
window->xtransient_for) == NULL)
if (window->xtransient_for != None)
{
meta_warning (_("Invalid WM_TRANSIENT_FOR window 0x%lx specified "
"for %s.\n"),
window->xtransient_for, window->desc);
window->xtransient_for = None;
parent = meta_display_lookup_x_window (window->display,
window->xtransient_for);
if (!parent)
{
meta_warning (_("Invalid WM_TRANSIENT_FOR window 0x%lx specified "
"for %s.\n"),
window->xtransient_for, window->desc);
window->xtransient_for = None;
}
}
/* Make sure there is not a loop */
while (parent)
{
if (parent == window)
{
meta_warning (_("WM_TRANSIENT_FOR window 0x%lx for %s "
"would create loop.\n"),
window->xtransient_for, window->desc);
window->xtransient_for = None;
break;
}
parent = meta_display_lookup_x_window (parent->display,
parent->xtransient_for);
}
window->transient_parent_is_root_window =
@@ -1509,6 +1537,40 @@ reload_transient_for (MetaWindow *window,
if (!window->constructing && !window->override_redirect)
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
if (meta_window_appears_focused (window) && window->xtransient_for != None)
meta_window_propagate_focus_appearance (window,
window->focus_keyboard,
TRUE);
}
static void
reload_gtk_theme_variant (MetaWindow *window,
MetaPropValue *value,
gboolean initial)
{
char *requested_variant = NULL;
char *current_variant = window->gtk_theme_variant;
if (value->type != META_PROP_VALUE_INVALID)
{
requested_variant = value->v.str;
meta_verbose ("Requested \"%s\" theme variant for window %s.\n",
requested_variant, window->desc);
}
if (g_strcmp0 (requested_variant, current_variant))
{
g_free (current_variant);
if (requested_variant)
window->gtk_theme_variant = g_strdup (requested_variant);
else
window->gtk_theme_variant = NULL;
if (window->frame)
meta_ui_update_frame_style (window->screen->ui, window->frame->xwindow);
}
}
/**
@@ -1563,6 +1625,7 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
{ display->atom__NET_WM_STATE, META_PROP_VALUE_ATOM_LIST, reload_net_wm_state, TRUE, FALSE },
{ display->atom__MOTIF_WM_HINTS, META_PROP_VALUE_MOTIF_HINTS, reload_mwm_hints, TRUE, FALSE },
{ XA_WM_TRANSIENT_FOR, META_PROP_VALUE_WINDOW, reload_transient_for, TRUE, FALSE },
{ display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8, reload_gtk_theme_variant, TRUE, FALSE },
{ display->atom__NET_WM_USER_TIME_WINDOW, META_PROP_VALUE_WINDOW, reload_net_wm_user_time_window, TRUE, FALSE },
{ display->atom_WM_STATE, META_PROP_VALUE_INVALID, NULL, FALSE, FALSE },
{ display->atom__NET_WM_ICON, META_PROP_VALUE_INVALID, reload_net_wm_icon, FALSE, FALSE },

File diff suppressed because it is too large Load Diff

View File

@@ -85,6 +85,7 @@ GList* meta_workspace_get_onmonitor_region (MetaWorkspace *workspace,
int which_monitor);
void meta_workspace_focus_default_window (MetaWorkspace *workspace,
MetaDevice *pointer,
MetaWindow *not_this_one,
guint32 timestamp);

View File

@@ -538,7 +538,9 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
MetaWorkspaceLayout layout1, layout2;
gint num_workspaces, current_space, new_space;
MetaMotionDirection direction;
MetaGrabInfo *grab_info;
GHashTableIter iter;
meta_verbose ("Activating workspace %d\n",
meta_workspace_index (workspace));
@@ -547,7 +549,7 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
/* Free any cached pointers to the workspaces's edges from
* a current resize or move operation */
meta_display_cleanup_edges (workspace->screen->display);
meta_display_cleanup_edges (workspace->screen->display, workspace->screen);
if (workspace->screen->active_workspace)
workspace_switch_sound (workspace->screen->active_workspace, workspace);
@@ -570,10 +572,22 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
return;
move_window = NULL;
if (workspace->screen->display->grab_op == META_GRAB_OP_MOVING ||
workspace->screen->display->grab_op == META_GRAB_OP_KEYBOARD_MOVING)
move_window = workspace->screen->display->grab_window;
/* FIXME: not quite multidevice friendly, but the whole
* "move window to another workspace" isn't.
*/
g_hash_table_iter_init (&iter, workspace->screen->display->current_grabs);
while (g_hash_table_iter_next (&iter, NULL, (gpointer *) &grab_info))
{
if (grab_info->grab_op == META_GRAB_OP_MOVING ||
grab_info->grab_op == META_GRAB_OP_KEYBOARD_MOVING)
{
move_window = grab_info->grab_window;
break;
}
}
if (move_window != NULL)
{
if (move_window->on_all_workspaces)
@@ -673,8 +687,13 @@ meta_workspace_activate_with_focus (MetaWorkspace *workspace,
}
else
{
MetaDevice *pointer;
pointer = meta_device_map_lookup (screen->display->device_map,
META_CORE_POINTER_ID);
meta_topic (META_DEBUG_FOCUS, "Focusing default window on new workspace\n");
meta_workspace_focus_default_window (workspace, NULL, timestamp);
meta_workspace_focus_default_window (workspace, pointer,
NULL, timestamp);
}
/* Emit switched signal from screen.c */
@@ -774,7 +793,7 @@ meta_workspace_invalidate_work_area (MetaWorkspace *workspace)
/* If we are in the middle of a resize or move operation, we
* might have cached pointers to the workspace's edges */
if (workspace == workspace->screen->active_workspace)
meta_display_cleanup_edges (workspace->screen->display);
meta_display_cleanup_edges (workspace->screen->display, workspace->screen);
g_free (workspace->work_area_monitor);
workspace->work_area_monitor = NULL;
@@ -1191,6 +1210,7 @@ meta_workspace_get_name (MetaWorkspace *workspace)
void
meta_workspace_focus_default_window (MetaWorkspace *workspace,
MetaDevice *pointer,
MetaWindow *not_this_one,
guint32 timestamp)
{
@@ -1207,7 +1227,8 @@ meta_workspace_focus_default_window (MetaWorkspace *workspace,
else
{
MetaWindow * window;
window = meta_screen_get_mouse_window (workspace->screen, not_this_one);
window = meta_screen_get_mouse_window (workspace->screen,
pointer, not_this_one);
if (window &&
window->type != META_WINDOW_DOCK &&
window->type != META_WINDOW_DESKTOP)

View File

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

46
src/meta/device-map.h Normal file
View File

@@ -0,0 +1,46 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICE_MAP_H
#define META_DEVICE_MAP_H
#include <glib-object.h>
#include <meta/types.h>
#include <meta/device.h>
#define META_TYPE_DEVICE_MAP (meta_device_map_get_type ())
#define META_DEVICE_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE_MAP, MetaDeviceMap))
#define META_DEVICE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE_MAP, MetaDeviceMapClass))
#define META_IS_DEVICE_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE_MAP))
#define META_IS_DEVICE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE_MAP))
#define META_DEVICE_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE_MAP, MetaDeviceMapClass))
typedef struct _MetaDeviceMapClass MetaDeviceMapClass;
GType meta_device_map_get_type (void) G_GNUC_CONST;
MetaDevice * meta_device_map_lookup (MetaDeviceMap *device_map,
gint device_id);
MetaDisplay * meta_device_map_get_display (MetaDeviceMap *device_map);
GList * meta_device_map_list_devices (MetaDeviceMap *device_map);
#endif

44
src/meta/device.h Normal file
View File

@@ -0,0 +1,44 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2011 Carlos Garnacho
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_DEVICE_H
#define META_DEVICE_H
#include <glib-object.h>
#include <meta/types.h>
#define META_TYPE_DEVICE (meta_device_get_type ())
#define META_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEVICE, MetaDevice))
#define META_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_DEVICE, MetaDeviceClass))
#define META_IS_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_DEVICE))
#define META_IS_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), META_TYPE_DEVICE))
#define META_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), META_TYPE_DEVICE, MetaDeviceClass))
typedef struct _MetaDeviceClass MetaDeviceClass;
GType meta_device_get_type (void) G_GNUC_CONST;
int meta_device_get_id (MetaDevice *device);
MetaDisplay *meta_device_get_display (MetaDevice *device);
MetaDevice * meta_device_get_paired_device (MetaDevice *device);
#endif

Some files were not shown because too many files have changed in this diff Show More