Compare commits

..

321 Commits

Author SHA1 Message Date
46a56bafbd Bump version to 3.4.0
Update NEWS
2012-03-26 14:23:20 -04:00
c8b4939c7e Fix uninstalling default.so
We need a clean uninstall for 'make distcheck' to pass; libtool
hijinks leave a left-over plugins/default.so - remove it manually.
2012-03-26 14:23:19 -04:00
fc3e82421a Updated Korean translation 2012-03-27 01:26:09 +09:00
23046f6e28 stack: Fix crash when opening a full-screen window
When mutter recognizes a full-screen window, it tries to raise it to the top
of the stack. Unfortunately, a recent rewrite of the stack code didn't do
well with raising a window to the top of the stack if the stack wasn't in
a consistent state -- it would crash. Ensure that the stack is in a consistent
state at the top of meta_stack_raise/meta_stack_lower.

https://bugzilla.redhat.com/show_bug.cgi?id=806437

https://bugzilla.gnome.org/show_bug.cgi?id=672797
2012-03-26 08:15:21 -03:00
823208120d Updated Gujarati Translations 2012-03-26 14:08:50 +05:30
d12c507b12 Updated Czech translation 2012-03-26 02:24:42 +02:00
2157c238b6 Updated Czech translation 2012-03-25 22:11:19 +02:00
423bda908e meta_display_get_tab_list(): Fix leaked GSList
https://bugzilla.gnome.org/show_bug.cgi?id=672640
2012-03-24 19:30:00 +01:00
98d427ddba meta_stack_update_window_tile_matches(): Fix leaked GList
https://bugzilla.gnome.org/show_bug.cgi?id=672640
2012-03-24 19:19:17 +01:00
7a35579c3f Updated Hebrew translation. 2012-03-24 19:08:23 +02:00
adc89fbb2c Updated French translation 2012-03-24 12:51:37 +01:00
a6ca3f768f [l10n]Updated Turkish translation 2012-03-23 23:01:08 +02:00
9362fbdcde Updated Vietnamese translation 2012-03-22 10:45:51 +07:00
47099f4a87 po/vi: import from Damned Lies 2012-03-22 10:44:46 +07:00
2e6e5b068c Updated Russian translation 2012-03-21 22:26:24 +04:00
ee840bc832 Updated Brazilian Portuguese translation 2012-03-21 14:54:09 -03:00
6333c174dc Bump version to 3.3.92
Update NEWS
2012-03-20 17:10:09 -04:00
a3bf9b01aa workspace: Don't try to use per-workspace MRU lists as a hint for focusing
Commit 2fc880db switched from focusing the topmost window as the default
window to focusing the MRU window. This was done in alignment with the
introduction of per-workspace MRU lists to avoid problems where the window
stack was inadvertently changed when focusing windows during window switches.

Now that focusing windows don't have as big an impact on the stacking order,
we can revert back to focusing the top window, which is less confusing to the
user.

For now, leave per-workspace MRU lists, as they're a pretty good approximation
of a global MRU list, and it works well enough.

https://bugzilla.gnome.org/show_bug.cgi?id=620744
2012-03-20 17:08:34 -04:00
402b477458 stack: Make meta_window_raise() and meta_window_lower() smarter
https://bugzilla.gnome.org/show_bug.cgi?id=620744
2012-03-20 17:08:34 -04:00
6b273ca713 Update Simplified Chinese translation. 2012-03-20 17:11:08 +00:00
c3ec6b34a3 Updated Traditional Chinese translation(Hong Kong and Taiwan) 2012-03-19 23:55:13 +08:00
78dc480e86 screen: don't use unreffed pointer 2012-03-19 14:58:32 +00:00
53364f986c Updated Danish translation 2012-03-19 09:54:01 +01:00
5770b5b3c3 util: Quit early once we've found and removed a later
This prevents an invalid read and also improves performance slightly.

https://bugzilla.gnome.org/show_bug.cgi?id=672374
2012-03-19 02:00:03 -04:00
f16f47bd38 Revert "window: Stop a gcc warning"
This reverts commit 335d211204 trying
not to trigger the uninitialized variable warning in gcc.
2012-03-19 00:32:34 +01:00
58a57185b7 Uploaded Ukranian 2012-03-18 17:42:15 +02:00
8fb361cb26 Add META_TAB_LIST_NORMAL_ALL to MetaTabList enum
This is a new value, not associated with any keybindings, useful
when the WM needs to order the applications by last-interaction,
taking into account all windows.

https://bugzilla.gnome.org/show_bug.cgi?id=667552
2012-03-18 14:52:12 +01:00
335d211204 window: Stop a gcc warning
"warning: 'match_tile_mode' may be used uninitialized in this function", it
complains. It thinks it's not unused because of other values of
window->tile_mode, but other complex logic ensures that it can't be
META_TILE_MAXIMIZED, so this is a safe commit.
2012-03-17 16:59:09 -04:00
7f64d6b92e window: Disallow maximization for windows that can't be maximized
Windows that have minimum widths larger than the screen can't be maximized,
even though we put them in a maximized state and allow users to do so:
the window just won't change size and position. Fix this by simply not giving
the option to maximize, like what happens for non-resizable windows.

https://bugzilla.gnome.org/show_bug.cgi?id=643606
2012-03-17 06:40:55 -04:00
8c1b2d5eda Simplify the frame testing logic in callers to grab borders
A lot of code did something similar to:

  MetaFrameBorders borders;

  if (window->frame)
    meta_frame_calc_borders (window->frame, &borders);
  else
    meta_frame_borders_clear (&borders);

Sometimes, the else part was omitted and we were unknowingly using
uninitalized values for OR windows. Clean this up by just testing
for a NULL frame in meta_frame_calc_borders and clearing for the
caller if so.

https://bugzilla.gnome.org/show_bug.cgi?id=643606
2012-03-17 06:40:54 -04:00
578b1c06c7 window: Fix meta_window_get_workspaces when a window isn't on a workspace
Since we're going to be evaluating the work area at startup now, we need
to make sure that we don't iterate over workspaces before they're assigned.
The easiest way to do this is to make sure that meta_window_get_workspaces
doesn't crash.

https://bugzilla.gnome.org/show_bug.cgi?id=643606
2012-03-16 21:01:48 -04:00
6dfde43786 Updated Dutch translation 2012-03-16 23:20:55 +01:00
a8ead4d447 MetaWindowActor: don't draw shadows for tiled windows with a match
The shadow between 2 tiled windows ruins the visual tiles effect.

https://bugzilla.gnome.org/show_bug.cgi?id=643075
2012-03-16 19:12:10 +01:00
2926323a9a window: Introduce meta_window_get_tile_match()
Returns the matching tiled window. This is the topmost tiled window in a
complementary tile mode that is:

 - on the same monitor;
 - on the same workspace;
 - spanning the remaining monitor width;
 - there is no 3rd window stacked between both tiled windows that's
   partially visible in the common edge.

https://bugzilla.gnome.org/show_bug.cgi?id=643075
2012-03-16 19:12:05 +01:00
13bc8f7a76 Updated Hungarian translation 2012-03-16 16:43:47 +01:00
ad516492d2 Updated Telugu Translation 2012-03-16 17:01:52 +05:30
6677c61db3 [l10n]Updated Catalan (Valencian) translation 2012-03-15 23:18:25 +01:00
f26f61ed7d [l10n]Updated Catalan translation 2012-03-15 23:18:20 +01:00
8ca86fa8bf ui: Kill tooltips
After the changes in style handling in GTK+, mutter's tooltips no
longer match the tooltip style used in applications. Given that
all buttons in the default layout are well-known, killing tooltips
altogether rather than fixing the styling issues looks like a valid
approach.

https://bugzilla.gnome.org/show_bug.cgi?id=645101
2012-03-15 22:27:43 +01:00
f2f500836e Automaximize large windows on map
Windows that start up in a size that is almost as big as the workarea create
extra work for the user (resizing or maximizing) so save the user's time by
detecting such windows and automaximize them.

https://bugzilla.gnome.org/show_bug.cgi?id=671677
2012-03-15 22:03:00 +01:00
c39998efee Don't unmaximize to nearly maximized size
Basically we don't really want to create windows that are almost maximized in
size but not actually maximized. This creates work for the user and makes it
very difficult to use and resize manually.

So set the newly unmaximized window size to the previously used size or 80% of the
size of the current workarea (attempting to retain natural aspect ratio if
possible), whichever is smaller.

https://bugzilla.gnome.org/show_bug.cgi?id=671677
2012-03-15 22:02:54 +01:00
3b811f33c7 update Punjabi Translation 2012-03-15 07:19:43 +05:30
beea2f7acd Updated Galician translations 2012-03-14 23:09:25 +01:00
fb4c50478d Updated Portuguese translation 2012-03-14 01:05:10 +00:00
ac0602a02e Updated Latvian translation. 2012-03-14 00:41:14 +02:00
5361e0259f display: Add accessor function for ignored_modifier_mask
Some modifiers like NumLock and ScrollLock don't make sense in
keybindings, which is why we ignore them when matching keybindings
to events. We should do the same in Javascript, so add an accessor
function.

https://bugzilla.gnome.org/show_bug.cgi?id=665215
2012-03-13 20:33:27 +01:00
04bf73ff6d default plugin: animate minimization to icon geometry
Instead of minimizing windows in place, minimize them to the icon
geometry for the window (if set), or to the upper-left corner if
it's not set.

https://bugzilla.gnome.org/show_bug.cgi?id=667437
2012-03-13 13:53:05 -04:00
047b9de1c6 Fix move-to-corner keybindings
The move-to-corner keybindings weren't treated as user actions, which
resulted in them not affecting the saved position - they weren't
always being treated as sticky. Marking them as a user action revealed
bugs in the positioning logic that were hidden by the constraint
code applied to automated moves. Fix those as well. Bug tracked
down by Mariusz Libera.

https://bugzilla.gnome.org/show_bug.cgi?id=661256
2012-03-13 12:19:07 -04:00
39b3244a3e Updated British English translation 2012-03-13 14:33:09 +00:00
63f982eb72 [l10n] Updated Estonian translation 2012-03-13 14:05:39 +02:00
c689306dae Updated Serbian translation 2012-03-13 08:39:49 +01:00
0b7f2f8cd3 theme-viewer: Fix invisible borders
https://bugzilla.gnome.org/show_bug.cgi?id=662895
2012-03-13 00:48:29 -04:00
efc90173b1 display: Add signals for plugins to know when a grab op begins/ends
https://bugzilla.gnome.org/show_bug.cgi?id=670658
2012-03-12 22:53:11 -04:00
9e439a22b5 Updated Norwegian bokmål translation 2012-03-12 18:55:00 +01:00
848c1f52f3 Updated Swedish translation 2012-03-12 18:26:34 +01:00
1b84be7031 Updated Slovenian translation 2012-03-12 15:26:55 +01:00
eb08a65b4c Updated Spanish translation 2012-03-12 14:18:00 +01:00
43ba596a0e Finnish translation update from http://l10n.laxstrom.name/wiki/Gnome_3.4 translation sprint 2012-03-12 11:11:19 +02:00
2e1de1a037 Assamese translation completed 2012-03-12 14:26:59 +05:30
81ede6abf8 Updated Bulgarian translation 2012-03-12 06:45:48 +02:00
1d98f1fee8 prefs: Handle the new META_PREF_DYNAMIC_WORKSPACES enum value
Avoids a -Werror compiler error.
2012-03-12 01:10:27 +01:00
f0582d1a86 Updated Polish translation 2012-03-11 23:19:18 +01:00
607dbf0f43 prefs: Add dynamic-workspaces setting
We currently sync the number of workspaces with the corresponding
preference. This is not really useful with GNOME Shell's dynamic
handling of workspaces, not least as the setting is effectively
ignored. Worse, it will trigger writes to dconf on login, slowing
down startup, so add a setting to indicate that workspaces are managed
dynamically and really ignore the num-workspaces setting when set.

https://bugzilla.gnome.org/show_bug.cgi?id=671568
2012-03-11 22:55:38 +01:00
584cd3e684 Updated Russian translation 2012-03-11 20:41:01 +04:00
90ec5b05f3 Updated Polish translation 2012-03-10 23:02:59 +01:00
7253a75b18 frames: Explicitly initialize style contexts
We were relying on GTK+ emitting GtkWidget::style-updated during
widget initialization to create the GtkStyleContexts used for
window decorations. A recent GTK+ update broke this assumption,
so do the necessary initialization ourselves.

https://bugzilla.gnome.org/show_bug.cgi?id=671796
2012-03-10 22:11:22 +01:00
cdbe3b274f Updated Korean translation 2012-03-10 23:40:56 +09:00
3f3e3ce37e plugins/default: Fix compiler error 2012-03-09 14:05:28 +01:00
5e3d93da87 plugin: Remove unneeded wrapper APIs
Mutter originally started out with the idea that only a subset of the total
API was exposed to plugins, so some APIs are duplicated on MutterPlugin.
We've long since abandoned that idea; remove these wrappers.

https://bugzilla.gnome.org/show_bug.cgi?id=671103
2012-03-08 16:52:44 -05:00
82b1d0d7e5 Updated Basque language 2012-03-06 12:44:57 +01:00
3583e57ec3 Uploaded Ukranian 2012-03-05 08:02:09 +02:00
2ddde04678 Updated Vietnamese translation 2012-03-04 11:35:10 +07:00
feda493fbf po/vi: import from Damned Lies 2012-03-04 11:29:24 +07:00
fc72309b71 [l10n] Updated Estonian translation 2012-03-01 18:05:31 +02:00
860c2a6282 window: Remove prefs listener in _unmanage instead of _finalize
After _unmanage the object is semantically dead even if technically it's not,
so remove the prefs listener here to prevent it being called for a dead
object.

In particular this fixes a crash when starting up gnome-shell with at least
one gimp utility window opened which causes mutter to create a MetaWindow for
it only to immediately get an UnmapNotify afterwards which causes mutter to
unmanage the MetaWindow. Afterwards prefs_changed_callback is called for this
dead MetaWindow and tries to dereference the window->monitor pointer which is
already NULL.

https://bugzilla.gnome.org/show_bug.cgi?id=671087
2012-03-01 10:22:21 +01:00
e6b4a34daf [l10n] Updated Estonian translation 2012-02-29 20:03:26 +02:00
3319cdfec0 Updated Hungarian translation 2012-02-29 03:37:23 +01:00
fc5594faad updated Tamil translation 2012-02-28 14:33:34 +05:30
7c9e0c2ebc Updated Belarusian translation. 2012-02-26 22:23:27 +03:00
9157cc2b70 Updated Belarusian translation. 2012-02-26 16:03:32 +03:00
69e7b32b54 update Punjabi Translation 2012-02-26 09:58:13 +05:30
04835eccb5 update Punjabi Translation 2012-02-26 09:46:42 +05:30
01c363bb6a Use a META_ prefix for enum types, not MUTTER_ 2012-02-23 16:39:28 -05:00
7649772394 configure.in: fix typo in gio-2.0 version 2012-02-23 08:52:20 +01:00
ca3dc2e876 Bump version to 3.3.90
Update NEWS
2012-02-22 21:40:10 -05:00
70d85049b1 configure.in: clean up version checks
Consolidate and simplify checks for required depenencies, and require
Cogl-1.9.6.
2012-02-22 21:40:10 -05:00
29f6f5e0ad configure.in: update an old message 2012-02-22 19:39:47 -05:00
d249cfd040 Pass CoglContext to cogl_texture_pixmap_x11_new()
The experimental Cogl api cogl_texture_pixmap_new() was recently changed
so it now expects an explicit CoglContext argument and it can also
return exceptions now via a GError. This patch updates mutters use of
the api accordingly.
2012-02-21 18:23:22 +00:00
3cb912aee2 MetaShapedTexture: Implement get_paint_volume
Add a get_paint_volume implementation to MetaShapedTexture.
2012-02-21 18:09:25 +01:00
7df823132c Updated Danish translation 2012-02-20 22:37:32 +01:00
41353d642b Updated Serbian translation 2012-02-20 11:59:40 +01:00
c47039db82 window: Fix meta_window_move_frame in the context of the new invisible borders
https://bugzilla.gnome.org/show_bug.cgi?id=659643
2012-02-16 16:46:10 -05:00
0dab6df25a configure: Require Clutter 1.9.10
We depend on API introduced in Clutter 1.9.10. Additionally, remove
a compatibility fallback that isn't needed anymore.
2012-02-16 16:44:03 -05:00
c844bab232 meta-background-actor: Chain up in dispose
This was preventing Clutter from running its dispose, preventing
it from being destroyed correctly. While a major bug and possibly
big memory leak, the most obvious effect was the message that Clutter
spat out:

  Clutter-CRITICAL **: clutter_actor_iter_next: assertion `ri->age == ri->root->priv->age' failed

Since we never disposed the actor correctly, it was never removed
from its parent, and the age wasn't updated correctly.
2012-02-16 16:29:33 -05:00
848f9d1399 Bump version to 3.3.5
Update NEWS
2012-02-07 18:30:01 -05:00
2e63de5c0a Add -Wno-error=deprecated declarations
Even with --enable-compile-warnings=error, avoid erroring out on deprecations
for the moment, since we are hitting many Clutter deprecations and some are
hard to fix.
2012-02-07 18:30:01 -05:00
7319b10d72 MetaShapedTexture: Remove visible_pixels_region
When we were shaping the window with a cairo region, there was an easy
optimization to restrict painting only to the pixels we were going to
actually draw. With rounded corners, the amount of work we have to do
figure out what pixels isn't worth the small savings of not drawing the
completely transparent parts of the corners, so remove this optimization,
and the supporting meta_shaped_texture_get_visible_pixels_region()

https://bugzilla.gnome.org/show_bug.cgi?id=657639
2012-02-03 19:58:21 -05:00
1265efcf78 MetaShapedTexture: Add a new method to flatten the shaped texture into pixels
This will be used by the Shell to implement a screenshot_window method.

https://bugzilla.gnome.org/show_bug.cgi?id=660941
2012-02-03 19:57:38 -05:00
3e0ef03fd9 MetaShapedTexture: Make public and directly derive from ClutterActor
ClutterTexture has many features that we simply don't use and don't make
sense for a subclass with custom drawing. Deriving directly from ClutterActor
simplifies our code by avoiding workarounds and makes things more robust.

Additionally, make it public. GNOME Shell was already assuming that any
MetaShapedTexture was also a ClutterTexture, and we need to replace these
bits with new API for GNOME Shell to use.

https://bugzilla.gnome.org/show_bug.cgi?id=660941
2012-02-03 15:35:41 -05:00
37076941ad Updated Traditional Chinese translation(Hong Kong and Taiwan) 2012-01-29 23:38:40 +08:00
25e43618a4 Updated Norwegian bokmål translation 2012-01-28 17:38:35 +01:00
fd404bafc8 screen: Remove harmless leftover argument
It compiled because it was picking index(3) from strings.h.
2012-01-26 15:27:50 +00:00
3b3b26b000 Bump dependency on gtk+ 3.3.7 2012-01-20 21:00:15 +01:00
33498f6b84 Bump version to 3.3.4
Update NEWS
2012-01-20 12:35:20 -05:00
c0a440b852 Fix crash when meta_display_close() is called with attached modal dialogs
When meta_display_unmanage_window_for_screen() is called, it gets a list
of windows and iterates over them and unmanages them, but unmanaging a
window with attached modal dialogs also unmanages those attached modal
dialogs (in the normal case, temporarily), so we need to guard against
such cases by ref'ing the windows in the list and checking if they have
already been unmanaged.

https://bugzilla.gnome.org/show_bug.cgi?id=668299
https://bugzilla.redhat.com/show_bug.cgi?id=760918
2012-01-19 16:12:56 -05:00
1772a2a59c adjust to new Gtk properties for app menu
https://bugzilla.gnome.org/show_bug.cgi?id=668118
2012-01-18 17:26:12 -05:00
44f362ad87 tile-preview: Remove non-composited case
The main reason for handling the non-composited case was to keep
code differences with metacity small, but the tiling patch[0] never
got merged. In mutter itself, the compositor is not optional, so
there's no good reason for keeping those untested code chunks around.

[0] https://bugzilla.gnome.org/show_bug.cgi?id=607694

https://bugzilla.gnome.org/show_bug.cgi?id=666039
2012-01-17 12:53:33 +01:00
478f1020a4 Updated Galician translations 2012-01-15 01:27:53 +01:00
e8209e7b22 Handle rename of GTK+'s window-unfocused state to backdrop
GTK_STATE_FLAG_WINDOW_UNFOCUSED was renamed to
GTK_STATE_FLAG_BACKDROP.
2012-01-09 19:03:27 -05:00
2d20c9ecad Updated Bulgarian translation 2012-01-08 15:18:52 +02:00
f35160c30f Bump version to 3.3.3
Update NEWS
2012-01-03 14:43:50 -05:00
7fad591d6e Updated Hebrew translation. 2011-12-30 10:49:13 +02:00
a364cea779 [l10n]Updated Turkish translation 2011-12-24 16:58:42 +02:00
2eb3ff4bfb prefs: Fix memory leak 2011-12-19 09:45:41 -05:00
796ca6746d Updated Slovenian translation 2011-12-16 21:50:35 +01:00
0a79fb8d62 Updated Spanish translation 2011-12-16 14:21:22 +01:00
ac7ec585c8 compositor: Use raw Xlib to resize the compositor window
If we get two configure events on the root window in close
sequence, then we could get the sequence:

 ConfigureNotify on the root window w1xh1
   Processed by Mutter
 clutter_actor_set_size(stage, w1, h1)
 <relayout happens, stage window resized by clutter>

 ConfigureNotify on the root window, w2xh2
   Processed by Mutter
 clutter_actor_set_size(stage, w2, h2)
 ConfigureNotify on the stage window, w1, h1)
   Processed by Clutter
 clutter_actor_set_size(stage, w1, h1)
 <relayout happens, stage window resized by clutter>

Leaving the stage at the wrong size. To avoid fighting with Clutter,
switch to resizing the stage with XResizeWindow(), similar to how a
toplevel window is handled by a window manager.
2011-12-15 16:06:07 -05:00
264c555af0 Do not use the default stage
https://bugzilla.gnome.org/show_bug.cgi?id=664028
2011-12-15 16:06:07 -05:00
bbbb0e6002 meta-window-actor: Add error traps in meta_window_actor_set_redirected
meta_window_actor_set_redirected makes X calls on the client window
so it need to set error traps.
2011-12-15 19:53:41 +01:00
41ae760454 Fix compilation with --disable-introspection
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@linux.intel.com>

https://bugzilla.gnome.org/show_bug.cgi?id=661871
2011-12-15 10:54:50 -05:00
9729a99ec5 window: Support GTK+'s hide-titlebar-when-maximized hint
For maximized windows, titlebars cannot be used to reposition or
scale the window, so if an application does not use it to convey
useful information (other than the application name), the screen
space occupied by titlebars could be put to better use.
To account for this use case, a setting for requesting that windows'
titlebars should be hidden during maximization has been added to
GTK+, add support for this in the window manager.

https://bugzilla.gnome.org/show_bug.cgi?id=665617
2011-12-15 16:37:20 +01:00
d64c5bfc11 screen: signal workspace creation from client applications
Using an external application using libwnck an external application
can create a new workspace by moving a window into it. In this case we
are currently missing a "workspace-added" signal emission.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@linux.intel.com>

https://bugzilla.gnome.org/show_bug.cgi?id=666015
2011-12-15 10:24:20 -05:00
e4ed433e18 Add _DBUS_UNIQUE_NAME and _OBJECT_PATH properties
https://bugzilla.gnome.org/show_bug.cgi?id=664851
2011-12-15 10:21:22 -05:00
8ab5cc8f19 Load _DBUS_APPLICATION_ID property, expose it via API
This is used to associate GtkApplication -> X window, and will
be consumed by gnome-shell.

https://bugzilla.gnome.org/show_bug.cgi?id=664851
2011-12-15 10:12:31 -05:00
35261808a9 Updated Norwegian bokmål translation 2011-12-14 22:59:42 +01:00
3a4512cd91 Use generic marshaller
https://bugzilla.gnome.org/show_bug.cgi?id=662153
2011-12-13 19:53:57 -05:00
eb0185c1b1 followup to last commit: close comment
Signed-off-by: Marc-Antoine Perennou <Marc-Antoine@Perennou.com>
2011-12-13 15:48:29 +01:00
34f6ffd1ad keybindings: Add toggle-tile-left/right bindings
Having keybindings for side-by-side tiling has been requested for
a long time, so add this support now.

https://bugzilla.gnome.org/show_bug.cgi?id=648700
2011-12-13 14:36:40 +01:00
baeb9fbc4b window: Make meta_window_can_tile_side_by_side() public
In order to support keybindings for window tiling, we need to
determine whether a window is tilable or not, so make this public.

https://bugzilla.gnome.org/show_bug.cgi?id=648700
2011-12-12 11:55:51 +01:00
c3d76aead6 window: Relax restrictions for can_tile_maximized ()
The current code requires windows to be resizable to be considered
for tiling, which excludes all maximized/tiled windows. While this
restriction concurs with the desired behavior for edge-tiling, it
feels overly restrictive for keybindings.
As the edge-tiling code in update_move() already ensures the above
restriction, it seems save to remove it from the can_tile_maximized()
function, assuming that windows that are not meant to be tiled or
maximized won't provide a maximize function.

https://bugzilla.gnome.org/show_bug.cgi?id=648700
2011-12-12 11:55:51 +01:00
bed9cb1648 window: Keep track of the last full-maximization state
In order to be able to toggle between tiled and normal/maximized
states, we need to keep track of the last full maximization state.

https://bugzilla.gnome.org/show_bug.cgi?id=648700
2011-12-12 11:55:50 +01:00
4ca552785f window: Queue a frame redraw after tiling
Usually tiling involves a size change and the frame is redrawn
automatically, however this is not the case when switching directly
between left- and right-tiled.
Ensure that a redraw happens in that case as well.

https://bugzilla.gnome.org/show_bug.cgi?id=648700
2011-12-12 11:55:50 +01:00
b26b11c74d Updated Hebrew translation. 2011-12-10 10:51:24 +02:00
b3114bb9e5 Updated Norwegian bokmål translation 2011-12-01 20:29:38 +01:00
497f9be61e window: Listen for pref changes
The workspaces-only-on-primary preference changes how windows are
displayed, so listen for pref changes and update the visibility
accordingly.

https://bugzilla.gnome.org/show_bug.cgi?id=664853
2011-11-26 11:34:03 +01:00
a88365df9b Updated Slovenian translation 2011-11-25 21:25:10 +01:00
47f98c5528 Bump version to 3.3.2
Update NEWS
2011-11-21 19:04:44 -05:00
0e50287aea keybindings: Allow to add/remove keybindings at runtime
Add meta_display_add_keybinding()/meta_display_remove_keybinding(),
which allow to add/remove keybindings dynamically at runtime.

https://bugzilla.gnome.org/show_bug.cgi?id=663428
2011-11-22 00:42:30 +01:00
d42a2a3c27 keybindings: Store keybindings dynamically
Rather than defining keybindings in static arrays generated at compile
time, store them in a hash table initialized in meta_display_init_keys()
and filled in init_builtin_keybindings().

This is a prerequisite for allowing to add/remove keybindings at runtime.

https://bugzilla.gnome.org/show_bug.cgi?id=663428
2011-11-22 00:42:30 +01:00
78849bef04 Updated Spanish translation 2011-11-17 14:20:54 +01:00
b1a69d1e89 prefs: Fix typo 2011-11-14 20:13:56 +01:00
c5468ee391 prefs: Adapt to re-addition of a separate visual-bell option
Commit d0910da036 merged the visual-bell/visual-bell-type options,
but the change turned out too disruptive for gnome-control-center /
gnome-shell, so gsettings-desktop-schemas commit a5819b2a4e9 re-added
the separate option.
2011-11-14 15:43:48 +01:00
7ce7feeb2b Updated Norwegian bokmål translation 2011-11-13 11:15:37 +01:00
c0432ebb39 build: Specify a minimum version for gsettings-desktop-schemas
The version has been bumped, so we can now depend on a version
which includes the new wm schemas.
2011-11-12 15:29:41 +01:00
1a51d307c8 Fix installation of mutter-schemas.convert 2011-11-11 21:39:54 +01:00
d0910da036 Port preferences to GSettings
Move preferences to GSettings, using mainly shared schemas from
gsettings-desktop-schemas.

Unlike GConf, GSettings support is not optional, as Gio is already
a hard dependency of GTK+.

https://bugzilla.gnome.org/show_bug.cgi?id=635378
2011-11-11 20:26:38 +01:00
a2726f41c9 ui: Replace deprecated gtk_widget_size_request 2011-11-11 09:33:42 +01:00
162213be0d Fix cogl crash from updating non-existent texture
The code here was always incorrect - we were processing damage events for
windows without having a texture. Before, this didn't matter, as
cogl_texture_get_width silently returned 0 for invalid handles. Cogl commit
4c3dadd35e changed this.

The fix here involves two strategies. First, we try to guard MetaTextureTower
from invalid textures. Second, we try not to go down the path that eventually
calls meta_shaped_texture_update_area by not handling damage events if we
don't have a texture for the window.

https://bugzilla.gnome.org/show_bug.cgi?id=660941
2011-11-10 16:40:12 -05:00
1596d1af10 meta-window-group: Fix types typo
gboolean is a typedef for int, so it doesn't matter too much

https://bugzilla.gnome.org/show_bug.cgi?id=660941
2011-11-10 15:52:25 -05:00
441287dc64 theme: handle GTK_STATE_FLAG_WINDOW_UNFOCUSED
This bumps the required GTK+ version to >= 3.3.3 .
2011-11-08 20:59:41 +00:00
6e47f0e846 window: add _NET_WM_STATE_FOCUSED hint to _NET_WM_STATE
This hint reflects whether a window appears focused.

https://bugzilla.gnome.org/show_bug.cgi?id=661427
2011-11-08 19:19:32 +00:00
4fb2fab7f7 window.c: add meta_window_move_resize_frame
meta_window_move_resize_frame operates much like
meta_window_move_resize, but ensures the window
and its frame (if present) will fit within the
specified dimensions.

https://bugzilla.gnome.org/show_bug.cgi?id=651899
2011-11-05 18:52:43 -04:00
3beb33bb44 mutter-mag: Quit when the user hits escape
https://bugzilla.gnome.org/show_bug.cgi?id=662895
2011-10-28 21:21:57 -04:00
1b04a40dce mutter-mag: Remove deprecated stuff
https://bugzilla.gnome.org/show_bug.cgi?id=662895
2011-10-28 21:21:56 -04:00
8087872130 theme-viewer: Fix layout
https://bugzilla.gnome.org/show_bug.cgi?id=662895
2011-10-28 15:09:21 -04:00
3ad25a62cd ui: Remove deprecated stuff
https://bugzilla.gnome.org/show_bug.cgi?id=662895
2011-10-28 15:09:21 -04:00
7ecd673d23 mutter-window-demo: Remove deprecated stuff
https://bugzilla.gnome.org/show_bug.cgi?id=662895
2011-10-28 15:09:21 -04:00
331c9aaee4 Reverting "configure: Turn off -Werror by default" Revert "configure: Turn off -Werror by default"
This reverts commit a26e72c452.

https://bugzilla.gnome.org/show_bug.cgi?id=662574
2011-10-25 09:42:21 -04:00
ec1979f9f5 theme-viewer: Update to fix GTK+ deprecations
Replace the GtkTable with a GtkGrid, replace GtkH/VBox with GtkBox
and junk a GtkHandleBox.

https://bugzilla.gnome.org/show_bug.cgi?id=662574
2011-10-25 09:42:16 -04:00
4b411ea241 tabpopup: Update to fix GTK+ deprecations
Replace the GtkTable with a GtkGrid, replace GtkH/VBox with GtkBox

https://bugzilla.gnome.org/show_bug.cgi?id=662574
2011-10-25 09:42:11 -04:00
70db187c36 frames: Don't use deprecated API to grab pointer position
https://bugzilla.gnome.org/show_bug.cgi?id=662574
2011-10-25 09:42:04 -04:00
4de3f1d147 Updated Telugu translations 2011-10-25 17:35:54 +05:30
821d4458ea Minor annotation fixes. 2011-10-24 17:06:17 -04:00
7f9472a58f util: Fix memory leak in meta_later_remove
We never destroy the later list that's added by meta_later_add.

==4289== 16 bytes in 1 blocks are definitely lost in loss record 1,632 of 7,258
==4289==    at 0x4C2640D: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4289==    by 0x5178D9F: standard_malloc (gmem.c:88)
==4289==    by 0x5178E37: g_malloc (gmem.c:164)
==4289==    by 0x51924B5: g_slice_alloc (gslice.c:842)
==4289==    by 0x5194521: g_slist_insert_sorted_real (gslist.c:900)
==4289==    by 0x519465A: g_slist_insert_sorted (gslist.c:957)
==4289==    by 0x4EA609A: meta_later_add (util.c:876)
==4289==    by 0x4E9C330: meta_screen_queue_workarea_recalc (screen.c:2640)
==4289==    by 0x4E9A360: update_num_workspaces (screen.c:1646)
==4289==    by 0x4E99026: meta_screen_new (screen.c:924)
==4289==    by 0x4E7AB51: meta_display_open (display.c:803)
==4289==    by 0x4E9168E: meta_run (main.c:552)

https://bugzilla.gnome.org/show_bug.cgi?id=642652
2011-10-21 15:44:50 -04:00
3599917123 meta-window-group: Use clutter_actor_has_effects if available
This avoids a potentially costly allocation on every pixmap update.

https://bugzilla.gnome.org/show_bug.cgi?id=662225
2011-10-21 09:20:46 -04:00
d624e85bc1 frames: Disable the titlebar "inner resize"
Since invisible draggable borders have been around, there isn't really a big
need for this feature

https://bugzilla.gnome.org/show_bug.cgi?id=660129
2011-10-21 09:16:39 -04:00
6aa4bfd060 tiling: do not tile if moving in snap mode
If we are moving in snap mode (shift pressed) we don't want to tile. We must
also cancel any pending tiling if snap mode is activated during the move drag.

https://bugzilla.gnome.org/show_bug.cgi?id=662270
2011-10-20 16:18:38 +01:00
a26e72c452 configure: Turn off -Werror by default
We will eventually land jhbuild work to grep for warnings; for now
breaking the build is just too painful.
2011-10-19 09:52:02 -04:00
acc4e03482 Updated Vietnamese translation 2011-10-18 14:40:21 +11:00
e176a9e891 po/vi: import from Damned Lies 2011-10-18 14:35:19 +11:00
0b36663ff1 Bump version to 3.2.1
Update NEWS
2011-10-17 23:17:16 -04:00
bb035fe6e0 window: Correct coordinates for the configure event
We should still correct the coordinates for withdrawn windows.
2011-10-17 21:53:58 -04:00
6d0c1f08d2 frame: Make sure to offset by invisible borders when unmanaging windows
When we reparent a window to the root when we're exiting, we need to offset
the position by the invisible borders, otherwise windows will creep up and
to the left.

https://bugzilla.gnome.org/show_bug.cgi?id=660848
2011-10-17 21:53:58 -04:00
f700a7be07 Make meta_display_unmanage_screen public
https://bugzilla.gnome.org/show_bug.cgi?id=660848
2011-10-17 21:53:58 -04:00
138eb1e3b4 tiling: keep track of the monitor where a window was tiled
meta_window_get_current_tile_area() computes the area where the tiled window
should be based on the current pointer position but that's only meaningful
when the user is actually dragging the window.

When running the tiling constrain the pointer might be on other monitor and at
that point the window jumps to this other monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=642580
2011-10-18 02:40:36 +01:00
c39129b6e8 tiling: for tiled maximization use the tile area as target size/position
When using more than one monitor, tiled maximization can be triggered with the
pointer in one monitor while most of the window area remains in another. This
means that the maximization constraint would maximize the window into the wrong
monitor as it uses the work area size/position as target.

Fix this by using the current tile area as target size/position.

https://bugzilla.gnome.org/show_bug.cgi?id=657519
2011-10-18 02:33:41 +01:00
bf175e72ad MetaWindowActor: don't unredirect ARGB32 windows
In particular this would a cause a "flash" when showing the tile preview for
maximization on a non-primary monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=662053
2011-10-18 02:33:34 +01:00
ba31ba4615 Update window->has_resize_func at the right time when unfullscreening
Since the frame window size that meta_window_move_resize() uses depends
on whether the window has horizontal/vertical resize functionality, we
need to update this flag before we resize the window.

https://bugzilla.gnome.org/show_bug.cgi?id=659854
2011-10-17 15:08:00 -04:00
f94f008ed6 window.c: use a consistent mapping from frame_type => decorated
If a window had a type hint intended for override-redirect windows
like NOTIFICATION, we ended up with a window that was decorated but
with a frame type of FRAME_TYPE_LAST, causing assertion failures.
Fix this by making recalc_window_features() just call
meta_window_get_frame_type().

https://bugzilla.gnome.org/show_bug.cgi?id=599988
2011-10-17 11:58:10 -04:00
9d4f3c5842 Allow keyboard ops to work without a pointer grab
https://bugzilla.gnome.org/show_bug.cgi?id=660457
2011-10-15 22:50:45 +02:00
0b2a9d58e0 Updated Turkish translation 2011-10-10 10:41:43 +03:00
28deea44d4 theme: Remove outdated assertion
The theme state used to use GtkStateType, but was ported over to GtkStateFlags,
leaving behind a broken assertion that fails when using certain Metacity
themes, for example Nodoka.

https://bugzilla.gnome.org/show_bug.cgi?id=661286
2011-10-08 17:27:12 -04:00
f82966adb5 Various annotation fixes
https://bugzilla.gnome.org/show_bug.cgi?id=660854
2011-10-04 16:44:39 -04:00
9f54f1d75d frame: destroy window->frame_bounds when destroying the frame
Since window->frame_bounds is used as a cache we need to invalidate it when
destroying the frame.

https://bugzilla.gnome.org/show_bug.cgi?id=660773
2011-10-04 12:47:42 +01:00
be9f7d7729 theme: Don't add invisible borders for windows that can't be resized
Invisible borders are all about resizing -- in the case that a window
cannot be resized, it makes no sense to add them.

https://bugzilla.gnome.org/show_bug.cgi?id=659854
2011-09-29 16:19:38 -04:00
1b4dce6f84 meta-window-group: Plug memory leak
We have to free the list returned by clutter_actor_get_effects() .

https://bugzilla.gnome.org/show_bug.cgi?id=660464
2011-09-29 15:36:10 +02:00
3bb17f0671 Updated Serbian translation 2011-09-28 20:09:27 +02:00
19d111a27b Updated Finnish translation 2011-09-27 09:48:43 +03:00
289561ddf3 .gitignore: Ignore generated POT file (po/*.pot) 2011-09-27 09:48:13 +03:00
d2ca160ea3 Bump version to 3.2.0
Update NEWS
2011-09-26 14:19:16 -04:00
cd19f9239c [l10n]Updated Catalan (Valencian) translation 2011-09-26 14:18:05 +02:00
16157ad522 Update Czech translation 2011-09-26 00:46:00 +02:00
d37a692392 Updated Japanese translation 2011-09-25 23:45:42 +09:00
f78f33d848 Updated Basque language 2011-09-25 13:35:47 +02:00
c4692b8d51 window: Fix _NET_FRAME_EXTENTS to work properly
_NET_FRAME_EXTENTS should contain the difference between where a window asked
to be placed, and where it is. Ideally, this should be the same as the visible
extents.

https://bugzilla.gnome.org/show_bug.cgi?id=659848
2011-09-24 13:21:25 -04:00
764569eb7a window: Fix window placement to exclude invisible borders
A window can specify geometry that it is placed at. We need to exclude invisible
borders when calculating where to place the window, otherwise the window will have
a strange offset.

https://bugzilla.gnome.org/show_bug.cgi?id=659848
2011-09-24 13:21:25 -04:00
aab0d2f54e [l10n] Updated German translation 2011-09-24 10:37:52 +02:00
24678de261 Updated Korean translation 2011-09-24 08:21:53 +09:00
1b71eeb02a Update Assamese translation 2011-09-22 12:22:04 +02:00
bfc6a2b078 configure.ac: switch to dist-xz 2011-09-21 12:30:37 -04:00
9c9da8f575 Updated Hungarian translation 2011-09-21 03:49:50 +02:00
d1a87288a4 Updated Brazilian Portuguese translation 2011-09-20 18:40:18 -03:00
e7c65d9404 Bump version to 3.1.92
Update NEWS
2011-09-20 15:41:45 -04:00
00e49b330c frames: Take out accidental south resize disable of attached dialogs
https://bugzilla.gnome.org/show_bug.cgi?id=657795
2011-09-20 15:30:29 -04:00
7c6bc73031 MetaWindowActor: Skip paint optimization for actors with an effect
The optimizations might not work for an actor with an effect, and
our clipped drawing interferes badly with the operation of
CoglOffscreenEffect.

https://bugzilla.gnome.org/show_bug.cgi?id=659523
2011-09-20 20:52:03 +02:00
c1368155fc MetaWindowActor: unset the shaped texture overlay path for frameless windows
When a window loses its frame we must unset any overlay path previously set on
the shaped texture.

Not doing so would cause rendering glitches near the window corners in
e.g. chrome/chromium by changing the Appearance preference "Use system title
bar and borders" → "Hide system title bar and use compact borders".

https://bugzilla.gnome.org/show_bug.cgi?id=659477
2011-09-19 18:52:43 +01:00
d305174ecc [l10n]Updated Catalan translation 2011-09-19 15:12:28 +02:00
6b7391bca9 Updated Danish translation 2011-09-18 23:57:17 +02:00
4e99c38491 Updated Japanese translation 2011-09-17 12:51:29 +09:00
6087a71951 theme: Don't add any bottom border to shaded windows
Shaded windows are assumed to be reduced to the titlebar: the
current code enforces a visible bottom border of 0 and only takes
the size of the title bar (+ invisible top border) into account
when resizing the frame. However, we still add an invisible border
at the bottom, which is than subtracted from the title bar, resulting
in shaded windows being cut off.
Fix by forcing both visible and invisible bottom borders to 0.

https://bugzilla.gnome.org/show_bug.cgi?id=659266
2011-09-17 03:50:37 +02:00
5f1c3de29a frames: Fall back to title bar if nothing else matched
The condition got removed in eeb2efe010 but that
had a side effect of adding a couple of rows of dead pixels so add it back.

https://bugzilla.gnome.org/show_bug.cgi?id=658069
2011-09-16 18:16:37 -04:00
abde64cb0c Don't unredirect non fully opaque windows
When a window is set to be translucent with _NET_WM_WINDOW_OPACITY it shouldn't
be unredirected as this will cause the hint to have no effect.
2011-09-16 21:39:03 +02:00
6923973c8a compositor: Fix cow shaping on multi monitor setups
XFixesCreateRegionFromWindow does not take the window's position into account,
which results into setting a wrong shape for windows not located on the
leftmost monitor.

Fix that by creating the region from the window's MetaRectangle.

https://bugzilla.gnome.org/show_bug.cgi?id=657869
2011-09-16 19:02:11 +02:00
d7f1b95349 Uploaded Ukranian 2011-09-16 14:23:52 +03:00
4a5c7ee4cc theme: Attached modal dialogs should have no top invisible border
If we do this, then there will be invisible borders around the top of attached
modal dialogs, which is unnecessary -- they can't be resized from the top
border and just interfere with the parent dialog.

This requires changing a bit of API to help identify the type of dialog.

https://bugzilla.gnome.org/show_bug.cgi?id=657795
2011-09-14 20:03:41 -04:00
f3bb16f301 theme: Remove meta_theme_draw_frame_by_name
It was unused, and isn't really useful.

https://bugzilla.gnome.org/show_bug.cgi?id=657795
2011-09-14 20:03:41 -04:00
d6b528a955 Disable top resizing for attached modal dialogs, for real this time
https://bugzilla.gnome.org/show_bug.cgi?id=657795
2011-09-14 20:03:40 -04:00
7ba6503e9b display: trivial code clean up
Remove redundant if statement.
2011-09-14 23:30:29 +01:00
9ee7783759 Bump version to 3.1.91.1
Update NEWS
2011-09-14 17:12:56 -04:00
2dc5693c60 Don't lose application redraws
Our usage of DamageReportBoundingBox was causing us to miss some
updates when an area of the screen was drawn twice in rapid
succession. Add an explicit XSync() call to force the server
to flush rendering to the kernel before we draw.

https://bugzilla.gnome.org/show_bug.cgi?id=657071
2011-09-14 14:36:52 -04:00
a1ef22e0d7 Updated Spanish translation 2011-09-14 17:53:30 +02:00
19b6888ea5 When monitors change, keep windows on same output.
If XRANDR is availible, we track the first (or primary) output per
crtc (== xinerama monitor) so when the monitors change we can try
to find the same output and move windows there. If we can't find the
original monitor in the new set (or XRANDR is not supported) we move
the window to the primary monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=645408
2011-09-14 15:38:55 +02:00
9520eaa970 MetaShapedTexture: Fix a crash caused by a silly typo 2011-09-13 20:15:22 -04:00
088e0c1ee7 MetaWindowActor: Make sure to always pop an error trap
https://bugzilla.gnome.org/show_bug.cgi?id=658228
2011-09-13 13:42:06 -04:00
de704386a1 Revert "MetaWindowActor: Delete useless error trap"
This reverts commit 766799ec6d.
2011-09-13 13:41:43 -04:00
766799ec6d MetaWindowActor: Delete useless error trap
https://bugzilla.gnome.org/show_bug.cgi?id=658228
2011-09-13 13:40:26 -04:00
7c50db5bf5 meta-window-actor: Skip unnecessary steps in pre_paint
We don't have to call check_needs_pixmap, check_needs_reshape
and check_needs_shadow on unredirected windows, so skip that.

https://bugzilla.gnome.org/show_bug.cgi?id=658228
2011-09-13 13:40:11 -04:00
7223c4e184 window: remove warning about _NET_WM_MOVERESIZE's lack of timestamps
The comments in the code about the protocol's inadequacies are enough, there's
no need to spam our standard outputs.
2011-09-12 18:46:47 +01:00
b0a9c391a1 updated Tamil translation 2011-09-12 21:34:46 +05:30
5c7158792f updated Tamil translation 2011-09-12 21:32:32 +05:30
9c71d23884 updated Tamil translation 2011-09-12 21:25:58 +05:30
e1362562b4 MetaDisplay: Renamed 'ignored_serials' for clarity
The ignored_serials member of Display refers explicitly to crossing
serials - rename the member and associated functions and constants
for clarity.

https://bugzilla.gnome.org/show_bug.cgi?id=597190
2011-09-12 09:56:59 -04:00
1ab6abc044 focus-follows-mouse: ignore events generated when reshaping the stage
* Export meta_display_add_ignored_crossing_serial()
* Add the serial for reshaping the stage
* Increase the size of the "ignored_serials" array a bit to
  try to avoid the possibility of losing serials from multiple
  reshapes happening close together.

https://bugzilla.gnome.org/show_bug.cgi?id=597190
2011-09-12 09:56:59 -04:00
bf4f3a8a99 Updated Latvian translation. 2011-09-11 19:37:54 +03:00
f9626d2db6 Make maintiner mode enabled by default
See http://blogs.gnome.org/desrt/2011/09/08/am_maintainer_mode-is-not-cool/
2011-09-09 15:43:09 +01:00
28b59589ca Updated British English translation 2011-09-09 12:56:39 +01:00
fb10910e66 l10n: Updated Italian translation 2011-09-08 21:57:12 +02:00
6d2efe9460 Updated Polish translation 2011-09-08 21:27:29 +02:00
f587595765 Updated French translation 2011-09-08 21:10:44 +02:00
5e6e8728c3 Updated Portuguese translation 2011-09-08 00:27:48 +01:00
f620f1b466 Updated Slovenian translation 2011-09-07 20:11:30 +02:00
818320e748 Don't show a title on alerts
This goes better with the general style of similar alerts throughout
GNOME 3, and as has been pointed out in bug 591735, 'Mutter' is
a somewhat unfortunate title in several lanuages, such as English
and German.
2011-09-06 12:51:53 -04:00
fc2e7e94a5 Updated Traditional Chinese translation(Hong Kong and Taiwan) 2011-09-06 19:49:39 +08:00
a47e35ba2e Updated Indonesian translation 2011-09-06 13:50:57 +07:00
07d8b2d510 Updated Belarusian translation. 2011-09-04 19:16:29 +03:00
6329aeac11 Updated Belarusian translation. 2011-09-02 20:52:34 +03:00
af1fef03f4 Updated Belarusian translation. 2011-09-02 15:42:49 +03:00
f778cf0ea3 Bump version to 3.1.90.1
Update NEWS
2011-08-30 15:39:25 -04:00
7af6aa9739 Additional annotation fixes
* At least one line (possibly blank) is required after a function name for a doc header
  to be parsed correctly.

* SnStartupSequence isn't a type known to introspection
2011-08-30 15:12:09 -04:00
faae2daae8 Add (element-type) annotations to make gobject-introspection happy 2011-08-30 12:54:49 -04:00
0b4cc14aa6 frames: Fix the visible region when we have a rounded bottom-right corner
https://bugzilla.gnome.org/show_bug.cgi?id=657661
2011-08-30 10:55:06 -04:00
622583a0d5 MetaWindowActor: Corner paths needs to be made in clockwise order
https://bugzilla.gnome.org/show_bug.cgi?id=657661
2011-08-30 10:55:06 -04:00
2f33d85a41 compositor: Fix crash in pre_paint_windows when no windows are open
https://bugzilla.gnome.org/show_bug.cgi?id=657692
2011-08-30 15:20:34 +02:00
3abb651325 Bump version to 3.1.90
Update NEWS
2011-08-29 18:39:42 -04:00
ada8882b61 Fix typo 2011-08-29 23:18:51 +02:00
d3831729a0 Unredirect fullscreen windows
Some apps that do a lot of rendering on the screen like games, mostly run in
fullscreen where there is no need for them to be redirected doing so does add
an overhead; while performance is critical for those apps.

This can be disabled / enabled at runtime using
meta_enable_unredirect_for_screen / meta_disable_unredirect_for_screen

https://bugzilla.gnome.org/show_bug.cgi?id=597014
2011-08-29 23:05:30 +02:00
05fee9beea Account for invisible borders when constraining modal dialogs
https://bugzilla.gnome.org/show_bug.cgi?id=656619
2011-08-29 13:00:26 -04:00
e4da6495d3 Disable top resizing for attached modal dialogs
https://bugzilla.gnome.org/show_bug.cgi?id=656619
2011-08-29 13:00:26 -04:00
8c74ad1992 MetaWindowActor: Don't use uninitialized frame borders
https://bugzilla.gnome.org/show_bug.cgi?id=656335
2011-08-29 12:58:05 -04:00
88064fd534 MetaBackgroundActor: fix a typo
https://bugzilla.gnome.org/show_bug.cgi?id=657583
2011-08-29 16:54:29 +01:00
b28c6533f8 MetaBackgroundActor: make it a public class
https://bugzilla.gnome.org/show_bug.cgi?id=656433
2011-08-29 16:54:09 +01:00
53e70b3e99 MetaBackgroundActor: add a dim-factor property
This property darkens the background.

https://bugzilla.gnome.org/show_bug.cgi?id=656433
2011-08-29 15:40:20 +01:00
c630046858 MetaBackgroundActor: allow creating multiple instances
Instead of requiring a singleton MetaBackgroundActor for the screen,
allow creating multiple copies that internally share a single
CoglTexture behind the scenes. This will be useful for allowing
multiple views of the screen background with different rendering
options.

https://bugzilla.gnome.org/show_bug.cgi?id=656433
2011-08-29 07:51:12 -04:00
a75c4d2cc9 Added UG translation 2011-08-28 16:46:27 +02:00
368a90c82a test-attached: new program for testing attached dialogs
https://bugzilla.gnome.org/show_bug.cgi?id=646761
2011-08-27 13:12:25 -04:00
2be1574e55 window: only attach dialogs to NORMAL, DIALOG, and MODAL_DIALOG windows
Attaching dialogs to unusual windows (like the desktop) looks bad, so
don't do it.

https://bugzilla.gnome.org/show_bug.cgi?id=646761
2011-08-27 13:12:25 -04:00
7f8c59614e window: make determination of attached dialog windows more consistent
Different bits of code were using slightly different checks to test
whether a window was an attached dialog. Add a new
meta_window_is_attached_dialog(), and use that everywhere.

Also, freeze the is-attached status when the window is first shown,
rather than recomputing it each time the caller asks, since this could
cause problems if a window changes its type after it has already been
attached, etc. However, if an attached window's parent is destroyed,
or an attached window changes its transient-for, then fix things up by
destroying the old MetaWindow and creating a new one (causing
compositor unmap and map events to be fired off, allowing the display
of the window to be fixed up).

Remove some code in display.c that tried to fix existing windows if
the gconf setting changed, but which didn't actually do anything (at
least under gnome-shell). However, if 654643 was fixed then the new
behavior with this patch would be that changing the gconf setting
would affect new dialogs, but not existing ones.

https://bugzilla.gnome.org/show_bug.cgi?id=646761
2011-08-27 13:12:25 -04:00
3650e9b074 Updated Lithuanian translation 2011-08-27 16:10:01 +03:00
978e601217 MetaWindowActor: Don't use truncated values when drawing the cairo overlay path
This was causing visual artifacts on large border radius values.
2011-08-26 21:50:20 -04:00
dcfa6986c6 Antialiased corners
Use a specially constructed cairo overlay to give us fully anti-aliased
corners on the mask texture.

https://bugzilla.gnome.org/show_bug.cgi?id=628195
2011-08-26 12:24:23 -04:00
49a3fd53b0 MetaShapedTexture: Allow for a "cairo overlay"
A cairo overlay gives us a path to overlay the mask texture data, allowing for
complex, anti-aliasing effects on the frame shape.

https://bugzilla.gnome.org/show_bug.cgi?id=628195
2011-08-26 12:24:22 -04:00
d33d113746 frame: Add "get_corner_radiuses" chain
https://bugzilla.gnome.org/show_bug.cgi?id=628195
2011-08-24 09:38:23 -04:00
f83568fc4e MetaShapedTexture: Use a proper stride, calculated by cairo
This will help us when painting directly on to the mask texture with
cairo, which is needed for rounded corner AA.

https://bugzilla.gnome.org/show_bug.cgi?id=628195
2011-08-24 09:38:23 -04:00
46415bb248 MetaWindowActor: Fix incorrect short-circuit
The code here was wrong in every way: it only updated the shape if all the
borders changed. It never saved new last_borders even if it *had* changed,
and the bounding rectangle's x and y positions were still important otherwise.

This had user-visible impact when doing simple things like changing the
border_width. It would short-circuit here and due to the above incorrectness,
weirdness could happen where windows would be cut off and so on.

https://bugzilla.gnome.org/show_bug.cgi?id=656334
2011-08-24 09:38:23 -04:00
5123a1fb03 Updated Swedish translation 2011-08-24 09:17:11 +02:00
19f4a5c819 Update Simplified Chinese translation. 2011-08-21 15:16:11 +00:00
69e9b70829 update Punjabi Translation 2011-08-21 09:31:42 +05:30
443ca1cc02 Updated Hebrew translation. 2011-08-18 23:35:32 +03:00
9a5f4a3346 Updated Russian translation 2011-08-18 01:19:03 +04:00
16a40dde7b Updated Galician translations 2011-08-16 19:27:02 +02:00
36e6e65778 Updated Thai translation. 2011-08-14 21:07:26 +07:00
b3bf2e08f3 Updated Japanese translation. 2011-08-14 21:26:27 +09:00
3ec500937f Updated Spanish translation 2011-08-13 17:24:55 +02:00
c45c4af5da Updated Bulgarian translation 2011-08-12 06:43:45 +03:00
a485685867 theme: Allow disabling fallback colors in gtk:custom()
gtk:custom() requires a fallback color in case the GTK+ theme in use
does not define the desired color. As in general the fallback color
will approximate the intended color, there is the risk of typos going
unnoticed. To make catching these kind of errors easier, allow to ignore
the fallback color specified (and fall back to a nice shade of pink
instead) by setting an environment variable.

https://bugzilla.gnome.org/show_bug.cgi?id=656112
2011-08-10 18:05:11 +02:00
08363f4d9b Updated Norwegian bokmål translation 2011-08-10 15:25:48 +02:00
2f254e5aa3 MetaWindowActor: Compensate for invisible borders
https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:51 -04:00
e0e78993f6 MetaWindowActor: Remove priv->attrs
It was deprecated and most of the information was in the MetaWindow anyway.

https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:51 -04:00
eeb2efe010 ui: Replace inline borders in MetaFrameGeometry with MetaFrameBorder
... and start compensating for invisible borders in all of the math.

https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:51 -04:00
be4ef9b43d MetaWindow: Compensate for invisible border changes
https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:51 -04:00
a133d8b42e MetaWindow: Repurpose get_outer_rect and add get_input_rect
get_outer_rect now returns the visible region, and a new get_input_rect
method returns the boundaries of the full frame, including the possible
invisible regions. When undecorated, both do the samething.

https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:51 -04:00
a1a2527c75 MetaFrameBorders: Add invisible borders
This just adds the invisible border field and populates it with data
but doesn't use it in any way.

https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:51 -04:00
6f5882302f prefs: Add draggable_border_width preference
https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:51 -04:00
ce9c7a210d MetaFrameBorders: Add meta_frame_borders_clear
Just a quick little commit to help clean things up for when we add invisible
borders. Additionally, do a little housekeeping in preview-widget as well.

https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:51 -04:00
e0fb83c691 Replace public MetaFrameGeometry with MetaFrameBorders
There were actually *two* MetaFrameGeometry structs: one in theme-private.h,
one in frame.h. The latter public struct was populated by a mix of (void*)
casting and int pointers, usually pulling directly from the data in the private
struct.

Remove the public struct, replace it with MetaFrameBorders and scrap all
the pointer hacks to populate it, instead relying on both structs being used
in common code.

This commit should be relatively straightforward, and it should not do any
tricky logic at all, just a sophisticated find and replace.

https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:50 -04:00
7e0a56fb80 Track the shape of the client window directly
Since we're not setting the frame's output shape any more, it doesn't
make sense to calculate the output shape based on the frame window.
Instead, track the client window directly and calculate the output shape
based on that.

https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:50 -04:00
65e1b416ef Port MetaShapedTexture/MetaWindowActor to use cairo regions instead of XRects
https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:50 -04:00
183bcd6fc7 Stop shaping the frame window
In preparation for switching to handling the output shape purely by what we
paint, stop applying a shape to the frame of the window. Even when we restore
handling the output shape, this will change the behavior with respect to input;
transparent areas between the frame and the contents will stop clicks rather
than passing them through, but that is arguably at least as expected
considering how that we decorate shaped windows with a frame all around.

https://bugzilla.gnome.org/show_bug.cgi?id=644930
2011-08-09 17:14:50 -04:00
f76372dd7d MetaWindow: Add :resizable and :above properties
Allow libmutter users to treat windows different based on these
attributes and to watch for changes.

https://bugzilla.gnome.org/show_bug.cgi?id=653858
2011-08-09 04:58:18 -04:00
9c493ab56a Updated Galician translations 2011-08-07 16:14:04 +02:00
a17f73a020 Updated Swedish translation 2011-08-03 08:49:01 +02:00
6ff9cae2b1 Bump version to 3.1.4
Update NEWS
2011-07-27 18:02:16 -04:00
d3edcbc11e window: remove redundant condition
This condition is already checked for at this point.
2011-07-27 01:42:25 +01:00
779ef582f1 prefs: Initialize button_layout struct even on pref string corner cases
We were leaving some members of the button_layout struct uninitialized if the
pref string didn't have at least one colon or if it was an empty string ("").

https://bugzilla.gnome.org/show_bug.cgi?id=654539
2011-07-24 01:41:25 +01:00
385887c55b Do not check for clutter-glx-texture-pixmap.h
Nothing uses that header any more.

https://bugzilla.gnome.org/show_bug.cgi?id=655064
2011-07-22 10:49:04 +01:00
f396a7aeb4 Do not use ClutterGLXTexturePixmap
MetaShapedTexture can be a ClutterX11TexturePixmap sub-class, given that
ClutterGLXTexturePixmap is just a shim compatibility layer since Clutter
1.4, and it's been deprecated.

https://bugzilla.gnome.org/show_bug.cgi?id=655064
2011-07-22 10:49:04 +01:00
ffa2310a34 Use Cogl API to check for TfP extension support
Do not use the ClutterGLXTexturePixmap method, since it's been
deprecated and it's just a convenience function around the Cogl
API anyway.

https://bugzilla.gnome.org/show_bug.cgi?id=655064
2011-07-22 10:49:04 +01:00
fccd626604 Use a utility function to create GL_ARB_texture_rectangles
meta-texture-rectangle and meta-shaped-texture both create textures
with GL_TEXTURE_RECTANGLE_ARB as the target using direct GL
calls. This patch moves that code into a shared utility function in a
separate file instead. The function resolves the required GL symbols
dynamically instead of linking to them directly so that if Clutter
eventually stops linking to -lGL mutter will continue to build. The
function also splits the texture creation into a separate texture
creation and data upload stage so that it can use
cogl_texture_set_region to upload the data. That way it can avoid
clobbering the glPixelStore state and it can let Cogl do any necessary
format conversion. The code preserves the old value of the rectangle
texture binding instead of clobbering it because Cogl expects to be
able to cache this value to avoid redundant glBindTexture
calls. Finally, the function uses cogl_object_set_data to
automatically destroy the GL texture when the Cogl texture is
destroyed. This avoids having to have special code to destroy the cogl
texture.

https://bugzilla.gnome.org/show_bug.cgi?id=654569
2011-07-19 11:06:23 +01:00
5237b2aa65 Fix dump_region 2011-07-18 16:49:10 -04:00
b1ae599c39 Updated Norwegian bokmål translation 2011-07-18 14:03:24 +02:00
3f694c7335 MetaTextureTower: Remove workaround for old clutter bug
texture_tower_revalidate_fbo() called cogl_flush() to work around
clutter bug #2110, which has been long fixed.

As we depend on clutter 1.7.x anyway we can just remove that workaround.

https://bugzilla.gnome.org/show_bug.cgi?id=654729
2011-07-16 14:24:31 +02:00
3da2f876bd Use paint volumes unconditionally
As we depend on clutter 1.7.x we no longer need to the 1.5.2
version check for paint volumes so just remove it.

https://bugzilla.gnome.org/show_bug.cgi?id=654730
2011-07-16 14:20:51 +02:00
a6d08fcd71 Updated Hebrew translation. 2011-07-15 10:38:59 +03:00
73d22a273e Updated Slovenian translation 2011-07-14 14:39:02 +02:00
24843f277f Updated Belarusian translation. 2011-07-14 00:23:16 +03:00
4167ef870c meta-window-group: Use clutter_stage_get_redraw_clip_bounds
Clutter now has some API to get the bounds of the current redraw clip
so Mutter no longer needs to make direct GL calls to get the scissor
rect. This should make it more robust against Cogl or Clutter changing
how it does the clipping.

https://bugzilla.gnome.org/show_bug.cgi?id=654551
2011-07-13 16:39:50 +01:00
cd7a968093 util: fix a reentrancy problem with meta_later
Calling meta_later_add() or meta_later_remove() from within a
META_LATER_BEFORE_REDRAW callback ended up being a no-op, because of
how run_repaint_laters() was fiddling with the laters list. (This
resulted in a crash in window.c:idle_calc_repaint(), which assumed it
would only be called when a certain queue was non-empty, but was
getting called anyway because of a failed meta_later_remove() call.)

Fix this by having run_repaint_laters() work on a copy of the laters
list instead, and add refcounting to MetaLater so that removing a
later that run_repaint_laters() hasn't gotten to yet won't cause
problems.

https://bugzilla.gnome.org/show_bug.cgi?id=642957
2011-07-13 10:40:41 -04:00
12f71c9795 Improve handling of <Super>key combinations
When we get a press of the overlay key, and then another key is pressed,
first try to handle the combination as a global keybinding. If that fails,
call XAllowEvents(..., ReplayKeyboard, ...) to let it be handled by
our per-window keybindings or by the application.

This requires restructuring things to call XAllowEvents a bit later
so we can pass the right mode.

https://bugzilla.gnome.org/show_bug.cgi?id=624869
2011-07-13 09:44:33 -04:00
b369c75e1b Updated Latvian translation. 2011-07-13 00:25:16 +03:00
739eade4fa Updated Norwegian bokmål translation 2011-07-12 20:07:18 +02:00
d2b63eaf1f fix a crash-on-exit
meta_frames_destroy() was not safe to be called multiple times, which
was causing a crash on exit due to something else changing somewhere
that makes it get called multiple times.

https://bugzilla.gnome.org/show_bug.cgi?id=654489
2011-07-12 13:53:19 -04:00
160 changed files with 31894 additions and 45369 deletions

10
.gitignore vendored
View File

@ -19,6 +19,7 @@ libtool
ltmain.sh
missing
.deps
src/50-mutter-windows.xml
src/mutter-wm.desktop
src/mutter.desktop
*.o
@ -40,6 +41,7 @@ stamp-h1
stamp-it
.intltool-merge-cache
POTFILES
po/*.pot
50-metacity-desktop-key.xml
50-metacity-key.xml
inlinepixbufs.h
@ -47,7 +49,8 @@ libmutter.pc
mutter
mutter-theme-viewer
mutter.desktop
mutter.schemas
org.gnome.mutter.gschema.valid
org.gnome.mutter.gschema.xml
testasyncgetprop
testboxes
testgradient
@ -56,10 +59,13 @@ mutter-mag
mutter-message
mutter-window-demo
focus-window
test-attached
test-gravity
test-resizing
test-size-hints
wm-tester
# We can't say just "wm-tester" here or it will ignore the directory
# rather than the binary
src/wm-tester/wm-tester
INSTALL
mkinstalldirs
src/mutter-enum-types.[ch]

View File

@ -42,10 +42,10 @@ Minimal Building/Testing Environment
build a development version of Metacity -- odds are, you may be able
to build metacity from CVS without building any other modules.
As long as you have gtk+ >= 2.10 and GConf with your distro (gtk+ >=
2.6 if you manually revert the change from bug 348633), you should
be able to install your distro's development packages
(e.g. gtk2-devel, GConf2-devel, startup-notification-devel on
As long as you have gtk+ >= 3.0 and GIO >= 2.25.10 with your distro
(gtk+ >= 2.6 if you manually revert the change from bug 348633), you
should be able to install your distro's development packages
(e.g. gtk2-devel, glib-devel, startup-notification-devel on
Fedora; also, remember to install the gnome-common package which is
needed for building cvs versions of Gnome modules like Metacity) as
well as the standard development tools (gcc, autoconf, automake,

280
NEWS
View File

@ -1,3 +1,283 @@
3.4.0
=====
* Fix crash when a full-screen window is opened [Jasper; #672797]
* Fix memory leaks [Pavel; #672640]
Contributors:
Jasper St. Pierre, Pavel Vasin
Translations:
Marek Černocký, Petr Kovar [cz], Bruno Brouard [fr], Sweta Kothari [gu],
Yaron Shahrabani [he], Changwoo Ryu [kr], Enrico Nicoletto [pt_BR],
Yuri Myasoedov [ru], Muhammet Kara [tr], Nguyễn Thái Ngọc Duy [vi]
3.3.92
======
* Automaximize large windows on map [Adel; #671677]
* When unmaximizing windows, make sure the unminimized size
is signficantly less than the maximized size [Adel; #671677]
* Don't offer maximize option for windows larger than the screen
[Jasper; #643606]
* Always focus the window immediately underneath without restacking
when closing a window [Jasper; #620744]
* Avoid drawing shadows when two windows are tiled together [Rui; #643075]
* Remove tooltips for window decorations [Florian; #645101]
* Add org.gnome.mutter.dynamic-workspaces GSetting - when this is set
to true, workspace counts are never saved to GSettings, avoiding
pointless disk traffic for GNOME dynamic workspaces [Florian; #671568]
* Add ::grab-op-begin, ::grab-op-end signals to MetaDisplay [Jasper; #670658]
* Add meta_display_get_ignored_modifier_mask() [Florian; #665215]
* Remove pointless wrapper methods on MetaPlugin [Jasper; #671103]
* Fix frame drawing with 3.3.x GTK+ releases [Florian; #671796]
* Build fixes [Jasper, Rico, Rui]
* Misc bug fixes [Damien, Jasper, Lionel, Marius, Owen, Rui;
#661256, #667437, #671601, #671087, #672374]
Contributors:
Stefano Facchini, Adel Gadllah, Lionel Landwerlin, Mariusz Libera,
Rui Matos, Florian Müllner, Jasper St. Pierre, Damien Radtke, Owen Taylor,
Rico Tzschichholz
Translations:
Nilamdyuti Goswami [as], Ihar Hrachyshka [be], Alexander Shopov [bg],
David Planella [ca], Carles Ferrando [ca@valencia], Kenneth Nielsen [dk],
Bruce Cowan [en_GB], Daniel Mustieles [es], Mattias Põldaru [et],
Inaki Larranaga Murgoitio [eu], Timo Jyrinki [fi], Fran Diéguez [gl],
Gabor Kelemen [hu], Changwoo Ryu [ko], Anita Reitere [lv],
Kjartan Maraas [nb], Wouter Bolsterlee [nl], A S Alam [pa], Piotr Drąg [pl],
Duarte Loreto [pt], Yuri Myasoedov [ru], Daniel Nylander [se],
Matej Urbančič [sl], Miroslav Nikolić [sr], Tirumurti Vasudevan [ta],
Sasi Bhushan [te], Daniel Korostil [uk], Nguyễn Thái Ngọc Duy [vi],
YunQiang Su [zh_CN], Chao-Hsiung Liao [zh_HK, zh_TW]
3.3.90
======
* Update for Cogl API changes [Robert]
* Bug fixes [Adel, Jasper; #659643]
* Build fixes [Jasper, Owen]
Contributors:
Robert Bragg, Adel Gadllah, Jasper St. Pierre, Owen Taylor
Translations:
Ask H. Larsen [dk], Miroslav Nikolić [sr]
3.3.5
=====
* MetaShapedTexture no longer is a ClutterTexture subclass [Jasper; #660941]
* Add meta_shaped_texture_get_image() [Jasper; #660941]
* Cleanups [Rui, Jasper; #657639]
* Depend on GTK+ 3.3.7 [Rico]
Contributors:
Rui Matos, Jasper St. Pierre, Rico Tzschichholz
Translations:
Kjartan Maraas [nb], Chao-Hsiung Liao [zh_HK, zh_TW]
3.3.4
=====
* Adapt to changes in GtkStateFlags [Owen]
* Redo properties for applications menu corresponding to GTK+ changes -
they are now _GTK_* not DBUS_*. [Ryan]
* Fix crash on gnome-shell restart when a modal dialog is open [Owen; #668299]
* Code cleanup [Florian; #666039]
Contributors:
Ryan Lortie, Florian Müllner, Owen Taylor
Translations:
Alexander Shopov [bg], Fran Diéguez [gl]
3.3.3
=====
* Add keybindings for tiling to left or right [Florian; #648700]
* Support GTK+'s hide-titlebar-when-maximized hint [Florian; #665617]
* Load _DBUS_APPLICATION_ID, _DBUS_UNIQUE_NAME, _DBUS_OBJECT_PATH
property [Colin, Ryan; #664851]
* Handle changes to workspaces-only-on-primary GSetting [Florian; #664853]
* Don't use the Clutter default stage [Jasper; #664028]
* Fix compilation with --disable-introspection [Lionel; #661871]
* Fix problem where stage could end up mis-sized on startup with
multiple monitors [Lionel]
* Misc bug fixes [Adel, Lionel, Jasper; #666015]
Contributors:
Adel Gadllah, Lionel Landwerlin, Florian Müllner, Jasper St. Pierre
Translations:
Daniel Mustieles [es], Yaron Shahrabani [he], Kjartan Maraas [nb],
Matej Urbančič [sk], Muhammet Kara [tr]
3.3.2
=====
* Move from GConf to GSettings for preferences [Florian; #635378]
* Add meta_display_add_keybinding()/meta_display_remove_keybinding()
to allow creating new keybindings at runtime [Florian; #663428]
* Add suport for new _NET_WM_STATE_FOCUSED atom in _NET_WM_STATE
to allow applications to draw unfocused windows differently
[Rui; #661427]
* Add meta_window_move_resize_frame() to allow specifying the
size and position of a window via the outside dimensions of the
window frame.
* Don't activate window tiling when moving in snap mode
[Rui; #662270]
* Remove the ability to resize a window from the inner edge of
the titlebar [Jasper; #660129]
* Fix for deprecations in GTK+ [Jasper, Rico; #662574, #662895]
* Misc bug fixes [Jasper, Rico, Rui; #662895, #642652, #660941, #662225]
Contributors:
Tim Cuthbertson, Rui Matos, Florian Müllner, Jasper St. Pierre, Rico Tzschichholz
Translations:
Jorge González (es), Kjartan Maraas (nb), Krishnababu Krothapalli (te), Nguyễn Thái Ngọc Duy (vi)
3.2.1
=====
* Allow keyboard window switching (alt-Tab) during drag-and-drop
[Matthias, #660457]
* Don't add invisible resize borders to fullscreen windows
[Jasper, Owen; #659854]
* Fix crash when toplevel windows were set to unexpected window types
[Owen; #599988]
* Correct problems with windows moving when restarting or switching
window managers [Jasper; #660848]
* Fix interaction of tiled windows with multiple monitors
[Rui; #642580, #657519]
* Make meta_display_unmanage_screen() public [Jasper; #660848]
* Fix problem with turning off window decorations on the fly [Rui; #660773]
* Fix spurious assertion failures with themes such as Nodoka [Sandro; #661286]
* Misc bug fixes [Adel, Jasper, Rui; #660464, #660854, #662053]
Contributors:
Matthias Clasen, Sandro Mani, Rui Matos, Jasper St. Pierre, Owen Taylor
Translations:
Tommi Vainikainen [fi], Miroslav Nikolić [sr, sr@latin], Muhammet Kara [tr]
3.2.0
=====
* Fix _NET_WM_FRAME_EXTENTS not to include invisible borders [Jasper; #659848]
* Fix application-specified window placement (-geometry) for
invisible borders [Jasper; #659848]
Contributors:
Jasper St. Pierre
Translations:
Nilamdyuti Goswami [as], Carles Ferrando [ca@valencia], Petr Kovar [cz],
Mario Blättermann [de], Inaki Larranaga [eu], Gabor Kelemen [hu],
Takayoshi Okano [ja], Changwoo Ryu [ko], Djavan Fagundes [pt_BR]
3.1.92
======
* Fix bug with unredirecting full-screen windows on multi-monitor -
notably affected gnome-screensaver [Adel; #657869]
* Disable top resizing of attached dialogs [Jasper; #657795]
* Code cleanup [Jasper, Rui]
* Misc bug fixes [Adel, Florian, Jasper, Rui;
#658069, #659266, #659523, #659477]
Contributors:
Adel Gadllah, Rui Matos, Florian Müllner, Jasper St. Pierre
Translations:
Joan Duran [ca], Joe Hansen [dk], Jiro Matsuzawa [ja], Daniel Korostil [uk]
3.1.91.1
========
* Fix problem where certain application updates would get lost [#657071, Owen]
* Fix a problem where after resuming from the screensaver, things got
slow [#658228, Jasper, Adel]
* When a monitor is plugged or unplugged, keep existing windows on their
current monitor [#645408, Alex]
* Remove 'Mutter' title from alerts such as
"The widow '%s' is not responding" [Matthias]
* Remove pointless warning:
Received a _NET_WM_MOVERESIZE message for %s; these
messages lack timestamps and therefore suck.
[Rui]
* Misc bug fixes [Jasper]
* Build fixes [Javier]
Contributors:
Matthias Clasen, Adel Gadllah, Javier Jardón, Alex Larsson, Rui Matos,
Jasper St. Pierre, Owen Taylor
Translations:
Ihar Hrachyshka [be], Bruce Cowan [en_FB], Daniel Mustieles [es],
Claude Paroz [fr], Andika Triwidada [id], Luca Ferretti [it],
Rudolfs Mazurs [lt], Piotr Drąg [pl], Duarte Loreto [pt],
Matej Urbančič [sl], Tirumurti Vasudevan [ta], Chao-Hsiung Liao [zh_KH, TW]
3.1.90.1
========
* Fix crash when no windows are open [Adel; #657692]
* Fix annotations for new strictness in gobject-introspection [Jasper, Owen]
* Fix some errors with rounded frame drawing [Jasper; #657661]
Contributors:
Adel Gadllah, Jasper St. Pierre, Owen Taylor
3.1.90
======
* Extend the draggable portion of window borders outside the visible frame
for easy resizing with thin borders. (New draggable_border_width GConf key
controls the total width of visible and invisible borders.)
[Jasper; #644930]
* Draw rounded window corners with antialising [Jasper; #628195]
* Unredirect override-redirect fullscreen windows, such as full-screen
3D games to avoid any performance impact [Adel; #597014]
* Add :resizable and :above properties to MetaWindow. [Tim; #653858]
* Add MUTTER_DISABLE_FALLBACK_COLOR environment variable to allow visualizing
places where a color is missing for gtk:custom() colors [Florian; #656112]
* Don't attach modal dialogs to special windows like the desktop;
add meta_window_is_attached_dialog() [Dan, #646761]
* Make MetaBackgroundActor public, allow creating multiple instances
(sharing a common texture), and add a :dim-factor property
[Rui, Owen; #656433]
* Fix attached dialogs to not be resizable from the top and to be
position correctly [Jasper; #656619]
* Misc bug fixes [Jasper, Rui; #656335, #657583]
Contributors:
Tim Cuthbertson, Adel Gadllah, Rui Matos, Florian Müllner, Jasper St. Pierre,
Owen Taylor, Dan Winship
Translations:
Alexander Shopov [bg], Jorge González [es], Fran Dieguez [gl],
Yaron Shahrabani [he], Takeshi Aihana [ja], Aurimas Černius [lt],
Kjartan Maraas [nb], A S Alam [pa], Yuri Kozlov [ru], Daniel Nylander [se],
Theppitak Karoonboonyanan [th], Abduxukur Abdurixit [ug], Aron Xu [zh_CN]
3.1.4
=====
* Use better, much more subtle shadow definitions [Jakub; #649374]
* Add the ability to use named GTK+ colors in theme files as
gtk:custom(name,fallback) [Florian; #648709]
* Port from GdkColor to GdkRGBA and from GtkStyle to GtkStyleContext
[Florian; #650586]
* Try to fix window bindings using the Super key [Owen; #624869]
* Update to using more modern Cogl and Clutter APIs
[Adel, Emmanuele, Neil; #654551 #654729 #654730 #655064]
* Fix for srcdir != builddir builds [Thierry; #624910]
* Make handling of focus appearance for attached dialogs more robust
[Dan; #647712]
* Misc bug fixes
[Dan, Florian, Jasper, Owen, Rui; #642957 #649374 #650661 #654489 #654539]
Contributors:
Emmanuele Bassi, Adel Gadllah, Rui Matos, Florian Müllner, Neil Roberts,
Jasper St. Pierre, Jakub Steiner, Owen Taylor
Translations:
Ihar Hrachyshka [be], Jorge González, Daniel Mustieles [es],
Fran Dieguez [gl], Yaron Shahrabani [he], Takeshi Aihana [ja],
Kjartan Maraas [nb], Rudolfs Mazurs [lv], Matej Urbančič [sl],
Abduxukur Abdurixit [ug], Nguyễn Thái Ngọc Duy [vi]
3.1.3.1
=======
* Back API version down to "3.0" - the change to Meta-3.1.gir

29
README
View File

@ -18,8 +18,7 @@ COMPILING MUTTER
You need GTK+ 2.2. For startup notification to work you need
libstartup-notification at
http://www.freedesktop.org/software/startup-notification/ or on the
GNOME ftp site. You also need GConf 1.2 (unless building a funky
extra-small embedded metacity with --disable-gconf, see below).
GNOME ftp site.
You need Clutter 1.0. You need gobject-introspection 0.6.3.
REPORTING BUGS AND SUBMITTING PATCHES
@ -59,25 +58,24 @@ MUTTER FEATURES
and should work with KWin, fvwm2, and other EWMH-compliant WMs.)
- Has a simple theme system and a couple of extra themes come with it.
Change themes via gconf-editor or gconftool or GNOME themes control
panel:
gconftool-2 --type=string --set /apps/metacity/general/theme Crux
gconftool-2 --type=string --set /apps/metacity/general/theme Gorilla
gconftool-2 --type=string --set /apps/metacity/general/theme Atlanta
gconftool-2 --type=string --set /apps/metacity/general/theme Bright
Change themes via gsettings:
gsettings set org.gnome.desktop.wm.preferences theme Crux
gsettings set org.gnome.desktop.wm.preferences theme Gorilla
gsettings set org.gnome.desktop.wm.preferences theme Atlanta
gsettings set org.gnome.desktop.wm.preferences theme Bright
See theme-format.txt for docs on the theme format. Use
metacity-theme-viewer to preview themes.
- Change number of workspaces via gconf-editor or gconftool:
gconftool-2 --type=int --set /apps/metacity/general/num_workspaces 5
- Change number of workspaces via gsettings:
gsettings set org.gnome.desktop.wm.preferences num-workspaces 5
Can also change workspaces from GNOME 2 pager.
- Change focus mode:
gconftool-2 --type=string --set /apps/metacity/general/focus_mode mouse
gconftool-2 --type=string --set /apps/metacity/general/focus_mode sloppy
gconftool-2 --type=string --set /apps/metacity/general/focus_mode click
gsettings set org.gnome.desktop.wm.preferences focus-mode mouse
gsettings set org.gnome.desktop.wm.preferences focus-mode sloppy
gsettings set org.gnome.desktop.wm.preferences focus-mode click
- Global keybinding defaults include:
@ -92,10 +90,9 @@ MUTTER FEATURES
Change keybindings for example:
unst gconftool-2 --type=string --set /apps/metacity/global_keybindings/switch_to_workspace_1 '<Alt>F1'
gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-1 '[<Alt>F1]'
Also try the GNOME keyboard shortcuts control panel, or
gconf-editor.
Also try the GNOME keyboard shortcuts control panel.
- Window keybindings:

View File

@ -1,8 +1,8 @@
AC_PREREQ(2.50)
m4_define([mutter_major_version], [3])
m4_define([mutter_minor_version], [1])
m4_define([mutter_micro_version], [3.1])
m4_define([mutter_minor_version], [4])
m4_define([mutter_micro_version], [0])
m4_define([mutter_version],
[mutter_major_version.mutter_minor_version.mutter_micro_version])
@ -15,9 +15,9 @@ AC_INIT([mutter], [mutter_version],
AC_CONFIG_SRCDIR(src/core/display.c)
AC_CONFIG_HEADERS(config.h)
AM_INIT_AUTOMAKE([dist-bzip2 no-dist-gzip])
AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar])
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],)
AM_MAINTAINER_MODE
AM_MAINTAINER_MODE([enable])
MUTTER_MAJOR_VERSION=mutter_major_version
MUTTER_MINOR_VERSION=mutter_minor_version
@ -61,21 +61,23 @@ AC_CHECK_SIZEOF(__int64)
## byte order
AC_C_BIGENDIAN
GTK_MIN_VERSION=2.91.7
CANBERRA_GTK=libcanberra-gtk3
CANBERRA_GTK_VERSION=0.26
MUTTER_PC_MODULES="gtk+-3.0 >= $GTK_MIN_VERSION pango >= 1.2.0 cairo >= 1.10.0"
CLUTTER_PACKAGE=clutter-1.0
AC_ARG_ENABLE(gconf,
AC_HELP_STRING([--disable-gconf],
[disable gconf usage, for embedded/size-sensitive non-GNOME builds]),,
enable_gconf=yes)
MUTTER_PC_MODULES="
gtk+-3.0 >= 3.3.7
gio-2.0 >= 2.25.10
pango >= 1.2.0
cairo >= 1.10.0
gsettings-desktop-schemas >= 3.3.0
xcomposite >= 0.2 xfixes xrender xdamage
$CLUTTER_PACKAGE >= 1.9.10
cogl-1.0 >= 1.9.6
"
if test x$enable_gconf = xyes; then
AC_DEFINE(HAVE_GCONF,1,[Build with gconf support])
MUTTER_PC_MODULES="$MUTTER_PC_MODULES gconf-2.0 >= 1.2.0"
fi
GLIB_GSETTINGS
AC_ARG_ENABLE(verbose-mode,
AC_HELP_STRING([--disable-verbose-mode],
@ -120,8 +122,8 @@ AM_GLIB_GNU_GETTEXT
# GRegex requires Glib-2.14.0
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0)
# gtk_window_set_icon_name requires gtk2+-2.6.0
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0 >= $GTK_MIN_VERSION)
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0 >= $GTK_MIN_VERSION)
PKG_CHECK_MODULES(MUTTER_MESSAGE, gtk+-3.0)
PKG_CHECK_MODULES(MUTTER_WINDOW_DEMO, gtk+-3.0)
# Unconditionally use this dir to avoid a circular dep with gnomecc
GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings"
@ -171,44 +173,6 @@ else
fi
fi
XCOMPOSITE_VERSION=0.2
AC_MSG_CHECKING([Xcomposite >= $XCOMPOSITE_VERSION])
if $PKG_CONFIG --atleast-version $XCOMPOSITE_VERSION xcomposite; then
MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage"
AC_DEFINE(HAVE_COMPOSITE_EXTENSIONS, 1, [Building with compositing manager support])
echo "Building with compositing manager"
## force on render also
have_xrender=yes
else
AC_MSG_ERROR([no. Mutter requires the Xcomposite extension to build.])
fi
CLUTTER_VERSION=1.2.0
CLUTTER_PACKAGE=clutter-1.0
AC_SUBST(CLUTTER_PACKAGE)
if $PKG_CONFIG --atleast-version $CLUTTER_VERSION $CLUTTER_PACKAGE ; then
MUTTER_PC_MODULES="$MUTTER_PC_MODULES $CLUTTER_PACKAGE "
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
AC_DEFINE(WITH_CLUTTER, , [Building with Clutter compositor])
dnl Check for the clutter-glx-texture-pixmap header
mutter_save_cppflags="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $CLUTTER_CFLAGS"
AC_CHECK_HEADER([clutter/glx/clutter-glx-texture-pixmap.h],
[have_glx_texture_pixmap=yes],
[have_glx_texture_pixmap=no])
CPPFLAGS="$mutter_save_cppflags"
if test x$have_glx_texture_pixmap = xyes; then
AC_DEFINE(HAVE_GLX_TEXTURE_PIXMAP, ,
[Is ClutterGLXTexturePixmap available?])
fi
else
AC_MSG_ERROR([no. Mutter requires Clutter version $CLUTTER_VERSION.])
fi
INTROSPECTION_VERSION=0.9.5
GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
@ -238,35 +202,12 @@ 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)
# This is used for plugins
AC_SUBST(CLUTTER_PACKAGE)
PKG_CHECK_MODULES(CLUTTER, $CLUTTER_PACKAGE)
AC_PATH_XTRA
ALL_X_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
@ -440,18 +381,6 @@ fi
AC_SUBST(GDK_PIXBUF_CSOURCE)
if test x$enable_gconf = xyes; then
AC_PATH_PROG(GCONFTOOL, gconftool-2, no)
if test x"$GCONFTOOL" = xno; then
AC_MSG_ERROR([gconftool-2 executable not found in your path - should be installed with GConf])
fi
AM_GCONF_SOURCE_2
else
GCONF_SCHEMAS_INSTALL_TRUE='#'
GCONF_SCHEMAS_INSTALL_FALSE=
fi
AC_PATH_PROG(ZENITY, zenity, no)
if test x"$ZENITY" = xno; then
AC_MSG_ERROR([zenity not found in your path - needed for dialogs])
@ -529,7 +458,7 @@ if test "$enable_compile_warnings" != no ; then
if test "$enable_compile_warnings" = error; then
case " $CFLAGS " in
*[\ \ ]-Werror[\ \ ]*) ;;
*) CFLAGS="$CFLAGS -Werror" ;;
*) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;;
esac
fi
fi
@ -551,13 +480,6 @@ po/Makefile.in
AC_OUTPUT
if test x$enable_gconf = xno; then
echo "*** WARNING WARNING WARNING WARNING WARNING"
echo "*** Building without GConf. This means there's no"
echo "*** way to change prefs except hacking source code."
echo "*** This is intended for embedded systems etc., not for normal use."
fi
if test x$enable_verbose_mode = xno; then
echo "*** WARNING WARNING WARNING WARNING WARNING"
echo "*** Building without verbose mode"
@ -574,7 +496,6 @@ mutter-$VERSION
source code location: ${srcdir}
compiler: ${CC}
GConf: ${enable_gconf}
XFree86 Xinerama: ${use_xfree_xinerama}
Solaris Xinerama: ${use_solaris_xinerama}
Startup notification: ${have_startup_notification}
@ -584,7 +505,6 @@ mutter-$VERSION
Shape extension: ${found_shape}
Xsync: ${found_xsync}
Xcursor: ${have_xcursor}
XInput2: ${have_xinput2}
"
@ -592,8 +512,8 @@ MUTTER_MINOR_VERSION=mutter_minor_version
if expr $MUTTER_MINOR_VERSION % 2 > /dev/null ; then
stable_version=`expr $MUTTER_MINOR_VERSION - 1`
echo "This is the UNSTABLE branch of mutter"
echo -n "Use 2.$stable_version.x for stable "
echo "(gnome-2-$stable_version branch in git)"
echo -n "Use 3.$stable_version.x for stable "
echo "(gnome-3-$stable_version branch in git)"
else
echo "This is the stable branch of mutter"
fi

View File

@ -31,8 +31,7 @@ workspaces. In these cases, there needs to be a rule consistent with
the above about the new window to choose.
Focus method Behavior
click Focus the most recently used window (same as the window
on top)
click Focus the window on top
sloppy Focus the window containing the pointer if there is such
a window, otherwise focus the most recently used window.
mouse Focus the non-DESKTOP window containing the pointer if

View File

@ -46,13 +46,13 @@ because the original program does not have a manual page.
Restart \fBmutter\fP(1) which is running.
.TP
.B reload-theme
Reload a theme which is specified on gconf database.
Reload a theme which is specified on gsettings database.
.TP
.B enable-keybindings
Enable all of keybindings which is specified on gconf database.
Enable all of keybindings which is specified on gsettings database.
.TP
.B disable-keybindings
Disable all of keybindings which is specified on gconf database.
Disable all of keybindings which is specified on gsettings database.
.SH SEE ALSO
.BR mutter (1)
.SH AUTHOR

View File

@ -51,7 +51,7 @@ Print the version number.
.B \-?, \-\-help
Show summary of options.
.SH CONFIGURATION
\fBmutter\fP configuration can be found under \fIPreferences\fP->\fIWindows\fP and \fIPreferences\fP->\fIKeyboard Shortcuts\fP on the menu-panel. Advanced configuration can be achieved directly through gconf editing (gconf-editor or gconftool-2).
\fBmutter\fP configuration can be found under \fIPreferences\fP->\fIWindows\fP and \fIPreferences\fP->\fIKeyboard Shortcuts\fP on the menu-panel. Advanced configuration can be achieved directly through gsettings.
.SH SEE ALSO
.BR mutter-message (1)
.SH AUTHOR

View File

@ -1,7 +1,7 @@
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
src/50-mutter-windows.xml.in
src/compositor/compositor.c
src/core/all-keybindings.h
src/core/bell.c
src/core/core.c
src/core/delete.c
@ -19,7 +19,7 @@ src/core/window-props.c
src/core/xprops.c
src/mutter.desktop.in
src/mutter-wm.desktop.in
src/mutter.schemas.in
src/org.gnome.mutter.gschema.xml.in
src/tools/mutter-message.c
src/ui/frames.c
src/ui/menu.c

3547
po/as.po

File diff suppressed because it is too large Load Diff

1083
po/be.po

File diff suppressed because it is too large Load Diff

870
po/bg.po

File diff suppressed because it is too large Load Diff

1205
po/ca.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1019
po/cs.po

File diff suppressed because it is too large Load Diff

2749
po/da.po

File diff suppressed because it is too large Load Diff

389
po/de.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1551
po/es.po

File diff suppressed because it is too large Load Diff

480
po/et.po
View File

@ -7,253 +7,39 @@
#
# Tõivo Leedjärv <toivo linux ee>, 2004.
# Ivar Smolin <okul linux ee>, 2005, 2006, 20092011.
# Mattias Põldaru <mahfiaz gmail com>, 20082011.
# Mattias Põldaru <mahfiaz@gmail.com>, 20082011, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: mutter MASTER\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&component=general\n"
"POT-Creation-Date: 2011-03-07 23:35+0000\n"
"PO-Revision-Date: 2011-03-09 06:41+0200\n"
"Last-Translator: Ivar Smolin <okul@linux.ee>\n"
"Language-Team: Estonian <gnome-et@linux.ee>\n"
"product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-03-11 22:19+0000\n"
"PO-Revision-Date: 2012-03-12 00:47+0200\n"
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
"Language-Team: Estonian <>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
msgid "Switch to workspace 1"
msgstr "Lülitumine 1. tööalale"
msgid "Windows"
msgstr "Aknad"
msgid "Switch to workspace 2"
msgstr "Lülitumine 2. tööalale"
msgid "View split on left"
msgstr "Vaade poolitatakse vasakult"
msgid "Switch to workspace 3"
msgstr "Lülitumine 3. tööalale"
msgid "View split on right"
msgstr "Vaade poolitatakse paremalt"
msgid "Switch to workspace 4"
msgstr "Lülitumine 4. tööalale"
msgid "Switch to workspace 5"
msgstr "Lülitumine 5. tööalale"
msgid "Switch to workspace 6"
msgstr "Lülitumine 6. tööalale"
msgid "Switch to workspace 7"
msgstr "Lülitumine 7. tööalale"
msgid "Switch to workspace 8"
msgstr "Lülitumine 8. tööalale"
msgid "Switch to workspace 9"
msgstr "Lülitumine 9. tööalale"
msgid "Switch to workspace 10"
msgstr "Lülitumine 10. tööalale"
msgid "Switch to workspace 11"
msgstr "Lülitumine 11. tööalale"
msgid "Switch to workspace 12"
msgstr "Lülitumine 12. tööalale"
msgid "Switch to workspace on the left of the current workspace"
msgstr "Lülitumine sellest tööalast vasakul olevale tööalale"
msgid "Switch to workspace on the right of the current workspace"
msgstr "Lülitumine sellest tööalast paremal olevale tööalale"
msgid "Switch to workspace above the current workspace"
msgstr "Lülitumine selle tööala kohal olevale tööalale"
msgid "Switch to workspace below the current workspace"
msgstr "Lülitumine selle tööala all olevale tööalale"
msgid "Move between windows of an application, using a popup window"
msgstr "Liigu rakenduse akende vahel, hüpikaknaga"
msgid "Move backward between windows of an application, using a popup window"
msgstr "Liigu rakenduse akende vahel tagasisuunas, hüpikaknaga"
msgid "Move between windows, using a popup window"
msgstr "Liigu akende vahel, hüpikaknaga"
msgid "Move backward between windows, using a popup window"
msgstr "Liigu akende vahel tagasisuunas, hüpikaknaga"
msgid "Move between panels and the desktop, using a popup window"
msgstr "Liigu paneelide ja töölaua vahel, hüpikaknaga"
msgid "Move backward between panels and the desktop, using a popup window"
msgstr "Liigu tagasisuunas paneelide ja töölaua vahel, hüpikaknaga"
msgid "Move between windows of an application immediately"
msgstr "Liigu koheselt rakenduse akende vahel"
msgid "Move backward between windows of an application immediately"
msgstr "Liigu koheselt rakenduse akende vahel tagasisuunas"
msgid "Move between windows immediately"
msgstr "Liigu koheselt akende vahel"
msgid "Move backward between windows immediately"
msgstr "Liigu koheselt akende vahel tagasisuunas"
msgid "Move between panels and the desktop immediately"
msgstr "Liigu koheselt paneeli ja töölaua vahel"
msgid "Move backward between panels and the desktop immediately"
msgstr "Liigu koheselt tagasisuunas paneelide ja töölaua vahel"
msgid "Hide all normal windows and set focus to the desktop"
msgstr "Peida kõik tavalised aknad ja fokuseeri töölaud"
msgid "Show the panel's main menu"
msgstr "Paneeli peamenüü näitamine"
msgid "Show the panel's \"Run Application\" dialog box"
msgstr "Paneeli dialoogi \"Käivita rakendus\" näitamine"
msgid "Start or stop recording the session"
msgstr "Seansi salvestamise käivitamine või seiskamine"
msgid "Take a screenshot"
msgstr "Kuvatõmmise võtmine"
msgid "Take a screenshot of a window"
msgstr "Kuvatõmmise võtmine aknast"
msgid "Run a terminal"
msgstr "Terminali käivitamine"
msgid "Activate the window menu"
msgstr "Aknamenüü aktiveerimine"
msgid "Toggle fullscreen mode"
msgstr "Täisekraanivaate sisse- ja väljalülitamine"
msgid "Toggle maximization state"
msgstr "Maksimeeritud oleku sisse- ja väljalülitamine"
msgid "Toggle whether a window will always be visible over other windows"
msgstr "Lüliti määrab, kas aken on alati teiste akende kohal nähtav"
msgid "Maximize window"
msgstr "Akna maksimeerimine"
msgid "Restore window"
msgstr "Taasta akna suurus"
msgid "Toggle shaded state"
msgstr "Varjatud oleku lüliti"
msgid "Minimize window"
msgstr "Akna minimeerimine"
msgid "Close window"
msgstr "Akna sulgemine"
msgid "Move window"
msgstr "Teisalda aken"
msgid "Resize window"
msgstr "Muuda akna suurust"
msgid "Toggle whether window is on all workspaces or just one"
msgstr "Lüliti määrab, kas aken on kõigil tööaladel või ainult ühel"
msgid "Move window to workspace 1"
msgstr "Akna tõstmine 1. tööalale"
msgid "Move window to workspace 2"
msgstr "Akna tõstmine 2. tööalale"
msgid "Move window to workspace 3"
msgstr "Akna tõstmine 3. tööalale"
msgid "Move window to workspace 4"
msgstr "Akna tõstmine 4. tööalale"
msgid "Move window to workspace 5"
msgstr "Akna tõstmine 5. tööalale"
msgid "Move window to workspace 6"
msgstr "Akna tõstmine 6. tööalale"
msgid "Move window to workspace 7"
msgstr "Akna tõstmine 7. tööalale"
msgid "Move window to workspace 8"
msgstr "Akna tõstmine 8. tööalale"
msgid "Move window to workspace 9"
msgstr "Akna tõstmine 9. tööalale"
msgid "Move window to workspace 10"
msgstr "Akna tõstmine 10. tööalale"
msgid "Move window to workspace 11"
msgstr "Akna tõstmine 11. tööalale"
msgid "Move window to workspace 12"
msgstr "Akna tõstmine 12. tööalale"
msgid "Move window one workspace to the left"
msgstr "Akna tõstmine ühe tööala võrra vasakule"
msgid "Move window one workspace to the right"
msgstr "Akna tõstmine ühe tööala võrra paremale"
msgid "Move window one workspace up"
msgstr "Akna tõstmine ühe tööala võrra ülespoole"
msgid "Move window one workspace down"
msgstr "Akna tõstmine ühe tööala võrra allapoole"
msgid "Raise window if it's covered by another window, otherwise lower it"
msgstr "Tõsta aken, kui seda katab teine aken, muul juhul vii tahapoole"
msgid "Raise window above other windows"
msgstr "Akna tõstmine teiste akende kohale"
msgid "Lower window below other windows"
msgstr "Saada aken teiste taha"
msgid "Maximize window vertically"
msgstr "Maksimeeri aken vertikaalselt"
msgid "Maximize window horizontally"
msgstr "Maksimeeri aken horisontaalselt"
msgid "Move window to north-west (top left) corner"
msgstr "Akna tõstmine ekraani loodepoolsesse (ülemisse vasakusse) nurka"
msgid "Move window to north-east (top right) corner"
msgstr "Akna tõstmine ekraani kirdepoolsesse (ülemisse paremasse) nurka"
msgid "Move window to south-west (bottom left) corner"
msgstr "Akna tõstmine ekraani edelapoolsesse (alumisse vasakusse) nurka"
msgid "Move window to south-east (bottom right) corner"
msgstr "Akna tõstmine ekraani kagupoolsesse (alumisse paremasse) nurka"
msgid "Move window to north (top) side of screen"
msgstr "Akna tõstmine ekraani põhjapoolsesse (ülemisse) serva"
msgid "Move window to south (bottom) side of screen"
msgstr "Akna tõstmine ekraani lõunapoolsesse (alumisse) serva"
msgid "Move window to east (right) side of screen"
msgstr "Akna tõstmine ekraani idapoolsesse (paremasse) serva"
msgid "Move window to west (left) side of screen"
msgstr "Akna tõstmine ekraani läänepoolsesse (vasakusse) serva"
msgid "Move window to center of screen"
msgstr "Akna tõstmine ekraani keskele"
#. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit
#, c-format
msgid ""
"Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr "Teine komposiithaldur juba töötab ekraani %i kuval \"%s\"."
msgid "Bell event"
msgstr "Helina sündmus"
@ -262,11 +48,13 @@ msgstr "Helina sündmus"
msgid "Unknown window information request: %d"
msgstr "Tundmatu aknateabe päring: %d"
#. Translators: %s is a window title
#, c-format
msgid "<tt>%s</tt> is not responding."
msgstr "<tt>%s</tt> ei vasta."
msgid "Application is not responding."
msgstr "Rakendus ei vasta."
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
@ -294,27 +82,6 @@ msgstr ""
"Mõni teine programm juba kasutab klahvi %s koos muuteklahvidega %x "
"kiirklahvina\n"
#. Displayed when a keybinding which is
#. * supposed to launch a program fails.
#.
#, c-format
msgid ""
"There was an error running <tt>%s</tt>:\n"
"\n"
"%s"
msgstr ""
"<tt>%s</tt> käivitamisel esines viga:\n"
"\n"
"%s"
#, c-format
msgid "No command %d has been defined.\n"
msgstr "Käsku %d pole defineeritud.\n"
#, c-format
msgid "No terminal command has been defined.\n"
msgstr "Terminalikäsku pole defineeritud.\n"
msgid "Disable connection to session manager"
msgstr "Seansihalduriga ühendumise keelamine"
@ -364,39 +131,6 @@ msgstr "Versiooni printimine"
msgid "Comma-separated list of compositor plugins"
msgstr "Komaga eraldatud nimekiri komposiitmontaaži pluginatest"
#.
#. * We found it, but it was invalid. Complain.
#. *
#. * FIXME: This replicates the original behaviour, but in the future
#. * we might consider reverting invalid keys to their original values.
#. * (We know the old value, so we can look up a suitable string in
#. * the symtab.)
#. *
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "GConf võtme '%s' väärtus on vigane\n"
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr ""
"%d, mis on salvestatud GConf võtmes %s, on väljaspool piirkonda %d - %d\n"
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "GConf-i võti \"%s\" on määratud vigase tüübiga\n"
#, c-format
msgid "GConf key %s is already in use and can't be used to override %s\n"
msgstr ""
"GConfi võti %s on juba kasutusel ja sellega ei saa tühistada võtit %s\n"
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "GConfi võtit pole võimalik tühistada, võtit %s ei leitud\n"
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@ -405,8 +139,8 @@ msgstr ""
"ei pruugi õigesti käituda.\n"
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr "Fondi kirjeldust \"%s\" GConf võtmest %s ei saa töödelda\n"
msgid "Could not parse font description \"%s\" from GSettings key %s\n"
msgstr "Fondi kirjeldust \"%s\" GSettings võtmest %s pole võimalik töödelda\n"
#, c-format
msgid ""
@ -416,14 +150,6 @@ msgstr ""
"Seadistuste andmebaasist leitud \"%s\" ei ole sobiv väärtus hiireklahvi "
"modifikaatoriks\n"
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "Viga tööalade arvuks %d määramisel: %s\n"
#, c-format
msgid "Workspace %d"
msgstr "Tööala %d"
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@ -433,16 +159,8 @@ msgstr ""
"\"\n"
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr "Viga tööalale %d nime \"%s\" määramisel: %s\n"
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr "Viga varjus elushoitavate akende oleku määramisel: %s\n"
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr ""
msgid "Workspace %d"
msgstr "Tööala %d"
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
@ -540,10 +258,6 @@ msgstr "Aknahalduri hoiatus: "
msgid "Window manager error: "
msgstr "Aknahalduri viga: "
#. Translators: This is the title used on dialog boxes
msgid "Mutter"
msgstr "Mutter"
#. first time through
#, c-format
msgid ""
@ -581,6 +295,12 @@ msgstr "%s (masinas %s)"
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Vigane WM_TRANSIENT_FOR aknale 0x%lx määratud %s jaoks.\n"
#, c-format
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
msgstr ""
"WM_TRANSIENT_FOR aknale 0x%lx määratud %s jaoks tekitaks tsüklilise "
"korduse.\n"
#, c-format
msgid ""
"Window 0x%lx has property %s\n"
@ -604,18 +324,8 @@ msgid ""
"Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n"
msgstr "Omadus %s aknal 0x%lx sisaldab vigast UTF-8 %d kirjele nimekirjas\n"
msgid "Attach modal dialogs"
msgstr "Modaaldialoogide kinnistamine"
msgid ""
"Determines whether hidden windows (i.e., minimized windows and windows on "
"other workspaces than the current one) should be kept alive."
msgstr ""
"Määrab, kas varjatud aknaid (nt minimeeritud ja teistel tööaladel aknad) "
"hoitakse elus."
msgid "Live Hidden Windows"
msgstr "Varjatud akende aktiivsus"
msgid "Mutter"
msgstr "Mutter"
msgid "Modifier to use for extended window management operations"
msgstr "Laiendatud aknaoperatsioonide korral kasutatav muuteklahv"
@ -632,6 +342,9 @@ msgstr ""
"klahv\". Eeldatavasti määratakse selle seose väärtuseks vaikimisi või tühi "
"sõne."
msgid "Attach modal dialogs"
msgstr "Modaaldialoogide kinnistamine"
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
@ -640,6 +353,75 @@ msgstr ""
"Kui märgitud, siis eraldi tiitliribade asemel on moodaalsed dialoogid "
"emaakna tiitliribade küljes ning liiguvad koos emaaknaga."
msgid "Live Hidden Windows"
msgstr "Varjatud akende aktiivsus"
msgid ""
"Determines whether hidden windows (i.e., minimized windows and windows on "
"other workspaces than the current one) should be kept alive."
msgstr ""
"Määrab, kas varjatud aknaid (nt minimeeritud ja teistel tööaladel aknad) "
"hoitakse elus."
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Akna ümberpaigutamine selle lohistamisel ekraani serva"
msgid ""
"If enabled, dropping windows on vertical screen edges maximizes them "
"vertically and resizes them horizontally to cover half of the available "
"area. Dropping windows on the top screen edge maximizes them completely."
msgstr ""
"Kui märgitud, siis akna lohistamine ekraani külgservale maksimeerib selle "
"vertikaalselt ja laius katab pool saadaolevast laiusest. Akna lohistamine "
"ekraani ülaserva maksimeerib akna täielikult."
msgid "Workspaces are managed dynamically"
msgstr "Tööalade dünaamiline haldus"
msgid ""
"Determines whether workspaces are managed dynamically or whether there's a "
"static number of workspaces (determined by the num-workspaces key in org."
"gnome.desktop.wm.preferences)."
msgstr ""
"Määrab, kas tööalasid hallatakse dünaamiliselt või on nende arv staatiline "
"(arvu määrab org.gnome.desktop.wm.preferences all võti num-workspaces)."
msgid "Workspaces only on primary"
msgstr "Tööalad ainult peamisel"
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
msgstr ""
"Määrab, kas tööalade vahetamine mõjutab kõiki aknaid kõigil monitoridel või "
"ainult aknaid peamisel monitoril."
msgid "No tab popup"
msgstr "Tabulaatoril pole hüpikakent"
msgid ""
"Determines whether the use of popup and highlight frame should be disabled "
"for window cycling."
msgstr ""
"Kui märgitud, siis on hüpikaken ja esiletõstmise raam keelatud akende "
"vahetamisel."
msgid "Draggable border width"
msgstr "Lohistatava äärise laius."
msgid ""
"The amount of total draggable borders. If the theme's visible borders are "
"not enough, invisible borders will be added to meet this value."
msgstr ""
"Lohistatava äärise laius. Kui kujunduse nähtavatest ääristest ei piisa, "
"lisatakse puuduoleva osa jaoks nähtamatu ääris."
msgid "Select window from tab popup"
msgstr "Akna valimine tabulaatori hüpikaknalt"
msgid "Cancel tab popup"
msgstr "Tabulaatori hüpikakna katkestamine"
#, c-format
msgid "Usage: %s\n"
msgstr "Kasutamine: %s\n"
@ -877,6 +659,30 @@ msgstr "Raami geomeetria ei määra nuppude suurust"
msgid "Gradients should have at least two colors"
msgstr "Värviüleminekus peaks olema vähemalt kaks värvi"
#, c-format
msgid ""
"GTK custom color specification must have color name and fallback in "
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
msgstr ""
"GTK kohandatud värvi määrang peab sisaldama sulgudes värvi nimetust ning "
"varuvärvi, nt gtk:custom(foo,bar); väärtust \"%s\" pole võimalik töödelda"
#, c-format
msgid ""
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
"_ are valid"
msgstr ""
"gtk:custom color_name parameetris sobimatu märk '%c', lubatud on ainult A-Za-"
"z0-9-_"
#, c-format
msgid ""
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
"fit the format"
msgstr ""
"Gtk:custom vorming on \"gtk:custom(värvi_nimi,varuvärv)\", \"%s\" ei sobi "
"selle vorminguga"
#, c-format
msgid ""
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
@ -1511,25 +1317,3 @@ msgstr "y väärtus oli %d, oodati väärtust %d"
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
msgstr ""
"%d koordinaatide avaldis töödeldi %g sekundiga (keskmine %g sekundit)\n"
#~ msgid ""
#~ "Don't make fullscreen windows that are maximized and have no decorations"
#~ msgstr "Ei tehta maksimeeritud ilma raamita täisekraanaknaid."
#~ msgid "Whether window popup/frame should be shown when cycling windows."
#~ msgstr "Kas hüpikakent/raami näidatakse akende vahetamisel."
#~ msgid "Internal argument for GObject introspection"
#~ msgstr "GObject enesevaatluse siseargument"
#~ msgid "Failed to restart: %s\n"
#~ msgstr "Tõrge taaskäivitamisel: %s\n"
#~ msgid "Error setting clutter plugin list: %s\n"
#~ msgstr "Viga clutteri pluginate nimekirja määramisel: %s\n"
#~ msgid "Clutter Plugins"
#~ msgstr "Clutteri pluginad"
#~ msgid "Plugins to load for the Clutter-based compositing manager."
#~ msgstr "Clutteril põhineva komposiitmontaažihalduri laadimise pluginad."

1207
po/eu.po

File diff suppressed because it is too large Load Diff

2224
po/fi.po

File diff suppressed because it is too large Load Diff

902
po/fr.po

File diff suppressed because it is too large Load Diff

1113
po/gl.po

File diff suppressed because it is too large Load Diff

1368
po/gu.po

File diff suppressed because it is too large Load Diff

1490
po/he.po

File diff suppressed because it is too large Load Diff

1155
po/hu.po

File diff suppressed because it is too large Load Diff

673
po/id.po

File diff suppressed because it is too large Load Diff

398
po/it.po
View File

@ -11,15 +11,26 @@ msgstr ""
"Project-Id-Version: mutter 2.9x\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-22 22:52+0100\n"
"POT-Creation-Date: 2011-09-06 16:52+0000\n"
"PO-Revision-Date: 2011-09-08 21:56+0200\n"
"Last-Translator: Luca Ferretti <lferrett@gnome.org>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
"Language-Team: Italiano <tp@lists.linux.it>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Content-Transfer-Encoding: 8bits\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\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:486
#, c-format
msgid ""
"Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr ""
"Un altro compositing manager è già in esecuzione sullo schermo %i sul "
"display «%s»."
# questo e i successivi presi dallo stesso
# file vanno a comparire in
@ -355,13 +366,16 @@ msgstr "Evento campanella"
msgid "Unknown window information request: %d"
msgstr "Richiesta informazioni finestra sconosciuta: %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 "Nessuna risposta da <tt>%s</tt>."
#: ../src/core/delete.c:99
#: ../src/core/delete.c:114
msgid "Application is not responding."
msgstr "L'applicazione non risponde."
#: ../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."
@ -369,11 +383,11 @@ msgstr ""
"È possibile scegliere di attendere un po' lasciando che l'applicazione "
"continui, oppure forzare la terminazione dell'applicazione."
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Wait"
msgstr "_Attendi"
#: ../src/core/delete.c:108
#: ../src/core/delete.c:126
msgid "_Force Quit"
msgstr "_Forza uscita"
@ -399,7 +413,7 @@ msgstr ""
#. Displayed when a keybinding which is
#. * supposed to launch a program fails.
#.
#: ../src/core/keybindings.c:2468
#: ../src/core/keybindings.c:2523
#, c-format
msgid ""
"There was an error running <tt>%s</tt>:\n"
@ -410,13 +424,13 @@ msgstr ""
"\n"
"%s."
#: ../src/core/keybindings.c:2558
#: ../src/core/keybindings.c:2613
#, c-format
msgid "No command %d has been defined.\n"
msgstr "Non è stato definito alcuno comando %d.\n"
# "comando di terminale" o "comando «terminal»" ???
#: ../src/core/keybindings.c:3570
#: ../src/core/keybindings.c:3625
#, c-format
msgid "No terminal command has been defined.\n"
msgstr "Non è stato definito alcun comando di terminale.\n"
@ -445,12 +459,12 @@ msgstr "Inizializza la sessione da file salvato"
msgid "Make X calls synchronous"
msgstr "Rende le chiamate X sincrone"
#: ../src/core/main.c:506
#: ../src/core/main.c:504
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "Scansione della directory dei temi non riuscita: %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"
@ -492,38 +506,38 @@ msgstr "Elenco separato da virgole dei plugin del compositor"
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
#: ../src/core/prefs.c:550 ../src/core/prefs.c:711
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "La chiave GConf «%s» è impostata ad un valore non valido\n"
# lasciato "Il valore" iniziale che c'era in precendeza
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
#: ../src/core/prefs.c:637 ../src/core/prefs.c:880
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr ""
"Il valore %d memorizzato nella chiave GConf %s è fuori dall'intervallo da %d "
"a %d\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:681 ../src/core/prefs.c:758 ../src/core/prefs.c:806
#: ../src/core/prefs.c:870 ../src/core/prefs.c:1331 ../src/core/prefs.c:1347
#: ../src/core/prefs.c:1364 ../src/core/prefs.c:1380
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "La chiave GConf «%s» è impostata ad un tipo non valido\n"
#: ../src/core/prefs.c:1203
#: ../src/core/prefs.c:1210
#, c-format
msgid "GConf key %s is already in use and can't be used to override %s\n"
msgstr ""
"La chiave GConf %s è già in uso e non può essere usata per scavalcare %s\n"
#: ../src/core/prefs.c:1262
#: ../src/core/prefs.c:1269
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "Impossibile scavalcare la chiave GConf, %s non trovato\n"
#: ../src/core/prefs.c:1447
#: ../src/core/prefs.c:1454
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@ -531,14 +545,14 @@ msgstr ""
"Disabilitate le funzionalità palliative per la applicazioni difettose. "
"Alcune applicazioni potrebbero avere comportamenti errati.\n"
#: ../src/core/prefs.c:1524
#: ../src/core/prefs.c:1531
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr ""
"Impossibile analizzare la descrizione del tipo di carattere «%s» dalla "
"chiave GConf %s\n"
"Impossibile analizzare la descrizione del tipo di carattere «%s» dalla chiave "
"GConf %s\n"
#: ../src/core/prefs.c:1586
#: ../src/core/prefs.c:1593
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@ -547,57 +561,57 @@ msgstr ""
"Il valore «%s» trovato nel database di configurazione non è valido per il "
"modificatore del tasto del mouse\n"
#: ../src/core/prefs.c:2016
#: ../src/core/prefs.c:2028
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "Errore nell'impostare il numero di spazi di lavoro a %d: %s\n"
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
#: ../src/core/prefs.c:2212 ../src/core/prefs.c:2714
#, c-format
msgid "Workspace %d"
msgstr "Spazio di lavoro %d"
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
#: ../src/core/prefs.c:2244 ../src/core/prefs.c:2422
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
"\"%s\"\n"
msgstr ""
"Il valore «%s» nel database di configurazione non è valido per "
"l'associazione di tasti «%s»\n"
"Il valore «%s» nel database di configurazione non è valido per l'associazione "
"di tasti «%s»\n"
#: ../src/core/prefs.c:2783
#: ../src/core/prefs.c:2795
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr "Errore nell'impostare il nome dello spazio di lavoro %d a «%s»: %s\n"
# eeeehhh????
#: ../src/core/prefs.c:2997
#: ../src/core/prefs.c:3009
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr "Errore nell'impostare lo stato \"stato finestre live nascoste\": %s\n"
# eeeehhh????
#: ../src/core/prefs.c:3032
#: ../src/core/prefs.c:3044
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr "Errore nell'impostare lo stato \"niente tab popup\": %s\n"
#: ../src/core/screen.c:623
#: ../src/core/screen.c:663
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Lo schermo %d nel display «%s» non è valido\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 ""
"Lo schermo %d sul display «%s» ha già un window manager; provare a "
"utilizzare l'opzione --replace per sostituirlo.\n"
"Lo schermo %d sul display «%s» ha già un window manager; provare a utilizzare "
"l'opzione --replace per sostituirlo.\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"
@ -605,66 +619,66 @@ msgstr ""
"Impossibile acquisire la selezione del window manager per lo schermo %d nel "
"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 "Lo schermo %d sul display «%s» ha già un window manager\n"
#: ../src/core/screen.c:906
#: ../src/core/screen.c:946
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "Impossibile rilasciare lo schermo %d sul 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 "Impossibile creare la directory «%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 "Impossibile aprire il file di sessione «%s» in scrittura: %s\n"
#: ../src/core/session.c:995
#: ../src/core/session.c:1001
#, c-format
msgid "Error writing session file '%s': %s\n"
msgstr "Errore nello scrivere il file di sessione «%s»: %s\n"
#: ../src/core/session.c:1000
#: ../src/core/session.c:1006
#, c-format
msgid "Error closing session file '%s': %s\n"
msgstr "Errore nel chiudere il file di sessione «%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 "Analisi del file della sessione salvato non riuscita: %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 ""
"Attributo <mutter_session> individuato, ma è già presente un ID della "
"sessione"
#: ../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 "Attributo %s sconosciuto per l'elemento <%s>"
#: ../src/core/session.c:1209
#: ../src/core/session.c:1215
#, c-format
msgid "nested <window> tag"
msgstr "tag <window> annidato"
#: ../src/core/session.c:1451
#: ../src/core/session.c:1457
#, c-format
msgid "Unknown element %s"
msgstr "Elemento %s sconosciuto"
#: ../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."
@ -693,30 +707,24 @@ msgid "Mutter was compiled without support for verbose mode\n"
msgstr ""
"Mutter è stato compilato escludendo il supporto per la modalità prolissa\n"
#: ../src/core/util.c:286
#: ../src/core/util.c:290
msgid "Window manager: "
msgstr "Window manager: "
#: ../src/core/util.c:434
#: ../src/core/util.c:438
msgid "Bug in window manager: "
msgstr "Bug nel window manager: "
#: ../src/core/util.c:467
#: ../src/core/util.c:471
msgid "Window manager warning: "
msgstr "Avviso del window manager: "
#: ../src/core/util.c:495
#: ../src/core/util.c:499
msgid "Window manager error: "
msgstr "Errore del window manager: "
#. Translators: This is the title used on dialog boxes
#: ../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:6752
#: ../src/core/window.c:7019
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@ -732,11 +740,11 @@ 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:7682
#, 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 ""
"La finestra %s ha impostato un hint MWM indicando che non è "
"ridimensionabile, ma ha impostato la dimensione minima %d x %d e la "
@ -754,11 +762,18 @@ msgstr "%s (su %s)"
# Sì, direi che è oscuro -Luca
#
#: ../src/core/window-props.c:1479
#: ../src/core/window-props.c:1481
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr "Specificato un WM_TRANSIENT_FOR finestra 0x%lx non valido per %s.\n"
# Sì, direi che è oscuro -Luca
#
#: ../src/core/window-props.c:1492
#, c-format
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
msgstr "WM_TRANSIENT_FOR finestra 0x%lx per %s potrebbe creare un loop.\n"
#: ../src/core/xprops.c:155
#, c-format
msgid ""
@ -787,6 +802,10 @@ msgstr ""
"La proprietà %s sulla finestra 0x%lx contiene UTF-8 non valido per "
"l'elemento %d nella lista\n"
#: ../src/mutter.desktop.in.h:1 ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#: ../src/mutter.schemas.in.h:1
msgid "Attach modal dialogs"
msgstr "Dialoghi modali attaccati"
@ -811,14 +830,27 @@ msgstr ""
"tutti i monitor oppure solo per le finestre sul monitor primario."
#: ../src/mutter.schemas.in.h:4
msgid "Draggable border width"
msgstr "Larghezza bordo trascinabile"
#: ../src/mutter.schemas.in.h:5
msgid "Live Hidden Windows"
msgstr "Finestre nascoste live"
#: ../src/mutter.schemas.in.h:5
#: ../src/mutter.schemas.in.h:6
msgid "Modifier to use for extended window management operations"
msgstr "Modificatore da utilizzare per le azioni di gestione finestre estese"
#: ../src/mutter.schemas.in.h:6
#: ../src/mutter.schemas.in.h:7
msgid ""
"The amount of total draggable borders. If the theme's visible borders are "
"not enough, invisible borders will be added to meet this value."
msgstr ""
"Lo spessore effettivo totale per i bordi trascinabili. Se i bordi visibili "
"del tema non sono sufficienti, vengono aggiunti dei bordi invisibili per "
"raggiungere questo valore."
#: ../src/mutter.schemas.in.h:8
msgid ""
"This key will initiate the \"overlay\", which is a combination window "
"overview and application launching system. The default is intended to be the "
@ -831,7 +863,7 @@ msgstr ""
"questa scorciatoia sia o il valore predefinito, oppure che sia impostata "
"alla stringa vuota."
#: ../src/mutter.schemas.in.h:7
#: ../src/mutter.schemas.in.h:9
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
@ -841,7 +873,7 @@ msgstr ""
"dialoghi modali appaiono attaccati alla barra del titolo della finestra "
"genitore, muovendosi assieme ad essa."
#: ../src/mutter.schemas.in.h:8
#: ../src/mutter.schemas.in.h:10
msgid "Workspaces only on primary"
msgstr "Spazi di lavoro solo sul primario"
@ -852,48 +884,48 @@ msgstr "Uso: %s\n"
# Questo e i successivi simili sono tooltip
# per i pulsanti della cornice.
#: ../src/ui/frames.c:1099
#: ../src/ui/frames.c:1157
msgid "Close Window"
msgstr "Chiude la finestra"
#: ../src/ui/frames.c:1102
#: ../src/ui/frames.c:1160
msgid "Window Menu"
msgstr "Menù finestra"
#: ../src/ui/frames.c:1105
#: ../src/ui/frames.c:1163
msgid "Minimize Window"
msgstr "Minimizza la finestra"
#: ../src/ui/frames.c:1108
#: ../src/ui/frames.c:1166
msgid "Maximize Window"
msgstr "Massimizza la finestra"
# ==demassimizza
#: ../src/ui/frames.c:1111
#: ../src/ui/frames.c:1169
msgid "Restore Window"
msgstr "Ripristina la finestra"
#: ../src/ui/frames.c:1114
#: ../src/ui/frames.c:1172
msgid "Roll Up Window"
msgstr "Arrotola la finestra"
#: ../src/ui/frames.c:1117
#: ../src/ui/frames.c:1175
msgid "Unroll Window"
msgstr "Srotola la finestra"
#: ../src/ui/frames.c:1120
#: ../src/ui/frames.c:1178
msgid "Keep Window On Top"
msgstr "Tiene la finestra in primo piano"
#: ../src/ui/frames.c:1123
#: ../src/ui/frames.c:1181
msgid "Remove Window From Top"
msgstr "Rimuove la finestra dalla primo piano"
#: ../src/ui/frames.c:1126
#: ../src/ui/frames.c:1184
msgid "Always On Visible Workspace"
msgstr "Sempre sullo spazio di lavoro visibile"
#: ../src/ui/frames.c:1129
#: ../src/ui/frames.c:1187
msgid "Put Window On Only One Workspace"
msgstr "Pone la finestra su un solo spazio di lavoro"
@ -1112,49 +1144,77 @@ msgstr "Mod5"
msgid "%d x %d"
msgstr "%d × %d"
#: ../src/ui/theme.c:255
#: ../src/ui/theme.c:253
msgid "top"
msgstr "alto"
#: ../src/ui/theme.c:257
#: ../src/ui/theme.c:255
msgid "bottom"
msgstr "basso"
#: ../src/ui/theme.c:259
#: ../src/ui/theme.c:257
msgid "left"
msgstr "sinistra"
#: ../src/ui/theme.c:261
#: ../src/ui/theme.c:259
msgid "right"
msgstr "destra"
#: ../src/ui/theme.c:288
#: ../src/ui/theme.c:286
#, c-format
msgid "frame geometry does not specify \"%s\" dimension"
msgstr "la geometria della cornice non specifica la dimensione «%s»"
#: ../src/ui/theme.c:307
#: ../src/ui/theme.c:305
#, c-format
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
msgstr ""
"la geometria della cornice non specifica la dimensione «%s» per il bordo «%s»"
#: ../src/ui/theme.c:344
#: ../src/ui/theme.c:342
#, c-format
msgid "Button aspect ratio %g is not reasonable"
msgstr "Le proporzioni %g del pulsante non sono ragionevoli"
#: ../src/ui/theme.c:356
#: ../src/ui/theme.c:354
#, c-format
msgid "Frame geometry does not specify size of buttons"
msgstr "La geometria della cornice non specifica la dimensione dei pulsanti"
#: ../src/ui/theme.c:1064
#: ../src/ui/theme.c:1060
#, c-format
msgid "Gradients should have at least two colors"
msgstr "I gradienti dovrebbero avere almeno due colori"
#: ../src/ui/theme.c:1202
#: ../src/ui/theme.c:1212
#, c-format
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 specificazione dei colori personalizzati GTK deve presentare un nome di "
"colore e un ripiego tra parentesi, per es. gtk:custom(foo,bar); impossibile "
"analizzare \"%s\""
#: ../src/ui/theme.c:1228
#, c-format
msgid ""
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
"_ are valid"
msgstr ""
"Carattere \"%c\" non valido nel parametro color_name di gtk:custom, sono "
"validi solo A-Za-z0-9-_"
#: ../src/ui/theme.c:1242
#, c-format
msgid ""
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
"fit the format"
msgstr ""
"Il formato per Gtk:custom è \"gtk:custom(color_name,fallback)\", «%s» non è "
"adatto a tale formato"
#: ../src/ui/theme.c:1287
#, c-format
msgid ""
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
@ -1163,7 +1223,7 @@ msgstr ""
"La specificazione del colore GTK deve avere lo stato fra parentesi, per es. "
"gtk:fg[NORMAL] dove NORMAL è lo stato; impossibile analizzare \"%s\""
#: ../src/ui/theme.c:1216
#: ../src/ui/theme.c:1301
#, c-format
msgid ""
"GTK color specification must have a close bracket after the state, e.g. gtk:"
@ -1173,18 +1233,18 @@ msgstr ""
"lo stato, per es. gtk:fg[NORMAL] dove NORMAL è lo stato; impossibile "
"analizzare \"%s\""
#: ../src/ui/theme.c:1227
#: ../src/ui/theme.c:1312
#, c-format
msgid "Did not understand state \"%s\" in color specification"
msgstr "State «%s» incomprensibile nella specificazione del colore"
msgstr "Stato «%s» incomprensibile nella specificazione del colore"
#: ../src/ui/theme.c:1240
#: ../src/ui/theme.c:1325
#, c-format
msgid "Did not understand color component \"%s\" in color specification"
msgstr ""
"Componente di colore «%s» incomprensibile nella specificazione del colore"
#: ../src/ui/theme.c:1270
#: ../src/ui/theme.c:1355
#, c-format
msgid ""
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
@ -1193,49 +1253,47 @@ msgstr ""
"Il formato della sfumature è «blend/bg_color/fg_color/alpha», «%s» non è "
"adatto a tale formato"
#: ../src/ui/theme.c:1281
#: ../src/ui/theme.c:1366
#, c-format
msgid "Could not parse alpha value \"%s\" in blended color"
msgstr "Impossibile analizzare il valore alpha «%s» nel colore sfumato"
#: ../src/ui/theme.c:1291
#: ../src/ui/theme.c:1376
#, c-format
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
msgstr "Il valore alpha «%s» nel colore sfumato non è compreso tra 0.0 e 1.0"
#: ../src/ui/theme.c:1338
#: ../src/ui/theme.c:1423
#, c-format
msgid ""
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
msgstr ""
"Il formato dell'ombreggiatura è «shade/base_color/factor», «%s» non è adatto "
"a tale formato"
"Il formato dell'ombreggiatura è «shade/base_color/factor», «%s» non è adatto a "
"tale formato"
#: ../src/ui/theme.c:1349
#: ../src/ui/theme.c:1434
#, c-format
msgid "Could not parse shade factor \"%s\" in shaded color"
msgstr ""
"Impossibile analizzare il fattore di ombreggiatura «%s» nel colore "
"ombreggiato"
"Impossibile analizzare il fattore di ombreggiatura «%s» nel colore ombreggiato"
#: ../src/ui/theme.c:1359
#: ../src/ui/theme.c:1444
#, c-format
msgid "Shade factor \"%s\" in shaded color is negative"
msgstr "Il fattore di ombreggiatura «%s» nel colore ombreggiato è negativo"
#: ../src/ui/theme.c:1388
#: ../src/ui/theme.c:1473
#, c-format
msgid "Could not parse color \"%s\""
msgstr "Impossibile analizzare il colore «%s»"
#: ../src/ui/theme.c:1646
#: ../src/ui/theme.c:1784
#, c-format
msgid "Coordinate expression contains character '%s' which is not allowed"
msgstr ""
"L'espressione delle coordinate contiene il carattere «%s» che non è "
"consentito"
"L'espressione delle coordinate contiene il carattere «%s» che non è consentito"
#: ../src/ui/theme.c:1673
#: ../src/ui/theme.c:1811
#, c-format
msgid ""
"Coordinate expression contains floating point number '%s' which could not be "
@ -1244,14 +1302,14 @@ msgstr ""
"L'espressione delle coordinate contiene il numero in virgola mobile «%s» che "
"non può essere analizzato"
#: ../src/ui/theme.c:1687
#: ../src/ui/theme.c:1825
#, c-format
msgid "Coordinate expression contains integer '%s' which could not be parsed"
msgstr ""
"L'espressione delle coordinate contiene l'intero «%s» che non può essere "
"analizzato"
#: ../src/ui/theme.c:1809
#: ../src/ui/theme.c:1947
#, c-format
msgid ""
"Coordinate expression contained unknown operator at the start of this text: "
@ -1260,18 +1318,18 @@ msgstr ""
"L'espressione delle coordinate contiene un operatore sconosciuto all'inizio "
"di questo testo: \"%s\""
#: ../src/ui/theme.c:1866
#: ../src/ui/theme.c:2004
#, c-format
msgid "Coordinate expression was empty or not understood"
msgstr "L'espressione delle coordinate è vuota o incomprensibile"
#: ../src/ui/theme.c:1977 ../src/ui/theme.c:1987 ../src/ui/theme.c:2021
#: ../src/ui/theme.c:2115 ../src/ui/theme.c:2125 ../src/ui/theme.c:2159
#, c-format
msgid "Coordinate expression results in division by zero"
msgstr ""
"L'espressione delle coordinate ha come risultato una divisione per zero"
#: ../src/ui/theme.c:2029
#: ../src/ui/theme.c:2167
#, c-format
msgid ""
"Coordinate expression tries to use mod operator on a floating-point number"
@ -1279,74 +1337,74 @@ msgstr ""
"L'espressione delle coordinate tenta di usare un operatore mod su un numero "
"in virgola mobile"
#: ../src/ui/theme.c:2085
#: ../src/ui/theme.c:2223
#, c-format
msgid ""
"Coordinate expression has an operator \"%s\" where an operand was expected"
msgstr ""
"L'espressione delle coordinate ha un operatore «%s» dove è atteso un operando"
#: ../src/ui/theme.c:2094
#: ../src/ui/theme.c:2232
#, c-format
msgid "Coordinate expression had an operand where an operator was expected"
msgstr ""
"L'espressione delle coordinate ha un operando dove è atteso un operatore"
#: ../src/ui/theme.c:2102
#: ../src/ui/theme.c:2240
#, c-format
msgid "Coordinate expression ended with an operator instead of an operand"
msgstr ""
"L'espressione delle coordinate finisce con un operatore invece che un "
"operando"
#: ../src/ui/theme.c:2112
#: ../src/ui/theme.c:2250
#, c-format
msgid ""
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
"operand in between"
msgstr ""
"L'espressione delle coordinate ha l'operatore «%c» seguito dall'operatore "
"«%c» senza un operando fra i due"
"L'espressione delle coordinate ha l'operatore «%c» seguito dall'operatore «%c» "
"senza un operando fra i due"
#: ../src/ui/theme.c:2263 ../src/ui/theme.c:2308
#: ../src/ui/theme.c:2401 ../src/ui/theme.c:2446
#, c-format
msgid "Coordinate expression had unknown variable or constant \"%s\""
msgstr ""
"L'espressione delle coordinate ha la variabile o la costante «%s» sconosciuta"
#: ../src/ui/theme.c:2362
#: ../src/ui/theme.c:2500
#, c-format
msgid "Coordinate expression parser overflowed its buffer."
msgstr ""
"L'analizzatore dell'espressione delle coordinate ha superato il proprio "
"buffer."
#: ../src/ui/theme.c:2391
#: ../src/ui/theme.c:2529
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr ""
"L'espressione delle coordinate ha una parentesi di chiusura senza la "
"relativa di apertura"
#: ../src/ui/theme.c:2455
#: ../src/ui/theme.c:2593
#, c-format
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
msgstr ""
"L'espressione delle coordinate ha una parentesi di apertura senza la "
"relativa di chiusura"
#: ../src/ui/theme.c:2466
#: ../src/ui/theme.c:2604
#, c-format
msgid "Coordinate expression doesn't seem to have any operators or operands"
msgstr ""
"L'espressione delle coordinate non sembra avere né operatori né operandi"
#: ../src/ui/theme.c:2676 ../src/ui/theme.c:2696 ../src/ui/theme.c:2716
#: ../src/ui/theme.c:2816 ../src/ui/theme.c:2836 ../src/ui/theme.c:2856
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "Il tema contiene un'espressione che ha come risultato un errore: %s\n"
#: ../src/ui/theme.c:4410
#: ../src/ui/theme.c:4527
#, c-format
msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
@ -1355,7 +1413,7 @@ msgstr ""
"È necessario specificare <button function=\"%s\" state=\"%s\" draw_ops="
"\"whatever\"/> per questo stile di cornice"
#: ../src/ui/theme.c:4940 ../src/ui/theme.c:4965
#: ../src/ui/theme.c:5060 ../src/ui/theme.c:5085
#, c-format
msgid ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
@ -1363,35 +1421,35 @@ msgstr ""
"Risulta mancante <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style="
"\"whatever\"/>"
#: ../src/ui/theme.c:5013
#: ../src/ui/theme.c:5133
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "Caricamento del tema «%s» non riuscito: %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:5269 ../src/ui/theme.c:5276 ../src/ui/theme.c:5283
#: ../src/ui/theme.c:5290 ../src/ui/theme.c:5297
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "Nessun <%s> impostato per il tema «%s»"
#: ../src/ui/theme.c:5185
#: ../src/ui/theme.c:5305
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
"type=\"%s\" style_set=\"whatever\"/> element"
msgstr ""
"Nessuno stile di cornice impostato per il tipo di finestra «%s» nel tema "
"«%s», aggiungere un elemento <window type=\"%s\" style_set=\"whatever\"/>"
"Nessuno stile di cornice impostato per il tipo di finestra «%s» nel tema «%s», "
"aggiungere 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:5744 ../src/ui/theme.c:5806 ../src/ui/theme.c:5869
#, c-format
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
msgstr ""
"Le costanti definite dall'utente devono iniziare con una lettera maiuscola, "
"«%s» non lo fa"
"Le costanti definite dall'utente devono iniziare con una lettera maiuscola, «%"
"s» non lo fa"
#: ../src/ui/theme.c:5643 ../src/ui/theme.c:5705 ../src/ui/theme.c:5768
#: ../src/ui/theme.c:5752 ../src/ui/theme.c:5814 ../src/ui/theme.c:5877
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "La costante «%s» è già definita"
@ -1427,8 +1485,7 @@ msgstr "Impossibile analizzare «%s» come un intero"
#: ../src/ui/theme-parser.c:603 ../src/ui/theme-parser.c:658
#, c-format
msgid "Did not understand trailing characters \"%s\" in string \"%s\""
msgstr ""
"Non sono stati compresi i caratteri di chiusura «%s» nella stringa «%s»"
msgstr "Non sono stati compresi i caratteri di chiusura «%s» nella stringa «%s»"
#: ../src/ui/theme-parser.c:613
#, c-format
@ -1625,8 +1682,7 @@ msgstr "Funzione «%s» sconosciuta per il pulsante"
#, c-format
msgid "Button function \"%s\" does not exist in this version (%d, need %d)"
msgstr ""
"La funzione di pulsante «%s» non esiste in questa versione (%d, necessaria "
"%d)"
"La funzione di pulsante «%s» non esiste in questa versione (%d, necessaria %d)"
#: ../src/ui/theme-parser.c:2994
#, c-format
@ -1724,8 +1780,8 @@ msgid ""
"\"version\" attribute cannot be used in metacity-theme-1.xml or metacity-"
"theme-2.xml"
msgstr ""
"L'attributo «version» non può essere usato in metacity-theme-1.xml o "
"metacity-theme-2.xml"
"L'attributo «version» non può essere usato in metacity-theme-1.xml o metacity-"
"theme-2.xml"
#: ../src/ui/theme-parser.c:3530
#, c-format
@ -1864,88 +1920,88 @@ msgstr "Questo è un messaggio d'esempio in una finestra di dialogo d'esempio"
msgid "Fake menu item %d\n"
msgstr "Voce di menu finta n.%d\n"
#: ../src/ui/theme-viewer.c:370
#: ../src/ui/theme-viewer.c:371
msgid "Border-only window"
msgstr "Finestra solo-bordo"
#: ../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 "Finestra applicazione normale"
#: ../src/ui/theme-viewer.c:393
#: ../src/ui/theme-viewer.c:394
msgid "Dialog Box"
msgstr "Casella di dialogo"
#: ../src/ui/theme-viewer.c:397
#: ../src/ui/theme-viewer.c:398
msgid "Modal Dialog Box"
msgstr "Casella di dialogo modale"
#: ../src/ui/theme-viewer.c:401
#: ../src/ui/theme-viewer.c:402
msgid "Utility Palette"
msgstr "Tavolozza di utilità"
#: ../src/ui/theme-viewer.c:405
#: ../src/ui/theme-viewer.c:406
msgid "Torn-off Menu"
msgstr "Menù staccato"
#: ../src/ui/theme-viewer.c:409
#: ../src/ui/theme-viewer.c:410
msgid "Border"
msgstr "Bordo"
#: ../src/ui/theme-viewer.c:413
#: ../src/ui/theme-viewer.c:414
msgid "Attached Modal Dialog"
msgstr "Dialogo modale attaccato"
#: ../src/ui/theme-viewer.c:744
#: ../src/ui/theme-viewer.c:747
#, c-format
msgid "Button layout test %d"
msgstr "Test n.%d disposizione pulsanti"
#: ../src/ui/theme-viewer.c:773
#: ../src/ui/theme-viewer.c:776
#, c-format
msgid "%g milliseconds to draw one window frame"
msgstr "%g millisecondi per disegnare una cornice di finestra"
#: ../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 [NOME_TEMA]\n"
#: ../src/ui/theme-viewer.c:825
#: ../src/ui/theme-viewer.c:828
#, c-format
msgid "Error loading theme: %s\n"
msgstr "Errore nel caricare il 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 "Tema «%s» caricato in %g secondi\n"
#: ../src/ui/theme-viewer.c:875
#: ../src/ui/theme-viewer.c:878
msgid "Normal Title Font"
msgstr "Carattere titolo normale"
#: ../src/ui/theme-viewer.c:881
#: ../src/ui/theme-viewer.c:884
msgid "Small Title Font"
msgstr "Carattere titolo piccolo"
#: ../src/ui/theme-viewer.c:887
#: ../src/ui/theme-viewer.c:890
msgid "Large Title Font"
msgstr "Carattere titolo grande"
#: ../src/ui/theme-viewer.c:892
#: ../src/ui/theme-viewer.c:895
msgid "Button Layouts"
msgstr "Disposizione pulsanti"
#: ../src/ui/theme-viewer.c:897
#: ../src/ui/theme-viewer.c:900
msgid "Benchmark"
msgstr "Prestazioni"
#: ../src/ui/theme-viewer.c:949
#: ../src/ui/theme-viewer.c:952
msgid "Window Title Goes Here"
msgstr "Qui va il titolo della finestra"
@ -2176,12 +2232,6 @@ msgstr ""
#~ msgstr "Solleva automaticamente la finestra col focus"
# Mi sa che l'originale è sbagliato aperto un bug
#~| msgid ""
#~| "Clicking a window while holding down this modifier key will move the "
#~| "window (left click), resize the window (middle click), or show the "
#~| "window menu (right click). The left and right operations may be swapped "
#~| "using the \"mouse_button_resize\" key. Modifier is expressed as \"&lt;"
#~| "Alt&gt;\" or \"&lt;Super&gt;\" for example."
#~ msgid ""
#~ "Clicking a window while holding down this modifier key will move the "
#~ "window (left click), resize the window (middle click), or show the window "

354
po/ja.po
View File

@ -9,26 +9,27 @@
msgid ""
msgstr ""
"Project-Id-Version: mutter master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-07-02 09:59+0900\n"
"PO-Revision-Date: 2011-07-01 07:18+0900\n"
"Last-Translator: Takeshi AIHANA <takeshi.aihana@gmail.com>\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-09-25 11:31+0000\n"
"PO-Revision-Date: 2011-09-25 23:38+0900\n"
"Last-Translator: OKANO Takayoshi <kano@na.rim.or.jp>\n"
"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\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
#: ../src/compositor/compositor.c:492
#, c-format
msgid ""
"Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr ""
"既に別の合成マネージャがディスプレイ \"%2$s\" 上のスクリーン %1$i で起動中"
"す"
"既に別の合成マネージャがディスプレイ \"%2$s\" 上のスクリーン %1$i で起動中"
"す"
# 「キーボード・ショートカット」のアプレット (gnome-control-center) で表示するメッセージ
#: ../src/core/all-keybindings.h:88
@ -400,7 +401,7 @@ msgstr ""
#. Displayed when a keybinding which is
#. * supposed to launch a program fails.
#.
#: ../src/core/keybindings.c:2468
#: ../src/core/keybindings.c:2523
#, c-format
msgid ""
"There was an error running <tt>%s</tt>:\n"
@ -411,23 +412,23 @@ msgstr ""
"\n"
"%s"
#: ../src/core/keybindings.c:2558
#: ../src/core/keybindings.c:2613
#, c-format
msgid "No command %d has been defined.\n"
msgstr "コマンド %d は定義されていません。\n"
#: ../src/core/keybindings.c:3570
#: ../src/core/keybindings.c:3625
#, c-format
msgid "No terminal command has been defined.\n"
msgstr "端末を起動するコマンドが定義されていません。\n"
#: ../src/core/main.c:206
msgid "Disable connection to session manager"
msgstr "セッション・マネージャに接続しない"
msgstr "セッション・マネージャに接続しない"
#: ../src/core/main.c:212
msgid "Replace the running window manager"
msgstr "実行中のウィンドウ・マネージャを置き換える"
msgstr "実行中のウィンドウ・マネージャを置き換える"
#: ../src/core/main.c:218
msgid "Specify session management ID"
@ -449,7 +450,7 @@ msgstr "Xの呼び出しを同期させる"
#: ../src/core/main.c:504
#, c-format
msgid "Failed to scan themes directory: %s\n"
msgstr "テーマ・フォルダのスキャンに失敗しました: %s\n"
msgstr "テーマ・フォルダのスキャンに失敗しました: %s\n"
#: ../src/core/main.c:520
#, c-format
@ -494,34 +495,34 @@ msgstr "画像の合成プラグインを指定する (複数ある時はカン
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
#: ../src/core/prefs.c:550 ../src/core/prefs.c:711
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr "GConf の '%s' キーには無効な値が格納されています\n"
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
#: ../src/core/prefs.c:637 ../src/core/prefs.c:880
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr "GConf の %2$s キーの値 %1$d は %3$d〜%4$d の範囲内にありません\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:681 ../src/core/prefs.c:758 ../src/core/prefs.c:806
#: ../src/core/prefs.c:870 ../src/core/prefs.c:1331 ../src/core/prefs.c:1347
#: ../src/core/prefs.c:1364 ../src/core/prefs.c:1380
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr "GConf の \"%s\" キーには無効な型が格納されています\n"
#: ../src/core/prefs.c:1203
#: ../src/core/prefs.c:1210
#, 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:1262
#: ../src/core/prefs.c:1269
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "GConf キーをオーバーライドできません (%s が見つかりませんでした)\n"
#: ../src/core/prefs.c:1447
#: ../src/core/prefs.c:1454
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@ -529,12 +530,12 @@ msgstr ""
"仕様に準拠していないアプリケーションに対する次善策は無効になっています.一部"
"のアプリケーションは正常に動作しない可能性があります\n"
#: ../src/core/prefs.c:1524
#: ../src/core/prefs.c:1531
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr "GConf の %2$s キーからフォント名 \"%1$s\" を解析できませんでした\n"
#: ../src/core/prefs.c:1586
#: ../src/core/prefs.c:1593
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@ -542,17 +543,17 @@ msgid ""
msgstr ""
"GConf の \"%s\" はマウス・ボタンの修飾キーとして妥当な値ではありません\n"
#: ../src/core/prefs.c:2016
#: ../src/core/prefs.c:2028
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "ワークスペース数を %d に設定中にエラーが発生しました: %s\n"
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
#: ../src/core/prefs.c:2212 ../src/core/prefs.c:2714
#, c-format
msgid "Workspace %d"
msgstr "ワークスペース %d"
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
#: ../src/core/prefs.c:2244 ../src/core/prefs.c:2422
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@ -561,54 +562,54 @@ msgstr ""
"設定データベースで発見した \"%s\" はキーバインド \"%s\" に有効な値ではありま"
"せん\n"
#: ../src/core/prefs.c:2783
#: ../src/core/prefs.c:2795
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr ""
"ワークスペース %d の名前を \"%s\" に設定するときにエラーが発生しました: %s\n"
#: ../src/core/prefs.c:2997
#: ../src/core/prefs.c:3009
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr ""
"表示されていないが動作中のウィンドウに対するステータスの設定エラー: %s\n"
#: ../src/core/prefs.c:3032
#: ../src/core/prefs.c:3044
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr "タブなしのポップアップ・ステータスの設定エラー: %s\n"
#: ../src/core/screen.c:663
#: ../src/core/screen.c:741
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "ディスプレイ '%2$s' 上のスクリーン %1$d は無効です\n"
#: ../src/core/screen.c:679
#: ../src/core/screen.c:757
#, 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 ""
"ディスプレイ \"%2$s\" 上のスクリーン %1$d はすでにウィンドウマネージャを持っ"
"ています; 現在のウィンドウマネージャを上書きするために --replace というオプ"
"ションの使用を試してみて下さい。\n"
"ディスプレイ \"%2$s\" 上のスクリーン %1$d はすでにウィンドウマネージャを"
"持っています; 現在のウィンドウマネージャを上書きするために --replace という"
"オプションの使用を試してみて下さい。\n"
#: ../src/core/screen.c:706
#: ../src/core/screen.c:784
#, c-format
msgid ""
"Could not acquire window manager selection on screen %d display \"%s\"\n"
msgstr ""
"ディスプレイ \"%2$s\" 上のスクリーン %1$d でウィンドウマネージャの選択を取"
"できませんでした\n"
"ディスプレイ \"%2$s\" 上のスクリーン %1$d でウィンドウマネージャの選択を取"
"できませんでした\n"
#: ../src/core/screen.c:761
#: ../src/core/screen.c:839
#, c-format
msgid "Screen %d on display \"%s\" already has a window manager\n"
msgstr ""
"ディスプレイ \"%2$s\" 上のスクリーン %1$d はすでにウィンドウマネージャを持っ"
"ています\n"
"ディスプレイ \"%2$s\" 上のスクリーン %1$d はすでにウィンドウマネージャを"
"持っています\n"
#: ../src/core/screen.c:946
#: ../src/core/screen.c:1024
#, c-format
msgid "Could not release screen %d on display \"%s\"\n"
msgstr "ディスプレイ \"%2$s\" 上のスクリーン %1$d を解放できませんでした\n"
@ -689,30 +690,24 @@ msgstr "ログ・ファイル %s をオープンしました\n"
msgid "Mutter was compiled without support for verbose mode\n"
msgstr "この mutter は詳細ログ・モードをサポートしていません\n"
#: ../src/core/util.c:286
#: ../src/core/util.c:290
msgid "Window manager: "
msgstr "ウィンドウ・マネージャ: "
msgstr "ウィンドウ・マネージャ: "
#: ../src/core/util.c:434
#: ../src/core/util.c:438
msgid "Bug in window manager: "
msgstr "ウィンドウ・マネージャのバグ: "
msgstr "ウィンドウ・マネージャのバグ: "
#: ../src/core/util.c:467
#: ../src/core/util.c:471
msgid "Window manager warning: "
msgstr "ウィンドウ・マネージャの警告: "
msgstr "ウィンドウ・マネージャの警告: "
#: ../src/core/util.c:495
#: ../src/core/util.c:499
msgid "Window manager error: "
msgstr "ウィンドウ・マネージャのエラー: "
#. Translators: This is the title used on dialog boxes
#: ../src/core/util.c:632 ../src/mutter.desktop.in.h:1
#: ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
msgstr "ウィンドウ・マネージャのエラー: "
#. first time through
#: ../src/core/window.c:6886
#: ../src/core/window.c:7069
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@ -728,11 +723,11 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7549
#: ../src/core/window.c:7732
#, 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 ""
"ウィンドウ %s はリサイズ可能ではない MWM ヒント指示を設定していますが,最小サ"
"イズ %d x %d と最大サイズ %d x %dも設定していますこれはあまり意味がありませ"
@ -748,12 +743,19 @@ msgstr "アプリケーションが間違った _NET_WM_PID %lu を設定しま
msgid "%s (on %s)"
msgstr "%s (%s)"
#: ../src/core/window-props.c:1484
#: ../src/core/window-props.c:1481
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr ""
"%2$s で指定したウィンドウ 0x%1$lx の WM_TRANSIENT_FOR が間違っています\n"
#: ../src/core/window-props.c:1492
#, c-format
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
msgstr ""
"%2$s で指定したウィンドウ 0x%1$lx の WM_TRANSIENT_FOR は無限ループになりま"
"す\n"
#: ../src/core/xprops.c:155
#, c-format
msgid ""
@ -766,7 +768,7 @@ msgstr ""
"ウィンドウ 0x%1$lx には type %5$s format %6$d n_items %7$d のプロパティ\n"
"%2$s が指定されていますが,実際には type %3$s format %4$d であることを\n"
"期待されています.これは,ほとんどの場合,アプリケーションのバグであり,\n"
"ウィンドウマネージャのバグではありません.\n"
"ウィンドウマネージャのバグではありません.\n"
"ウィンドウの属性は title=\"%8$s\" class=\"%9$s\" name=\"%10$s\"です.\n"
#: ../src/core/xprops.c:411
@ -782,6 +784,10 @@ msgstr ""
"ウィンドウ 0x%2$lx 上のプロパティ %1$s はリスト内のアイテム %3$d で無効な "
"UTF-8を含んでいました\n"
#: ../src/mutter.desktop.in.h:1 ../src/mutter-wm.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#: ../src/mutter.schemas.in.h:1
msgid "Attach modal dialogs"
msgstr "モーダルなダイアログを統合するかどうか"
@ -800,19 +806,31 @@ 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 "Draggable border width"
msgstr "ドラッグが可能になる境界線の幅"
#: ../src/mutter.schemas.in.h:5
msgid "Live Hidden Windows"
msgstr "表示されていないウィンドウをそのままにしておくかどうか"
#: ../src/mutter.schemas.in.h:5
#: ../src/mutter.schemas.in.h:6
msgid "Modifier to use for extended window management operations"
msgstr "ウィンドウの拡張管理の操作で使用する修飾キー"
#: ../src/mutter.schemas.in.h:6
#: ../src/mutter.schemas.in.h:7
msgid ""
"The amount of total draggable borders. If the theme's visible borders are "
"not enough, invisible borders will be added to meet this value."
msgstr ""
"ドラッグができるようになる境界線の幅です。テーマで表示している境界線がこの値"
"よりも小さい場合は、表示できない境界線がこの値になるように追加されます。"
#: ../src/mutter.schemas.in.h:8
msgid ""
"This key will initiate the \"overlay\", which is a combination window "
"overview and application launching system. The default is intended to be the "
@ -824,7 +842,7 @@ msgstr ""
"デフォルトのキーは PC のキーボードにある [Windows キー] です。指定可能な値: "
"デフォルトのキー、または空の文字列"
#: ../src/mutter.schemas.in.h:7
#: ../src/mutter.schemas.in.h:9
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
@ -834,56 +852,56 @@ msgstr ""
"に、親ウィンドウのタイトルバーに統合したダイアログを表示します (親ウィンドウ"
"を移動すると一緒にモーダルなダイアログも移動します)。"
#: ../src/mutter.schemas.in.h:8
#: ../src/mutter.schemas.in.h:10
msgid "Workspaces only on primary"
msgstr "プライマリ・モニタのみワークスペースを切り替えるかどうか"
msgstr "プライマリ・モニタのみワークスペースを切り替えるかどうか"
#: ../src/tools/mutter-message.c:123
#, c-format
msgid "Usage: %s\n"
msgstr "用法: %s\n"
#: ../src/ui/frames.c:1280
#: ../src/ui/frames.c:1157
msgid "Close Window"
msgstr "ウィンドウを閉じます"
#: ../src/ui/frames.c:1283
#: ../src/ui/frames.c:1160
msgid "Window Menu"
msgstr "ウィンドウ・メニューを表示します"
#: ../src/ui/frames.c:1286
#: ../src/ui/frames.c:1163
msgid "Minimize Window"
msgstr "ウィンドウを最小化します"
#: ../src/ui/frames.c:1289
#: ../src/ui/frames.c:1166
msgid "Maximize Window"
msgstr "ウィンドウを最大化します"
#: ../src/ui/frames.c:1292
#: ../src/ui/frames.c:1169
msgid "Restore Window"
msgstr "ウィンドウの状態を元に戻します"
#: ../src/ui/frames.c:1295
#: ../src/ui/frames.c:1172
msgid "Roll Up Window"
msgstr "ウィンドウを巻き上げます"
#: ../src/ui/frames.c:1298
#: ../src/ui/frames.c:1175
msgid "Unroll Window"
msgstr "ウィンドウの巻き上げを解除します"
#: ../src/ui/frames.c:1301
#: ../src/ui/frames.c:1178
msgid "Keep Window On Top"
msgstr "ウィンドウを最前面に維持します"
#: ../src/ui/frames.c:1304
#: ../src/ui/frames.c:1181
msgid "Remove Window From Top"
msgstr "ウィンドウを最前面の維持から解除します"
#: ../src/ui/frames.c:1307
#: ../src/ui/frames.c:1184
msgid "Always On Visible Workspace"
msgstr "全てのワークスペースに配置します"
#: ../src/ui/frames.c:1310
#: ../src/ui/frames.c:1187
msgid "Put Window On Only One Workspace"
msgstr "現在のワークスペースにのみ配置します"
@ -1086,48 +1104,75 @@ msgstr "Mod5"
msgid "%d x %d"
msgstr "%d x %d"
#: ../src/ui/theme.c:255
#: ../src/ui/theme.c:253
msgid "top"
msgstr "上"
#: ../src/ui/theme.c:257
#: ../src/ui/theme.c:255
msgid "bottom"
msgstr "下"
#: ../src/ui/theme.c:259
#: ../src/ui/theme.c:257
msgid "left"
msgstr "左"
#: ../src/ui/theme.c:261
#: ../src/ui/theme.c:259
msgid "right"
msgstr "右"
#: ../src/ui/theme.c:288
#: ../src/ui/theme.c:286
#, c-format
msgid "frame geometry does not specify \"%s\" dimension"
msgstr "フレームジオメトリは \"%s\" のサイズを指定しません"
#: ../src/ui/theme.c:307
#: ../src/ui/theme.c:305
#, c-format
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
msgstr "境界 \"%2$s\" 用のフレームジオメトリは大きさ \"%1$s\" を指定しません"
#: ../src/ui/theme.c:344
#: ../src/ui/theme.c:342
#, c-format
msgid "Button aspect ratio %g is not reasonable"
msgstr "ボタンのアスペクト比 %g は妥当ではありません"
#: ../src/ui/theme.c:356
#: ../src/ui/theme.c:354
#, c-format
msgid "Frame geometry does not specify size of buttons"
msgstr "フレームジオメトリはボタンのサイズを指定しません"
#: ../src/ui/theme.c:1064
#: ../src/ui/theme.c:1065
#, c-format
msgid "Gradients should have at least two colors"
msgstr "階調度は少なくとも2つの色をもつべきです"
#: ../src/ui/theme.c:1202
#: ../src/ui/theme.c:1217
#, c-format
msgid ""
"GTK custom color specification must have color name and fallback in "
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
msgstr ""
"\"%s\" を解析できませんでした; GTK の色指定では gtk:custom(foo,bar); のように"
"括弧の中に色の名前とそれと代替えになる色の名前を指定して下さい"
#: ../src/ui/theme.c:1233
#, c-format
msgid ""
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
"_ are valid"
msgstr ""
"gtk:custom の color_name で指定した文字が間違っています (使用できる文字は A-"
"Za-z0-9-_): '%c'"
#: ../src/ui/theme.c:1247
#, c-format
msgid ""
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
"fit the format"
msgstr ""
"Gtk:custom の書式は \"gtk:custom(color_name,fallback)\" です (\"%s\" はこの書"
"式に合っていません)"
#: ../src/ui/theme.c:1292
#, c-format
msgid ""
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
@ -1136,7 +1181,7 @@ msgstr ""
"\"%s\" を解析できませんでした; GTK の色指定では gtk:fg[NORMAL] のように状態を"
"大括弧で囲み指定する必要があります (NORMAL は状態を示す)"
#: ../src/ui/theme.c:1216
#: ../src/ui/theme.c:1306
#, c-format
msgid ""
"GTK color specification must have a close bracket after the state, e.g. gtk:"
@ -1145,17 +1190,17 @@ msgstr ""
"\"%s\" を解析できませんでした; GTK の色指定では gtk:fg[NORMAL] のように状態の"
"後に右大括弧をつける必要があります (NORMAL は状態を示す)"
#: ../src/ui/theme.c:1227
#: ../src/ui/theme.c:1317
#, c-format
msgid "Did not understand state \"%s\" in color specification"
msgstr "色指定で状態 \"%s\" は理解しませんでした"
#: ../src/ui/theme.c:1240
#: ../src/ui/theme.c:1330
#, c-format
msgid "Did not understand color component \"%s\" in color specification"
msgstr "色指定でカラーコンポーネント \"%s\" は理解しませんでした"
#: ../src/ui/theme.c:1270
#: ../src/ui/theme.c:1360
#, c-format
msgid ""
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
@ -1164,17 +1209,17 @@ msgstr ""
"混合色のフォーマットは \"blend/bg_color/fg_color/alpha\" で,\"%s\" はこの"
"フォーマットに適合していません"
#: ../src/ui/theme.c:1281
#: ../src/ui/theme.c:1371
#, c-format
msgid "Could not parse alpha value \"%s\" in blended color"
msgstr "混合色のアルファ値 \"%s\" を解析できませんでした"
#: ../src/ui/theme.c:1291
#: ../src/ui/theme.c:1381
#, c-format
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
msgstr "混合色のアルファ値 \"%s\" は 0.0 から 1.0 の間ではありません"
#: ../src/ui/theme.c:1338
#: ../src/ui/theme.c:1428
#, c-format
msgid ""
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
@ -1182,83 +1227,78 @@ msgstr ""
"シェードのフォーマットは \"shade/base_color/factor\" で,\"%s\" はこのフォー"
"マットに適合していません"
#: ../src/ui/theme.c:1349
#: ../src/ui/theme.c:1439
#, c-format
msgid "Could not parse shade factor \"%s\" in shaded color"
msgstr "シェードカラーのシェード係数 \"%s\" をパスできませんでした"
#: ../src/ui/theme.c:1359
#: ../src/ui/theme.c:1449
#, c-format
msgid "Shade factor \"%s\" in shaded color is negative"
msgstr "シェードカラーのシェード係数 \"%s\" が負の値です"
#: ../src/ui/theme.c:1388
#: ../src/ui/theme.c:1478
#, c-format
msgid "Could not parse color \"%s\""
msgstr "次の色を解析できませんでした: \"%s\""
#: ../src/ui/theme.c:1481
#, c-format
msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
msgstr "GTK+ のテーマから色を取得できませんでした: %s[%s]\n"
#: ../src/ui/theme.c:1713
#: ../src/ui/theme.c:1789
#, c-format
msgid "Coordinate expression contains character '%s' which is not allowed"
msgstr "許可されていない文字が座標式に含まれています: '%s'"
#: ../src/ui/theme.c:1740
#: ../src/ui/theme.c:1816
#, c-format
msgid ""
"Coordinate expression contains floating point number '%s' which could not be "
"parsed"
msgstr "解析できない浮動小数点数が座標式に含まれています: '%s'"
#: ../src/ui/theme.c:1754
#: ../src/ui/theme.c:1830
#, c-format
msgid "Coordinate expression contains integer '%s' which could not be parsed"
msgstr "解析できない整数が座標式に含まれています: '%s'"
#: ../src/ui/theme.c:1876
#: ../src/ui/theme.c:1952
#, c-format
msgid ""
"Coordinate expression contained unknown operator at the start of this text: "
"\"%s\""
msgstr "次のテキストの先頭に無効な演算子が座標式の中に含まれていました: \"%s\""
#: ../src/ui/theme.c:1933
#: ../src/ui/theme.c:2009
#, c-format
msgid "Coordinate expression was empty or not understood"
msgstr "座標式が空か解析不能です"
#: ../src/ui/theme.c:2044 ../src/ui/theme.c:2054 ../src/ui/theme.c:2088
#: ../src/ui/theme.c:2120 ../src/ui/theme.c:2130 ../src/ui/theme.c:2164
#, c-format
msgid "Coordinate expression results in division by zero"
msgstr "座標式はゼロで除算しました"
#: ../src/ui/theme.c:2096
#: ../src/ui/theme.c:2172
#, c-format
msgid ""
"Coordinate expression tries to use mod operator on a floating-point number"
msgstr "座標式は浮動小数点で mod 演算子を使用しようとしています"
#: ../src/ui/theme.c:2152
#: ../src/ui/theme.c:2228
#, c-format
msgid ""
"Coordinate expression has an operator \"%s\" where an operand was expected"
msgstr "座標式はオペランドが必要な場所に演算子 \"%s\" を使用しています"
#: ../src/ui/theme.c:2161
#: ../src/ui/theme.c:2237
#, c-format
msgid "Coordinate expression had an operand where an operator was expected"
msgstr "座標式は演算子が必要な場所でオペランドを使用しています"
#: ../src/ui/theme.c:2169
#: ../src/ui/theme.c:2245
#, c-format
msgid "Coordinate expression ended with an operator instead of an operand"
msgstr "座標式はオペランドの代わりに演算子で終わっています"
#: ../src/ui/theme.c:2179
#: ../src/ui/theme.c:2255
#, c-format
msgid ""
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
@ -1267,37 +1307,37 @@ msgstr ""
"座標式は演算子 \"%2$c\" の後に演算子 \"%1$c\" が続いており,これらの間にオペ"
"ランドがありません"
#: ../src/ui/theme.c:2330 ../src/ui/theme.c:2375
#: ../src/ui/theme.c:2406 ../src/ui/theme.c:2451
#, c-format
msgid "Coordinate expression had unknown variable or constant \"%s\""
msgstr "座標式は無効な値または定数 \"%s\" が使用されていました"
#: ../src/ui/theme.c:2429
#: ../src/ui/theme.c:2505
#, c-format
msgid "Coordinate expression parser overflowed its buffer."
msgstr "座標式を解析する際にオーバーフローが発生しました"
#: ../src/ui/theme.c:2458
#: ../src/ui/theme.c:2534
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr "座標式は左括弧がなしに右括弧が指定されています"
#: ../src/ui/theme.c:2522
#: ../src/ui/theme.c:2598
#, c-format
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
msgstr "座標式は左括弧が指定されていますが,右括弧がありません"
#: ../src/ui/theme.c:2533
#: ../src/ui/theme.c:2609
#, c-format
msgid "Coordinate expression doesn't seem to have any operators or operands"
msgstr "座標式は演算子もオペランドも使用していないようです"
#: ../src/ui/theme.c:2745 ../src/ui/theme.c:2765 ../src/ui/theme.c:2785
#: ../src/ui/theme.c:2821 ../src/ui/theme.c:2841 ../src/ui/theme.c:2861
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "テーマにエラーを引き起こす式が含まれていました: %s\n"
#: ../src/ui/theme.c:4482
#: ../src/ui/theme.c:4532
#, c-format
msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
@ -1306,7 +1346,7 @@ msgstr ""
"このフレームスタイルは <button function=\"%s\" state=\"%s\" draw_ops="
"\"whatever\"/> を指定する必要があります"
#: ../src/ui/theme.c:5012 ../src/ui/theme.c:5037
#: ../src/ui/theme.c:5065 ../src/ui/theme.c:5090
#, c-format
msgid ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
@ -1314,18 +1354,18 @@ msgstr ""
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>がありませ"
"ん"
#: ../src/ui/theme.c:5085
#: ../src/ui/theme.c:5138
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "テーマ \"%s\" の読み込みに失敗しました: %s\n"
#: ../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
#: ../src/ui/theme.c:5274 ../src/ui/theme.c:5281 ../src/ui/theme.c:5288
#: ../src/ui/theme.c:5295 ../src/ui/theme.c:5302
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "テーマ \"%1$s\" の <%2$s> が設定されていません"
#: ../src/ui/theme.c:5257
#: ../src/ui/theme.c:5310
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
@ -1335,13 +1375,14 @@ msgstr ""
"ません.<window type=\"%3$s\" style_set=\"whatever\"/> エレメントを追加してく"
"ださい"
#: ../src/ui/theme.c:5707 ../src/ui/theme.c:5769 ../src/ui/theme.c:5832
#: ../src/ui/theme.c:5708 ../src/ui/theme.c:5770 ../src/ui/theme.c:5833
#, c-format
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
msgstr "ユーザ定義の定数は大文字で始まらなければなりません; \"%s\" は違います"
msgstr ""
"ユーザー定義の定数は大文字で始まらなければなりません; \"%s\" は違います"
#: ../src/ui/theme.c:5715 ../src/ui/theme.c:5777 ../src/ui/theme.c:5840
#: ../src/ui/theme.c:5716 ../src/ui/theme.c:5778 ../src/ui/theme.c:5841
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "定数 \"%s\" は既に定義されています"
@ -1409,8 +1450,8 @@ msgstr "角度は 0.0 から 360.0 の間でなければなりませんが,%g
#, c-format
msgid "Alpha must be between 0.0 (invisible) and 1.0 (fully opaque), was %g\n"
msgstr ""
"アルファ値は 0.0 (不可視)と 1.0 (完全に不透明) の間でなければなりません"
"が,%g でした\n"
"アルファ値は 0.0 (不可視)と 1.0 (完全に不透明) の間でなければなりませんが,%"
"g でした\n"
#: ../src/ui/theme-parser.c:863
#, c-format
@ -1804,88 +1845,88 @@ msgstr "これはサンプル・ダイアログの中に表示したサンプル
msgid "Fake menu item %d\n"
msgstr "メニュー・アイテムの例%d\n"
#: ../src/ui/theme-viewer.c:370
#: ../src/ui/theme-viewer.c:371
msgid "Border-only window"
msgstr "境界線だけのウィンドウ"
#: ../src/ui/theme-viewer.c:372
#: ../src/ui/theme-viewer.c:373
msgid "Bar"
msgstr "バー"
#: ../src/ui/theme-viewer.c:389
#: ../src/ui/theme-viewer.c:390
msgid "Normal Application Window"
msgstr "通常のアプリケーション・ウィンドウ"
#: ../src/ui/theme-viewer.c:393
#: ../src/ui/theme-viewer.c:394
msgid "Dialog Box"
msgstr "ダイアログ・ボックス"
#: ../src/ui/theme-viewer.c:397
#: ../src/ui/theme-viewer.c:398
msgid "Modal Dialog Box"
msgstr "モーダルなダイアログ・ボックス"
#: ../src/ui/theme-viewer.c:401
#: ../src/ui/theme-viewer.c:402
msgid "Utility Palette"
msgstr "ユーティリティ・パレット"
#: ../src/ui/theme-viewer.c:405
#: ../src/ui/theme-viewer.c:406
msgid "Torn-off Menu"
msgstr "取り外したメニュー"
#: ../src/ui/theme-viewer.c:409
#: ../src/ui/theme-viewer.c:410
msgid "Border"
msgstr "境界線"
#: ../src/ui/theme-viewer.c:413
#: ../src/ui/theme-viewer.c:414
msgid "Attached Modal Dialog"
msgstr "埋め込んだモーダルなダイアログ"
#: ../src/ui/theme-viewer.c:744
#: ../src/ui/theme-viewer.c:747
#, c-format
msgid "Button layout test %d"
msgstr "ボタンの配置テスト %d"
#: ../src/ui/theme-viewer.c:773
#: ../src/ui/theme-viewer.c:776
#, c-format
msgid "%g milliseconds to draw one window frame"
msgstr "1個のウィンドウ・フレームの描画時間: %gミリ秒"
#: ../src/ui/theme-viewer.c:818
#: ../src/ui/theme-viewer.c:821
#, c-format
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
msgstr "用法: metacity-theme-viewer [テーマ名]\n"
#: ../src/ui/theme-viewer.c:825
#: ../src/ui/theme-viewer.c:828
#, c-format
msgid "Error loading theme: %s\n"
msgstr "テーマのロードでエラーが発生しました: %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 "\"%s\" というテーマを%g秒で読み込みました\n"
#: ../src/ui/theme-viewer.c:875
#: ../src/ui/theme-viewer.c:878
msgid "Normal Title Font"
msgstr "標準的なフォントのタイトル"
#: ../src/ui/theme-viewer.c:881
#: ../src/ui/theme-viewer.c:884
msgid "Small Title Font"
msgstr "小さなフォントのタイトル"
#: ../src/ui/theme-viewer.c:887
#: ../src/ui/theme-viewer.c:890
msgid "Large Title Font"
msgstr "大きなフォントのタイトル"
#: ../src/ui/theme-viewer.c:892
#: ../src/ui/theme-viewer.c:895
msgid "Button Layouts"
msgstr "ボタンの配置"
#: ../src/ui/theme-viewer.c:897
#: ../src/ui/theme-viewer.c:900
msgid "Benchmark"
msgstr "ベンチマーク"
#: ../src/ui/theme-viewer.c:949
#: ../src/ui/theme-viewer.c:952
msgid "Window Title Goes Here"
msgstr "ここにウィンドウのタイトルが表示されます"
@ -1897,7 +1938,7 @@ msgid ""
"frame)\n"
msgstr ""
"%d 個のフレームをクライアント側で%g秒 (1フレームにつき%gミリ秒)、実時間ではX"
"サーバのリソースを含めて%g秒 (1フレームにつき %gミリ秒)で描画しました\n"
"サーバのリソースを含めて%g秒 (1フレームにつき %gミリ秒)で描画しました\n"
#: ../src/ui/theme-viewer.c:1274
msgid "position expression test returned TRUE but set error"
@ -1935,3 +1976,6 @@ msgstr "yの値は %d でした (期待値: %d)"
#, c-format
msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
msgstr "%d個の座標式を %g秒 (平均 %g秒) で解析しました\n"
#~ msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
#~ msgstr "GTK+ のテーマから色を取得できませんでした: %s[%s]\n"

920
po/ko.po

File diff suppressed because it is too large Load Diff

1899
po/lt.po

File diff suppressed because it is too large Load Diff

1341
po/lv.po

File diff suppressed because it is too large Load Diff

805
po/nb.po

File diff suppressed because it is too large Load Diff

1161
po/nl.po

File diff suppressed because it is too large Load Diff

1148
po/pa.po

File diff suppressed because it is too large Load Diff

840
po/pl.po

File diff suppressed because it is too large Load Diff

1139
po/pt.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1185
po/ru.po

File diff suppressed because it is too large Load Diff

901
po/sl.po

File diff suppressed because it is too large Load Diff

1331
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1138
po/sv.po

File diff suppressed because it is too large Load Diff

1088
po/ta.po

File diff suppressed because it is too large Load Diff

2435
po/te.po

File diff suppressed because it is too large Load Diff

2558
po/th.po

File diff suppressed because it is too large Load Diff

1170
po/tr.po

File diff suppressed because it is too large Load Diff

269
po/ug.po
View File

@ -10,8 +10,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-06-30 21:06+0000\n"
"PO-Revision-Date: 2011-06-27 11:17+0600\n"
"POT-Creation-Date: 2011-08-27 17:13+0000\n"
"PO-Revision-Date: 2011-08-08 16:52+0600\n"
"Last-Translator: Sahran <sahran.ug@gmail.com>\n"
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
"MIME-Version: 1.0\n"
@ -20,16 +20,13 @@ msgstr ""
#. 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
#, fuzzy, c-format
#| msgid ""
#| "Could not acquire window manager selection on screen %d display \"%s\"\n"
#: ../src/compositor/compositor.c:487
#, c-format
msgid ""
"Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr ""
"كۆرسەتكۈچ \"%2$s\" نىڭدىكى ئېكران %1$d دا كۆزنەك باشقۇرغۇنىڭ تاللانمىسىنى "
"ئالغىلى بولمىدى\n"
"كۆرسەتكۈچ \"%2$s\" نىڭدىكى ئېكران %1$d دا بۆلەك باشقۇرغۇچ ئىجرا قىلىنىۋاتىدۇ."
#: ../src/core/all-keybindings.h:88
msgid "Switch to workspace 1"
@ -401,7 +398,7 @@ msgstr ""
#. Displayed when a keybinding which is
#. * supposed to launch a program fails.
#.
#: ../src/core/keybindings.c:2468
#: ../src/core/keybindings.c:2523
#, c-format
msgid ""
"There was an error running <tt>%s</tt>:\n"
@ -412,12 +409,12 @@ msgstr ""
"\n"
"%s"
#: ../src/core/keybindings.c:2558
#: ../src/core/keybindings.c:2613
#, c-format
msgid "No command %d has been defined.\n"
msgstr "بۇيرۇق %d بېكىتىلمىگەن.\n"
#: ../src/core/keybindings.c:3570
#: ../src/core/keybindings.c:3625
#, c-format
msgid "No terminal command has been defined.\n"
msgstr "تېرمىنال بۇيرۇققا ئېنىقلىما بېرىلمىگەن .\n"
@ -492,41 +489,41 @@ msgstr "پەش بىلەن ئايرىلغان تىزىم ۋە بىرىكمە رە
#. * (Empty comment follows so the translators don't see this.)
#.
#.
#: ../src/core/prefs.c:543 ../src/core/prefs.c:704
#: ../src/core/prefs.c:550 ../src/core/prefs.c:711
#, c-format
msgid "GConf key '%s' is set to an invalid value\n"
msgstr ""
"GConf نىڭ ئاچقۇچ سۆزى“%s” ئۈنۈمسىز \n"
" قىلىپ تەڭشەلگەن\n"
#: ../src/core/prefs.c:630 ../src/core/prefs.c:873
#: ../src/core/prefs.c:637 ../src/core/prefs.c:880
#, c-format
msgid "%d stored in GConf key %s is out of range %d to %d\n"
msgstr ""
"GConf نىڭ %2$s ئاچقۇچىنىڭ قىممىتى %1$d نىڭ دائىرىسى %3$d〜%4$d نىڭ ئىچىدە "
"ئەمەس\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:681 ../src/core/prefs.c:758 ../src/core/prefs.c:806
#: ../src/core/prefs.c:870 ../src/core/prefs.c:1331 ../src/core/prefs.c:1347
#: ../src/core/prefs.c:1364 ../src/core/prefs.c:1380
#, c-format
msgid "GConf key \"%s\" is set to an invalid type\n"
msgstr ""
"GConf نىڭ ئاچقۇچلۇق سۆزى “%s” ئۈنۈمسىز تىپتىكى \n"
" قىلىپ تەڭشەلگەن\n"
#: ../src/core/prefs.c:1203
#: ../src/core/prefs.c:1210
#, 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:1262
#: ../src/core/prefs.c:1269
#, c-format
msgid "Can't override GConf key, %s not found\n"
msgstr "GConf ئاچقۇچىنى قاپلىغىلى بولمىدى، %s تېپىلمىدى\n"
#: ../src/core/prefs.c:1447
#: ../src/core/prefs.c:1454
msgid ""
"Workarounds for broken applications disabled. Some applications may not "
"behave properly.\n"
@ -534,14 +531,14 @@ msgstr ""
"بۇزۇلغان پروگراممىلارنى تۈزىتىش-ياخشىلاش قوزغىتىلمىغان. بەزى پروگراممىلار "
"نورمال ئىشلىمەسلىكى مۇمكىن.\n"
#: ../src/core/prefs.c:1524
#: ../src/core/prefs.c:1531
#, c-format
msgid "Could not parse font description \"%s\" from GConf key %s\n"
msgstr ""
"خەت نۇسخىسىنىڭ چۈشەندۈرۈلۈشىنى ئانالىز قىلغىلى بولمىدى “%s” ( GConf دىكى "
"ئاچقۇچلۇق سۆز %s )\n"
#: ../src/core/prefs.c:1586
#: ../src/core/prefs.c:1593
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for mouse button "
@ -551,17 +548,17 @@ msgstr ""
"ئۈنۈملۈك قىممەت \n"
" ئەمەس\n"
#: ../src/core/prefs.c:2016
#: ../src/core/prefs.c:2028
#, c-format
msgid "Error setting number of workspaces to %d: %s\n"
msgstr "خىزمەت رايونى سانىنى %d قىلىپ تەڭشەشتە كۆرۈلگەن خاتالىق %s\n"
#: ../src/core/prefs.c:2200 ../src/core/prefs.c:2702
#: ../src/core/prefs.c:2212 ../src/core/prefs.c:2714
#, c-format
msgid "Workspace %d"
msgstr "خىزمەت بوشلۇقى %d"
#: ../src/core/prefs.c:2232 ../src/core/prefs.c:2410
#: ../src/core/prefs.c:2244 ../src/core/prefs.c:2422
#, c-format
msgid ""
"\"%s\" found in configuration database is not a valid value for keybinding "
@ -570,18 +567,18 @@ msgstr ""
"سەپلىمە ساندانىدىن تېپىلغان \"%s\"، \"%s\" كۇنۇپكا باغلانمىسىنىڭ ئىناۋەتلىك "
"قىممىتى ئەمەس\n"
#: ../src/core/prefs.c:2783
#: ../src/core/prefs.c:2795
#, c-format
msgid "Error setting name for workspace %d to \"%s\": %s\n"
msgstr "خىزمەت مۇھىتى %d غا \"%s\" دەپ ئائىت قويۇشتا خاتالىق كۆرۈلدى: %s\n"
#: ../src/core/prefs.c:2997
#: ../src/core/prefs.c:3009
#, c-format
msgid "Error setting live hidden windows status status: %s\n"
msgstr ""
"شۇئان يوشۇرۇنىدىغان كۆزنەك ھالىتىنى تەڭشەۋاتقاندا خاتالىق كۆرۈلدى: %s\n"
#: ../src/core/prefs.c:3032
#: ../src/core/prefs.c:3044
#, c-format
msgid "Error setting no tab popup status: %s\n"
msgstr "بەتكۈچ يوق قاڭقىش ھالىتىنى تەڭشەۋەتقاندا خاتالىق كۆرۈلدى: %s\n"
@ -721,7 +718,7 @@ msgid "Mutter"
msgstr "Mutter"
#. first time through
#: ../src/core/window.c:6886
#: ../src/core/window.c:7019
#, c-format
msgid ""
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
@ -737,7 +734,7 @@ msgstr ""
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
#. * about these apps but make them work.
#.
#: ../src/core/window.c:7549
#: ../src/core/window.c:7682
#, c-format
msgid ""
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
@ -759,12 +756,17 @@ msgstr ""
msgid "%s (on %s)"
msgstr "%s (ھەققىدە %s)"
#: ../src/core/window-props.c:1484
#: ../src/core/window-props.c:1481
#, c-format
msgid "Invalid WM_TRANSIENT_FOR window 0x%lx specified for %s.\n"
msgstr ""
"%2$s گە بەلگىلەنگەن ئۈنۈمسىز WM_TRANSIENT_FOR كۆزنەك 0x%1$lx بولىدۇ.\n"
#: ../src/core/window-props.c:1492
#, c-format
msgid "WM_TRANSIENT_FOR window 0x%lx for %s would create loop.\n"
msgstr "%2$s نىڭ WM_TRANSIENT_FOR كۆزنەك0x%1$lx دەۋرىيلىك قۇرۇشى مۇمكىن.\n"
#: ../src/core/xprops.c:155
#, c-format
msgid ""
@ -815,14 +817,24 @@ msgstr ""
"ئېكرانغىلا قارىتىلغانلىقىنى جەزملەيدۇ."
#: ../src/mutter.schemas.in.h:4
msgid "Draggable border width"
msgstr ""
#: ../src/mutter.schemas.in.h:5
msgid "Live Hidden Windows"
msgstr "شۇئان يوشۇرۇنىدىغان كۆزنەكلەر"
#: ../src/mutter.schemas.in.h:5
#: ../src/mutter.schemas.in.h:6
msgid "Modifier to use for extended window management operations"
msgstr "كېڭەيتىلگەن كۆزنەك باشقۇرۇش مەشغۇلاتىغا ئىشلىتىلىدىغان ئۆزگەرتىش"
#: ../src/mutter.schemas.in.h:6
#: ../src/mutter.schemas.in.h:7
msgid ""
"The amount of total draggable borders. If the theme's visible borders are "
"not enough, invisible borders will be added to meet this value."
msgstr ""
#: ../src/mutter.schemas.in.h:8
msgid ""
"This key will initiate the \"overlay\", which is a combination window "
"overview and application launching system. The default is intended to be the "
@ -834,7 +846,7 @@ msgstr ""
"ئەھۋالدا يەككە كومپيۇتېردىكى \"Windows key\" كۇنۇپكىسىنى ئىشلىتىشنى تەلەپ "
"قىلىدۇ. بەلكىم كۆڭۈلدىكى ياكى بوش تىزىقنى ئىشلىتىدۇ."
#: ../src/mutter.schemas.in.h:7
#: ../src/mutter.schemas.in.h:9
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
@ -843,7 +855,7 @@ msgstr ""
"true بولغاندا مودېل سۆزلەشكۈ ئاتا كۆزنەكنىڭ ماۋزۇ بالداققا يېپىشىپ كۆرۈنىدۇ "
"ھەمدە ئاتا كۆزنەككە ئەگىشىپ يۆتكىلىدۇ، ئايرىم ماۋزۇ بالدىقى بولمايدۇ."
#: ../src/mutter.schemas.in.h:8
#: ../src/mutter.schemas.in.h:10
msgid "Workspaces only on primary"
msgstr "ئاساسىي كۆزەتكۈچتىكى خىزمەت رايونىغىلا"
@ -852,47 +864,47 @@ msgstr "ئاساسىي كۆزەتكۈچتىكى خىزمەت رايونىغىل
msgid "Usage: %s\n"
msgstr "ئىشلىتىش ئۇسۇلى:%s\n"
#: ../src/ui/frames.c:1280
#: ../src/ui/frames.c:1157
msgid "Close Window"
msgstr "كۆزنەك ياپ"
#: ../src/ui/frames.c:1283
#: ../src/ui/frames.c:1160
msgid "Window Menu"
msgstr "كۆزنەك تىزىملىكى"
#: ../src/ui/frames.c:1286
#: ../src/ui/frames.c:1163
msgid "Minimize Window"
msgstr "كۆزنەكنى كىچىكلەت"
#: ../src/ui/frames.c:1289
#: ../src/ui/frames.c:1166
msgid "Maximize Window"
msgstr "كۆزنەكنى چوڭايت"
#: ../src/ui/frames.c:1292
#: ../src/ui/frames.c:1169
msgid "Restore Window"
msgstr "كۆزنەكنى ئەسلىگە كەلتۈر"
#: ../src/ui/frames.c:1295
#: ../src/ui/frames.c:1172
msgid "Roll Up Window"
msgstr "كۆزنەكنى تۈر"
#: ../src/ui/frames.c:1298
#: ../src/ui/frames.c:1175
msgid "Unroll Window"
msgstr "كۆزنەكنى تۈرمە"
#: ../src/ui/frames.c:1301
#: ../src/ui/frames.c:1178
msgid "Keep Window On Top"
msgstr "كۆزنەكنى چوققىلاشنى ساقلا"
#: ../src/ui/frames.c:1304
#: ../src/ui/frames.c:1181
msgid "Remove Window From Top"
msgstr "كۆزنەكنى چوققىلاشنى بىكار قىلىش"
#: ../src/ui/frames.c:1307
#: ../src/ui/frames.c:1184
msgid "Always On Visible Workspace"
msgstr "خىزمەت رايونىدا ئىزچىل كۆرۈنسۇن"
#: ../src/ui/frames.c:1310
#: ../src/ui/frames.c:1187
msgid "Put Window On Only One Workspace"
msgstr "بىر خىزمەت رايونىغا ئورۇنلاشتۇرۇش"
@ -1004,7 +1016,7 @@ msgstr "باشقا خىزمەت بوشلۇقىغا يۆتكە(_W)"
#.
#: ../src/ui/metaaccellabel.c:77
msgid "Shift"
msgstr "Shift كۇنۇپكىسى"
msgstr "Shift"
#. This is the text that should appear next to menu accelerators
#. * that use the control key. If the text on this key isn't typically
@ -1095,50 +1107,77 @@ msgstr "Mod5"
msgid "%d x %d"
msgstr "%d x %d"
#: ../src/ui/theme.c:255
#: ../src/ui/theme.c:253
msgid "top"
msgstr "چوققا"
#: ../src/ui/theme.c:257
#: ../src/ui/theme.c:255
msgid "bottom"
msgstr "ئاستى"
#: ../src/ui/theme.c:259
#: ../src/ui/theme.c:257
msgid "left"
msgstr "سول"
#: ../src/ui/theme.c:261
#: ../src/ui/theme.c:259
msgid "right"
msgstr "ئوڭ"
#: ../src/ui/theme.c:288
#: ../src/ui/theme.c:286
#, c-format
msgid "frame geometry does not specify \"%s\" dimension"
msgstr "كاندۇك گىيومېتىرىك جايلاشتۇرۇش \"%s\" نىڭ چوڭلۇقىنى بەلگىلىمىگەن"
#: ../src/ui/theme.c:307
#: ../src/ui/theme.c:305
#, c-format
msgid "frame geometry does not specify dimension \"%s\" for border \"%s\""
msgstr ""
"كاندۇك گىيومېتىرىك جايلاشتۇرۇش \"%s\" نىڭ چوڭلۇقىنى بەلگىلىمىگەن(\"%s\" "
"گىرۋىكىگە بەلگىلەنگەن)"
#: ../src/ui/theme.c:344
#: ../src/ui/theme.c:342
#, c-format
msgid "Button aspect ratio %g is not reasonable"
msgstr "كۇنۇپكا ئۇزۇنلۇق كەڭلىك نىسبىتى %g غا ماس كەلمەيدۇ"
#: ../src/ui/theme.c:356
#: ../src/ui/theme.c:354
#, c-format
msgid "Frame geometry does not specify size of buttons"
msgstr "كاندۇك گىيومېتىرىك جايلاشتۇرۇشتا تۈگمە چوڭلۇقى بەلگىلەنمىگەن"
#: ../src/ui/theme.c:1064
#: ../src/ui/theme.c:1060
#, c-format
msgid "Gradients should have at least two colors"
msgstr "تەدرىجىي ئۆزگىرىشتە ئاز دېگەندە ئىككى خىل رەڭ بولۇش كېرەك"
#: ../src/ui/theme.c:1202
#: ../src/ui/theme.c:1212
#, c-format
msgid ""
"GTK custom color specification must have color name and fallback in "
"parentheses, e.g. gtk:custom(foo,bar); could not parse \"%s\""
msgstr ""
"GTK رەڭ ئۆلچىمىدە ھالەتتىن كېيىن چوقۇم رەڭ ئاتى ۋە زاپاس بولۇشى لازىم، "
"مەسىلەن، gtk:custom(foo,bar) ھالەت؛ \"%s\" نى تەھلىل قىلالمايدۇ"
#: ../src/ui/theme.c:1228
#, c-format
msgid ""
"Invalid character '%c' in color_name parameter of gtk:custom, only A-Za-z0-9-"
"_ are valid"
msgstr ""
"gtk:custom نىڭ color_name پارامېتىرىدىكى ئىناۋەتسىز ھەرپ '%c'، پەقەت A-Za-z0-"
"9-_ نىلا ئىشلەتكىلى بولىدۇ"
#: ../src/ui/theme.c:1242
#, c-format
msgid ""
"Gtk:custom format is \"gtk:custom(color_name,fallback)\", \"%s\" does not "
"fit the format"
msgstr ""
"Gtk:custom نىڭ پىچىمى \"gtk:custom(color_name,fallback)\" بولۇپ، \"%s\" "
"پىچىمغا توغرا كەلمەيدۇ"
#: ../src/ui/theme.c:1287
#, c-format
msgid ""
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
@ -1147,7 +1186,7 @@ msgstr ""
"GTK رەڭ ئۆلچىمىدە ھالەت چوقۇم ئوتتۇرا تىرناققا ئېلىنىشى لازىم، مەسىلەن، gtk:"
"fg[NORMAL] بۇنىڭدىكى NORMAL ھالەت؛ \"%s\" نى تەھلىل قىلالمايدۇ"
#: ../src/ui/theme.c:1216
#: ../src/ui/theme.c:1301
#, c-format
msgid ""
"GTK color specification must have a close bracket after the state, e.g. gtk:"
@ -1156,17 +1195,17 @@ msgstr ""
"GTK رەڭ ئۆلچىمىدە ھالەتتىن كېيىن چوقۇم ئوتتۇرا تىرناق يېپىلىشى لازىم، "
"مەسىلەن، gtk:fg[NORMAL] بۇنىڭدىكى NORMAL ھالەت؛ \"%s\" نى تەھلىل قىلالمايدۇ"
#: ../src/ui/theme.c:1227
#: ../src/ui/theme.c:1312
#, c-format
msgid "Did not understand state \"%s\" in color specification"
msgstr "رەڭ بەلگىلىمىسىدىكى «%s» ھالەتنى چۈشەنگىلى بولمىدى"
#: ../src/ui/theme.c:1240
#: ../src/ui/theme.c:1325
#, c-format
msgid "Did not understand color component \"%s\" in color specification"
msgstr "رەڭ بەلگىلىمىسىدىكى «%s» رەڭ بۆلىكىنى چۈشەنگىلى بولمىدى"
#: ../src/ui/theme.c:1270
#: ../src/ui/theme.c:1355
#, c-format
msgid ""
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
@ -1175,49 +1214,44 @@ msgstr ""
"بىرىكمە رەڭنىڭ فورماتى \"blend/bg_color/fg_color/alpha\"، \"%s\" بۇ "
"فورماتقا ماس كەلمىدى"
#: ../src/ui/theme.c:1281
#: ../src/ui/theme.c:1366
#, c-format
msgid "Could not parse alpha value \"%s\" in blended color"
msgstr "بىرىكمە رەڭدىكى ئالفا قىممىتى \"%s\" نى تەھلىل قىلغىلى بولمىدى"
#: ../src/ui/theme.c:1291
#: ../src/ui/theme.c:1376
#, c-format
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
msgstr ""
"بىرىكمە رەڭنىڭ ئالفا قىممىتى \"%s\" نىڭ دائىرىسى 0.0 ~1.0 ئىچىدە ئەمەس"
#: ../src/ui/theme.c:1338
#: ../src/ui/theme.c:1423
#, c-format
msgid ""
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
msgstr "سايە پىچىمى \"shade/base_color/factor\"، \"%s\" پىچىمغا توغرا كەلمەيدۇ"
#: ../src/ui/theme.c:1349
#: ../src/ui/theme.c:1434
#, c-format
msgid "Could not parse shade factor \"%s\" in shaded color"
msgstr "سايە رەڭگىدىكى سايە فاكتور «%s»نى تەھلىل قىلغىلى بولمىدى"
#: ../src/ui/theme.c:1359
#: ../src/ui/theme.c:1444
#, c-format
msgid "Shade factor \"%s\" in shaded color is negative"
msgstr "سايە رەڭگىدىكى سايە فاكتور “%s” مەنپىي سان"
#: ../src/ui/theme.c:1388
#: ../src/ui/theme.c:1473
#, c-format
msgid "Could not parse color \"%s\""
msgstr "رەڭنى تەھلىل قىلغىلى بولمىدى“%s”"
#: ../src/ui/theme.c:1481
#, c-format
msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
msgstr "GTK+ ئۆرنەكتىن رەڭ %s[%s] نى ئىزدىيەلمىدى\n"
#: ../src/ui/theme.c:1713
#: ../src/ui/theme.c:1784
#, c-format
msgid "Coordinate expression contains character '%s' which is not allowed"
msgstr "كوئوردېنات ئىپادىسىنىڭ تەركىبىدە رۇخسەت قىلىنمىغان تېكىست '%s' بار"
#: ../src/ui/theme.c:1740
#: ../src/ui/theme.c:1811
#, c-format
msgid ""
"Coordinate expression contains floating point number '%s' which could not be "
@ -1226,54 +1260,54 @@ msgstr ""
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە تەھلىل قىلغىلى بولمايدىغان كەسىر سان '%s' "
"بار"
#: ../src/ui/theme.c:1754
#: ../src/ui/theme.c:1825
#, c-format
msgid "Coordinate expression contains integer '%s' which could not be parsed"
msgstr ""
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە تەھلىل قىلغىلى بولمايدىغان پۈتۈن سان '%s' "
"بار"
#: ../src/ui/theme.c:1876
#: ../src/ui/theme.c:1947
#, c-format
msgid ""
"Coordinate expression contained unknown operator at the start of this text: "
"\"%s\""
msgstr "كوئوردېنات ئىپادىسىنىڭ بېشىدا نامەلۇم ئەمەل بار: «%s»"
#: ../src/ui/theme.c:1933
#: ../src/ui/theme.c:2004
#, c-format
msgid "Coordinate expression was empty or not understood"
msgstr "كوئوردېناتنىڭ ئىپادىلەش شەكلى قۇرۇق ياكى چۈشىنىكسىز"
#: ../src/ui/theme.c:2044 ../src/ui/theme.c:2054 ../src/ui/theme.c:2088
#: ../src/ui/theme.c:2115 ../src/ui/theme.c:2125 ../src/ui/theme.c:2159
#, c-format
msgid "Coordinate expression results in division by zero"
msgstr "كوئوردېناتنىڭ ئىپادىلەش شەكلى 0 نى بۆلگۈچ قىلغان"
#: ../src/ui/theme.c:2096
#: ../src/ui/theme.c:2167
#, c-format
msgid ""
"Coordinate expression tries to use mod operator on a floating-point number"
msgstr "كوئوردېنات ئىپادىسى كەسىر سانغا mod ئەمىلىنى ئىشلەتمەكچى"
#: ../src/ui/theme.c:2152
#: ../src/ui/theme.c:2223
#, c-format
msgid ""
"Coordinate expression has an operator \"%s\" where an operand was expected"
msgstr ""
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە سان كېلىدىغان يەردە ئەمەل \"%s\" بار ئىكەن"
#: ../src/ui/theme.c:2161
#: ../src/ui/theme.c:2232
#, c-format
msgid "Coordinate expression had an operand where an operator was expected"
msgstr "كوئوردېنات ئىپادىسىنىڭ تەركىبىدە ئەمەل كېلىدىغان يەردە سان بار ئىكەن"
#: ../src/ui/theme.c:2169
#: ../src/ui/theme.c:2240
#, c-format
msgid "Coordinate expression ended with an operator instead of an operand"
msgstr "كوئوردېنات ئىپادىسى سان بىلەن ئاياغلاشماي ئەمەل بىلەن ئاياغلاشقان"
#: ../src/ui/theme.c:2179
#: ../src/ui/theme.c:2250
#, c-format
msgid ""
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
@ -1282,43 +1316,43 @@ msgstr ""
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە ئەمەل \"%2$c\" نىڭ ئارقىسىدىن ئەمەل \"%1$c"
"\" كېلىپتۇ، ئارىلىقتا سان يوق ئىكەن"
#: ../src/ui/theme.c:2330 ../src/ui/theme.c:2375
#: ../src/ui/theme.c:2401 ../src/ui/theme.c:2446
#, c-format
msgid "Coordinate expression had unknown variable or constant \"%s\""
msgstr ""
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدە نامەلۇم ئۆزگەرگۈچى ياكى تۇراقلىق سان \"%s\" "
"بار ئىكەن"
#: ../src/ui/theme.c:2429
#: ../src/ui/theme.c:2500
#, c-format
msgid "Coordinate expression parser overflowed its buffer."
msgstr "كوئوردېنات ئىپادىسىنى تەھلىل قىلىۋاتقاندا يىغلەك تېشىپ كەتتى."
#: ../src/ui/theme.c:2458
#: ../src/ui/theme.c:2529
#, c-format
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
msgstr ""
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدىكى يېپىلغان تىرناققا ماس كېلىدىغان ئېچىلغان "
"تىرناق يوق"
#: ../src/ui/theme.c:2522
#: ../src/ui/theme.c:2593
#, c-format
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
msgstr ""
"كوئوردېنات ئىپادىسىنىڭ تەركىبىدىكى ئېچىلغان تىرناققا ماس كېلىدىغان يېپىلغان "
"تىرناق يوق"
#: ../src/ui/theme.c:2533
#: ../src/ui/theme.c:2604
#, c-format
msgid "Coordinate expression doesn't seem to have any operators or operands"
msgstr "كوئوردېنات ئىپادىسىنىڭ تەركىبىدە ئەمەل(قوشۇش، ئېلىش...) ياكى سان يوق"
#: ../src/ui/theme.c:2745 ../src/ui/theme.c:2765 ../src/ui/theme.c:2785
#: ../src/ui/theme.c:2816 ../src/ui/theme.c:2836 ../src/ui/theme.c:2856
#, c-format
msgid "Theme contained an expression that resulted in an error: %s\n"
msgstr "تېما تەركىبىدە خاتالىق چىقىرىدىغان ئىپادە بار: %s\n"
#: ../src/ui/theme.c:4482
#: ../src/ui/theme.c:4527
#, c-format
msgid ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
@ -1327,25 +1361,25 @@ msgstr ""
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/>بۇ كۆزنەكنىڭ "
"ئۇسلۇبى ئۈچۈن بەلگىلىنىشى زۆرۈر"
#: ../src/ui/theme.c:5012 ../src/ui/theme.c:5037
#: ../src/ui/theme.c:5060 ../src/ui/theme.c:5085
#, c-format
msgid ""
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
msgstr ""
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/> يوق"
#: ../src/ui/theme.c:5085
#: ../src/ui/theme.c:5133
#, c-format
msgid "Failed to load theme \"%s\": %s\n"
msgstr "تېما “%s” نى كىرگۈزگىلى بولمىدى:%s\n"
#: ../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
#: ../src/ui/theme.c:5269 ../src/ui/theme.c:5276 ../src/ui/theme.c:5283
#: ../src/ui/theme.c:5290 ../src/ui/theme.c:5297
#, c-format
msgid "No <%s> set for theme \"%s\""
msgstr "ئۇسلۇب \"%1$s\" نىڭ <%2$s> ئى بەلگىلەنمىگەن"
#: ../src/ui/theme.c:5257
#: ../src/ui/theme.c:5305
#, c-format
msgid ""
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
@ -1354,7 +1388,7 @@ msgstr ""
"كۆزنەك تىپى \"%s\" (\"%s\" تېمىدا)غا كاندۇك كۆزنەك تەڭشەلمىگەن، بىر <window "
"type=\"%s\" style_set=\"whatever\"/> ئېلېمېنتى قوشۇڭ"
#: ../src/ui/theme.c:5707 ../src/ui/theme.c:5769 ../src/ui/theme.c:5832
#: ../src/ui/theme.c:5744 ../src/ui/theme.c:5806 ../src/ui/theme.c:5869
#, c-format
msgid ""
"User-defined constants must begin with a capital letter; \"%s\" does not"
@ -1362,7 +1396,7 @@ msgstr ""
"ئىشلەتكۈچى بەلگىلىگەن تۇراقلىق مىقدار چوقۇم چوڭ ھەرپ بىلەن باشلانسۇن؛ «%s» "
"بولمايدۇ"
#: ../src/ui/theme.c:5715 ../src/ui/theme.c:5777 ../src/ui/theme.c:5840
#: ../src/ui/theme.c:5752 ../src/ui/theme.c:5814 ../src/ui/theme.c:5877
#, c-format
msgid "Constant \"%s\" has already been defined"
msgstr "تۇراقلىق سان “%s” غا ئېنىقلىما بېرىلگەن"
@ -1821,88 +1855,88 @@ msgstr "بۇ ئۈلگە سۆزلەشكۈسىدىكى مىسال ئۇچۇرى"
msgid "Fake menu item %d\n"
msgstr "مەۋھۇم تىزىملىك تۈرى %d\n"
#: ../src/ui/theme-viewer.c:370
#: ../src/ui/theme-viewer.c:371
msgid "Border-only window"
msgstr "گىرۋەكلىك كۆزنەك"
#: ../src/ui/theme-viewer.c:372
#: ../src/ui/theme-viewer.c:373
msgid "Bar"
msgstr "تۈۋرۈكسىمان دىئاگرامما"
#: ../src/ui/theme-viewer.c:389
#: ../src/ui/theme-viewer.c:390
msgid "Normal Application Window"
msgstr "ئادەتتىكى پروگرامما كۆزنىكى"
#: ../src/ui/theme-viewer.c:393
#: ../src/ui/theme-viewer.c:394
msgid "Dialog Box"
msgstr "سۆزلەشكۈ كۆزنەكچىسى"
#: ../src/ui/theme-viewer.c:397
#: ../src/ui/theme-viewer.c:398
msgid "Modal Dialog Box"
msgstr "ھالەت سۆزلەشكۈ رامكىسى"
#: ../src/ui/theme-viewer.c:401
#: ../src/ui/theme-viewer.c:402
msgid "Utility Palette"
msgstr "قورال كۇنۇپكىسى"
#: ../src/ui/theme-viewer.c:405
#: ../src/ui/theme-viewer.c:406
msgid "Torn-off Menu"
msgstr "بۆلىۋالغان تىزىملىك"
#: ../src/ui/theme-viewer.c:409
#: ../src/ui/theme-viewer.c:410
msgid "Border"
msgstr "گىرۋەك"
#: ../src/ui/theme-viewer.c:413
#: ../src/ui/theme-viewer.c:414
msgid "Attached Modal Dialog"
msgstr "قوشۇلغان Modal سۆزلەشكۈ"
#: ../src/ui/theme-viewer.c:744
#: ../src/ui/theme-viewer.c:747
#, c-format
msgid "Button layout test %d"
msgstr "كۇنۇپكا ئورۇنلاشتۇرۇلۇشىنى سىناش %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 مىللىسېكۇنت(بىر كۆزنەك كاندۇكىنى سىزىشقا كەتكەن ۋاقىت)"
#: ../src/ui/theme-viewer.c:818
#: ../src/ui/theme-viewer.c:821
#, c-format
msgid "Usage: metacity-theme-viewer [THEMENAME]\n"
msgstr "ئىشلىتىش ئۇسۇلى: metacity-theme-viewer [ئۇسلۇب ئاتى]\n"
#: ../src/ui/theme-viewer.c:825
#: ../src/ui/theme-viewer.c:828
#, c-format
msgid "Error loading theme: %s\n"
msgstr "تېما قاچىلاشتا خاتالىق كۆرۈلدى:%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 "\"%s\" دېگەن ئۇسلۇبنى %g سېكۇنتتا ئوقۇدى\n"
#: ../src/ui/theme-viewer.c:875
#: ../src/ui/theme-viewer.c:878
msgid "Normal Title Font"
msgstr "ئادەتتىكى ماۋزۇ خەت نۇسخىسى"
#: ../src/ui/theme-viewer.c:881
#: ../src/ui/theme-viewer.c:884
msgid "Small Title Font"
msgstr "تارماق ماۋزۇ خەت نۇسخىسى"
#: ../src/ui/theme-viewer.c:887
#: ../src/ui/theme-viewer.c:890
msgid "Large Title Font"
msgstr "ماۋزۇ خەت نۇسخىسى"
#: ../src/ui/theme-viewer.c:892
#: ../src/ui/theme-viewer.c:895
msgid "Button Layouts"
msgstr "كۇنۇپكا ئورۇنلاشتۇرۇلۇشى"
#: ../src/ui/theme-viewer.c:897
#: ../src/ui/theme-viewer.c:900
msgid "Benchmark"
msgstr "ئاساسىي ئۆلچەم"
#: ../src/ui/theme-viewer.c:949
#: ../src/ui/theme-viewer.c:952
msgid "Window Title Goes Here"
msgstr "بۇ يەردە كۆزنەك ماۋزۇسى كۆرسىتىلىدۇ"
@ -1955,6 +1989,9 @@ msgid "%d coordinate expressions parsed in %g seconds (%g seconds average)\n"
msgstr ""
"%d كوئوردېنات ئىپادىسى %g سېكۇنتتا تەھلىل قىلىندى(%g ئوتتۇرىچە سېكۇنت)\n"
#~ msgid "Failed to retrieve color %s[%s] from GTK+ theme.\n"
#~ msgstr "GTK+ ئۆرنەكتىن رەڭ %s[%s] نى ئىزدىيەلمىدى\n"
#~ msgid "Turn compositing on"
#~ msgstr "ئارىلاشتۇرۇشنى ئىچىش"

1141
po/uk.po

File diff suppressed because it is too large Load Diff

1433
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

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<KeyListEntries schema="org.gnome.mutter.keybindings"
group="system"
_name="Windows"
wm_name="Mutter"
package="mutter">
<KeyListEntry name="toggle-tiled-left"
_description="View split on left"/>
<KeyListEntry name="toggle-tiled-right"
_description="View split on right"/>
</KeyListEntries>

View File

@ -27,8 +27,6 @@ INCLUDES= \
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
mutter_built_sources = \
mutter-marshal.h \
mutter-marshal.c \
mutter-enum-types.h \
mutter-enum-types.c
@ -45,7 +43,7 @@ libmutter_la_SOURCES = \
compositor/compositor.c \
compositor/compositor-private.h \
compositor/meta-background-actor.c \
compositor/meta-background-actor.h \
compositor/meta-background-actor-private.h \
compositor/meta-module.c \
compositor/meta-module.h \
compositor/meta-plugin.c \
@ -54,7 +52,8 @@ libmutter_la_SOURCES = \
compositor/meta-shadow-factory.c \
compositor/meta-shadow-factory-private.h \
compositor/meta-shaped-texture.c \
compositor/meta-shaped-texture.h \
compositor/meta-texture-rectangle.c \
compositor/meta-texture-rectangle.h \
compositor/meta-texture-tower.c \
compositor/meta-texture-tower.h \
compositor/meta-window-actor.c \
@ -66,6 +65,7 @@ libmutter_la_SOURCES = \
compositor/region-utils.c \
compositor/region-utils.h \
meta/compositor.h \
meta/meta-background-actor.h \
meta/meta-plugin.h \
meta/meta-shadow-factory.h \
meta/meta-window-actor.h \
@ -75,20 +75,6 @@ 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 \
@ -111,8 +97,6 @@ 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 \
@ -146,8 +130,6 @@ libmutter_la_SOURCES = \
core/core.h \
ui/ui.h \
inlinepixbufs.h \
ui/fixedtip.c \
ui/fixedtip.h \
ui/frames.c \
ui/frames.h \
ui/menu.c \
@ -165,19 +147,10 @@ libmutter_la_SOURCES = \
meta/theme.h \
ui/theme-private.h \
ui/ui.c \
core/all-keybindings.h \
meta/preview-widget.h \
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)
@ -188,15 +161,15 @@ 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 \
meta/group.h \
meta/keybindings.h \
meta/main.h \
meta/meta-background-actor.h \
meta/meta-plugin.h \
meta/meta-shaped-texture.h \
meta/meta-shadow-factory.h \
meta/meta-window-actor.h \
meta/prefs.h \
@ -248,7 +221,7 @@ typelib_DATA = Meta-$(api_version).typelib
INTROSPECTION_GIRS = Meta-$(api_version).gir
Meta-$(api_version).gir: libmutter.la
@META_GIR@_INCLUDES = GObject-2.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0
@META_GIR@_INCLUDES = GObject-2.0 GDesktopEnums-3.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0
@META_GIR@_PACKAGES = clutter-1.0 gtk+-3.0
@META_GIR@_CFLAGS = $(INCLUDES)
@META_GIR@_LIBS = libmutter.la
@ -284,20 +257,17 @@ wmproperties_in_files=mutter-wm.desktop.in
wmproperties_files=$(wmproperties_in_files:.desktop.in=.desktop)
wmproperties_DATA = $(wmproperties_files)
schemadir = $(GCONF_SCHEMA_FILE_DIR)
schema_in_files = mutter.schemas.in
schema_DATA = $(schema_in_files:.schemas.in=.schemas)
xmldir = @GNOME_KEYBINDINGS_KEYSDIR@
xml_in_files = \
50-mutter-windows.xml.in
xml_DATA = $(xml_in_files:.xml.in=.xml)
gsettings_SCHEMAS = org.gnome.mutter.gschema.xml
@INTLTOOL_XML_NOMERGE_RULE@
@GSETTINGS_RULES@
@INTLTOOL_SCHEMAS_RULE@
if GCONF_SCHEMAS_INSTALL
install-data-local:
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(schema_DATA)
else
install-data-local:
endif
convertdir = $(datadir)/GConf/gsettings
convert_DATA = mutter-schemas.convert
IMAGES=stock_maximize.png stock_minimize.png stock_delete.png
VARIABLES=stock_maximize_data $(srcdir)/stock_maximize.png \
@ -309,7 +279,8 @@ CLEANFILES = \
inlinepixbufs.h \
mutter.desktop \
mutter-wm.desktop \
mutter.schemas \
org.gnome.mutter.gschema.xml \
$(xml_DATA) \
$(mutter_built_sources) \
$(typelib_DATA) \
$(gir_DATA)
@ -326,37 +297,18 @@ EXTRA_DIST=$(desktopfiles_files) \
$(IMAGES) \
$(desktopfiles_in_files) \
$(wmproperties_in_files) \
$(schema_in_files) \
$(xml_in_files) \
org.gnome.mutter.gschema.xml.in \
mutter-schemas.convert \
libmutter.pc.in \
mutter-plugins.pc.in \
mutter-enum-types.h.in \
mutter-enum-types.c.in \
mutter-marshal.list
mutter-enum-types.c.in
BUILT_SOURCES += $(mutter_built_sources)
MUTTER_STAMP_FILES = stamp-mutter-marshal.h stamp-mutter-enum-types.h
MUTTER_STAMP_FILES = stamp-mutter-enum-types.h
CLEANFILES += $(MUTTER_STAMP_FILES)
mutter-marshal.h: stamp-mutter-marshal.h
@true
stamp-mutter-marshal.h: Makefile mutter-marshal.list
$(AM_V_GEN) $(GLIB_GENMARSHAL) \
--prefix=_mutter_marshal \
--header \
$(srcdir)/mutter-marshal.list > xgen-tmh && \
(cmp -s xgen-tmh mutter-marshal.h || cp -f xgen-tmh mutter-marshal.h) && \
rm -f xgen-tmh && \
echo timestamp > $(@F)
mutter-marshal.c: Makefile mutter-marshal.list
$(AM_V_GEN) (echo "#include \"mutter-marshal.h\"" ; \
$(GLIB_GENMARSHAL) \
--prefix=_mutter_marshal \
--body \
$(srcdir)/mutter-marshal.list ) > xgen-tmc && \
cp -f xgen-tmc mutter-marshal.c && \
rm -f xgen-tmc
mutter-enum-types.h: stamp-mutter-enum-types.h Makefile
@true
stamp-mutter-enum-types.h: $(libmutterinclude_base_headers) mutter-enum-types.h.in

View File

@ -8,6 +8,7 @@
#include <meta/compositor.h>
#include <meta/display.h>
#include "meta-plugin-manager.h"
#include "meta-window-actor-private.h"
#include <clutter/clutter.h>
typedef struct _MetaCompScreen MetaCompScreen;
@ -41,6 +42,10 @@ struct _MetaCompScreen
GHashTable *windows_by_xid;
Window output;
/* Used for unredirecting fullscreen windows */
guint disable_unredirect_count;
MetaWindowActor *unredirected_window;
/* Before we create the output window */
XserverRegion pending_input_region;
@ -50,9 +55,6 @@ struct _MetaCompScreen
};
void meta_switch_workspace_completed (MetaScreen *screen);
void meta_set_stage_input_region (MetaScreen *screen,
XserverRegion region);
void meta_empty_stage_input_region (MetaScreen *screen);
gboolean meta_begin_modal_for_plugin (MetaScreen *screen,
MetaPlugin *plugin,

View File

@ -15,11 +15,9 @@
#include <meta/meta-shadow-factory.h>
#include "meta-window-actor-private.h"
#include "meta-window-group.h"
#include "meta-background-actor.h"
#include "meta-background-actor-private.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>
@ -111,28 +109,6 @@ process_damage (MetaCompositor *compositor,
meta_window_actor_process_damage (window_actor, event);
}
#ifdef HAVE_SHAPE
static void
process_shape (MetaCompositor *compositor,
XShapeEvent *event,
MetaWindow *window)
{
MetaWindowActor *window_actor;
if (window == NULL)
return;
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
if (window_actor == NULL)
return;
if (event->kind == ShapeBounding)
{
meta_window_actor_update_shape (window_actor, event->shaped);
}
}
#endif
static void
process_property_notify (MetaCompositor *compositor,
XPropertyEvent *event,
@ -149,8 +125,7 @@ process_property_notify (MetaCompositor *compositor,
MetaScreen *screen = l->data;
if (event->window == meta_screen_get_xroot (screen))
{
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
meta_background_actor_update (META_BACKGROUND_ACTOR (info->background_actor));
meta_background_actor_update (screen);
return;
}
}
@ -180,6 +155,7 @@ 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);
@ -193,7 +169,13 @@ get_output_window (MetaScreen *screen)
KeyPressMask | KeyReleaseMask;
output = XCompositeGetOverlayWindow (xdisplay, xroot);
meta_core_select_events (xdisplay, output, event_mask, TRUE);
if (XGetWindowAttributes (xdisplay, output, &attr))
{
event_mask |= attr.your_event_mask;
}
XSelectInput (xdisplay, output, event_mask);
return output;
}
@ -297,6 +279,12 @@ do_set_stage_input_region (MetaScreen *screen,
Window xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
/* It's generally a good heuristic that when a crossing event is generated because
* we reshape the overlay, we don't want it to affect focus-follows-mouse focus -
* it's not the user doing something, it's the environment changing under the user.
*/
meta_display_add_ignored_crossing_serial (display, XNextRequest (xdpy));
XFixesSetWindowShapeRegion (xdpy, info->output, ShapeInput, 0, 0, region);
}
@ -359,34 +347,26 @@ 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;
gboolean result;
MetaDevice *device;
MetaGrabInfo *grab_info;
int result;
/* 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)
if (compositor->modal_plugin != NULL || display->grab_op != META_GRAB_OP_NONE)
return FALSE;
if ((options & META_MODAL_POINTER_ALREADY_GRABBED) == 0)
{
result = meta_device_grab (device,
grab_window,
(ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask | PointerMotionMask),
cursor,
FALSE,
FALSE,
timestamp);
if (!result)
result = XGrabPointer (xdpy, grab_window,
False, /* owner_events */
(ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask | PointerMotionMask),
GrabModeAsync, GrabModeAsync,
None, /* confine to */
cursor,
timestamp);
if (result != Success)
goto fail;
pointer_grabbed = TRUE;
@ -394,25 +374,22 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
if ((options & META_MODAL_KEYBOARD_ALREADY_GRABBED) == 0)
{
result = meta_device_grab (meta_device_get_paired_device (device),
grab_window,
(KeyPressMask | KeyReleaseMask),
META_CURSOR_DEFAULT,
FALSE, FALSE,
timestamp);
if (!result)
result = XGrabKeyboard (xdpy, grab_window,
False, /* owner_events */
GrabModeAsync, GrabModeAsync,
timestamp);
if (result != Success)
goto fail;
keyboard_grabbed = 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;
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;
compositor->modal_plugin = plugin;
@ -420,9 +397,9 @@ meta_begin_modal_for_plugin (MetaScreen *screen,
fail:
if (pointer_grabbed)
meta_device_ungrab (device, timestamp);
XUngrabPointer (xdpy, timestamp);
if (keyboard_grabbed)
meta_device_ungrab (meta_device_get_paired_device (device), timestamp);
XUngrabKeyboard (xdpy, timestamp);
return FALSE;
}
@ -433,19 +410,20 @@ 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);
/* FIXME: need a real device here */
device = meta_device_map_lookup (display->device_map,
META_CORE_POINTER_ID);
XUngrabPointer (xdpy, timestamp);
XUngrabKeyboard (xdpy, timestamp);
meta_device_ungrab (device, timestamp);
meta_device_ungrab (meta_device_get_paired_device (device), timestamp);
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_display_remove_grab_info (display, device);
compositor->modal_plugin = NULL;
}
@ -478,6 +456,7 @@ 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;
@ -536,13 +515,15 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
meta_screen_set_cm_selection (screen);
info->stage = clutter_stage_get_default ();
info->stage = clutter_stage_new ();
meta_screen_get_size (screen, &width, &height);
clutter_actor_set_size (info->stage, width, height);
clutter_actor_realize (info->stage);
xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
XResizeWindow (xdisplay, xwin, width, height);
event_mask = FocusChangeMask |
ExposureMask |
EnterWindowMask | LeaveWindowMask |
@ -552,10 +533,15 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
KeyPressMask | KeyReleaseMask |
StructureNotifyMask;
meta_core_select_events (xdisplay, xwin, event_mask, TRUE);
if (XGetWindowAttributes (xdisplay, xwin, &attr))
{
event_mask |= attr.your_event_mask;
}
XSelectInput (xdisplay, xwin, event_mask);
info->window_group = meta_window_group_new (screen);
info->background_actor = meta_background_actor_new (screen);
info->background_actor = meta_background_actor_new_for_screen (screen);
info->overlay_group = clutter_group_new ();
info->hidden_group = clutter_group_new ();
@ -620,6 +606,47 @@ meta_compositor_unmanage_screen (MetaCompositor *compositor,
XCompositeUnredirectSubwindows (xdisplay, xroot, CompositeRedirectManual);
}
/*
* Shapes the cow so that the given window is exposed,
* when metaWindow is NULL it clears the shape again
*/
static void
meta_shape_cow_for_window (MetaScreen *screen,
MetaWindow *metaWindow)
{
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
Display *xdisplay = meta_display_get_xdisplay (meta_screen_get_display (screen));
if (metaWindow == NULL)
XFixesSetWindowShapeRegion (xdisplay, info->output, ShapeBounding, 0, 0, None);
else
{
XserverRegion output_region;
XRectangle screen_rect, window_bounds;
int width, height;
MetaRectangle rect;
meta_window_get_outer_rect (metaWindow, &rect);
window_bounds.x = rect.x;
window_bounds.y = rect.y;
window_bounds.width = rect.width;
window_bounds.height = rect.height;
meta_screen_get_size (screen, &width, &height);
screen_rect.x = 0;
screen_rect.y = 0;
screen_rect.width = width;
screen_rect.height = height;
output_region = XFixesCreateRegion (xdisplay, &window_bounds, 1);
XFixesInvertRegion (xdisplay, output_region, &screen_rect, output_region);
XFixesSetWindowShapeRegion (xdisplay, info->output, ShapeBounding, 0, 0, output_region);
XFixesDestroyRegion (xdisplay, output_region);
}
}
void
meta_compositor_add_window (MetaCompositor *compositor,
MetaWindow *window)
@ -640,12 +667,25 @@ meta_compositor_remove_window (MetaCompositor *compositor,
MetaWindow *window)
{
MetaWindowActor *window_actor = NULL;
MetaScreen *screen;
MetaCompScreen *info;
DEBUG_TRACE ("meta_compositor_remove_window\n");
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
if (!window_actor)
return;
screen = meta_window_get_screen (window);
info = meta_screen_get_compositor_data (screen);
if (window_actor == info->unredirected_window)
{
meta_window_actor_set_redirected (window_actor, TRUE);
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
NULL);
info->unredirected_window = NULL;
}
meta_window_actor_destroy (window_actor);
}
@ -657,15 +697,9 @@ meta_compositor_set_updates (MetaCompositor *compositor,
}
static gboolean
is_grabbed_event (MetaDisplay *display,
XEvent *event)
is_grabbed_event (XEvent *event)
{
guint evtype;
if (!meta_input_event_get_type (display, event, &evtype))
return FALSE;
switch (evtype)
switch (event->xany.type)
{
case ButtonPress:
case ButtonRelease:
@ -679,6 +713,16 @@ is_grabbed_event (MetaDisplay *display,
return FALSE;
}
void
meta_compositor_window_shape_changed (MetaCompositor *compositor,
MetaWindow *window)
{
MetaWindowActor *window_actor;
window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
meta_window_actor_update_shape (window_actor);
}
/**
* meta_compositor_process_event: (skip)
*
@ -688,8 +732,7 @@ meta_compositor_process_event (MetaCompositor *compositor,
XEvent *event,
MetaWindow *window)
{
if (compositor->modal_plugin &&
is_grabbed_event (compositor->display, event))
if (compositor->modal_plugin && is_grabbed_event (event))
{
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (compositor->modal_plugin);
@ -759,13 +802,6 @@ meta_compositor_process_event (MetaCompositor *compositor,
DEBUG_TRACE ("meta_compositor_process_event (process_damage)\n");
process_damage (compositor, (XDamageNotifyEvent *) event, window);
}
#ifdef HAVE_SHAPE
else if (event->type == meta_display_get_shape_event_base (compositor->display) + ShapeNotify)
{
DEBUG_TRACE ("meta_compositor_process_event (process_shape)\n");
process_shape (compositor, (XShapeEvent *) event, window);
}
#endif /* HAVE_SHAPE */
break;
}
@ -1105,14 +1141,20 @@ meta_compositor_sync_screen_size (MetaCompositor *compositor,
guint width,
guint height)
{
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
MetaDisplay *display = meta_screen_get_display (screen);
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
Display *xdisplay;
Window xwin;
DEBUG_TRACE ("meta_compositor_sync_screen_size\n");
g_return_if_fail (info);
clutter_actor_set_size (info->stage, width, height);
xdisplay = meta_display_get_xdisplay (display);
xwin = clutter_x11_get_stage_window (CLUTTER_STAGE (info->stage));
meta_background_actor_screen_size_changed (META_BACKGROUND_ACTOR (info->background_actor));
XResizeWindow (xdisplay, xwin, width, height);
meta_background_actor_screen_size_changed (screen);
meta_verbose ("Changed size for stage on screen %d to %dx%d\n",
meta_screen_get_screen_number (screen),
@ -1123,6 +1165,36 @@ static void
pre_paint_windows (MetaCompScreen *info)
{
GList *l;
MetaWindowActor *top_window;
MetaWindowActor *expected_unredirected_window = NULL;
if (info->windows == NULL)
return;
top_window = g_list_last (info->windows)->data;
if (meta_window_actor_should_unredirect (top_window) &&
info->disable_unredirect_count == 0)
expected_unredirected_window = top_window;
if (info->unredirected_window != expected_unredirected_window)
{
if (info->unredirected_window != NULL)
{
meta_window_actor_set_redirected (info->unredirected_window, TRUE);
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (info->unredirected_window)),
NULL);
}
if (expected_unredirected_window != NULL)
{
meta_shape_cow_for_window (meta_window_get_screen (meta_window_actor_get_meta_window (top_window)),
meta_window_actor_get_meta_window (top_window));
meta_window_actor_set_redirected (top_window, FALSE);
}
info->unredirected_window = expected_unredirected_window;
}
for (l = info->windows; l; l = l->next)
meta_window_actor_pre_paint (l->data);
@ -1226,6 +1298,37 @@ meta_get_overlay_window (MetaScreen *screen)
return info->output;
}
/**
* meta_disable_unredirect_for_screen:
* @screen: a #MetaScreen
*
* Disables unredirection, can be usefull in situations where having
* unredirected windows is undesireable like when recording a video.
*
*/
void
meta_disable_unredirect_for_screen (MetaScreen *screen)
{
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
if (info != NULL)
info->disable_unredirect_count = info->disable_unredirect_count + 1;
}
/**
* meta_enable_unredirect_for_screen:
* @screen: a #MetaScreen
*
* Enables unredirection which reduces the overhead for apps like games.
*
*/
void
meta_enable_unredirect_for_screen (MetaScreen *screen)
{
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
if (info != NULL)
info->disable_unredirect_count = MAX(0, info->disable_unredirect_count - 1);
}
#define FLASH_TIME_MS 50
static void

View File

@ -0,0 +1,15 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef META_BACKGROUND_ACTOR_PRIVATE_H
#define META_BACKGROUND_ACTOR_PRIVATE_H
#include <meta/screen.h>
#include <meta/meta-background-actor.h>
void meta_background_actor_set_visible_region (MetaBackgroundActor *self,
cairo_region_t *visible_region);
void meta_background_actor_update (MetaScreen *screen);
void meta_background_actor_screen_size_changed (MetaScreen *screen);
#endif /* META_BACKGROUND_ACTOR_PRIVATE_H */

View File

@ -28,76 +28,188 @@
#define COGL_ENABLE_EXPERIMENTAL_API
#include <cogl/cogl-texture-pixmap-x11.h>
#define CLUTTER_ENABLE_EXPERIMENTAL_API
#include <clutter/clutter.h>
#include <X11/Xatom.h>
#include "cogl-utils.h"
#include "compositor-private.h"
#include <meta/errors.h>
#include "meta-background-actor.h"
#include "meta-background-actor-private.h"
struct _MetaBackgroundActorClass
/* We allow creating multiple MetaBackgroundActors for the same MetaScreen to
* allow different rendering options to be set for different copies.
* But we want to share the same underlying CoglTexture for efficiency and
* to avoid driver bugs that might occur if we created multiple CoglTexturePixmaps
* for the same pixmap.
*
* This structure holds common information.
*/
typedef struct _MetaScreenBackground MetaScreenBackground;
struct _MetaScreenBackground
{
ClutterActorClass parent_class;
};
struct _MetaBackgroundActor
{
ClutterActor parent;
CoglHandle material;
MetaScreen *screen;
cairo_region_t *visible_region;
GSList *actors;
float texture_width;
float texture_height;
CoglHandle texture;
CoglMaterialWrapMode wrap_mode;
guint have_pixmap : 1;
};
struct _MetaBackgroundActorPrivate
{
MetaScreenBackground *background;
CoglHandle material;
cairo_region_t *visible_region;
float dim_factor;
};
enum
{
PROP_0,
PROP_DIM_FACTOR,
PROP_LAST
};
static GParamSpec *obj_props[PROP_LAST];
G_DEFINE_TYPE (MetaBackgroundActor, meta_background_actor, CLUTTER_TYPE_ACTOR);
static void
update_wrap_mode (MetaBackgroundActor *self)
{
int width, height;
CoglMaterialWrapMode wrap_mode;
static void set_texture (MetaScreenBackground *background,
CoglHandle texture);
static void set_texture_to_stage_color (MetaScreenBackground *background);
meta_screen_get_size (self->screen, &width, &height);
static void
on_notify_stage_color (GObject *stage,
GParamSpec *pspec,
MetaScreenBackground *background)
{
if (!background->have_pixmap)
set_texture_to_stage_color (background);
}
static void
free_screen_background (MetaScreenBackground *background)
{
set_texture (background, COGL_INVALID_HANDLE);
if (background->screen != NULL)
{
ClutterActor *stage = meta_get_stage_for_screen (background->screen);
g_signal_handlers_disconnect_by_func (stage,
(gpointer) on_notify_stage_color,
background);
background->screen = NULL;
}
}
static MetaScreenBackground *
meta_screen_background_get (MetaScreen *screen)
{
MetaScreenBackground *background;
background = g_object_get_data (G_OBJECT (screen), "meta-screen-background");
if (background == NULL)
{
ClutterActor *stage;
background = g_new0 (MetaScreenBackground, 1);
background->screen = screen;
g_object_set_data_full (G_OBJECT (screen), "meta-screen-background",
background, (GDestroyNotify) free_screen_background);
stage = meta_get_stage_for_screen (screen);
g_signal_connect (stage, "notify::color",
G_CALLBACK (on_notify_stage_color), background);
meta_background_actor_update (screen);
}
return background;
}
static void
update_wrap_mode_of_actor (MetaBackgroundActor *self)
{
MetaBackgroundActorPrivate *priv = self->priv;
cogl_material_set_layer_wrap_mode (priv->material, 0, priv->background->wrap_mode);
}
static void
update_wrap_mode (MetaScreenBackground *background)
{
GSList *l;
int width, height;
meta_screen_get_size (background->screen, &width, &height);
/* We turn off repeating when we have a full-screen pixmap to keep from
* getting artifacts from one side of the image sneaking into the other
* side of the image via bilinear filtering.
*/
if (width == self->texture_width && height == self->texture_height)
wrap_mode = COGL_MATERIAL_WRAP_MODE_CLAMP_TO_EDGE;
if (width == background->texture_width && height == background->texture_height)
background->wrap_mode = COGL_MATERIAL_WRAP_MODE_CLAMP_TO_EDGE;
else
wrap_mode = COGL_MATERIAL_WRAP_MODE_REPEAT;
background->wrap_mode = COGL_MATERIAL_WRAP_MODE_REPEAT;
cogl_material_set_layer_wrap_mode (self->material, 0, wrap_mode);
for (l = background->actors; l; l = l->next)
update_wrap_mode_of_actor (l->data);
}
static void
set_texture (MetaBackgroundActor *self,
CoglHandle texture)
set_texture_on_actor (MetaBackgroundActor *self)
{
MetaDisplay *display;
display = meta_screen_get_display (self->screen);
MetaBackgroundActorPrivate *priv = self->priv;
MetaDisplay *display = meta_screen_get_display (priv->background->screen);
/* This may trigger destruction of an old texture pixmap, which, if
* the underlying X pixmap is already gone has the tendency to trigger
* X errors inside DRI. For safety, trap errors */
meta_error_trap_push (display);
cogl_material_set_layer (self->material, 0, texture);
cogl_material_set_layer (priv->material, 0, priv->background->texture);
meta_error_trap_pop (display);
self->texture_width = cogl_texture_get_width (texture);
self->texture_height = cogl_texture_get_height (texture);
update_wrap_mode (self);
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
}
static void
set_texture (MetaScreenBackground *background,
CoglHandle texture)
{
MetaDisplay *display = meta_screen_get_display (background->screen);
GSList *l;
/* This may trigger destruction of an old texture pixmap, which, if
* the underlying X pixmap is already gone has the tendency to trigger
* X errors inside DRI. For safety, trap errors */
meta_error_trap_push (display);
if (background->texture != COGL_INVALID_HANDLE)
{
cogl_handle_unref (background->texture);
background->texture = COGL_INVALID_HANDLE;
}
meta_error_trap_pop (display);
if (texture != COGL_INVALID_HANDLE)
background->texture = cogl_handle_ref (texture);
background->texture_width = cogl_texture_get_width (background->texture);
background->texture_height = cogl_texture_get_height (background->texture);
for (l = background->actors; l; l = l->next)
set_texture_on_actor (l->data);
update_wrap_mode (background);
}
/* Sets our material to paint with a 1x1 texture of the stage's background
* color; doing this when we have no pixmap allows the application to turn
* off painting the stage. There might be a performance benefit to
@ -106,9 +218,9 @@ set_texture (MetaBackgroundActor *self,
* actually pick up the (small?) performance win. This is just a fallback.
*/
static void
set_texture_to_stage_color (MetaBackgroundActor *self)
set_texture_to_stage_color (MetaScreenBackground *background)
{
ClutterActor *stage = meta_get_stage_for_screen (self->screen);
ClutterActor *stage = meta_get_stage_for_screen (background->screen);
ClutterColor color;
CoglHandle texture;
@ -120,40 +232,31 @@ set_texture_to_stage_color (MetaBackgroundActor *self)
texture = meta_create_color_texture_4ub (color.red, color.green,
color.blue, 0xff,
COGL_TEXTURE_NO_SLICING);
set_texture (self, texture);
set_texture (background, texture);
cogl_handle_unref (texture);
}
static void
on_notify_stage_color (GObject *stage,
GParamSpec *pspec,
MetaBackgroundActor *self)
{
if (!self->have_pixmap)
set_texture_to_stage_color (self);
}
static void
meta_background_actor_dispose (GObject *object)
{
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
MetaBackgroundActorPrivate *priv = self->priv;
meta_background_actor_set_visible_region (self, NULL);
if (self->material != COGL_INVALID_HANDLE)
if (priv->background != NULL)
{
cogl_handle_unref (self->material);
self->material = COGL_INVALID_HANDLE;
priv->background->actors = g_slist_remove (priv->background->actors, self);
priv->background = NULL;
}
if (self->screen != NULL)
if (priv->material != COGL_INVALID_HANDLE)
{
ClutterActor *stage = meta_get_stage_for_screen (self->screen);
g_signal_handlers_disconnect_by_func (stage,
(gpointer) on_notify_stage_color,
self);
self->screen = NULL;
cogl_handle_unref (priv->material);
priv->material = COGL_INVALID_HANDLE;
}
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
}
static void
@ -163,14 +266,15 @@ meta_background_actor_get_preferred_width (ClutterActor *actor,
gfloat *natural_width_p)
{
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
MetaBackgroundActorPrivate *priv = self->priv;
int width, height;
meta_screen_get_size (self->screen, &width, &height);
meta_screen_get_size (priv->background->screen, &width, &height);
if (min_width_p)
*min_width_p = width;
if (natural_width_p)
*natural_width_p = height;
*natural_width_p = width;
}
static void
@ -181,9 +285,10 @@ meta_background_actor_get_preferred_height (ClutterActor *actor,
{
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
MetaBackgroundActorPrivate *priv = self->priv;
int width, height;
meta_screen_get_size (self->screen, &width, &height);
meta_screen_get_size (priv->background->screen, &width, &height);
if (min_height_p)
*min_height_p = height;
@ -195,32 +300,39 @@ static void
meta_background_actor_paint (ClutterActor *actor)
{
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
guchar opacity = clutter_actor_get_paint_opacity (actor);
MetaBackgroundActorPrivate *priv = self->priv;
guint8 opacity = clutter_actor_get_paint_opacity (actor);
guint8 color_component;
int width, height;
meta_screen_get_size (self->screen, &width, &height);
meta_screen_get_size (priv->background->screen, &width, &height);
cogl_material_set_color4ub (self->material,
opacity, opacity, opacity, opacity);
color_component = (int)(0.5 + opacity * priv->dim_factor);
cogl_set_source (self->material);
cogl_material_set_color4ub (priv->material,
color_component,
color_component,
color_component,
opacity);
if (self->visible_region)
cogl_set_source (priv->material);
if (priv->visible_region)
{
int n_rectangles = cairo_region_num_rectangles (self->visible_region);
int n_rectangles = cairo_region_num_rectangles (priv->visible_region);
int i;
for (i = 0; i < n_rectangles; i++)
{
cairo_rectangle_int_t rect;
cairo_region_get_rectangle (self->visible_region, i, &rect);
cairo_region_get_rectangle (priv->visible_region, i, &rect);
cogl_rectangle_with_texture_coords (rect.x, rect.y,
rect.x + rect.width, rect.y + rect.height,
rect.x / self->texture_width,
rect.y / self->texture_height,
(rect.x + rect.width) / self->texture_width,
(rect.y + rect.height) / self->texture_height);
rect.x / priv->background->texture_width,
rect.y / priv->background->texture_height,
(rect.x + rect.width) / priv->background->texture_width,
(rect.y + rect.height) / priv->background->texture_height);
}
}
else
@ -228,85 +340,160 @@ meta_background_actor_paint (ClutterActor *actor)
cogl_rectangle_with_texture_coords (0.0f, 0.0f,
width, height,
0.0f, 0.0f,
width / self->texture_width,
height / self->texture_height);
width / priv->background->texture_width,
height / priv->background->texture_height);
}
}
#if CLUTTER_CHECK_VERSION(1, 5, 2)
static gboolean
meta_background_actor_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
{
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
MetaBackgroundActorPrivate *priv = self->priv;
int width, height;
meta_screen_get_size (self->screen, &width, &height);
meta_screen_get_size (priv->background->screen, &width, &height);
clutter_paint_volume_set_width (volume, width);
clutter_paint_volume_set_height (volume, height);
return TRUE;
}
#endif
static void
meta_background_actor_set_dim_factor (MetaBackgroundActor *self,
gfloat dim_factor)
{
MetaBackgroundActorPrivate *priv = self->priv;
if (priv->dim_factor == dim_factor)
return;
priv->dim_factor = dim_factor;
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_DIM_FACTOR]);
}
static void
meta_background_actor_get_property(GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
MetaBackgroundActorPrivate *priv = self->priv;
switch (prop_id)
{
case PROP_DIM_FACTOR:
g_value_set_float (value, priv->dim_factor);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
meta_background_actor_set_property(GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (object);
switch (prop_id)
{
case PROP_DIM_FACTOR:
meta_background_actor_set_dim_factor (self, g_value_get_float (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
meta_background_actor_class_init (MetaBackgroundActorClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
GParamSpec *pspec;
g_type_class_add_private (klass, sizeof (MetaBackgroundActorPrivate));
object_class->dispose = meta_background_actor_dispose;
object_class->get_property = meta_background_actor_get_property;
object_class->set_property = meta_background_actor_set_property;
actor_class->get_preferred_width = meta_background_actor_get_preferred_width;
actor_class->get_preferred_height = meta_background_actor_get_preferred_height;
actor_class->paint = meta_background_actor_paint;
#if CLUTTER_CHECK_VERSION(1, 5, 2)
actor_class->get_paint_volume = meta_background_actor_get_paint_volume;
#endif
/**
* MetaBackgroundActor:dim-factor:
*
* Factor to dim the background by, between 0.0 (black) and 1.0 (original
* colors)
*/
pspec = g_param_spec_float ("dim-factor",
"Dim factor",
"Factor to dim the background by",
0.0, 1.0,
1.0,
G_PARAM_READWRITE);
obj_props[PROP_DIM_FACTOR] = pspec;
g_object_class_install_property (object_class, PROP_DIM_FACTOR, pspec);
}
static void
meta_background_actor_init (MetaBackgroundActor *background_actor)
meta_background_actor_init (MetaBackgroundActor *self)
{
MetaBackgroundActorPrivate *priv;
priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
META_TYPE_BACKGROUND_ACTOR,
MetaBackgroundActorPrivate);
priv->dim_factor = 1.0;
}
/**
* @screen: the #MetaScreen
* meta_background_actor_new:
* @screen: the #MetaScreen
*
* Creates a new actor to draw the background for the given screen.
*
* Return value: (transfer none): the newly created background actor
* Return value: the newly created background actor
*/
ClutterActor *
meta_background_actor_new (MetaScreen *screen)
meta_background_actor_new_for_screen (MetaScreen *screen)
{
MetaBackgroundActor *self;
ClutterActor *stage;
MetaBackgroundActorPrivate *priv;
g_return_val_if_fail (META_IS_SCREEN (screen), NULL);
self = g_object_new (META_TYPE_BACKGROUND_ACTOR, NULL);
priv = self->priv;
self->screen = screen;
priv->background = meta_screen_background_get (screen);
priv->background->actors = g_slist_prepend (priv->background->actors, self);
self->material = meta_create_texture_material (NULL);
cogl_material_set_layer_wrap_mode (self->material, 0,
COGL_MATERIAL_WRAP_MODE_REPEAT);
priv->material = meta_create_texture_material (NULL);
stage = meta_get_stage_for_screen (self->screen);
g_signal_connect (stage, "notify::color",
G_CALLBACK (on_notify_stage_color), self);
meta_background_actor_update (self);
set_texture_on_actor (self);
update_wrap_mode_of_actor (self);
return CLUTTER_ACTOR (self);
}
/**
* meta_background_actor_update:
* @self: a #MetaBackgroundActor
* @screen: a #MetaScreen
*
* Refetches the _XROOTPMAP_ID property for the root window and updates
* the contents of the background actor based on that. There's no attempt
@ -316,8 +503,9 @@ meta_background_actor_new (MetaScreen *screen)
* a PropertyNotify event for the property.
*/
void
meta_background_actor_update (MetaBackgroundActor *self)
meta_background_actor_update (MetaScreen *screen)
{
MetaScreenBackground *background;
MetaDisplay *display;
MetaCompositor *compositor;
Atom type;
@ -327,14 +515,13 @@ meta_background_actor_update (MetaBackgroundActor *self)
guchar *data;
Pixmap root_pixmap_id;
g_return_if_fail (META_IS_BACKGROUND_ACTOR (self));
display = meta_screen_get_display (self->screen);
background = meta_screen_background_get (screen);
display = meta_screen_get_display (screen);
compositor = meta_display_get_compositor (display);
root_pixmap_id = None;
if (!XGetWindowProperty (meta_display_get_xdisplay (display),
meta_screen_get_xroot (self->screen),
meta_screen_get_xroot (screen),
compositor->atom_x_root_pixmap,
0, LONG_MAX,
False,
@ -355,23 +542,31 @@ meta_background_actor_update (MetaBackgroundActor *self)
if (root_pixmap_id != None)
{
CoglHandle texture;
CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ());
GError *error = NULL;
meta_error_trap_push (display);
texture = cogl_texture_pixmap_x11_new (root_pixmap_id, FALSE);
texture = cogl_texture_pixmap_x11_new (ctx, root_pixmap_id, FALSE, &error);
meta_error_trap_pop (display);
if (texture != COGL_INVALID_HANDLE)
{
set_texture (self, texture);
set_texture (background, texture);
cogl_handle_unref (texture);
self->have_pixmap = True;
background->have_pixmap = True;
return;
}
else
{
g_warning ("Failed to create background texture from pixmap: %s",
error->message);
g_error_free (error);
}
}
self->have_pixmap = False;
set_texture_to_stage_color (self);
background->have_pixmap = False;
set_texture_to_stage_color (background);
}
/**
@ -387,37 +582,46 @@ void
meta_background_actor_set_visible_region (MetaBackgroundActor *self,
cairo_region_t *visible_region)
{
MetaBackgroundActorPrivate *priv;
g_return_if_fail (META_IS_BACKGROUND_ACTOR (self));
if (self->visible_region)
priv = self->priv;
if (priv->visible_region)
{
cairo_region_destroy (self->visible_region);
self->visible_region = NULL;
cairo_region_destroy (priv->visible_region);
priv->visible_region = NULL;
}
if (visible_region)
{
cairo_rectangle_int_t screen_rect = { 0 };
meta_screen_get_size (self->screen, &screen_rect.width, &screen_rect.height);
meta_screen_get_size (priv->background->screen, &screen_rect.width, &screen_rect.height);
/* Doing the intersection here is probably unnecessary - MetaWindowGroup
* should never compute a visible area that's larger than the root screen!
* but it's not that expensive and adds some extra robustness.
*/
self->visible_region = cairo_region_create_rectangle (&screen_rect);
cairo_region_intersect (self->visible_region, visible_region);
priv->visible_region = cairo_region_create_rectangle (&screen_rect);
cairo_region_intersect (priv->visible_region, visible_region);
}
}
/**
* meta_background_actor_screen_size_changed:
* @self: a #MetaBackgroundActor
* @screen: a #MetaScreen
*
* Called by the compositor when the size of the #MetaScreen changes
*/
void
meta_background_actor_screen_size_changed (MetaBackgroundActor *self)
meta_background_actor_screen_size_changed (MetaScreen *screen)
{
update_wrap_mode (self);
clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
MetaScreenBackground *background = meta_screen_background_get (screen);
GSList *l;
update_wrap_mode (background);
for (l = background->actors; l; l = l->next)
clutter_actor_queue_relayout (l->data);
}

View File

@ -263,38 +263,6 @@ meta_plugin_get_info (MetaPlugin *plugin)
return NULL;
}
ClutterActor *
meta_plugin_get_overlay_group (MetaPlugin *plugin)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
return meta_get_overlay_group_for_screen (priv->screen);
}
ClutterActor *
meta_plugin_get_stage (MetaPlugin *plugin)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
return meta_get_stage_for_screen (priv->screen);
}
ClutterActor *
meta_plugin_get_window_group (MetaPlugin *plugin)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
return meta_get_window_group_for_screen (priv->screen);
}
ClutterActor *
meta_plugin_get_background_actor (MetaPlugin *plugin)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
return meta_get_background_actor_for_screen (priv->screen);
}
/**
* _meta_plugin_effect_started:
* @plugin: the plugin
@ -315,7 +283,7 @@ meta_plugin_switch_workspace_completed (MetaPlugin *plugin)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
MetaScreen *screen = meta_plugin_get_screen (plugin);
MetaScreen *screen = priv->screen;
if (priv->running-- < 0)
{
@ -389,80 +357,6 @@ meta_plugin_destroy_completed (MetaPlugin *plugin,
meta_plugin_window_effect_completed (plugin, actor, META_PLUGIN_DESTROY);
}
void
meta_plugin_query_screen_size (MetaPlugin *plugin,
int *width,
int *height)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
meta_screen_get_size (priv->screen, width, height);
}
void
meta_plugin_set_stage_reactive (MetaPlugin *plugin,
gboolean reactive)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
MetaScreen *screen = priv->screen;
if (reactive)
meta_set_stage_input_region (screen, None);
else
meta_empty_stage_input_region (screen);
}
void
meta_plugin_set_stage_input_area (MetaPlugin *plugin,
gint x, gint y, gint width, gint height)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
MetaScreen *screen = priv->screen;
MetaDisplay *display = meta_screen_get_display (screen);
Display *xdpy = meta_display_get_xdisplay (display);
XRectangle rect;
XserverRegion region;
rect.x = x;
rect.y = y;
rect.width = width;
rect.height = height;
region = XFixesCreateRegion (xdpy, &rect, 1);
meta_set_stage_input_region (screen, region);
XFixesDestroyRegion (xdpy, region);
}
void
meta_plugin_set_stage_input_region (MetaPlugin *plugin,
XserverRegion region)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
MetaScreen *screen = priv->screen;
meta_set_stage_input_region (screen, region);
}
/**
* meta_plugin_get_window_actors:
* @plugin: A #MetaPlugin
*
* This function returns all of the #MetaWindowActor objects referenced by Mutter, including
* override-redirect windows. The returned list is a snapshot of Mutter's current
* stacking order, with the topmost window last.
*
* The 'restacked' signal of #MetaScreen signals when this value has changed.
*
* Returns: (transfer none) (element-type MetaWindowActor): Windows in stacking order, topmost last
*/
GList *
meta_plugin_get_window_actors (MetaPlugin *plugin)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
return meta_get_window_actors (priv->screen);
}
/**
* meta_plugin_begin_modal:
* @plugin: a #MetaPlugin
@ -521,16 +415,6 @@ meta_plugin_end_modal (MetaPlugin *plugin,
meta_end_modal_for_plugin (priv->screen, plugin, timestamp);
}
Display *
meta_plugin_get_xdisplay (MetaPlugin *plugin)
{
MetaPluginPrivate *priv = META_PLUGIN (plugin)->priv;
MetaDisplay *display = meta_screen_get_display (priv->screen);
Display *xdpy = meta_display_get_xdisplay (display);
return xdpy;
}
/**
* meta_plugin_get_screen:
* @plugin: a #MetaPlugin

View File

@ -360,7 +360,7 @@ meta_shadow_paint (MetaShadow *shadow,
* @window_height: actual height of the region to paint a shadow for
*
* Computes the bounds of the pixels that will be affected by
* meta_shadow_paints()
* meta_shadow_paint()
*/
void
meta_shadow_get_bounds (MetaShadow *shadow,
@ -442,8 +442,7 @@ meta_shadow_factory_class_init (MetaShadowFactoryClass *klass)
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
}

View File

@ -25,37 +25,41 @@
#include <config.h>
#include "meta-shaped-texture.h"
#define CLUTTER_ENABLE_EXPERIMENTAL_API
#define COGL_ENABLE_EXPERIMENTAL_API
#include <meta/meta-shaped-texture.h>
#include "meta-texture-tower.h"
#include "meta-texture-rectangle.h"
#include <clutter/clutter.h>
#include <cogl/cogl.h>
#include <cogl/cogl-texture-pixmap-x11.h>
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
#include <string.h>
static void meta_shaped_texture_dispose (GObject *object);
static void meta_shaped_texture_finalize (GObject *object);
static void meta_shaped_texture_notify (GObject *object,
GParamSpec *pspec);
static void meta_shaped_texture_paint (ClutterActor *actor);
static void meta_shaped_texture_pick (ClutterActor *actor,
const ClutterColor *color);
static void meta_shaped_texture_update_area (ClutterX11TexturePixmap *texture,
int x,
int y,
int width,
int height);
static void meta_shaped_texture_get_preferred_width (ClutterActor *self,
gfloat for_height,
gfloat *min_width_p,
gfloat *natural_width_p);
static void meta_shaped_texture_get_preferred_height (ClutterActor *self,
gfloat for_width,
gfloat *min_height_p,
gfloat *natural_height_p);
static void meta_shaped_texture_dirty_mask (MetaShapedTexture *stex);
#ifdef HAVE_GLX_TEXTURE_PIXMAP
static gboolean meta_shaped_texture_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume);
G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
CLUTTER_GLX_TYPE_TEXTURE_PIXMAP);
#else /* HAVE_GLX_TEXTURE_PIXMAP */
G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
CLUTTER_X11_TYPE_TEXTURE_PIXMAP);
#endif /* HAVE_GLX_TEXTURE_PIXMAP */
CLUTTER_TYPE_ACTOR);
#define META_SHAPED_TEXTURE_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), META_TYPE_SHAPED_TEXTURE, \
@ -64,16 +68,21 @@ G_DEFINE_TYPE (MetaShapedTexture, meta_shaped_texture,
struct _MetaShapedTexturePrivate
{
MetaTextureTower *paint_tower;
Pixmap pixmap;
CoglHandle texture;
CoglHandle mask_texture;
CoglHandle material;
CoglHandle material_unshaped;
cairo_region_t *clip_region;
cairo_region_t *shape_region;
cairo_region_t *overlay_region;
cairo_path_t *overlay_path;
guint tex_width, tex_height;
guint mask_width, mask_height;
GArray *rectangles;
guint create_mipmaps : 1;
};
@ -82,16 +91,14 @@ meta_shaped_texture_class_init (MetaShapedTextureClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
ClutterActorClass *actor_class = (ClutterActorClass *) klass;
ClutterX11TexturePixmapClass *x11_texture_class = (ClutterX11TexturePixmapClass *) klass;
gobject_class->dispose = meta_shaped_texture_dispose;
gobject_class->finalize = meta_shaped_texture_finalize;
gobject_class->notify = meta_shaped_texture_notify;
actor_class->get_preferred_width = meta_shaped_texture_get_preferred_width;
actor_class->get_preferred_height = meta_shaped_texture_get_preferred_height;
actor_class->paint = meta_shaped_texture_paint;
actor_class->pick = meta_shaped_texture_pick;
x11_texture_class->update_area = meta_shaped_texture_update_area;
actor_class->get_paint_volume = meta_shaped_texture_get_paint_volume;
g_type_class_add_private (klass, sizeof (MetaShapedTexturePrivate));
}
@ -103,9 +110,11 @@ meta_shaped_texture_init (MetaShapedTexture *self)
priv = self->priv = META_SHAPED_TEXTURE_GET_PRIVATE (self);
priv->rectangles = g_array_new (FALSE, FALSE, sizeof (XRectangle));
priv->shape_region = NULL;
priv->overlay_path = NULL;
priv->overlay_region = NULL;
priv->paint_tower = meta_texture_tower_new ();
priv->texture = COGL_INVALID_HANDLE;
priv->mask_texture = COGL_INVALID_HANDLE;
priv->create_mipmaps = TRUE;
}
@ -132,48 +141,19 @@ meta_shaped_texture_dispose (GObject *object)
cogl_handle_unref (priv->material_unshaped);
priv->material_unshaped = COGL_INVALID_HANDLE;
}
if (priv->texture != COGL_INVALID_HANDLE)
{
cogl_handle_unref (priv->texture);
priv->texture = COGL_INVALID_HANDLE;
}
meta_shaped_texture_set_shape_region (self, NULL);
meta_shaped_texture_set_clip_region (self, NULL);
meta_shaped_texture_set_overlay_path (self, NULL, NULL);
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->dispose (object);
}
static void
meta_shaped_texture_finalize (GObject *object)
{
MetaShapedTexture *self = (MetaShapedTexture *) object;
MetaShapedTexturePrivate *priv = self->priv;
g_array_free (priv->rectangles, TRUE);
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->finalize (object);
}
static void
meta_shaped_texture_notify (GObject *object,
GParamSpec *pspec)
{
if (G_OBJECT_CLASS (meta_shaped_texture_parent_class)->notify)
G_OBJECT_CLASS (meta_shaped_texture_parent_class)->notify (object, pspec);
/* It seems like we could just do this out of update_area(), but unfortunately,
* clutter_glx_texture_pixmap() doesn't call through the vtable on the
* initial update_area, so we need to look for changes to the texture
* explicitly.
*/
if (strcmp (pspec->name, "cogl-texture") == 0)
{
MetaShapedTexture *stex = (MetaShapedTexture *) object;
MetaShapedTexturePrivate *priv = stex->priv;
meta_shaped_texture_clear (stex);
if (priv->create_mipmaps)
meta_texture_tower_set_base_texture (priv->paint_tower,
clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex)));
}
}
static void
meta_shaped_texture_dirty_mask (MetaShapedTexture *stex)
{
@ -181,23 +161,65 @@ meta_shaped_texture_dirty_mask (MetaShapedTexture *stex)
if (priv->mask_texture != COGL_INVALID_HANDLE)
{
GLuint mask_gl_tex;
GLenum mask_gl_target;
cogl_texture_get_gl_texture (priv->mask_texture,
&mask_gl_tex, &mask_gl_target);
#ifdef GL_TEXTURE_RECTANGLE_ARB
if (mask_gl_target == GL_TEXTURE_RECTANGLE_ARB)
glDeleteTextures (1, &mask_gl_tex);
#endif
cogl_handle_unref (priv->mask_texture);
priv->mask_texture = COGL_INVALID_HANDLE;
if (priv->material != COGL_INVALID_HANDLE)
cogl_material_set_layer (priv->material, 1, COGL_INVALID_HANDLE);
}
if (priv->material != COGL_INVALID_HANDLE)
cogl_material_set_layer (priv->material, 1, COGL_INVALID_HANDLE);
}
static void
install_overlay_path (MetaShapedTexture *stex,
guchar *mask_data,
int tex_width,
int tex_height,
int stride)
{
MetaShapedTexturePrivate *priv = stex->priv;
int i, n_rects;
cairo_t *cr;
cairo_rectangle_int_t rect;
cairo_surface_t *surface;
if (priv->overlay_region == NULL)
return;
surface = cairo_image_surface_create_for_data (mask_data,
CAIRO_FORMAT_A8,
tex_width,
tex_height,
stride);
cr = cairo_create (surface);
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
n_rects = cairo_region_num_rectangles (priv->overlay_region);
for (i = 0; i < n_rects; i++)
{
cairo_region_get_rectangle (priv->overlay_region, i, &rect);
cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height);
}
cairo_fill_preserve (cr);
if (priv->overlay_path == NULL)
{
/* If we have an overlay region but not an overlay path, then we
* just need to clear the rectangles in the overlay region. */
goto out;
}
cairo_clip (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
cairo_set_source_rgba (cr, 1, 1, 1, 1);
cairo_append_path (cr, priv->overlay_path);
cairo_fill (cr);
out:
cairo_destroy (cr);
cairo_surface_destroy (surface);
}
static void
@ -207,7 +229,7 @@ meta_shaped_texture_ensure_mask (MetaShapedTexture *stex)
CoglHandle paint_tex;
guint tex_width, tex_height;
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
paint_tex = priv->texture;
if (paint_tex == COGL_INVALID_HANDLE)
return;
@ -225,19 +247,35 @@ meta_shaped_texture_ensure_mask (MetaShapedTexture *stex)
if (priv->mask_texture == COGL_INVALID_HANDLE)
{
guchar *mask_data;
const XRectangle *rect;
int i;
int n_rects;
int stride;
GLenum paint_gl_target;
/* Create data for an empty image */
mask_data = g_malloc0 (tex_width * tex_height);
/* Cut out a hole for each rectangle */
for (rect = (XRectangle *) priv->rectangles->data
+ priv->rectangles->len;
rect-- > (XRectangle *) priv->rectangles->data;)
/* If we have no shape region and no (or an empty) overlay region, we
* don't need to create a full mask texture, so quit early. */
if (priv->shape_region == NULL &&
(priv->overlay_region == NULL ||
cairo_region_num_rectangles (priv->overlay_region) == 0))
{
gint x1 = rect->x, x2 = x1 + rect->width;
gint y1 = rect->y, y2 = y1 + rect->height;
return;
}
stride = cairo_format_stride_for_width (CAIRO_FORMAT_A8, tex_width);
/* Create data for an empty image */
mask_data = g_malloc0 (stride * tex_height);
n_rects = cairo_region_num_rectangles (priv->shape_region);
/* Fill in each rectangle. */
for (i = 0; i < n_rects; i ++)
{
cairo_rectangle_int_t rect;
cairo_region_get_rectangle (priv->shape_region, i, &rect);
gint x1 = rect.x, x2 = x1 + rect.width;
gint y1 = rect.y, y2 = y1 + rect.height;
guchar *p;
/* Clip the rectangle to the size of the texture */
@ -247,35 +285,31 @@ meta_shaped_texture_ensure_mask (MetaShapedTexture *stex)
y2 = CLAMP (y2, y1, (gint) tex_height);
/* Fill the rectangle */
for (p = mask_data + y1 * tex_width + x1;
for (p = mask_data + y1 * stride + x1;
y1 < y2;
y1++, p += tex_width)
y1++, p += stride)
memset (p, 255, x2 - x1);
}
install_overlay_path (stex, mask_data, tex_width, tex_height, stride);
cogl_texture_get_gl_texture (paint_tex, NULL, &paint_gl_target);
#ifdef GL_TEXTURE_RECTANGLE_ARB
if (paint_gl_target == GL_TEXTURE_RECTANGLE_ARB)
{
GLuint tex;
glGenTextures (1, &tex);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, tex);
glPixelStorei (GL_UNPACK_ROW_LENGTH, tex_width);
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glPixelStorei (GL_UNPACK_SKIP_ROWS, 0);
glPixelStorei (GL_UNPACK_SKIP_PIXELS, 0);
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0,
GL_ALPHA, tex_width, tex_height,
0, GL_ALPHA, GL_UNSIGNED_BYTE, mask_data);
priv->mask_texture
= cogl_texture_new_from_foreign (tex,
GL_TEXTURE_RECTANGLE_ARB,
tex_width, tex_height,
0, 0,
COGL_PIXEL_FORMAT_A_8);
= meta_texture_rectangle_new (tex_width, tex_height,
0, /* flags */
/* data format */
COGL_PIXEL_FORMAT_A_8,
/* internal GL format */
GL_ALPHA,
/* internal cogl format */
COGL_PIXEL_FORMAT_A_8,
/* rowstride */
stride,
mask_data);
}
else
#endif /* GL_TEXTURE_RECTANGLE_ARB */
@ -283,7 +317,7 @@ meta_shaped_texture_ensure_mask (MetaShapedTexture *stex)
COGL_TEXTURE_NONE,
COGL_PIXEL_FORMAT_A_8,
COGL_PIXEL_FORMAT_ANY,
tex_width,
stride,
mask_data);
g_free (mask_data);
@ -331,20 +365,20 @@ meta_shaped_texture_paint (ClutterActor *actor)
if (priv->create_mipmaps)
paint_tex = meta_texture_tower_get_paint_texture (priv->paint_tower);
else
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
paint_tex = priv->texture;
if (paint_tex == COGL_INVALID_HANDLE)
return;
tex_width = cogl_texture_get_width (paint_tex);
tex_height = cogl_texture_get_height (paint_tex);
tex_width = priv->tex_width;
tex_height = priv->tex_height;
if (tex_width == 0 || tex_height == 0) /* no contents yet */
return;
if (priv->rectangles->len < 1)
if (priv->shape_region == NULL)
{
/* If there are no rectangles use a single-layer texture */
/* No region means an unclipped shape. Use a single-layer texture. */
if (priv->material_unshaped == COGL_INVALID_HANDLE)
{
@ -392,6 +426,7 @@ meta_shaped_texture_paint (ClutterActor *actor)
{
int n_rects;
int i;
cairo_rectangle_int_t tex_rect = { 0, 0, tex_width, tex_height };
/* Limit to how many separate rectangles we'll draw; beyond this just
* fall back and draw the whole thing */
@ -409,6 +444,9 @@ meta_shaped_texture_paint (ClutterActor *actor)
cairo_region_get_rectangle (priv->clip_region, i, &rect);
if (!gdk_rectangle_intersect (&tex_rect, &rect, &rect))
continue;
x1 = rect.x;
y1 = rect.y;
x2 = rect.x + rect.width;
@ -444,8 +482,8 @@ meta_shaped_texture_pick (ClutterActor *actor,
MetaShapedTexture *stex = (MetaShapedTexture *) actor;
MetaShapedTexturePrivate *priv = stex->priv;
/* If there are no rectangles then use the regular pick */
if (priv->rectangles->len < 1)
/* If there is no region then use the regular pick */
if (priv->shape_region == NULL)
CLUTTER_ACTOR_CLASS (meta_shaped_texture_parent_class)
->pick (actor, color);
else if (clutter_actor_should_pick_paint (actor))
@ -454,7 +492,7 @@ meta_shaped_texture_pick (ClutterActor *actor,
ClutterActorBox alloc;
guint tex_width, tex_height;
paint_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex));
paint_tex = priv->texture;
if (paint_tex == COGL_INVALID_HANDLE)
return;
@ -482,19 +520,48 @@ meta_shaped_texture_pick (ClutterActor *actor,
}
static void
meta_shaped_texture_update_area (ClutterX11TexturePixmap *texture,
int x,
int y,
int width,
int height)
meta_shaped_texture_get_preferred_width (ClutterActor *self,
gfloat for_height,
gfloat *min_width_p,
gfloat *natural_width_p)
{
MetaShapedTexture *stex = (MetaShapedTexture *) texture;
MetaShapedTexturePrivate *priv = stex->priv;
MetaShapedTexturePrivate *priv;
CLUTTER_X11_TEXTURE_PIXMAP_CLASS (meta_shaped_texture_parent_class)->update_area (texture,
x, y, width, height);
g_return_if_fail (META_IS_SHAPED_TEXTURE (self));
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
priv = META_SHAPED_TEXTURE (self)->priv;
if (min_width_p)
*min_width_p = 0;
if (natural_width_p)
*natural_width_p = priv->tex_width;
}
static void
meta_shaped_texture_get_preferred_height (ClutterActor *self,
gfloat for_width,
gfloat *min_height_p,
gfloat *natural_height_p)
{
MetaShapedTexturePrivate *priv;
g_return_if_fail (META_IS_SHAPED_TEXTURE (self));
priv = META_SHAPED_TEXTURE (self)->priv;
if (min_height_p)
*min_height_p = 0;
if (natural_height_p)
*natural_height_p = priv->tex_height;
}
static gboolean
meta_shaped_texture_get_paint_volume (ClutterActor *self,
ClutterPaintVolume *volume)
{
return clutter_paint_volume_set_from_allocation (volume, self);
}
ClutterActor *
@ -520,34 +587,16 @@ meta_shaped_texture_set_create_mipmaps (MetaShapedTexture *stex,
if (create_mipmaps != priv->create_mipmaps)
{
CoglHandle base_texture;
priv->create_mipmaps = create_mipmaps;
base_texture = create_mipmaps ?
clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (stex)) : COGL_INVALID_HANDLE;
priv->texture : COGL_INVALID_HANDLE;
meta_texture_tower_set_base_texture (priv->paint_tower, base_texture);
}
}
/* This is a workaround for deficiencies in the hack tower:
*
* When we call clutter_x11_texture_pixmap_set_pixmap(tp, None),
* ClutterX11TexturePixmap knows that it has to get rid of the old texture, but
* clutter_texture_set_cogl_texture(texture, COGL_INVALID_HANDLE) isn't allowed, so
* it grabs the material for the texture and manually sets the texture in it. This means
* that the "cogl-texture" property isn't notified, so we don't find out about it.
*
* And if we keep the CoglX11TexturePixmap around after the X pixmap is freed, then
* we'll trigger X errors when we actually try to free it.
*
* The only correct thing to do here is to change our code to derive
* from ClutterActor and get rid of the inheritance hack tower. Once
* we want to depend on Clutter-1.4 (which has CoglTexturePixmapX11),
* that will be very easy to do.
*/
void
meta_shaped_texture_clear (MetaShapedTexture *stex)
meta_shaped_texture_set_shape_region (MetaShapedTexture *stex,
cairo_region_t *region)
{
MetaShapedTexturePrivate *priv;
@ -555,61 +604,184 @@ meta_shaped_texture_clear (MetaShapedTexture *stex)
priv = stex->priv;
meta_texture_tower_set_base_texture (priv->paint_tower, COGL_INVALID_HANDLE);
if (priv->shape_region != NULL)
{
cairo_region_destroy (priv->shape_region);
priv->shape_region = NULL;
}
if (priv->material != COGL_INVALID_HANDLE)
cogl_material_set_layer (priv->material, 0, COGL_INVALID_HANDLE);
if (region != NULL)
{
cairo_region_reference (region);
priv->shape_region = region;
}
if (priv->material_unshaped != COGL_INVALID_HANDLE)
cogl_material_set_layer (priv->material_unshaped, 0, COGL_INVALID_HANDLE);
}
void
meta_shaped_texture_clear_rectangles (MetaShapedTexture *stex)
{
MetaShapedTexturePrivate *priv;
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
priv = stex->priv;
g_array_set_size (priv->rectangles, 0);
meta_shaped_texture_dirty_mask (stex);
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
}
void
meta_shaped_texture_add_rectangle (MetaShapedTexture *stex,
const XRectangle *rect)
{
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
meta_shaped_texture_add_rectangles (stex, 1, rect);
}
void
meta_shaped_texture_add_rectangles (MetaShapedTexture *stex,
size_t num_rects,
const XRectangle *rects)
meta_shaped_texture_update_area (MetaShapedTexture *stex,
int x,
int y,
int width,
int height)
{
MetaShapedTexturePrivate *priv;
const cairo_rectangle_int_t clip = { x, y, width, height };
priv = stex->priv;
if (priv->texture == COGL_INVALID_HANDLE)
return;
cogl_texture_pixmap_x11_update_area (priv->texture, x, y, width, height);
meta_texture_tower_update_area (priv->paint_tower, x, y, width, height);
clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stex), &clip);
}
static void
set_cogl_texture (MetaShapedTexture *stex,
CoglHandle cogl_tex)
{
MetaShapedTexturePrivate *priv;
guint width, height;
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
priv = stex->priv;
g_array_append_vals (priv->rectangles, rects, num_rects);
if (priv->texture != COGL_INVALID_HANDLE)
cogl_handle_unref (priv->texture);
priv->texture = cogl_tex;
if (priv->material != COGL_INVALID_HANDLE)
cogl_material_set_layer (priv->material, 0, cogl_tex);
if (priv->material_unshaped != COGL_INVALID_HANDLE)
cogl_material_set_layer (priv->material_unshaped, 0, cogl_tex);
if (cogl_tex != COGL_INVALID_HANDLE)
{
width = cogl_texture_get_width (cogl_tex);
height = cogl_texture_get_height (cogl_tex);
if (width != priv->tex_width ||
height != priv->tex_height)
{
priv->tex_width = width;
priv->tex_height = height;
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
}
}
else
{
/* size changed to 0 going to an invalid handle */
priv->tex_width = 0;
priv->tex_height = 0;
clutter_actor_queue_relayout (CLUTTER_ACTOR (stex));
}
meta_shaped_texture_dirty_mask (stex);
clutter_actor_queue_redraw (CLUTTER_ACTOR (stex));
}
/**
* meta_shaped_texture_set_pixmap:
* @stex: The #MetaShapedTexture
* @pixmap: The pixmap you want the stex to assume
*/
void
meta_shaped_texture_set_pixmap (MetaShapedTexture *stex,
Pixmap pixmap)
{
MetaShapedTexturePrivate *priv;
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
priv = stex->priv;
if (priv->pixmap == pixmap)
return;
priv->pixmap = pixmap;
if (pixmap != None)
{
CoglContext *ctx =
clutter_backend_get_cogl_context (clutter_get_default_backend ());
set_cogl_texture (stex, cogl_texture_pixmap_x11_new (ctx, pixmap, FALSE, NULL));
}
else
set_cogl_texture (stex, COGL_INVALID_HANDLE);
if (priv->create_mipmaps)
meta_texture_tower_set_base_texture (priv->paint_tower, priv->texture);
}
/**
* meta_shaped_texture_get_texture:
* @stex: The #MetaShapedTexture
*
* Returns: (transfer none): the unshaped texture
*/
CoglHandle
meta_shaped_texture_get_texture (MetaShapedTexture *stex)
{
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), COGL_INVALID_HANDLE);
return stex->priv->texture;
}
/**
* meta_shaped_texture_set_overlay_path:
* @stex: a #MetaShapedTexture
* @overlay_region: A region containing the parts of the mask to overlay.
* All rectangles in this region are wiped clear to full transparency,
* and the overlay path is clipped to this region.
* @overlay_path: (transfer full): This path will be painted onto the mask
* texture with a fully opaque source. Due to the lack of refcounting
* in #cairo_path_t, ownership of the path is assumed.
*/
void
meta_shaped_texture_set_overlay_path (MetaShapedTexture *stex,
cairo_region_t *overlay_region,
cairo_path_t *overlay_path)
{
MetaShapedTexturePrivate *priv;
g_return_if_fail (META_IS_SHAPED_TEXTURE (stex));
priv = stex->priv;
if (priv->overlay_region != NULL)
{
cairo_region_destroy (priv->overlay_region);
priv->overlay_region = NULL;
}
if (priv->overlay_path != NULL)
{
cairo_path_destroy (priv->overlay_path);
priv->overlay_path = NULL;
}
cairo_region_reference (overlay_region);
priv->overlay_region = overlay_region;
/* cairo_path_t does not have refcounting. */
priv->overlay_path = overlay_path;
meta_shaped_texture_dirty_mask (stex);
}
/**
* meta_shaped_texture_set_clip_region:
* @frame: a #TidyTextureframe
* @stex: a #MetaShapedTexture
* @clip_region: (transfer full): the region of the texture that
* is visible and should be painted. OWNERSHIP IS ASSUMED BY
* THE FUNCTION (for efficiency to avoid a copy.)
* is visible and should be painted.
*
* Provides a hint to the texture about what areas of the texture
* are not completely obscured and thus need to be painted. This
@ -635,5 +807,106 @@ meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
priv->clip_region = NULL;
}
priv->clip_region = clip_region;
if (clip_region)
priv->clip_region = cairo_region_copy (clip_region);
else
priv->clip_region = NULL;
}
/**
* meta_shaped_texture_get_image:
* @stex: A #MetaShapedTexture
* @clip: A clipping rectangle, to help prevent extra processing.
* In the case that the clipping rectangle is partially or fully
* outside the bounds of the texture, the rectangle will be clipped.
*
* Flattens the two layers of the shaped texture into one ARGB32
* image by alpha blending the two images, and returns the flattened
* image.
*
* Returns: (transfer full): a new cairo surface to be freed with
* cairo_surface_destroy().
*/
cairo_surface_t *
meta_shaped_texture_get_image (MetaShapedTexture *stex,
cairo_rectangle_int_t *clip)
{
CoglHandle texture, mask_texture;
cairo_rectangle_int_t texture_rect = { 0, 0, 0, 0 };
cairo_surface_t *surface;
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), NULL);
texture = stex->priv->texture;
if (texture == NULL)
return NULL;
texture_rect.width = cogl_texture_get_width (texture);
texture_rect.height = cogl_texture_get_height (texture);
if (clip != NULL)
{
/* GdkRectangle is just a typedef of cairo_rectangle_int_t,
* so we can use the gdk_rectangle_* APIs on these. */
if (!gdk_rectangle_intersect (&texture_rect, clip, clip))
return NULL;
}
if (clip != NULL)
texture = cogl_texture_new_from_sub_texture (texture,
clip->x,
clip->y,
clip->width,
clip->height);
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
cogl_texture_get_width (texture),
cogl_texture_get_height (texture));
cogl_texture_get_data (texture, CLUTTER_CAIRO_FORMAT_ARGB32,
cairo_image_surface_get_stride (surface),
cairo_image_surface_get_data (surface));
cairo_surface_mark_dirty (surface);
if (clip != NULL)
cogl_object_unref (texture);
mask_texture = stex->priv->mask_texture;
if (mask_texture != COGL_INVALID_HANDLE)
{
cairo_t *cr;
cairo_surface_t *mask_surface;
if (clip != NULL)
mask_texture = cogl_texture_new_from_sub_texture (mask_texture,
clip->x,
clip->y,
clip->width,
clip->height);
mask_surface = cairo_image_surface_create (CAIRO_FORMAT_A8,
cogl_texture_get_width (mask_texture),
cogl_texture_get_height (mask_texture));
cogl_texture_get_data (mask_texture, COGL_PIXEL_FORMAT_A_8,
cairo_image_surface_get_stride (mask_surface),
cairo_image_surface_get_data (mask_surface));
cairo_surface_mark_dirty (mask_surface);
cr = cairo_create (surface);
cairo_set_source_surface (cr, mask_surface, 0, 0);
cairo_set_operator (cr, CAIRO_OPERATOR_DEST_IN);
cairo_paint (cr);
cairo_destroy (cr);
cairo_surface_destroy (mask_surface);
if (clip != NULL)
cogl_object_unref (mask_texture);
}
return surface;
}

View File

@ -0,0 +1,118 @@
/*
* texture rectangle
*
* A small utility function to help create a rectangle texture
*
* Authored By Neil Roberts <neil@linux.intel.com>
*
* Copyright (C) 2011 Intel Corporation
*
* 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 "meta-texture-rectangle.h"
#ifdef GL_TEXTURE_RECTANGLE_ARB
static void (* pf_glGetIntegerv) (GLenum pname, GLint *params);
static void (* pf_glTexImage2D) (GLenum target, GLint level,
GLint internalFormat,
GLsizei width, GLsizei height,
GLint border, GLenum format, GLenum type,
const GLvoid *pixels);
static void (* pf_glGenTextures) (GLsizei n, GLuint *textures);
static void (* pf_glDeleteTextures) (GLsizei n, const GLuint *texture);
static void (* pf_glBindTexture) (GLenum target, GLuint texture);
static void
rectangle_texture_destroy_cb (void *user_data)
{
GLuint tex = GPOINTER_TO_UINT (user_data);
pf_glDeleteTextures (1, &tex);
}
#endif /* GL_TEXTURE_RECTANGLE_ARB */
CoglHandle
meta_texture_rectangle_new (unsigned int width,
unsigned int height,
CoglTextureFlags flags,
CoglPixelFormat format,
GLenum internal_gl_format,
GLenum internal_format,
unsigned int rowstride,
const guint8 *data)
{
CoglHandle cogl_tex = COGL_INVALID_HANDLE;
#ifdef GL_TEXTURE_RECTANGLE_ARB
static CoglUserDataKey user_data_key;
GLint old_binding;
GLuint tex;
if (pf_glGenTextures == NULL)
{
pf_glGetIntegerv = (void *) cogl_get_proc_address ("glGetIntegerv");
pf_glTexImage2D = (void *) cogl_get_proc_address ("glTexImage2D");
pf_glGenTextures = (void *) cogl_get_proc_address ("glGenTextures");
pf_glDeleteTextures = (void *) cogl_get_proc_address ("glDeleteTextures");
pf_glBindTexture = (void *) cogl_get_proc_address ("glBindTexture");
}
pf_glGenTextures (1, &tex);
pf_glGetIntegerv (GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
pf_glBindTexture (GL_TEXTURE_RECTANGLE_ARB, tex);
pf_glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0,
internal_gl_format, width, height,
0, internal_gl_format,
GL_UNSIGNED_BYTE, NULL);
pf_glBindTexture (GL_TEXTURE_RECTANGLE_ARB, old_binding);
cogl_tex = cogl_texture_new_from_foreign (tex,
GL_TEXTURE_RECTANGLE_ARB,
width, height,
0, 0, /* no waste */
internal_format);
/* Cogl won't destroy the GL texture when a foreign texture is used
so we need to destroy it manually. We can set a destroy
notification callback to do this transparently */
cogl_object_set_user_data (cogl_tex,
&user_data_key,
GUINT_TO_POINTER (tex),
rectangle_texture_destroy_cb);
/* Use cogl_texture_set_region instead of uploading the data
directly with GL calls so that we can let Cogl deal with setting
the pixel store parameters and handling format conversion */
if (data)
cogl_texture_set_region (cogl_tex,
0, 0, /* src x/y */
0, 0, /* dst x/y */
width, height, /* dst width/height */
width, height, /* src width/height */
format,
rowstride,
data);
#endif /* GL_TEXTURE_RECTANGLE_ARB */
return cogl_tex;
}

View File

@ -0,0 +1,45 @@
/*
* texture rectangle
*
* A small utility function to help create a rectangle texture
*
* Authored By Neil Roberts <neil@linux.intel.com>
*
* Copyright (C) 2011 Intel Corporation
*
* 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_TEXTURE_RECTANGLE_H__
#define __META_TEXTURE_RECTANGLE_H__
#include <cogl/cogl.h>
G_BEGIN_DECLS
CoglHandle
meta_texture_rectangle_new (unsigned int width,
unsigned int height,
CoglTextureFlags flags,
CoglPixelFormat format,
GLenum internal_gl_format,
GLenum internal_format,
unsigned int rowstride,
const guint8 *data);
G_END_DECLS
#endif /* __META_TEXTURE_RECTANGLE_H__ */

View File

@ -26,6 +26,7 @@
#include <string.h>
#include "meta-texture-tower.h"
#include "meta-texture-rectangle.h"
#ifndef M_LOG2E
#define M_LOG2E 1.4426950408889634074
@ -109,25 +110,9 @@ texture_is_rectangle (CoglHandle texture)
}
#endif /* GL_TEXTURE_RECTANGLE_ARB */
static void
free_texture (CoglHandle texture)
{
#ifdef GL_TEXTURE_RECTANGLE_ARB
GLuint gl_tex;
GLenum gl_target;
cogl_texture_get_gl_texture (texture, &gl_tex, &gl_target);
if (gl_target == GL_TEXTURE_RECTANGLE_ARB)
glDeleteTextures (1, &gl_tex);
#endif /* GL_TEXTURE_RECTANGLE_ARB */
cogl_handle_unref (texture);
}
/**
* meta_texture_tower_update_area:
* @tower: a MetaTextureTower
* meta_texture_tower_set_base_texture:
* @tower: a #MetaTextureTower
* @texture: the new texture used as a base for scaled down versions
*
* Sets the base texture that is the scaled texture that the
@ -152,7 +137,7 @@ meta_texture_tower_set_base_texture (MetaTextureTower *tower,
{
if (tower->textures[i] != COGL_INVALID_HANDLE)
{
free_texture (tower->textures[i]);
cogl_handle_unref (tower->textures[i]);
tower->textures[i] = COGL_INVALID_HANDLE;
}
@ -190,7 +175,7 @@ meta_texture_tower_set_base_texture (MetaTextureTower *tower,
/**
* meta_texture_tower_update_area:
* @tower: a MetaTextureTower
* @tower: a #MetaTextureTower
* @x: X coordinate of upper left of rectangle that changed
* @y: Y coordinate of upper left of rectangle that changed
* @width: width of rectangle that changed
@ -213,6 +198,9 @@ meta_texture_tower_update_area (MetaTextureTower *tower,
g_return_if_fail (tower != NULL);
if (tower->textures[0] == COGL_INVALID_HANDLE)
return;
texture_width = cogl_texture_get_width (tower->textures[0]);
texture_height = cogl_texture_get_height (tower->textures[0]);
@ -384,23 +372,18 @@ texture_tower_create_texture (MetaTextureTower *tower,
if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
texture_is_rectangle (tower->textures[level - 1]))
{
GLuint tex = 0;
glGenTextures (1, &tex);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, tex);
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0,
GL_RGBA, width,height,
#if TEXTURE_FORMAT == COGL_PIXEL_FORMAT_BGRA_8888_PRE
0, GL_BGRA, GL_UNSIGNED_BYTE,
#else /* assume big endian */
0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
#endif
NULL);
tower->textures[level] = cogl_texture_new_from_foreign (tex, GL_TEXTURE_RECTANGLE_ARB,
width, height,
0, 0,
TEXTURE_FORMAT);
tower->textures[level] =
meta_texture_rectangle_new (width, height,
0, /* flags */
/* data format */
TEXTURE_FORMAT,
/* internal GL format */
GL_RGBA,
/* internal cogl format */
TEXTURE_FORMAT,
/* rowstride */
width * 4,
NULL);
}
else
#endif /* GL_TEXTURE_RECTANGLE_ARB */
@ -430,12 +413,7 @@ texture_tower_revalidate_fbo (MetaTextureTower *tower,
CoglMatrix modelview;
if (tower->fbos[level] == COGL_INVALID_HANDLE)
{
/* Work around http://bugzilla.openedhand.com/show_bug.cgi?id=2110 */
cogl_flush();
tower->fbos[level] = cogl_offscreen_new_to_texture (dest_texture);
}
tower->fbos[level] = cogl_offscreen_new_to_texture (dest_texture);
if (tower->fbos[level] == COGL_INVALID_HANDLE)
return FALSE;
@ -604,7 +582,7 @@ texture_tower_revalidate (MetaTextureTower *tower,
/**
* meta_texture_tower_get_paint_texture:
* @tower: a MetaTextureTower
* @tower: a #MetaTextureTower
*
* Gets the texture from the tower that best matches the current
* rendering scale. (On the assumption here the texture is going to

View File

@ -26,15 +26,22 @@ void meta_window_actor_unmaximize (MetaWindowActor *self,
void meta_window_actor_process_damage (MetaWindowActor *self,
XDamageNotifyEvent *event);
void meta_window_actor_pre_paint (MetaWindowActor *self);
void meta_window_actor_invalidate_shadow (MetaWindowActor *self);
void meta_window_actor_set_redirected (MetaWindowActor *self, gboolean state);
gboolean meta_window_actor_should_unredirect (MetaWindowActor *self);
void meta_window_actor_get_shape_bounds (MetaWindowActor *self,
cairo_rectangle_int_t *bounds);
gboolean meta_window_actor_effect_in_progress (MetaWindowActor *self);
void meta_window_actor_sync_actor_position (MetaWindowActor *self);
void meta_window_actor_sync_visibility (MetaWindowActor *self);
void meta_window_actor_update_shape (MetaWindowActor *self,
gboolean shaped);
void meta_window_actor_update_shape (MetaWindowActor *self);
void meta_window_actor_update_opacity (MetaWindowActor *self);
void meta_window_actor_mapped (MetaWindowActor *self);
void meta_window_actor_unmapped (MetaWindowActor *self);

File diff suppressed because it is too large Load Diff

View File

@ -7,9 +7,10 @@
#include <gdk/gdk.h> /* for gdk_rectangle_intersect() */
#include "compositor-private.h"
#include "meta-window-actor-private.h"
#include "meta-window-group.h"
#include "meta-background-actor.h"
#include "meta-background-actor-private.h"
struct _MetaWindowGroupClass
{
@ -103,13 +104,20 @@ actor_is_untransformed (ClutterActor *actor,
static void
meta_window_group_paint (ClutterActor *actor)
{
MetaWindowGroup *window_group = META_WINDOW_GROUP (actor);
cairo_region_t *visible_region;
GLboolean scissor_test;
cairo_rectangle_int_t screen_rect = { 0 };
cairo_rectangle_int_t scissor_rect;
cairo_region_t *unredirected_window_region = NULL;
ClutterActor *stage;
cairo_rectangle_int_t visible_rect, unredirected_rect;
GList *children, *l;
MetaWindowGroup *window_group = META_WINDOW_GROUP (actor);
MetaCompScreen *info = meta_screen_get_compositor_data (window_group->screen);
if (info->unredirected_window != NULL)
{
meta_window_actor_get_shape_bounds (META_WINDOW_ACTOR (info->unredirected_window), &unredirected_rect);
unredirected_window_region = cairo_region_create_rectangle (&unredirected_rect);
}
/* We walk the list from top to bottom (opposite of painting order),
* and subtract the opaque area of each window out of the visible
* region that we pass to the windows below.
@ -117,49 +125,49 @@ meta_window_group_paint (ClutterActor *actor)
children = clutter_container_get_children (CLUTTER_CONTAINER (actor));
children = g_list_reverse (children);
/* Start off with the full screen area (for a multihead setup, we
* might want to use a more accurate union of the monitors to avoid
* painting in holes from mismatched monitor sizes. That's just an
* optimization, however.)
*/
meta_screen_get_size (window_group->screen, &screen_rect.width, &screen_rect.height);
/* Get the clipped redraw bounds from Clutter so that we can avoid
* painting shadows on windows that don't need to be painted in this
* frame. In the case of a multihead setup with mismatched monitor
* sizes, we could intersect this with an accurate union of the
* monitors to avoid painting shadows that are visible only in the
* holes. */
stage = clutter_actor_get_stage (actor);
clutter_stage_get_redraw_clip_bounds (CLUTTER_STAGE (stage),
&visible_rect);
/* When doing a partial stage paint, Clutter will set the GL scissor
* box to the clip rectangle for the partial repaint. We combine the screen
* rectangle with the scissor box to get the region we need to
* paint. (Strangely, the scissor box sometimes seems to be bigger
* than the stage ... Clutter should probably be clampimg)
*/
glGetBooleanv (GL_SCISSOR_TEST, &scissor_test);
visible_region = cairo_region_create_rectangle (&visible_rect);
if (scissor_test)
{
GLint scissor_box[4];
glGetIntegerv (GL_SCISSOR_BOX, scissor_box);
scissor_rect.x = scissor_box[0];
scissor_rect.y = screen_rect.height - (scissor_box[1] + scissor_box[3]);
scissor_rect.width = scissor_box[2];
scissor_rect.height = scissor_box[3];
gdk_rectangle_intersect (&scissor_rect, &screen_rect, &scissor_rect);
}
else
{
scissor_rect = screen_rect;
}
visible_region = cairo_region_create_rectangle (&scissor_rect);
if (unredirected_window_region)
cairo_region_subtract (visible_region, unredirected_window_region);
for (l = children; l; l = l->next)
{
if (!CLUTTER_ACTOR_IS_VISIBLE (l->data))
continue;
/* If an actor has effects applied, then that can change the area
* it paints and the opacity, so we no longer can figure out what
* portion of the actor is obscured and what portion of the screen
* it obscures, so we skip the actor.
*
* This has a secondary beneficial effect: if a ClutterOffscreenEffect
* is applied to an actor, then our clipped redraws interfere with the
* caching of the FBO - even if we only need to draw a small portion
* of the window right now, ClutterOffscreenEffect may use other portions
* of the FBO later. So, skipping actors with effects applied also
* prevents these bugs.
*
* Theoretically, we should check clutter_actor_get_offscreen_redirect()
* as well for the same reason, but omitted for simplicity in the
* hopes that no-one will do that.
*/
if (clutter_actor_has_effects (l->data))
continue;
if (META_IS_WINDOW_ACTOR (l->data))
{
MetaWindowActor *window_actor = l->data;
gboolean x, y;
int x, y;
if (!actor_is_untransformed (CLUTTER_ACTOR (window_actor), &x, &y))
continue;
@ -188,6 +196,9 @@ meta_window_group_paint (ClutterActor *actor)
cairo_region_destroy (visible_region);
if (unredirected_window_region)
cairo_region_destroy (unredirected_window_region);
CLUTTER_ACTOR_CLASS (meta_window_group_parent_class)->paint (actor);
/* Now that we are done painting, unset the visible regions (they will

View File

@ -16,3 +16,9 @@ pkglib_LTLIBRARIES = default.la
install-exec-hook:
-rm $(DESTDIR)$(pkglibdir)/*.a
-rm $(DESTDIR)$(pkglibdir)/*.la
# Since we removed the .la file, 'make uninstall' doesn't work properly,
# since it counts on libtool to remove the .la files, so just kill the
# .so file manually.
uninstall-local:
-rm -f $(DESTDIR)$(pkglibdir)/default.so

View File

@ -284,7 +284,8 @@ on_switch_workspace_effect_complete (ClutterTimeline *timeline, gpointer data)
{
MetaPlugin *plugin = META_PLUGIN (data);
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
GList *l = meta_plugin_get_window_actors (plugin);
MetaScreen *screen = meta_plugin_get_screen (plugin);
GList *l = meta_get_window_actors (screen);
while (l)
{
@ -317,6 +318,7 @@ switch_workspace (MetaPlugin *plugin,
gint from, gint to,
MetaMotionDirection direction)
{
MetaScreen *screen;
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
GList *l;
ClutterActor *workspace0 = clutter_group_new ();
@ -325,11 +327,13 @@ switch_workspace (MetaPlugin *plugin,
int screen_width, screen_height;
ClutterAnimation *animation;
stage = meta_plugin_get_stage (plugin);
screen = meta_plugin_get_screen (plugin);
stage = meta_get_stage_for_screen (screen);
meta_screen_get_size (screen,
&screen_width,
&screen_height);
meta_plugin_query_screen_size (plugin,
&screen_width,
&screen_height);
clutter_actor_set_anchor_point (workspace1,
screen_width,
screen_height);
@ -348,7 +352,7 @@ switch_workspace (MetaPlugin *plugin,
return;
}
l = g_list_last (meta_plugin_get_window_actors (plugin));
l = g_list_last (meta_get_window_actors (screen));
while (l)
{
@ -446,12 +450,19 @@ static void
minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
{
MetaWindowType type;
MetaRectangle icon_geometry;
MetaWindow *meta_window = meta_window_actor_get_meta_window (window_actor);
ClutterActor *actor = CLUTTER_ACTOR (window_actor);
type = meta_window_get_window_type (meta_window);
if (!meta_window_get_icon_geometry(meta_window, &icon_geometry))
{
icon_geometry.x = 0;
icon_geometry.y = 0;
}
if (type == META_WINDOW_NORMAL)
{
ClutterAnimation *animation;
@ -468,6 +479,8 @@ minimize (MetaPlugin *plugin, MetaWindowActor *window_actor)
MINIMIZE_TIMEOUT,
"scale-x", 0.0,
"scale-y", 0.0,
"x", icon_geometry.x,
"y", icon_geometry.y,
NULL);
apriv->tml_minimize = clutter_animation_get_timeline (animation);
data->plugin = plugin;

View File

@ -1,400 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2008 Thomas Thurman
*
* 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.
*/
/**
* A list of screen keybinding information.
*
* Each action which can have a keystroke bound to it is listed below.
* To use this file, define keybind() to be a seven-argument macro (you can
* throw any of the arguments you please away), include this file,
* and then undefine the macro again.
*
* (If you aren't familiar with this technique, sometimes called "x-macros",
* see DDJ of May 2001: <http://www.ddj.com/cpp/184401387>.)
*
* This makes it possible to keep all information about all the keybindings
* in the same place. The only exception is the code to run when an action
* is actually invoked; while we *could* have put that in this file, it would
* have made debugging ridiculously difficult. Instead, each action should
* have a corresponding static function named handle_<name>() in
* keybindings.c.
*
* The arguments to keybind() are:
* 1) the name of the binding; a bareword identifier
* (it's fine if it happens to clash with a C reserved word)
* 2) the name of the function which implements it.
* Clearly we could have guessed this from the binding very often,
* but we choose to write it in full for the benefit of grep.
* 3) an integer parameter to pass to the handler
* 4) a set of boolean flags, ORed together:
* BINDING_PER_WINDOW - this is a window-based binding.
* It is only valid if there is a
* current window, and will operate in
* some way on that window.
* BINDING_REVERSES - the binding can reverse if you hold down Shift
* BINDING_IS_REVERSED - the same, but the senses are reversed from the
* handler's point of view (let me know if I should
* explain this better)
* or 0 if no flag applies.
*
* 5) a string representing the default binding.
* If this is NULL, the action is unbound by default.
* Please use NULL and not "disabled".
* 6) a short description.
* It must be marked translatable (i.e. inside "_(...)").
*
* Don't try to do XML entity escaping anywhere in the strings.
*/
#ifndef keybind
#error "keybind () must be defined when you include screen-bindings.h"
#endif
/***********************************/
#ifndef _BINDINGS_DEFINED_CONSTANTS
#define _BINDINGS_DEFINED_CONSTANTS 1
#define BINDING_PER_WINDOW 0x01
#define BINDING_REVERSES 0x02
#define BINDING_IS_REVERSED 0x04
#endif /* _BINDINGS_DEFINED_CONSTANTS */
/***********************************/
/* convenience, since in this file they must always be set together */
#define REVERSES_AND_REVERSED (BINDING_REVERSES | BINDING_IS_REVERSED)
keybind (switch_to_workspace_1, handle_switch_to_workspace, 0, 0, NULL,
_("Switch to workspace 1"))
keybind (switch_to_workspace_2, handle_switch_to_workspace, 1, 0, NULL,
_("Switch to workspace 2"))
keybind (switch_to_workspace_3, handle_switch_to_workspace, 2, 0, NULL,
_("Switch to workspace 3"))
keybind (switch_to_workspace_4, handle_switch_to_workspace, 3, 0, NULL,
_("Switch to workspace 4"))
keybind (switch_to_workspace_5, handle_switch_to_workspace, 4, 0, NULL,
_("Switch to workspace 5"))
keybind (switch_to_workspace_6, handle_switch_to_workspace, 5, 0, NULL,
_("Switch to workspace 6"))
keybind (switch_to_workspace_7, handle_switch_to_workspace, 6, 0, NULL,
_("Switch to workspace 7"))
keybind (switch_to_workspace_8, handle_switch_to_workspace, 7, 0, NULL,
_("Switch to workspace 8"))
keybind (switch_to_workspace_9, handle_switch_to_workspace, 8, 0, NULL,
_("Switch to workspace 9"))
keybind (switch_to_workspace_10, handle_switch_to_workspace, 9, 0, NULL,
_("Switch to workspace 10"))
keybind (switch_to_workspace_11, handle_switch_to_workspace, 10, 0, NULL,
_("Switch to workspace 11"))
keybind (switch_to_workspace_12, handle_switch_to_workspace, 11, 0, NULL,
_("Switch to workspace 12"))
/* META_MOTION_* are negative, and so distinct from workspace numbers,
* which are always zero or positive.
* If you make use of these constants, you will need to include workspace.h
* (which you're probably using already for other reasons anyway).
* If your definition of keybind() throws them away, you don't need to include
* workspace.h, of course.
*/
keybind (switch_to_workspace_left, handle_switch_to_workspace,
META_MOTION_LEFT, 0, "<Control><Alt>Left",
_("Switch to workspace on the left of the current workspace"))
keybind (switch_to_workspace_right, handle_switch_to_workspace,
META_MOTION_RIGHT, 0, "<Control><Alt>Right",
_("Switch to workspace on the right of the current workspace"))
keybind (switch_to_workspace_up, handle_switch_to_workspace,
META_MOTION_UP, 0, "<Control><Alt>Up",
_("Switch to workspace above the current workspace"))
keybind (switch_to_workspace_down, handle_switch_to_workspace,
META_MOTION_DOWN, 0, "<Control><Alt>Down",
_("Switch to workspace below the current workspace"))
/***********************************/
/* The ones which have inverses. These can't be bound to any keystroke
* containing Shift because Shift will invert their "backward" state.
*
* TODO: "NORMAL" and "DOCKS" should be renamed to the same name as their
* action, for obviousness.
*
* TODO: handle_switch and handle_cycle should probably really be the
* same function checking a bit in the parameter for difference.
*/
keybind (switch_group, handle_switch, META_TAB_LIST_GROUP,
BINDING_REVERSES, "<Alt>Above_Tab",
_("Move between windows of an application, using a popup window"))
keybind (switch_group_backward, handle_switch, META_TAB_LIST_GROUP,
REVERSES_AND_REVERSED, NULL,
_("Move backward between windows of an application, "
"using a popup window"))
keybind (switch_windows, handle_switch, META_TAB_LIST_NORMAL,
BINDING_REVERSES, "<Alt>Tab",
_("Move between windows, using a popup window"))
keybind (switch_windows_backward, handle_switch, META_TAB_LIST_NORMAL,
REVERSES_AND_REVERSED, NULL,
_("Move backward between windows, using a popup window"))
keybind (switch_panels, handle_switch, META_TAB_LIST_DOCKS,
BINDING_REVERSES, "<Control><Alt>Tab",
_("Move between panels and the desktop, using a popup window"))
keybind (switch_panels_backward, handle_switch, META_TAB_LIST_DOCKS,
REVERSES_AND_REVERSED, NULL,
_("Move backward between panels and the desktop, "
"using a popup window"))
keybind (cycle_group, handle_cycle, META_TAB_LIST_GROUP,
BINDING_REVERSES, "<Alt>F6",
_("Move between windows of an application immediately"))
keybind (cycle_group_backward, handle_cycle, META_TAB_LIST_GROUP,
REVERSES_AND_REVERSED, NULL,
_("Move backward between windows of an application immediately"))
keybind (cycle_windows, handle_cycle, META_TAB_LIST_NORMAL,
BINDING_REVERSES, "<Alt>Escape",
_("Move between windows immediately"))
keybind (cycle_windows_backward, handle_cycle, META_TAB_LIST_NORMAL,
REVERSES_AND_REVERSED, NULL,
_("Move backward between windows immediately"))
keybind (cycle_panels, handle_cycle, META_TAB_LIST_DOCKS,
BINDING_REVERSES, "<Control><Alt>Escape",
_("Move between panels and the desktop immediately"))
keybind (cycle_panels_backward, handle_cycle, META_TAB_LIST_DOCKS,
REVERSES_AND_REVERSED, NULL,
_("Move backward between panels and the desktop immediately"))
/***********************************/
/* These two are special pseudo-bindings that are provided for allowing
* custom handlers, but will never be bound to a key. While a tab
* grab is in effect, they are invoked for releasing the primary modifier
* or pressing some unbound key, respectively.
*/
keybind (tab_popup_select, handle_tab_popup_select, 0, 0, NULL,
"Select window from tab popup")
keybind (tab_popup_cancel, handle_tab_popup_cancel, 0, 0, NULL,
"Cancel tab popup")
/***********************************/
keybind (show_desktop, handle_show_desktop, 0, 0, "<Control><Alt>d",
_("Hide all normal windows and set focus to the desktop"))
keybind (panel_main_menu, handle_panel,
META_KEYBINDING_ACTION_PANEL_MAIN_MENU, 0, "<Alt>F1",
_("Show the panel's main menu"))
keybind (panel_run_dialog, handle_panel,
META_KEYBINDING_ACTION_PANEL_RUN_DIALOG, 0, "<Alt>F2",
_("Show the panel's \"Run Application\" dialog box"))
keybind (toggle_recording, handle_toggle_recording, 0, 0, "<Control><Shift><Alt>r",
_("Start or stop recording the session"))
/* Yes, the param is offset by one. Historical reasons. (Maybe worth fixing
* at some point.) The description is NULL here because the stanza is
* irregularly shaped in mutter.schemas.in. This will probably be fixed
* as well.
*/
keybind (run_command_1, handle_run_command, 0, 0, NULL, NULL)
keybind (run_command_2, handle_run_command, 1, 0, NULL, NULL)
keybind (run_command_3, handle_run_command, 2, 0, NULL, NULL)
keybind (run_command_4, handle_run_command, 3, 0, NULL, NULL)
keybind (run_command_5, handle_run_command, 4, 0, NULL, NULL)
keybind (run_command_6, handle_run_command, 5, 0, NULL, NULL)
keybind (run_command_7, handle_run_command, 6, 0, NULL, NULL)
keybind (run_command_8, handle_run_command, 7, 0, NULL, NULL)
keybind (run_command_9, handle_run_command, 8, 0, NULL, NULL)
keybind (run_command_10, handle_run_command, 9, 0, NULL, NULL)
keybind (run_command_11, handle_run_command, 10, 0, NULL, NULL)
keybind (run_command_12, handle_run_command, 11, 0, NULL, NULL)
keybind (run_command_13, handle_run_command, 12, 0, NULL, NULL)
keybind (run_command_14, handle_run_command, 13, 0, NULL, NULL)
keybind (run_command_15, handle_run_command, 14, 0, NULL, NULL)
keybind (run_command_16, handle_run_command, 15, 0, NULL, NULL)
keybind (run_command_17, handle_run_command, 16, 0, NULL, NULL)
keybind (run_command_18, handle_run_command, 17, 0, NULL, NULL)
keybind (run_command_19, handle_run_command, 18, 0, NULL, NULL)
keybind (run_command_20, handle_run_command, 19, 0, NULL, NULL)
keybind (run_command_21, handle_run_command, 20, 0, NULL, NULL)
keybind (run_command_22, handle_run_command, 21, 0, NULL, NULL)
keybind (run_command_23, handle_run_command, 22, 0, NULL, NULL)
keybind (run_command_24, handle_run_command, 23, 0, NULL, NULL)
keybind (run_command_25, handle_run_command, 24, 0, NULL, NULL)
keybind (run_command_26, handle_run_command, 25, 0, NULL, NULL)
keybind (run_command_27, handle_run_command, 26, 0, NULL, NULL)
keybind (run_command_28, handle_run_command, 27, 0, NULL, NULL)
keybind (run_command_29, handle_run_command, 28, 0, NULL, NULL)
keybind (run_command_30, handle_run_command, 29, 0, NULL, NULL)
keybind (run_command_31, handle_run_command, 30, 0, NULL, NULL)
keybind (run_command_32, handle_run_command, 31, 0, NULL, NULL)
keybind (run_command_screenshot, handle_run_command, 32, 0, "Print",
_("Take a screenshot"))
keybind (run_command_window_screenshot, handle_run_command, 33, 0,"<Alt>Print",
_("Take a screenshot of a window"))
keybind (run_command_terminal, handle_run_terminal, 0, 0, NULL, _("Run a terminal"))
/* No description because this is undocumented */
keybind (set_spew_mark, handle_set_spew_mark, 0, 0, NULL, NULL)
#undef REVERSES_AND_REVERSED
/************************ PER WINDOW BINDINGS ************************/
/* These take a window as an extra parameter; they have no effect
* if no window is active.
*/
keybind (activate_window_menu, handle_activate_window_menu, 0,
BINDING_PER_WINDOW, "<Alt>space",
_("Activate the window menu"))
keybind (toggle_fullscreen, handle_toggle_fullscreen, 0, BINDING_PER_WINDOW,
NULL,
_("Toggle fullscreen mode"))
keybind (toggle_maximized, handle_toggle_maximized, 0, BINDING_PER_WINDOW, "<Alt>F10",
_("Toggle maximization state"))
keybind (toggle_above, handle_toggle_above, 0, BINDING_PER_WINDOW, NULL,
_("Toggle whether a window will always be visible over other windows"))
keybind (maximize, handle_maximize, 0, BINDING_PER_WINDOW, NULL,
_("Maximize window"))
keybind (unmaximize, handle_unmaximize, 0, BINDING_PER_WINDOW, "<Alt>F5",
_("Restore window"))
keybind (toggle_shaded, handle_toggle_shaded, 0, BINDING_PER_WINDOW, NULL,
_("Toggle shaded state"))
keybind (minimize, handle_minimize, 0, BINDING_PER_WINDOW, "<Alt>F9",
_("Minimize window"))
keybind (close, handle_close, 0, BINDING_PER_WINDOW, "<Alt>F4",
_("Close window"))
keybind (begin_move, handle_begin_move, 0, BINDING_PER_WINDOW, "<Alt>F7",
_("Move window"))
keybind (begin_resize, handle_begin_resize, 0, BINDING_PER_WINDOW, "<Alt>F8",
_("Resize window"))
keybind (toggle_on_all_workspaces, handle_toggle_on_all_workspaces, 0,
BINDING_PER_WINDOW, NULL,
_("Toggle whether window is on all workspaces or just one"))
keybind (move_to_workspace_1, handle_move_to_workspace, 0, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 1"))
keybind (move_to_workspace_2, handle_move_to_workspace, 1, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 2"))
keybind (move_to_workspace_3, handle_move_to_workspace, 2, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 3"))
keybind (move_to_workspace_4, handle_move_to_workspace, 3, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 4"))
keybind (move_to_workspace_5, handle_move_to_workspace, 4, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 5"))
keybind (move_to_workspace_6, handle_move_to_workspace, 5, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 6"))
keybind (move_to_workspace_7, handle_move_to_workspace, 6, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 7"))
keybind (move_to_workspace_8, handle_move_to_workspace, 7, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 8"))
keybind (move_to_workspace_9, handle_move_to_workspace, 8, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 9"))
keybind (move_to_workspace_10, handle_move_to_workspace, 9, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 10"))
keybind (move_to_workspace_11, handle_move_to_workspace, 10, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 11"))
keybind (move_to_workspace_12, handle_move_to_workspace, 11, BINDING_PER_WINDOW,
NULL,
_("Move window to workspace 12"))
/* META_MOTION_* are negative, and so distinct from workspace numbers,
* which are always zero or positive.
* If you make use of these constants, you will need to include workspace.h
* (which you're probably using already for other reasons anyway).
* If your definition of keybind() throws them away, you don't need to include
* workspace.h, of course.
*/
keybind (move_to_workspace_left, handle_move_to_workspace,
META_MOTION_LEFT, BINDING_PER_WINDOW, "<Control><Shift><Alt>Left",
_("Move window one workspace to the left"))
keybind (move_to_workspace_right, handle_move_to_workspace,
META_MOTION_RIGHT, BINDING_PER_WINDOW, "<Control><Shift><Alt>Right",
_("Move window one workspace to the right"))
keybind (move_to_workspace_up, handle_move_to_workspace,
META_MOTION_UP, BINDING_PER_WINDOW, "<Control><Shift><Alt>Up",
_("Move window one workspace up"))
keybind (move_to_workspace_down, handle_move_to_workspace,
META_MOTION_DOWN, BINDING_PER_WINDOW, "<Control><Shift><Alt>Down",
_("Move window one workspace down"))
keybind (raise_or_lower, handle_raise_or_lower, 0, BINDING_PER_WINDOW, NULL,
_("Raise window if it's covered by another window, otherwise lower it"))
keybind (raise, handle_raise, 0, BINDING_PER_WINDOW, NULL,
_("Raise window above other windows"))
keybind (lower, handle_lower, 0, BINDING_PER_WINDOW, NULL,
_("Lower window below other windows"))
keybind (maximize_vertically, handle_maximize_vertically, 0,
BINDING_PER_WINDOW, NULL,
_("Maximize window vertically"))
keybind (maximize_horizontally, handle_maximize_horizontally, 0,
BINDING_PER_WINDOW, NULL,
_("Maximize window horizontally"))
keybind (move_to_corner_nw, handle_move_to_corner_nw, 0,
BINDING_PER_WINDOW, NULL,
_("Move window to north-west (top left) corner"))
keybind (move_to_corner_ne, handle_move_to_corner_ne, 0,
BINDING_PER_WINDOW, NULL,
_("Move window to north-east (top right) corner"))
keybind (move_to_corner_sw, handle_move_to_corner_sw, 0,
BINDING_PER_WINDOW, NULL,
_("Move window to south-west (bottom left) corner"))
keybind (move_to_corner_se, handle_move_to_corner_se, 0,
BINDING_PER_WINDOW, NULL,
_("Move window to south-east (bottom right) corner"))
keybind (move_to_side_n, handle_move_to_side_n, 0,
BINDING_PER_WINDOW, NULL,
_("Move window to north (top) side of screen"))
keybind (move_to_side_s, handle_move_to_side_s, 0,
BINDING_PER_WINDOW, NULL,
_("Move window to south (bottom) side of screen"))
keybind (move_to_side_e, handle_move_to_side_e, 0,
BINDING_PER_WINDOW, NULL,
_("Move window to east (right) side of screen"))
keybind (move_to_side_w, handle_move_to_side_w, 0,
BINDING_PER_WINDOW, NULL,
_("Move window to west (left) side of screen"))
keybind (move_to_center, handle_move_to_center, 0,
BINDING_PER_WINDOW, NULL,
_("Move window to center of screen"))
/* eof all-keybindings.h */

View File

@ -130,7 +130,7 @@ bell_flash_screen (MetaDisplay *display,
XFreeGC (display->xdisplay, gc);
}
if (meta_prefs_get_focus_mode () != META_FOCUS_MODE_CLICK &&
if (meta_prefs_get_focus_mode () != G_DESKTOP_FOCUS_MODE_CLICK &&
!display->mouse_mode)
meta_display_increment_focus_sentinel (display);
XFlush (display->xdisplay);
@ -230,35 +230,6 @@ 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.
@ -270,11 +241,15 @@ 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 = get_flash_window (display, xkb_ev);
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
if (!window && (display->focus_window))
{
window = display->focus_window;
}
if (window && window->frame)
{
bell_flash_window_frame (window);
@ -302,15 +277,12 @@ bell_visual_notify (MetaDisplay *display,
{
switch (meta_prefs_get_visual_bell_type ())
{
case META_VISUAL_BELL_FULLSCREEN_FLASH:
case G_DESKTOP_VISUAL_BELL_FULLSCREEN_FLASH:
bell_flash_fullscreen (display, xkb_ev);
break;
case META_VISUAL_BELL_FRAME_FLASH:
case G_DESKTOP_VISUAL_BELL_FRAME_FLASH:
bell_flash_frame (display, xkb_ev); /* does nothing yet */
break;
case META_VISUAL_BELL_INVALID:
/* do nothing */
break;
}
}
@ -319,7 +291,7 @@ meta_bell_notify (MetaDisplay *display,
XkbAnyEvent *xkb_ev)
{
/* flash something */
if (meta_prefs_get_visual_bell ())
if (meta_prefs_get_visual_bell ())
bell_visual_notify (display, xkb_ev);
#ifdef HAVE_LIBCANBERRA
@ -335,7 +307,9 @@ 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 = get_flash_window (display, xkb_ev);
window = meta_display_lookup_x_window (display, xkb_bell_event->window);
if (!window && (display->focus_window) && (display->focus_window->frame))
window = display->focus_window;
if (window)
{

View File

@ -118,7 +118,7 @@ typedef struct
{
MetaRectangle orig;
MetaRectangle current;
MetaFrameGeometry *fgeom;
MetaFrameBorders *borders;
ActionType action_type;
gboolean is_user_action;
@ -194,7 +194,7 @@ static gboolean constrain_partially_onscreen (MetaWindow *window,
static void setup_constraint_info (ConstraintInfo *info,
MetaWindow *window,
MetaFrameGeometry *orig_fgeom,
MetaFrameBorders *orig_borders,
MetaMoveResizeFlags flags,
int resize_gravity,
const MetaRectangle *orig,
@ -204,11 +204,11 @@ static void place_window_if_needed (MetaWindow *window,
static void update_onscreen_requirements (MetaWindow *window,
ConstraintInfo *info);
static void extend_by_frame (MetaRectangle *rect,
const MetaFrameGeometry *fgeom);
const MetaFrameBorders *borders);
static void unextend_by_frame (MetaRectangle *rect,
const MetaFrameGeometry *fgeom);
const MetaFrameBorders *borders);
static inline void get_size_limits (const MetaWindow *window,
const MetaFrameGeometry *fgeom,
const MetaFrameBorders *borders,
gboolean include_frame,
MetaRectangle *min_size,
MetaRectangle *max_size);
@ -279,7 +279,7 @@ do_all_constraints (MetaWindow *window,
void
meta_window_constrain (MetaWindow *window,
MetaFrameGeometry *orig_fgeom,
MetaFrameBorders *orig_borders,
MetaMoveResizeFlags flags,
int resize_gravity,
const MetaRectangle *orig,
@ -302,7 +302,7 @@ meta_window_constrain (MetaWindow *window,
setup_constraint_info (&info,
window,
orig_fgeom,
orig_borders,
flags,
resize_gravity,
orig,
@ -337,14 +337,14 @@ meta_window_constrain (MetaWindow *window,
* not gobject-style--gobject would be more pain than it's worth) or
* smart pointers would be so much nicer here. *shrug*
*/
if (!orig_fgeom)
g_free (info.fgeom);
if (!orig_borders)
g_free (info.borders);
}
static void
setup_constraint_info (ConstraintInfo *info,
MetaWindow *window,
MetaFrameGeometry *orig_fgeom,
MetaFrameBorders *orig_borders,
MetaMoveResizeFlags flags,
int resize_gravity,
const MetaRectangle *orig,
@ -357,10 +357,10 @@ setup_constraint_info (ConstraintInfo *info,
info->current = *new;
/* Create a fake frame geometry if none really exists */
if (orig_fgeom && !window->fullscreen)
info->fgeom = orig_fgeom;
if (orig_borders && !window->fullscreen)
info->borders = orig_borders;
else
info->fgeom = g_new0 (MetaFrameGeometry, 1);
info->borders = g_new0 (MetaFrameBorders, 1);
if (flags & META_IS_MOVE_ACTION && flags & META_IS_RESIZE_ACTION)
info->action_type = ACTION_MOVE_AND_RESIZE;
@ -439,9 +439,13 @@ setup_constraint_info (ConstraintInfo *info,
monitor_info->number);
/* Workaround braindead legacy apps that don't know how to
* fullscreen themselves properly.
* fullscreen themselves properly - don't get fooled by
* windows which hide their titlebar when maximized; that's
* not the same as fullscreen, even if there are no struts
* making the workarea smaller than the monitor.
*/
if (meta_prefs_get_force_fullscreen() &&
!window->hide_titlebar_when_maximized &&
meta_rectangle_equal (new, &monitor_info->rect) &&
window->has_fullscreen_func &&
!window->fullscreen)
@ -461,7 +465,6 @@ setup_constraint_info (ConstraintInfo *info,
"Setting up constraint info:\n"
" orig: %d,%d +%d,%d\n"
" new : %d,%d +%d,%d\n"
" fgeom: %d,%d,%d,%d\n"
" action_type : %s\n"
" is_user_action : %s\n"
" resize_gravity : %s\n"
@ -471,8 +474,6 @@ setup_constraint_info (ConstraintInfo *info,
info->orig.x, info->orig.y, info->orig.width, info->orig.height,
info->current.x, info->current.y,
info->current.width, info->current.height,
info->fgeom->left_width, info->fgeom->right_width,
info->fgeom->top_height, info->fgeom->bottom_height,
(info->action_type == ACTION_MOVE) ? "Move" :
(info->action_type == ACTION_RESIZE) ? "Resize" :
(info->action_type == ACTION_MOVE_AND_RESIZE) ? "Move&Resize" :
@ -513,7 +514,7 @@ place_window_if_needed(MetaWindow *window,
MetaWorkspace *cur_workspace;
const MetaMonitorInfo *monitor_info;
meta_window_place (window, info->fgeom, info->orig.x, info->orig.y,
meta_window_place (window, info->borders, info->orig.x, info->orig.y,
&placed_rect.x, &placed_rect.y);
did_placement = TRUE;
@ -572,8 +573,8 @@ place_window_if_needed(MetaWindow *window,
META_MAXIMIZE_VERTICAL : 0), &info->current);
/* maximization may have changed frame geometry */
if (window->frame && !window->fullscreen)
meta_frame_calc_geometry (window->frame, info->fgeom);
if (!window->fullscreen)
meta_frame_calc_borders (window->frame, info->borders);
if (window->fullscreen_after_placement)
{
@ -634,7 +635,7 @@ update_onscreen_requirements (MetaWindow *window,
/* The require onscreen/on-single-monitor and titlebar_visible
* stuff is relative to the outer window, not the inner
*/
extend_by_frame (&info->current, info->fgeom);
extend_by_frame (&info->current, info->borders);
/* Update whether we want future constraint runs to require the
* window to be on fully onscreen.
@ -670,7 +671,7 @@ update_onscreen_requirements (MetaWindow *window,
MetaRectangle titlebar_rect;
titlebar_rect = info->current;
titlebar_rect.height = info->fgeom->top_height;
titlebar_rect.height = info->borders->visible.top;
old = window->require_titlebar_visible;
window->require_titlebar_visible =
meta_rectangle_overlaps_with_region (info->usable_screen_region,
@ -683,32 +684,32 @@ update_onscreen_requirements (MetaWindow *window,
}
/* Don't forget to restore the position of the window */
unextend_by_frame (&info->current, info->fgeom);
unextend_by_frame (&info->current, info->borders);
}
static void
extend_by_frame (MetaRectangle *rect,
const MetaFrameGeometry *fgeom)
const MetaFrameBorders *borders)
{
rect->x -= fgeom->left_width;
rect->y -= fgeom->top_height;
rect->width += fgeom->left_width + fgeom->right_width;
rect->height += fgeom->top_height + fgeom->bottom_height;
rect->x -= borders->visible.left;
rect->y -= borders->visible.top;
rect->width += borders->visible.left + borders->visible.right;
rect->height += borders->visible.top + borders->visible.bottom;
}
static void
unextend_by_frame (MetaRectangle *rect,
const MetaFrameGeometry *fgeom)
const MetaFrameBorders *borders)
{
rect->x += fgeom->left_width;
rect->y += fgeom->top_height;
rect->width -= fgeom->left_width + fgeom->right_width;
rect->height -= fgeom->top_height + fgeom->bottom_height;
rect->x += borders->visible.left;
rect->y += borders->visible.top;
rect->width -= borders->visible.left + borders->visible.right;
rect->height -= borders->visible.top + borders->visible.bottom;
}
static inline void
get_size_limits (const MetaWindow *window,
const MetaFrameGeometry *fgeom,
const MetaFrameBorders *borders,
gboolean include_frame,
MetaRectangle *min_size,
MetaRectangle *max_size)
@ -723,8 +724,8 @@ get_size_limits (const MetaWindow *window,
if (include_frame)
{
int fw = fgeom->left_width + fgeom->right_width;
int fh = fgeom->top_height + fgeom->bottom_height;
int fw = borders->visible.left + borders->visible.right;
int fh = borders->visible.top + borders->visible.bottom;
min_size->width += fw;
min_size->height += fh;
@ -752,27 +753,25 @@ constrain_modal_dialog (MetaWindow *window,
MetaWindow *parent = meta_window_get_transient_for (window);
gboolean constraint_already_satisfied;
if (!meta_prefs_get_attach_modal_dialogs ())
return TRUE;
if (window->type != META_WINDOW_MODAL_DIALOG || !parent)
if (!meta_window_is_attached_dialog (window))
return TRUE;
x = parent->rect.x + (parent->rect.width / 2 - info->current.width / 2);
y = 0;
if (parent->frame)
{
MetaFrameGeometry fgeom;
MetaFrameBorders borders;
x += parent->frame->rect.x;
y += parent->frame->rect.y;
meta_frame_calc_geometry (parent->frame, &fgeom);
y += fgeom.top_height;
meta_frame_calc_borders (parent->frame, &borders);
y += borders.total.top;
y += info->fgeom->top_height;
y += info->borders->visible.top;
}
else
y = parent->rect.y + info->fgeom->top_height;
y = parent->rect.y + info->borders->visible.top;
constraint_already_satisfied = (x == info->current.x) && (y == info->current.y);
@ -810,8 +809,14 @@ constrain_maximization (MetaWindow *window,
return TRUE;
/* Calculate target_size = maximized size of (window + frame) */
if (window->maximized_horizontally && window->maximized_vertically)
target_size = info->work_area_monitor;
if (META_WINDOW_TILED_MAXIMIZED (window))
{
meta_window_get_current_tile_area (window, &target_size);
}
else if (META_WINDOW_MAXIMIZED (window))
{
target_size = info->work_area_monitor;
}
else
{
/* Amount of maximization possible in a single direction depends
@ -831,19 +836,19 @@ constrain_maximization (MetaWindow *window,
active_workspace_struts = window->screen->active_workspace->all_struts;
target_size = info->current;
extend_by_frame (&target_size, info->fgeom);
extend_by_frame (&target_size, info->borders);
meta_rectangle_expand_to_avoiding_struts (&target_size,
&info->entire_monitor,
direction,
active_workspace_struts);
}
/* Now make target_size = maximized size of client window */
unextend_by_frame (&target_size, info->fgeom);
unextend_by_frame (&target_size, info->borders);
/* Check min size constraints; max size constraints are ignored for maximized
* windows, as per bug 327543.
*/
get_size_limits (window, info->fgeom, FALSE, &min_size, &max_size);
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
hminbad = target_size.width < min_size.width && window->maximized_horizontally;
vminbad = target_size.height < min_size.height && window->maximized_vertically;
if (hminbad || vminbad)
@ -885,7 +890,6 @@ constrain_tiling (MetaWindow *window,
gboolean hminbad, vminbad;
gboolean horiz_equal, vert_equal;
gboolean constraint_already_satisfied;
MetaDevice *pointer;
if (priority > PRIORITY_TILING)
return TRUE;
@ -894,18 +898,16 @@ 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, pointer, &target_size);
unextend_by_frame (&target_size, info->fgeom);
meta_window_get_current_tile_area (window, &target_size);
unextend_by_frame (&target_size, info->borders);
/* Check min size constraints; max size constraints are ignored as for
* maximized windows.
*/
get_size_limits (window, info->fgeom, FALSE, &min_size, &max_size);
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
hminbad = target_size.width < min_size.width;
vminbad = target_size.height < min_size.height;
if (hminbad || vminbad)
@ -948,7 +950,7 @@ constrain_fullscreen (MetaWindow *window,
monitor = info->entire_monitor;
get_size_limits (window, info->fgeom, FALSE, &min_size, &max_size);
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
too_big = !meta_rectangle_could_fit_rect (&monitor, &min_size);
too_small = !meta_rectangle_could_fit_rect (&max_size, &monitor);
if (too_big || too_small)
@ -1057,7 +1059,7 @@ constrain_size_limits (MetaWindow *window,
return TRUE;
/* Determine whether constraint is already satisfied; exit if it is */
get_size_limits (window, info->fgeom, FALSE, &min_size, &max_size);
get_size_limits (window, info->borders, FALSE, &min_size, &max_size);
/* We ignore max-size limits for maximized windows; see #327543 */
if (window->maximized_horizontally)
max_size.width = MAX (max_size.width, info->current.width);
@ -1249,8 +1251,8 @@ do_screen_and_monitor_relative_constraints (
/* Determine whether constraint applies; exit if it doesn't */
how_far_it_can_be_smushed = info->current;
get_size_limits (window, info->fgeom, TRUE, &min_size, &max_size);
extend_by_frame (&info->current, info->fgeom);
get_size_limits (window, info->borders, TRUE, &min_size, &max_size);
extend_by_frame (&info->current, info->borders);
if (info->action_type != ACTION_MOVE)
{
@ -1270,7 +1272,7 @@ do_screen_and_monitor_relative_constraints (
&info->current);
if (exit_early || constraint_satisfied || check_only)
{
unextend_by_frame (&info->current, info->fgeom);
unextend_by_frame (&info->current, info->borders);
return constraint_satisfied;
}
@ -1294,7 +1296,7 @@ do_screen_and_monitor_relative_constraints (
info->fixed_directions,
&info->current);
unextend_by_frame (&info->current, info->fgeom);
unextend_by_frame (&info->current, info->borders);
return TRUE;
}
@ -1365,18 +1367,15 @@ 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 && (!grab_info || !grab_info->grab_frame_action);
info->is_user_action && !window->display->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
@ -1410,8 +1409,8 @@ constrain_titlebar_visible (MetaWindow *window,
*/
if (window->frame)
{
bottom_amount = info->current.height + info->fgeom->bottom_height;
vert_amount_onscreen = info->fgeom->top_height;
bottom_amount = info->current.height + info->borders->visible.bottom;
vert_amount_onscreen = info->borders->visible.top;
}
else
bottom_amount = vert_amount_offscreen;
@ -1485,8 +1484,8 @@ constrain_partially_onscreen (MetaWindow *window,
*/
if (window->frame)
{
bottom_amount = info->current.height + info->fgeom->bottom_height;
vert_amount_onscreen = info->fgeom->top_height;
bottom_amount = info->current.height + info->borders->visible.bottom;
vert_amount_onscreen = info->borders->visible.top;
}
else
bottom_amount = vert_amount_offscreen;

View File

@ -39,7 +39,7 @@ typedef enum
} MetaMoveResizeFlags;
void meta_window_constrain (MetaWindow *window,
MetaFrameGeometry *orig_fgeom,
MetaFrameBorders *orig_borders,
MetaMoveResizeFlags flags,
int resize_gravity,
const MetaRectangle *orig,

View File

@ -30,11 +30,6 @@
#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.
*
@ -217,7 +212,7 @@ lower_window_and_transients (MetaWindow *window,
meta_window_foreach_transient (window, lower_window_and_transients, NULL);
if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK &&
if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK &&
meta_prefs_get_raise_on_click ())
{
/* Move window to the back of the focusing workspace's MRU list.
@ -250,19 +245,9 @@ 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);
@ -271,7 +256,6 @@ 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);
}
@ -279,21 +263,16 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
void
meta_core_lower_beneath_grab_window (Display *xdisplay,
Window xwindow,
int device_id,
guint32 timestamp)
{
XWindowChanges changes;
MetaDisplay *display;
MetaScreen *screen;
MetaWindow *grab_window;
MetaDevice *pointer;
MetaGrabInfo *grab_info;
display = meta_display_for_x_display (xdisplay);
screen = meta_display_screen_for_xwindow (display, xwindow);
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;
grab_window = display->grab_window;
if (grab_window == NULL)
return;
@ -512,27 +491,18 @@ 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);
device = meta_device_map_lookup (window->display->device_map, device_id);
meta_window_show_menu (window, device, root_x, root_y, button, timestamp);
meta_window_show_menu (window, root_x, root_y, button, timestamp);
}
void
@ -568,70 +538,70 @@ meta_core_get_menu_accelerator (MetaMenuOp menu_op,
break;
case META_MENU_OP_UNSTICK:
case META_MENU_OP_STICK:
name = "toggle_on_all_workspaces";
name = "toggle-on-all-workspaces";
break;
case META_MENU_OP_ABOVE:
case META_MENU_OP_UNABOVE:
name = "toggle_above";
name = "toggle-above";
break;
case META_MENU_OP_WORKSPACES:
switch (workspace)
{
case 1:
name = "move_to_workspace_1";
name = "move-to-workspace-1";
break;
case 2:
name = "move_to_workspace_2";
name = "move-to-workspace-2";
break;
case 3:
name = "move_to_workspace_3";
name = "move-to-workspace-3";
break;
case 4:
name = "move_to_workspace_4";
name = "move-to-workspace-4";
break;
case 5:
name = "move_to_workspace_5";
name = "move-to-workspace-5";
break;
case 6:
name = "move_to_workspace_6";
name = "move-to-workspace-6";
break;
case 7:
name = "move_to_workspace_7";
name = "move-to-workspace-7";
break;
case 8:
name = "move_to_workspace_8";
name = "move-to-workspace-8";
break;
case 9:
name = "move_to_workspace_9";
name = "move-to-workspace-9";
break;
case 10:
name = "move_to_workspace_10";
name = "move-to-workspace-10";
break;
case 11:
name = "move_to_workspace_11";
name = "move-to-workspace-11";
break;
case 12:
name = "move_to_workspace_12";
name = "move-to-workspace-12";
break;
}
break;
case META_MENU_OP_MOVE:
name = "begin_move";
name = "begin-move";
break;
case META_MENU_OP_RESIZE:
name = "begin_resize";
name = "begin-resize";
break;
case META_MENU_OP_MOVE_LEFT:
name = "move_to_workspace_left";
name = "move-to-workspace-left";
break;
case META_MENU_OP_MOVE_RIGHT:
name = "move_to_workspace_right";
name = "move-to-workspace-right";
break;
case META_MENU_OP_MOVE_UP:
name = "move_to_workspace_up";
name = "move-to-workspace-up";
break;
case META_MENU_OP_MOVE_DOWN:
name = "move_to_workspace_down";
name = "move-to-workspace-down";
break;
case META_MENU_OP_RECOVER:
/* No keybinding for this one */
@ -668,7 +638,6 @@ 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,
@ -681,16 +650,13 @@ 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);
device = meta_device_map_lookup (display->device_map, device_id);
return meta_display_begin_grab_op (display, screen, window, device,
return meta_display_begin_grab_op (display, screen, window,
op, pointer_already_grabbed,
frame_action,
button, modmask,
@ -699,58 +665,57 @@ meta_core_begin_grab_op (Display *xdisplay,
void
meta_core_end_grab_op (Display *xdisplay,
int device_id,
guint32 timestamp)
{
MetaDisplay *display;
MetaDevice *device;
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);
meta_display_end_grab_op (display, timestamp);
}
MetaGrabOp
meta_core_frame_has_grab (Display *xdisplay,
Window frame_xwindow,
gint *device_id,
gint *button_ret)
meta_core_get_grab_op (Display *xdisplay)
{
MetaWindow *window;
MetaDisplay *display;
display = meta_display_for_x_display (xdisplay);
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;
return display->grab_op;
}
Window
meta_core_get_frame (Display *xdisplay,
Window client_xwindow)
meta_core_get_grab_frame (Display *xdisplay)
{
MetaDisplay *display;
MetaWindow *window;
display = meta_display_for_x_display (xdisplay);
window = meta_display_lookup_x_window (display, client_xwindow);
if (window &&
window->frame)
return window->frame->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;
}
return None;
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;
}
void
@ -766,24 +731,13 @@ meta_core_grab_buttons (Display *xdisplay,
}
void
meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen,
gint device_id,
MetaCursor cursor)
meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen,
MetaCursor cursor)
{
MetaWindow *window = get_window (xdisplay, frame_on_screen);
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);
meta_frame_set_screen_cursor (window->frame, pointer, cursor);
meta_frame_set_screen_cursor (window->frame, cursor);
}
void
@ -821,69 +775,3 @@ 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

@ -110,7 +110,6 @@ 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,
@ -119,7 +118,6 @@ void meta_core_user_focus (Display *xdisplay,
void meta_core_lower_beneath_grab_window (Display *xdisplay,
Window xwindow,
int device_id,
guint32 timestamp);
void meta_core_minimize (Display *xdisplay,
@ -165,7 +163,6 @@ 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,
@ -178,7 +175,6 @@ 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,
@ -188,29 +184,18 @@ 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,
int device_id,
MetaCursor cursor);
void meta_core_select_events (Display *xdisplay,
Window xwindow,
gint evmask,
gboolean preserve_old_mask);
void meta_core_set_screen_cursor (Display *xdisplay,
Window frame_on_screen,
MetaCursor cursor);
/* Used because we ignore EnterNotify when a window is unmapped that
* really shouldn't cause focus changes, by comparing the event serial

View File

@ -1,69 +0,0 @@
/* -*- 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

@ -1,69 +0,0 @@
/* -*- 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 */

View File

@ -1,134 +0,0 @@
/* -*- 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

@ -1,56 +0,0 @@
/* -*- 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

@ -1,111 +0,0 @@
/* -*- 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 */

View File

@ -1,269 +0,0 @@
/* -*- 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;
}

View File

@ -1,59 +0,0 @@
/* -*- 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 */

View File

@ -1,390 +0,0 @@
/* -*- 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);
}

View File

@ -1,124 +0,0 @@
/* -*- 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;
}

View File

@ -1,95 +0,0 @@
/* -*- 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 */

View File

@ -1,80 +0,0 @@
/* -*- 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 */

View File

@ -1,270 +0,0 @@
/* -*- 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;
}

View File

@ -1,256 +0,0 @@
/* -*- 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);
}

View File

@ -1,85 +0,0 @@
/* -*- 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 */

View File

@ -1,343 +0,0 @@
/* -*- 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);
}

View File

@ -1,92 +0,0 @@
/* -*- 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,7 +38,6 @@
#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
@ -57,9 +56,6 @@ 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,
@ -77,9 +73,11 @@ typedef enum {
/* This is basically a bogus number, just has to be large enough
* to handle the expected case of the alt+tab operation, where
* we want to ignore serials from UnmapNotify on the tab popup,
* and the LeaveNotify/EnterNotify from the pointer ungrab
* and the LeaveNotify/EnterNotify from the pointer ungrab. It
* also has to be big enough to hold ignored serials from the point
* where we reshape the stage to the point where we get events back.
*/
#define N_IGNORED_SERIALS 4
#define N_IGNORED_CROSSING_SERIALS 10
typedef enum {
META_TILE_NONE,
@ -88,65 +86,6 @@ 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;
@ -165,8 +104,22 @@ struct _MetaDisplay
#include <meta/atomnames.h>
#undef item
/* keyboard -> MetaFocusInfo hashtable */
GHashTable *focus_info;
/* 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;
/* last user interaction time in any app */
guint32 last_user_time;
@ -202,7 +155,7 @@ struct _MetaDisplay
* correspond to an enter event we should
* ignore
*/
unsigned long ignored_serials[N_IGNORED_SERIALS];
unsigned long ignored_crossing_serials[N_IGNORED_CROSSING_SERIALS];
Window ungrab_should_not_cause_focus_window;
guint32 current_time;
@ -226,11 +179,35 @@ struct _MetaDisplay
/* Alt+click button grabs */
unsigned int window_grab_modifiers;
/* per-device current window operation */
GHashTable *current_grabs;
/* per-screen edge resistance cache */
GHashTable *edge_resistance_info;
/* 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_tile_monitor_number;
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;
/* we use property updates as sentinels for certain window focus events
* to avoid some race conditions on EnterNotify events
@ -241,6 +218,11 @@ 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;
@ -287,9 +269,6 @@ struct _MetaDisplay
/* Managed by compositor.c */
MetaCompositor *compositor;
/* Managed by device-map.c */
MetaDeviceMap *device_map;
int render_event_base;
int render_error_base;
@ -313,12 +292,6 @@ 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)
@ -371,10 +344,6 @@ MetaScreen* meta_display_screen_for_xwindow (MetaDisplay *display,
void meta_display_grab (MetaDisplay *display);
void meta_display_ungrab (MetaDisplay *display);
void meta_display_unmanage_screen (MetaDisplay *display,
MetaScreen *screen,
guint32 timestamp);
void meta_display_unmanage_windows_for_screen (MetaDisplay *display,
MetaScreen *screen,
guint32 timestamp);
@ -408,14 +377,12 @@ 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,
@ -429,8 +396,7 @@ 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,
MetaScreen *screen);
void meta_display_cleanup_edges (MetaDisplay *display);
/* make a request to ensure the event serial has changed */
void meta_display_increment_event_serial (MetaDisplay *display);
@ -478,15 +444,4 @@ 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, screen) \
meta_window_should_be_showing (window) && \
window->screen == screen && \
window->cur_grab == NULL && \
window->type != META_WINDOW_DESKTOP && \
window->type != META_WINDOW_MENU && \
#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 && \
window->type != META_WINDOW_SPLASHSCREEN
struct ResistanceDataForAnEdge
@ -44,9 +44,8 @@ struct ResistanceDataForAnEdge
guint timeout_id;
int timeout_edge_pos;
gboolean timeout_over;
MetaEdgeResistanceFunc timeout_func;
GSourceFunc timeout_func;
MetaWindow *window;
MetaDevice *device;
int keyboard_buildup;
};
typedef struct ResistanceDataForAnEdge ResistanceDataForAnEdge;
@ -64,9 +63,7 @@ struct MetaEdgeResistanceData
ResistanceDataForAnEdge bottom_data;
};
static MetaEdgeResistanceData *
compute_resistance_and_snapping_edges (MetaDisplay *display,
MetaScreen *screen);
static void compute_resistance_and_snapping_edges (MetaDisplay *display);
/* !WARNING!: this function can return invalid indices (namely, either -1 or
* edges->len); this is by design, but you need to remember this.
@ -321,22 +318,20 @@ edge_resistance_timeout (gpointer data)
resistance_data->timeout_over = TRUE;
resistance_data->timeout_id = 0;
(*resistance_data->timeout_func) (resistance_data->window,
resistance_data->device);
(*resistance_data->timeout_func)(resistance_data->window);
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,
MetaEdgeResistanceFunc timeout_func,
GSourceFunc timeout_func,
gboolean xdir,
gboolean keyboard_op)
{
@ -450,7 +445,6 @@ 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)
@ -539,28 +533,29 @@ 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,
MetaDevice *device,
const MetaRectangle *old_outer,
MetaRectangle *new_outer,
MetaEdgeResistanceFunc timeout_func,
gboolean auto_snap,
gboolean keyboard_op,
gboolean is_resize)
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)
{
MetaEdgeResistanceData *edge_data;
MetaRectangle modified_rect;
gboolean modified;
int new_left, new_right, new_top, new_bottom;
edge_data = g_hash_table_lookup (display->edge_resistance_info,
window->screen);
if (display->grab_edge_resistance_data == NULL)
compute_resistance_and_snapping_edges (display);
if (!edge_data)
edge_data = compute_resistance_and_snapping_edges (display, window->screen);
edge_data = display->grab_edge_resistance_data;
if (auto_snap)
{
@ -606,7 +601,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, device,
new_left = apply_edge_resistance (window,
BOX_LEFT (*old_outer),
BOX_LEFT (*new_outer),
old_outer,
@ -616,7 +611,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
timeout_func,
TRUE,
keyboard_op);
new_right = apply_edge_resistance (window, device,
new_right = apply_edge_resistance (window,
BOX_RIGHT (*old_outer),
BOX_RIGHT (*new_outer),
old_outer,
@ -635,7 +630,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, device,
new_top = apply_edge_resistance (window,
BOX_TOP (*old_outer),
BOX_TOP (*new_outer),
old_outer,
@ -645,7 +640,7 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
timeout_func,
FALSE,
keyboard_op);
new_bottom = apply_edge_resistance (window, device,
new_bottom = apply_edge_resistance (window,
BOX_BOTTOM (*old_outer),
BOX_BOTTOM (*new_outer),
old_outer,
@ -674,20 +669,15 @@ apply_edge_resistance_to_each_side (MetaDisplay *display,
}
void
meta_display_cleanup_edges (MetaDisplay *display,
MetaScreen *screen)
meta_display_cleanup_edges (MetaDisplay *display)
{
guint i,j;
MetaEdgeResistanceData *edge_data;
MetaEdgeResistanceData *edge_data = display->grab_edge_resistance_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);
@ -760,7 +750,8 @@ meta_display_cleanup_edges (MetaDisplay *display,
edge_data->bottom_data.timeout_id != 0)
g_source_remove (edge_data->bottom_data.timeout_id);
g_free (edge_data);
g_free (display->grab_edge_resistance_data);
display->grab_edge_resistance_data = NULL;
}
static int
@ -772,9 +763,8 @@ stupid_sort_requiring_extra_pointer_dereference (gconstpointer a,
return meta_rectangle_edge_cmp_ignore_type (*a_edge, *b_edge);
}
static MetaEdgeResistanceData *
static void
cache_edges (MetaDisplay *display,
MetaScreen *screen,
GList *window_edges,
GList *monitor_edges,
GList *screen_edges)
@ -858,8 +848,9 @@ cache_edges (MetaDisplay *display,
/*
* 2nd: Allocate the edges
*/
edge_data = g_new0 (MetaEdgeResistanceData, 1);
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->left_edges = g_array_sized_new (FALSE,
FALSE,
sizeof(MetaEdge*),
@ -926,21 +917,21 @@ cache_edges (MetaDisplay *display,
* avoided this sort by sticking them into the array with some simple
* merging of the lists).
*/
g_array_sort (edge_data->left_edges,
g_array_sort (display->grab_edge_resistance_data->left_edges,
stupid_sort_requiring_extra_pointer_dereference);
g_array_sort (edge_data->right_edges,
g_array_sort (display->grab_edge_resistance_data->right_edges,
stupid_sort_requiring_extra_pointer_dereference);
g_array_sort (edge_data->top_edges,
g_array_sort (display->grab_edge_resistance_data->top_edges,
stupid_sort_requiring_extra_pointer_dereference);
g_array_sort (edge_data->bottom_edges,
g_array_sort (display->grab_edge_resistance_data->bottom_edges,
stupid_sort_requiring_extra_pointer_dereference);
return edge_data;
}
static void
initialize_grab_edge_resistance_data (MetaEdgeResistanceData *edge_data)
initialize_grab_edge_resistance_data (MetaDisplay *display)
{
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;
@ -952,9 +943,8 @@ initialize_grab_edge_resistance_data (MetaEdgeResistanceData *edge_data)
edge_data->bottom_data.keyboard_buildup = 0;
}
static MetaEdgeResistanceData *
compute_resistance_and_snapping_edges (MetaDisplay *display,
MetaScreen *screen)
static void
compute_resistance_and_snapping_edges (MetaDisplay *display)
{
GList *stacked_windows;
GList *cur_window_iter;
@ -966,17 +956,18 @@ 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 screen %s.\n",
screen->screen_name);
"Computing edges to resist-movement or snap-to for %s.\n",
display->grab_window->desc);
/*
* 1st: Get the list of relevant windows, from bottom to top
*/
stacked_windows =
meta_stack_list_windows (screen->stack, screen->active_workspace);
meta_stack_list_windows (display->grab_screen->stack,
display->grab_screen->active_workspace);
/*
* 2nd: we need to separate that stacked list into a list of windows that
@ -990,7 +981,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, screen))
if (WINDOW_EDGES_RELEVANT (cur_window, display))
{
MetaRectangle *new_rect;
new_rect = g_new (MetaRectangle, 1);
@ -1025,7 +1016,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, screen) &&
if (WINDOW_EDGES_RELEVANT (cur_window, display) &&
cur_window->type != META_WINDOW_DOCK)
{
GList *new_edges;
@ -1037,7 +1028,7 @@ compute_resistance_and_snapping_edges (MetaDisplay *display,
* by other windows or DOCKS, but that's handled below).
*/
meta_rectangle_intersect (&cur_rect,
&screen->rect,
&display->grab_screen->rect,
&reduced);
new_edges = NULL;
@ -1132,36 +1123,32 @@ compute_resistance_and_snapping_edges (MetaDisplay *display,
* monitor edges in an array for quick access. Free the edges since
* they've been cached elsewhere.
*/
edge_data = cache_edges (display, screen,
edges,
screen->active_workspace->monitor_edges,
screen->active_workspace->screen_edges);
cache_edges (display,
edges,
display->grab_screen->active_workspace->monitor_edges,
display->grab_screen->active_workspace->screen_edges);
g_list_free (edges);
/*
* 6th: Initialize the resistance timeouts and buildups
*/
initialize_grab_edge_resistance_data (edge_data);
return edge_data;
initialize_grab_edge_resistance_data (display);
}
/* 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,
MetaDevice *device,
int old_x,
int old_y,
int *new_x,
int *new_y,
MetaEdgeResistanceFunc timeout_func,
gboolean snap,
gboolean is_keyboard_op)
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)
{
MetaRectangle old_outer, proposed_outer, new_outer;
MetaGrabInfo *grab_info;
gboolean is_resize;
meta_window_get_outer_rect (window, &old_outer);
@ -1171,14 +1158,10 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
proposed_outer.y += (*new_y - old_y);
new_outer = proposed_outer;
grab_info = meta_display_get_grab_info (window->display, device);
g_assert (grab_info != NULL);
grab_info->grab_last_user_action_was_snap = snap;
window->display->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,
@ -1240,20 +1223,18 @@ meta_window_edge_resistance_for_move (MetaWindow *window,
* sizes of the inner window.
*/
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 timeout_func,
gboolean snap,
gboolean is_keyboard_op)
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)
{
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);
@ -1265,14 +1246,10 @@ meta_window_edge_resistance_for_resize (MetaWindow *window,
proposed_outer_width,
proposed_outer_height);
grab_info = meta_display_get_grab_info (window->display, device);
g_assert (grab_info != NULL);
grab_info->grab_last_user_action_was_snap = snap;
window->display->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,28 +26,23 @@
#include "window-private.h"
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);
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);
#endif /* META_EDGE_RESISTANCE_H */

View File

@ -28,7 +28,6 @@
#include "bell.h"
#include <meta/errors.h>
#include "keybindings-private.h"
#include "device-pointer.h"
#include <X11/extensions/Xrender.h>
@ -65,10 +64,9 @@ meta_window_ensure_frame (MetaWindow *window)
frame->child_y = 0;
frame->bottom_height = 0;
frame->right_width = 0;
frame->cursors = g_hash_table_new (NULL, NULL);
frame->current_cursor = 0;
frame->mapped = FALSE;
frame->need_reapply_frame_shape = TRUE;
frame->is_flashing = FALSE;
meta_verbose ("Framing window %s: visual %s default, depth %d default depth %d\n",
@ -168,14 +166,6 @@ meta_window_ensure_frame (MetaWindow *window)
/* Move keybindings to frame instead of window */
meta_window_grab_keys (window);
/* Shape mask */
meta_ui_apply_frame_shape (frame->window->screen->ui,
frame->xwindow,
frame->rect.width,
frame->rect.height,
frame->window->has_shape);
frame->need_reapply_frame_shape = FALSE;
meta_display_ungrab (window->display);
}
@ -183,6 +173,7 @@ void
meta_window_destroy_frame (MetaWindow *window)
{
MetaFrame *frame;
MetaFrameBorders borders;
if (window->frame == NULL)
return;
@ -190,6 +181,8 @@ meta_window_destroy_frame (MetaWindow *window)
meta_verbose ("Unframing window %s\n", window->desc);
frame = window->frame;
meta_frame_calc_borders (frame, &borders);
meta_bell_notify_frame_destroy (frame);
@ -217,8 +210,8 @@ meta_window_destroy_frame (MetaWindow *window)
* coordinates here means we'll need to ensure a configure
* notify event is sent; see bug 399552.
*/
window->frame->rect.x,
window->frame->rect.y);
window->frame->rect.x + borders.invisible.left,
window->frame->rect.y + borders.invisible.top);
meta_error_trap_pop (window->display);
meta_ui_destroy_frame_window (window->screen->ui, frame->xwindow);
@ -227,13 +220,17 @@ meta_window_destroy_frame (MetaWindow *window)
frame->xwindow);
window->frame = NULL;
if (window->frame_bounds)
{
cairo_region_destroy (window->frame_bounds);
window->frame_bounds = NULL;
}
/* 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);
@ -247,12 +244,6 @@ 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
@ -319,40 +310,39 @@ meta_frame_get_flags (MetaFrame *frame)
}
void
meta_frame_calc_geometry (MetaFrame *frame,
MetaFrameGeometry *geomp)
meta_frame_borders_clear (MetaFrameBorders *self)
{
MetaFrameGeometry geom;
MetaWindow *window;
window = frame->window;
meta_ui_get_frame_geometry (window->screen->ui,
frame->xwindow,
&geom.top_height,
&geom.bottom_height,
&geom.left_width,
&geom.right_width);
*geomp = geom;
self->visible.top = self->invisible.top = self->total.top = 0;
self->visible.bottom = self->invisible.bottom = self->total.bottom = 0;
self->visible.left = self->invisible.left = self->total.left = 0;
self->visible.right = self->invisible.right = self->total.right = 0;
}
static gboolean
update_shape (MetaFrame *frame)
void
meta_frame_calc_borders (MetaFrame *frame,
MetaFrameBorders *borders)
{
if (frame->need_reapply_frame_shape)
{
meta_ui_apply_frame_shape (frame->window->screen->ui,
frame->xwindow,
frame->rect.width,
frame->rect.height,
frame->window->has_shape);
frame->need_reapply_frame_shape = FALSE;
return TRUE;
}
/* Save on if statements and potential uninitialized values
* in callers -- if there's no frame, then zero the borders. */
if (frame == NULL)
meta_frame_borders_clear (borders);
else
return FALSE;
meta_ui_get_frame_borders (frame->window->screen->ui,
frame->xwindow,
borders);
}
void
meta_frame_get_corner_radiuses (MetaFrame *frame,
float *top_left,
float *top_right,
float *bottom_left,
float *bottom_right)
{
meta_ui_get_corner_radiuses (frame->window->screen->ui,
frame->xwindow,
top_left, top_right,
bottom_left, bottom_right);
}
gboolean
@ -361,11 +351,6 @@ meta_frame_sync_to_window (MetaFrame *frame,
gboolean need_move,
gboolean need_resize)
{
if (!(need_move || need_resize))
{
return update_shape (frame);
}
meta_topic (META_DEBUG_GEOMETRY,
"Syncing frame geometry %d,%d %dx%d (SE: %d,%d)\n",
frame->rect.x, frame->rect.y,
@ -380,19 +365,8 @@ meta_frame_sync_to_window (MetaFrame *frame,
frame->xwindow,
frame->rect.width,
frame->rect.height);
/* we need new shape if we're resized */
frame->need_reapply_frame_shape = TRUE;
}
/* Done before the window resize, because doing it before means
* part of the window being resized becomes unshaped, which may
* be sort of hard to see with bg = None. If we did it after
* window resize, part of the window being resized would become
* shaped, which might be more visible.
*/
update_shape (frame);
meta_ui_move_resize_frame (frame->window->screen->ui,
frame->xwindow,
frame->rect.x,
@ -408,7 +382,8 @@ 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->cur_grab != NULL)
if (frame->window->display->grab_window ==
frame->window)
meta_ui_repaint_frame (frame->window->screen->ui,
frame->xwindow);
}
@ -433,22 +408,22 @@ meta_frame_queue_draw (MetaFrame *frame)
}
void
meta_frame_set_screen_cursor (MetaFrame *frame,
MetaDevice *pointer,
MetaCursor cursor)
meta_frame_set_screen_cursor (MetaFrame *frame,
MetaCursor cursor)
{
MetaCursor old_cursor;
old_cursor = GPOINTER_TO_UINT (g_hash_table_lookup (frame->cursors, pointer));
if (cursor == old_cursor)
Cursor xcursor;
if (cursor == frame->current_cursor)
return;
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);
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);
}
}
Window

View File

@ -26,17 +26,6 @@
#include "window-private.h"
typedef struct _MetaFrameGeometry MetaFrameGeometry;
struct _MetaFrameGeometry
{
/* border sizes (space between frame and child) */
int left_width;
int right_width;
int top_height;
int bottom_height;
};
struct _MetaFrame
{
/* window we frame */
@ -45,7 +34,7 @@ struct _MetaFrame
/* reparent window */
Window xwindow;
GHashTable *cursors;
MetaCursor current_cursor;
/* This rect is trusted info from where we put the
* frame, not the result of ConfigureNotify
@ -71,8 +60,15 @@ MetaFrameFlags meta_frame_get_flags (MetaFrame *frame);
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_calc_borders (MetaFrame *frame,
MetaFrameBorders *borders);
void meta_frame_get_corner_radiuses (MetaFrame *frame,
float *top_left,
float *top_right,
float *bottom_left,
float *bottom_right);
gboolean meta_frame_sync_to_window (MetaFrame *frame,
int gravity,
gboolean need_move,
@ -80,8 +76,7 @@ gboolean meta_frame_sync_to_window (MetaFrame *frame,
cairo_region_t *meta_frame_get_frame_bounds (MetaFrame *frame);
void meta_frame_set_screen_cursor (MetaFrame *frame,
MetaDevice *pointer,
void meta_frame_set_screen_cursor (MetaFrame *frame,
MetaCursor cursor);
#endif

View File

@ -1,677 +0,0 @@
/* -*- 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;
}

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